1
2
3
4
5 package tlog
6
7 import (
8 "strings"
9 "testing"
10 )
11
12 func TestFormatTree(t *testing.T) {
13 n := int64(123456789012)
14 h := RecordHash([]byte("hello world"))
15 golden := "go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n"
16 b := FormatTree(Tree{n, h})
17 if string(b) != golden {
18 t.Errorf("FormatTree(...) = %q, want %q", b, golden)
19 }
20 }
21
22 func TestParseTree(t *testing.T) {
23 in := "go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n"
24 goldH := RecordHash([]byte("hello world"))
25 goldN := int64(123456789012)
26 tree, err := ParseTree([]byte(in))
27 if tree.N != goldN || tree.Hash != goldH || err != nil {
28 t.Fatalf("ParseTree(...) = Tree{%d, %v}, %v, want Tree{%d, %v}, nil", tree.N, tree.Hash, err, goldN, goldH)
29 }
30
31
32 var badTrees = []string{
33 "not-" + in,
34 "go.sum database tree\n0xabcdef\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n",
35 "go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBTOOBIG=\n",
36 }
37 for _, bad := range badTrees {
38 _, err := ParseTree([]byte(bad))
39 if err == nil {
40 t.Fatalf("ParseTree(%q) succeeded, want failure", in)
41 }
42 }
43
44
45 var goodTrees = []string{
46 in + "JOE",
47 in + "JOE\n",
48 in + strings.Repeat("JOE\n", 1000),
49 }
50 for _, good := range goodTrees {
51 _, err := ParseTree([]byte(good))
52 if tree.N != goldN || tree.Hash != goldH || err != nil {
53 t.Fatalf("ParseTree(...+%q) = Tree{%d, %v}, %v, want Tree{%d, %v}, nil", good[len(in):], tree.N, tree.Hash, err, goldN, goldH)
54 }
55 }
56 }
57
58 func TestFormatRecord(t *testing.T) {
59 id := int64(123456789012)
60 text := "hello, world\n"
61 golden := "123456789012\nhello, world\n\n"
62 msg, err := FormatRecord(id, []byte(text))
63 if err != nil {
64 t.Fatalf("FormatRecord: %v", err)
65 }
66 if string(msg) != golden {
67 t.Fatalf("FormatRecord(...) = %q, want %q", msg, golden)
68 }
69
70 var badTexts = []string{
71 "",
72 "hello\nworld",
73 "hello\n\nworld\n",
74 "hello\x01world\n",
75 }
76 for _, bad := range badTexts {
77 msg, err := FormatRecord(id, []byte(bad))
78 if err == nil {
79 t.Errorf("FormatRecord(id, %q) = %q, want error", bad, msg)
80 }
81 }
82 }
83
84 func TestParseRecord(t *testing.T) {
85 in := "123456789012\nhello, world\n\njunk on end\x01\xff"
86 goldID := int64(123456789012)
87 goldText := "hello, world\n"
88 goldRest := "junk on end\x01\xff"
89 id, text, rest, err := ParseRecord([]byte(in))
90 if id != goldID || string(text) != goldText || string(rest) != goldRest || err != nil {
91 t.Fatalf("ParseRecord(%q) = %d, %q, %q, %v, want %d, %q, %q, nil", in, id, text, rest, err, goldID, goldText, goldRest)
92 }
93
94 in = "123456789012\nhello, world\n\n"
95 id, text, rest, err = ParseRecord([]byte(in))
96 if id != goldID || string(text) != goldText || len(rest) != 0 || err != nil {
97 t.Fatalf("ParseRecord(%q) = %d, %q, %q, %v, want %d, %q, %q, nil", in, id, text, rest, err, goldID, goldText, "")
98 }
99 if rest == nil {
100 t.Fatalf("ParseRecord(%q): rest = []byte(nil), want []byte{}", in)
101 }
102
103
104 var badRecords = []string{
105 "not-" + in,
106 "123\nhello\x01world\n\n",
107 "123\nhello\xffworld\n\n",
108 "123\nhello world\n",
109 "0x123\nhello world\n\n",
110 }
111 for _, bad := range badRecords {
112 id, text, rest, err := ParseRecord([]byte(bad))
113 if err == nil {
114 t.Fatalf("ParseRecord(%q) = %d, %q, %q, nil, want error", in, id, text, rest)
115 }
116 }
117 }
118
119
120 func FuzzParseTree(f *testing.F) {
121 f.Add([]byte("go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n"))
122 f.Fuzz(func(t *testing.T, text []byte) {
123 ParseTree(text)
124 })
125 }
126
127
128 func FuzzParseRecord(f *testing.F) {
129 f.Add([]byte("12345\nhello\n\n"))
130 f.Fuzz(func(t *testing.T, msg []byte) {
131 ParseRecord(msg)
132 })
133 }
134
View as plain text