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}