tar_test.odin (3889B)
1 package tar 2 3 import "core:os" 4 import "core:path/filepath" 5 import "core:strings" 6 import "core:testing" 7 import "jm:sh" 8 9 @(test) 10 git_archive_extracts_whole :: proc(t: ^testing.T) { 11 context.allocator = context.temp_allocator 12 temp := os.temp_directory(context.temp_allocator) or_else "" 13 root, err := os.make_directory_temp(temp, "jm-tar-*", context.temp_allocator) 14 testing.expect(t, err == nil) 15 defer os.remove_all(root) 16 git := proc(root: string, args: ..string) -> sh.Result { 17 argv := make([dynamic]string, context.temp_allocator) 18 append( 19 &argv, 20 "git", 21 "-c", 22 "user.email=t@t", 23 "-c", 24 "user.name=t", 25 "-c", 26 "commit.gpgsign=false", 27 ) 28 append(&argv, ..args) 29 return sh.exec(argv[:], {dir = root}, context.temp_allocator) 30 } 31 long := strings.repeat("deep/", 30) 32 testing.expect(t, git(root, "init", "-q").ok) 33 testing.expect( 34 t, 35 os.make_directory_all(filepath.join({root, long}, context.temp_allocator) or_else "") == 36 nil, 37 ) 38 testing.expect( 39 t, 40 os.write_entire_file( 41 filepath.join({root, "a.txt"}, context.temp_allocator) or_else "", 42 transmute([]byte)string("alpha\n"), 43 ) == 44 nil, 45 ) 46 testing.expect( 47 t, 48 os.make_directory_all(filepath.join({root, "sub"}, context.temp_allocator) or_else "") == 49 nil, 50 ) 51 testing.expect( 52 t, 53 os.write_entire_file( 54 filepath.join({root, "sub", "b.bin"}, context.temp_allocator) or_else "", 55 transmute([]byte)string("\x00\x01\x02"), 56 ) == 57 nil, 58 ) 59 testing.expect( 60 t, 61 os.write_entire_file( 62 filepath.join({root, long, "c.txt"}, context.temp_allocator) or_else "", 63 transmute([]byte)strings.repeat("x", 1000), 64 ) == 65 nil, 66 ) 67 testing.expect(t, git(root, "add", "-A").ok) 68 testing.expect(t, git(root, "commit", "-q", "-m", "seed").ok) 69 70 archive := git(root, "archive", "--format=tar", "HEAD") 71 testing.expect(t, archive.ok) 72 entries, read_err := read(transmute([]byte)archive.stdout) 73 testing.expect_value(t, read_err, Error.None) 74 names := make([dynamic]string, context.temp_allocator) 75 for e in entries { 76 if !e.dir { 77 append(&names, e.name) 78 } 79 } 80 testing.expect_value(t, len(names), 3) 81 82 dest, derr := os.make_directory_temp(temp, "jm-tar-out-*", context.temp_allocator) 83 testing.expect(t, derr == nil) 84 defer os.remove_all(dest) 85 count, xerr := extract(transmute([]byte)archive.stdout, dest) 86 testing.expect_value(t, xerr, Error.None) 87 testing.expect_value(t, count, 3) 88 a, _ := os.read_entire_file_from_path( 89 filepath.join({dest, "a.txt"}, context.temp_allocator) or_else "", 90 context.temp_allocator, 91 ) 92 testing.expect_value(t, string(a), "alpha\n") 93 b, _ := os.read_entire_file_from_path( 94 filepath.join({dest, "sub", "b.bin"}, context.temp_allocator) or_else "", 95 context.temp_allocator, 96 ) 97 testing.expect_value(t, string(b), "\x00\x01\x02") 98 c, cerr := os.read_entire_file_from_path( 99 filepath.join({dest, long, "c.txt"}, context.temp_allocator) or_else "", 100 context.temp_allocator, 101 ) 102 testing.expect(t, cerr == nil, "the long path was written") 103 testing.expect_value(t, string(c), strings.repeat("x", 1000)) 104 } 105 106 @(test) 107 headers_are_read_and_bad_ones_refused :: proc(t: ^testing.T) { 108 context.allocator = context.temp_allocator 109 n, ok := octal(transmute([]byte)string("00000000144\x00")) 110 testing.expect(t, ok) 111 testing.expect_value(t, n, 100) 112 n, ok = octal(transmute([]byte)string(" ")) 113 testing.expect(t, ok) 114 testing.expect_value(t, n, 0) 115 _, ok = octal(transmute([]byte)string("not octal!!!")) 116 testing.expect(t, !ok) 117 path, found := pax_path( 118 transmute([]byte)string("27 mtime=1700000000.123456\n16 path=x/y.txt\n"), 119 ) 120 testing.expect(t, found) 121 testing.expect_value(t, path, "x/y.txt") 122 _, err := read(transmute([]byte)strings.repeat("z", 512)) 123 testing.expect_value(t, err, Error.Bad_Header) 124 empty, eerr := read(transmute([]byte)strings.repeat("\x00", 1024)) 125 testing.expect_value(t, eerr, Error.None) 126 testing.expect_value(t, len(empty), 0) 127 }