jm

Odin for scripts: small packages and a runner, on core: only
Log | Files | Refs | README

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 }