use std::{
fs::{self, File},
io::{BufReader, Read},
};
use anyhow::bail;
use assert_matches::assert_matches;
use insta::assert_snapshot;
use nix_nar::Encoder;
use pretty_hex::{config_hex, HexConfig};
#[ctor::ctor]
fn setup() {
fs::create_dir_all("test-data/01-empty-dir.in").unwrap();
if fs::symlink_metadata("test-data/06-symlink.in").is_err() {
symlink::symlink_file("02-empty-file.in", "test-data/06-symlink.in").unwrap();
}
if fs::symlink_metadata(
"test-data/07-nested-dirs.in/02-some-dir/link-to-an-empty-file",
)
.is_err()
{
symlink::symlink_file(
"../01-an-empty-file",
"test-data/07-nested-dirs.in/02-some-dir/link-to-an-empty-file",
)
.unwrap();
}
}
#[test]
fn empty_dir() {
assert_snapshot!(enc_and_print("test-data/01-empty-dir.in").unwrap(), @r###"
0000: 0d00 0000 0000 0000 6e69 782d 6172 6368 ........nix-arch
0010: 6976 652d 3100 0000 0100 0000 0000 0000 ive-1...........
0020: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0030: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0040: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
0050: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
"###);
let enc = Encoder::new("test-data/01-empty-dir.in").unwrap();
let expected = File::open("test-data/01-empty-dir.nar").unwrap();
assert_matches!(readers_equal(enc, expected), Ok(()))
}
#[test]
fn empty_file() {
assert_snapshot!(enc_and_print("test-data/02-empty-file.in").unwrap(), @r###"
0000: 0d00 0000 0000 0000 6e69 782d 6172 6368 ........nix-arch
0010: 6976 652d 3100 0000 0100 0000 0000 0000 ive-1...........
0020: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0030: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0040: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
0050: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
0060: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
"###);
let enc = Encoder::new("test-data/02-empty-file.in").unwrap();
let expected = File::open("test-data/02-empty-file.nar").unwrap();
assert_matches!(readers_equal(enc, expected), Ok(()))
}
#[test]
fn dir_one_empty_file() {
assert_snapshot!(enc_and_print("test-data/03-dir-one-empty-file.in").unwrap(), @r###"
0000: 0d00 0000 0000 0000 6e69 782d 6172 6368 ........nix-arch
0010: 6976 652d 3100 0000 0100 0000 0000 0000 ive-1...........
0020: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0030: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0040: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
0050: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0060: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0070: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0080: 0d00 0000 0000 0000 616e 2d65 6d70 7479 ........an-empty
0090: 2d66 696c 6500 0000 0400 0000 0000 0000 -file...........
00a0: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
00b0: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
00c0: 7479 7065 0000 0000 0700 0000 0000 0000 type............
00d0: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
00e0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
00f0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0100: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0110: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
"###);
let enc = Encoder::new("test-data/03-dir-one-empty-file.in").unwrap();
let expected = File::open("test-data/03-dir-one-empty-file.nar").unwrap();
assert_matches!(readers_equal(enc, expected), Ok(()))
}
#[test]
fn small_file() {
assert_snapshot!(enc_and_print("test-data/04-small-file.in").unwrap(), @r###"
0000: 0d00 0000 0000 0000 6e69 782d 6172 6368 ........nix-arch
0010: 6976 652d 3100 0000 0100 0000 0000 0000 ive-1...........
0020: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0030: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0040: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
0050: 636f 6e74 656e 7473 1500 0000 0000 0000 contents........
0060: 5468 6973 2069 7320 6120 7465 7374 2066 This is a test f
0070: 696c 652e 0a00 0000 0100 0000 0000 0000 ile.............
0080: 2900 0000 0000 0000 ).......
"###);
let enc = Encoder::new("test-data/04-small-file.in").unwrap();
let expected = File::open("test-data/04-small-file.nar").unwrap();
assert_matches!(readers_equal(enc, expected), Ok(()))
}
#[test]
fn executable_file() {
assert_snapshot!(enc_and_print("test-data/05-executable-file.in.exe").unwrap(), @r###"
0000: 0d00 0000 0000 0000 6e69 782d 6172 6368 ........nix-arch
0010: 6976 652d 3100 0000 0100 0000 0000 0000 ive-1...........
0020: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0030: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0040: 7265 6775 6c61 7200 0a00 0000 0000 0000 regular.........
0050: 6578 6563 7574 6162 6c65 0000 0000 0000 executable......
0060: 0000 0000 0000 0000 0800 0000 0000 0000 ................
0070: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
0080: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
"###);
let enc = Encoder::new("test-data/05-executable-file.in.exe").unwrap();
let expected = File::open("test-data/05-executable-file.in.exe.nar").unwrap();
assert_matches!(readers_equal(enc, expected), Ok(()))
}
#[cfg_attr(not(target_family = "windows"), test)]
fn symlink() {
assert_snapshot!(enc_and_print("test-data/06-symlink.in").unwrap(), @r###"
0000: 0d00 0000 0000 0000 6e69 782d 6172 6368 ........nix-arch
0010: 6976 652d 3100 0000 0100 0000 0000 0000 ive-1...........
0020: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0030: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0040: 7379 6d6c 696e 6b00 0600 0000 0000 0000 symlink.........
0050: 7461 7267 6574 0000 1000 0000 0000 0000 target..........
0060: 3032 2d65 6d70 7479 2d66 696c 652e 696e 02-empty-file.in
0070: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
"###);
let enc = Encoder::new("test-data/06-symlink.in").unwrap();
let expected = File::open("test-data/06-symlink.nar").unwrap();
assert_matches!(readers_equal(enc, expected), Ok(()))
}
#[cfg_attr(not(target_family = "windows"), test)]
fn nested_dirs() {
assert_snapshot!(enc_and_print("test-data/07-nested-dirs.in").unwrap(), @r###"
0000: 0d00 0000 0000 0000 6e69 782d 6172 6368 ........nix-arch
0010: 6976 652d 3100 0000 0100 0000 0000 0000 ive-1...........
0020: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0030: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0040: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
0050: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0060: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0070: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0080: 1000 0000 0000 0000 3031 2d61 6e2d 656d ........01-an-em
0090: 7074 792d 6669 6c65 0400 0000 0000 0000 pty-file........
00a0: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
00b0: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
00c0: 7479 7065 0000 0000 0700 0000 0000 0000 type............
00d0: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
00e0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
00f0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0100: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0110: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0120: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0130: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0140: 0b00 0000 0000 0000 3032 2d73 6f6d 652d ........02-some-
0150: 6469 7200 0000 0000 0400 0000 0000 0000 dir.............
0160: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0170: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0180: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0190: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
01a0: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
01b0: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
01c0: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
01d0: 1500 0000 0000 0000 6c69 6e6b 2d74 6f2d ........link-to-
01e0: 616e 2d65 6d70 7479 2d66 696c 6500 0000 an-empty-file...
01f0: 0400 0000 0000 0000 6e6f 6465 0000 0000 ........node....
0200: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0210: 0400 0000 0000 0000 7479 7065 0000 0000 ........type....
0220: 0700 0000 0000 0000 7379 6d6c 696e 6b00 ........symlink.
0230: 0600 0000 0000 0000 7461 7267 6574 0000 ........target..
0240: 1300 0000 0000 0000 2e2e 2f30 312d 616e ........../01-an
0250: 2d65 6d70 7479 2d66 696c 6500 0000 0000 -empty-file.....
0260: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0270: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0280: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0290: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
02a0: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
02b0: 0a00 0000 0000 0000 6d6f 7265 2d64 6570 ........more-dep
02c0: 7468 0000 0000 0000 0400 0000 0000 0000 th..............
02d0: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
02e0: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
02f0: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0300: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
0310: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0320: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0330: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0340: 0f00 0000 0000 0000 6465 6570 2d65 6d70 ........deep-emp
0350: 7479 2d66 696c 6500 0400 0000 0000 0000 ty-file.........
0360: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0370: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0380: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0390: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
03a0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
03b0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03c0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03d0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03e0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03f0: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0400: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0410: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0420: 0a00 0000 0000 0000 736d 616c 6c2d 6669 ........small-fi
0430: 6c65 0000 0000 0000 0400 0000 0000 0000 le..............
0440: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0450: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0460: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0470: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
0480: 636f 6e74 656e 7473 1500 0000 0000 0000 contents........
0490: 5468 6973 2069 7320 6120 7465 7374 2066 This is a test f
04a0: 696c 652e 0a00 0000 0100 0000 0000 0000 ile.............
04b0: 2900 0000 0000 0000 0100 0000 0000 0000 )...............
04c0: 2900 0000 0000 0000 0100 0000 0000 0000 )...............
04d0: 2900 0000 0000 0000 0100 0000 0000 0000 )...............
04e0: 2900 0000 0000 0000 0500 0000 0000 0000 )...............
04f0: 656e 7472 7900 0000 0100 0000 0000 0000 entry...........
0500: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0510: 6e61 6d65 0000 0000 1600 0000 0000 0000 name............
0520: 3033 2d65 7865 6375 7461 626c 652d 6669 03-executable-fi
0530: 6c65 2e65 7865 0000 0400 0000 0000 0000 le.exe..........
0540: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0550: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0560: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0570: 7265 6775 6c61 7200 0a00 0000 0000 0000 regular.........
0580: 6578 6563 7574 6162 6c65 0000 0000 0000 executable......
0590: 0000 0000 0000 0000 0800 0000 0000 0000 ................
05a0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
05b0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
05c0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
05d0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
"###);
let enc = Encoder::new("test-data/07-nested-dirs.in").unwrap();
let expected = File::open("test-data/07-nested-dirs.nar").unwrap();
assert_matches!(readers_equal(enc, expected), Ok(()))
}
#[cfg_attr(not(target_family = "windows"), test)]
fn small_buffer() {
let mut enc = Encoder::new("test-data/07-nested-dirs.in").unwrap();
let mut buf: [u8; 4096] = [0; 4096];
let mut bytes_read = 0;
loop {
let mut small_buf = [0; 1];
match enc.read(&mut small_buf).unwrap() {
0 => break,
n => {
buf[bytes_read..bytes_read + n].copy_from_slice(&small_buf[..n]);
bytes_read += n;
}
}
}
assert_snapshot!(hex_print(&buf[..bytes_read]), @r###"
0000: 0d00 0000 0000 0000 6e69 782d 6172 6368 ........nix-arch
0010: 6976 652d 3100 0000 0100 0000 0000 0000 ive-1...........
0020: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0030: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0040: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
0050: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0060: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0070: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0080: 1000 0000 0000 0000 3031 2d61 6e2d 656d ........01-an-em
0090: 7074 792d 6669 6c65 0400 0000 0000 0000 pty-file........
00a0: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
00b0: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
00c0: 7479 7065 0000 0000 0700 0000 0000 0000 type............
00d0: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
00e0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
00f0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0100: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0110: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0120: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0130: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0140: 0b00 0000 0000 0000 3032 2d73 6f6d 652d ........02-some-
0150: 6469 7200 0000 0000 0400 0000 0000 0000 dir.............
0160: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0170: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0180: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0190: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
01a0: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
01b0: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
01c0: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
01d0: 1500 0000 0000 0000 6c69 6e6b 2d74 6f2d ........link-to-
01e0: 616e 2d65 6d70 7479 2d66 696c 6500 0000 an-empty-file...
01f0: 0400 0000 0000 0000 6e6f 6465 0000 0000 ........node....
0200: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0210: 0400 0000 0000 0000 7479 7065 0000 0000 ........type....
0220: 0700 0000 0000 0000 7379 6d6c 696e 6b00 ........symlink.
0230: 0600 0000 0000 0000 7461 7267 6574 0000 ........target..
0240: 1300 0000 0000 0000 2e2e 2f30 312d 616e ........../01-an
0250: 2d65 6d70 7479 2d66 696c 6500 0000 0000 -empty-file.....
0260: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0270: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0280: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0290: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
02a0: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
02b0: 0a00 0000 0000 0000 6d6f 7265 2d64 6570 ........more-dep
02c0: 7468 0000 0000 0000 0400 0000 0000 0000 th..............
02d0: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
02e0: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
02f0: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0300: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
0310: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0320: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0330: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0340: 0f00 0000 0000 0000 6465 6570 2d65 6d70 ........deep-emp
0350: 7479 2d66 696c 6500 0400 0000 0000 0000 ty-file.........
0360: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0370: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0380: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0390: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
03a0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
03b0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03c0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03d0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03e0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03f0: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0400: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0410: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0420: 0a00 0000 0000 0000 736d 616c 6c2d 6669 ........small-fi
0430: 6c65 0000 0000 0000 0400 0000 0000 0000 le..............
0440: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0450: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0460: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0470: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
0480: 636f 6e74 656e 7473 1500 0000 0000 0000 contents........
0490: 5468 6973 2069 7320 6120 7465 7374 2066 This is a test f
04a0: 696c 652e 0a00 0000 0100 0000 0000 0000 ile.............
04b0: 2900 0000 0000 0000 0100 0000 0000 0000 )...............
04c0: 2900 0000 0000 0000 0100 0000 0000 0000 )...............
04d0: 2900 0000 0000 0000 0100 0000 0000 0000 )...............
04e0: 2900 0000 0000 0000 0500 0000 0000 0000 )...............
04f0: 656e 7472 7900 0000 0100 0000 0000 0000 entry...........
0500: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0510: 6e61 6d65 0000 0000 1600 0000 0000 0000 name............
0520: 3033 2d65 7865 6375 7461 626c 652d 6669 03-executable-fi
0530: 6c65 2e65 7865 0000 0400 0000 0000 0000 le.exe..........
0540: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0550: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0560: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0570: 7265 6775 6c61 7200 0a00 0000 0000 0000 regular.........
0580: 6578 6563 7574 6162 6c65 0000 0000 0000 executable......
0590: 0000 0000 0000 0000 0800 0000 0000 0000 ................
05a0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
05b0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
05c0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
05d0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
"###);
let enc = Encoder::new("test-data/07-nested-dirs.in").unwrap();
let expected = File::open("test-data/07-nested-dirs.nar").unwrap();
assert_matches!(readers_equal(enc, expected), Ok(()))
}
#[cfg_attr(not(target_family = "windows"), test)]
fn read_to_end() {
let mut enc = Encoder::builder("test-data/07-nested-dirs.in")
.internal_buffer_size(200)
.build()
.unwrap();
let mut buf = Vec::with_capacity(0);
enc.read_to_end(&mut buf).unwrap();
assert_snapshot!(hex_print(&buf), @r###"
0000: 0d00 0000 0000 0000 6e69 782d 6172 6368 ........nix-arch
0010: 6976 652d 3100 0000 0100 0000 0000 0000 ive-1...........
0020: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0030: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0040: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
0050: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0060: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0070: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0080: 1000 0000 0000 0000 3031 2d61 6e2d 656d ........01-an-em
0090: 7074 792d 6669 6c65 0400 0000 0000 0000 pty-file........
00a0: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
00b0: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
00c0: 7479 7065 0000 0000 0700 0000 0000 0000 type............
00d0: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
00e0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
00f0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0100: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0110: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0120: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0130: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0140: 0b00 0000 0000 0000 3032 2d73 6f6d 652d ........02-some-
0150: 6469 7200 0000 0000 0400 0000 0000 0000 dir.............
0160: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0170: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0180: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0190: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
01a0: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
01b0: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
01c0: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
01d0: 1500 0000 0000 0000 6c69 6e6b 2d74 6f2d ........link-to-
01e0: 616e 2d65 6d70 7479 2d66 696c 6500 0000 an-empty-file...
01f0: 0400 0000 0000 0000 6e6f 6465 0000 0000 ........node....
0200: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0210: 0400 0000 0000 0000 7479 7065 0000 0000 ........type....
0220: 0700 0000 0000 0000 7379 6d6c 696e 6b00 ........symlink.
0230: 0600 0000 0000 0000 7461 7267 6574 0000 ........target..
0240: 1300 0000 0000 0000 2e2e 2f30 312d 616e ........../01-an
0250: 2d65 6d70 7479 2d66 696c 6500 0000 0000 -empty-file.....
0260: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0270: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
0280: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0290: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
02a0: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
02b0: 0a00 0000 0000 0000 6d6f 7265 2d64 6570 ........more-dep
02c0: 7468 0000 0000 0000 0400 0000 0000 0000 th..............
02d0: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
02e0: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
02f0: 7479 7065 0000 0000 0900 0000 0000 0000 type............
0300: 6469 7265 6374 6f72 7900 0000 0000 0000 directory.......
0310: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0320: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0330: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0340: 0f00 0000 0000 0000 6465 6570 2d65 6d70 ........deep-emp
0350: 7479 2d66 696c 6500 0400 0000 0000 0000 ty-file.........
0360: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0370: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0380: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0390: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
03a0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
03b0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03c0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03d0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03e0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
03f0: 0500 0000 0000 0000 656e 7472 7900 0000 ........entry...
0400: 0100 0000 0000 0000 2800 0000 0000 0000 ........(.......
0410: 0400 0000 0000 0000 6e61 6d65 0000 0000 ........name....
0420: 0a00 0000 0000 0000 736d 616c 6c2d 6669 ........small-fi
0430: 6c65 0000 0000 0000 0400 0000 0000 0000 le..............
0440: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0450: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0460: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0470: 7265 6775 6c61 7200 0800 0000 0000 0000 regular.........
0480: 636f 6e74 656e 7473 1500 0000 0000 0000 contents........
0490: 5468 6973 2069 7320 6120 7465 7374 2066 This is a test f
04a0: 696c 652e 0a00 0000 0100 0000 0000 0000 ile.............
04b0: 2900 0000 0000 0000 0100 0000 0000 0000 )...............
04c0: 2900 0000 0000 0000 0100 0000 0000 0000 )...............
04d0: 2900 0000 0000 0000 0100 0000 0000 0000 )...............
04e0: 2900 0000 0000 0000 0500 0000 0000 0000 )...............
04f0: 656e 7472 7900 0000 0100 0000 0000 0000 entry...........
0500: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0510: 6e61 6d65 0000 0000 1600 0000 0000 0000 name............
0520: 3033 2d65 7865 6375 7461 626c 652d 6669 03-executable-fi
0530: 6c65 2e65 7865 0000 0400 0000 0000 0000 le.exe..........
0540: 6e6f 6465 0000 0000 0100 0000 0000 0000 node............
0550: 2800 0000 0000 0000 0400 0000 0000 0000 (...............
0560: 7479 7065 0000 0000 0700 0000 0000 0000 type............
0570: 7265 6775 6c61 7200 0a00 0000 0000 0000 regular.........
0580: 6578 6563 7574 6162 6c65 0000 0000 0000 executable......
0590: 0000 0000 0000 0000 0800 0000 0000 0000 ................
05a0: 636f 6e74 656e 7473 0000 0000 0000 0000 contents........
05b0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
05c0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
05d0: 0100 0000 0000 0000 2900 0000 0000 0000 ........).......
"###);
let enc = Encoder::new("test-data/07-nested-dirs.in").unwrap();
let expected = File::open("test-data/07-nested-dirs.nar").unwrap();
assert_matches!(readers_equal(enc, expected), Ok(()))
}
fn enc_and_print(path: &str) -> Result<String, anyhow::Error> {
let mut enc = Encoder::new(path).unwrap();
let mut buf: [u8; 4096] = [0; 4096];
let mut bytes_read = 0;
loop {
match enc.read(&mut buf[bytes_read..])? {
0 => break,
n => bytes_read += n,
}
}
Ok(hex_print(&buf[..bytes_read]))
}
fn hex_print(buf: &[u8]) -> String {
let cfg = HexConfig {
title: false,
width: 16,
group: 0,
chunk: 2,
..HexConfig::default()
};
config_hex(&buf.to_vec(), cfg)
}
fn readers_equal<R1: Read, R2: Read>(
reader1: R1,
reader2: R2,
) -> Result<(), anyhow::Error> {
let mut reader1 = BufReader::new(reader1);
let mut reader2 = BufReader::new(reader2);
let mut buf1: [u8; 128] = [0; 128];
let mut buf2: [u8; 128] = [0; 128];
let mut bytes_read = 0;
loop {
let len = reader1.read(&mut buf1)?;
if len == 0 {
let len = reader2.read(&mut buf2)?;
if len > 0 {
bail!("trailing data in second reader: {:?}", buf2);
}
break;
}
reader2.read_exact(&mut buf2[..len])?;
for i in 0..len - 1 {
if buf1[i] != buf2[i] {
println!("Mismatch with expected file!");
println!("Encoded:\n{}", hex_print(&buf1[..len]));
println!("File:\n{}", hex_print(&buf2[..len]));
bail!(
"data mismatch at {} ({} in this buf): {:?} != {:?}",
bytes_read + i,
i,
buf1,
buf2
)
}
}
bytes_read += len;
}
Ok(())
}