internal/gitutil/batch_test.go

53 lines · 1620 bytes

1 symbol in this file
 1package gitutil
 2
 3import (
 4	"os"
 5	"os/exec"
 6	"strings"
 7	"testing"
 8)
 9
10func TestBlobBatch(t *testing.T) {
11	dir := t.TempDir()
12	run := func(stdin string, args ...string) string {
13		t.Helper()
14		cmd := exec.Command("git", append([]string{"-C", dir}, args...)...)
15		cmd.Env = append(os.Environ(), "GIT_CONFIG_GLOBAL=/dev/null", "GIT_CONFIG_NOSYSTEM=1")
16		cmd.Stdin = strings.NewReader(stdin)
17		out, err := cmd.CombinedOutput()
18		if err != nil {
19			t.Fatalf("git %v: %v\n%s", args, err, out)
20		}
21		return strings.TrimSpace(string(out))
22	}
23	run("", "init", "-q", "--bare")
24	a := run("one\ntwo", "hash-object", "-w", "--stdin")
25	b := run("", "hash-object", "-w", "--stdin")
26	tree := run("100644 blob "+a+"\tf\n", "mktree")
27	batch, err := NewBlobBatch(dir)
28	if err != nil {
29		t.Fatal(err)
30	}
31	defer batch.Close()
32	for _, c := range []struct{ oid, want string }{{a, "one\ntwo"}, {b, ""}, {a, "one\ntwo"}} {
33		got, err := batch.Read(c.oid, 100)
34		if err != nil || string(got) != c.want {
35			t.Fatalf("Read(%s) = %q, %v; want %q", c.oid, got, err, c.want)
36		}
37	}
38	if _, err := batch.Read(a, 3); err == nil {
39		t.Error("a blob over the limit was read")
40	}
41	if got, err := batch.Read(b, 100); err != nil || string(got) != "" {
42		t.Fatalf("read after a blob over the limit = %q, %v", got, err)
43	}
44	if _, err := batch.Read(tree, 100); err == nil {
45		t.Error("a tree was read as a blob")
46	}
47	if _, err := batch.Read(strings.Repeat("0", 40), 100); err == nil {
48		t.Error("a missing object was read")
49	}
50	if got, err := batch.Read(a, 100); err != nil || string(got) != "one\ntwo" {
51		t.Fatalf("read after refusals = %q, %v", got, err)
52	}
53}