| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package tlog |
| |
| import ( |
| "strings" |
| "testing" |
| ) |
| |
| func TestFormatTree(t *testing.T) { |
| n := int64(123456789012) |
| h := RecordHash([]byte("hello world")) |
| golden := "go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n" |
| b := FormatTree(Tree{n, h}) |
| if string(b) != golden { |
| t.Errorf("FormatTree(...) = %q, want %q", b, golden) |
| } |
| } |
| |
| func TestParseTree(t *testing.T) { |
| in := "go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n" |
| goldH := RecordHash([]byte("hello world")) |
| goldN := int64(123456789012) |
| tree, err := ParseTree([]byte(in)) |
| if tree.N != goldN || tree.Hash != goldH || err != nil { |
| t.Fatalf("ParseTree(...) = Tree{%d, %v}, %v, want Tree{%d, %v}, nil", tree.N, tree.Hash, err, goldN, goldH) |
| } |
| |
| // Check invalid trees. |
| var badTrees = []string{ |
| "not-" + in, |
| "go.sum database tree\n0xabcdef\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBb0=\n", |
| "go.sum database tree\n123456789012\nTszzRgjTG6xce+z2AG31kAXYKBgQVtCSCE40HmuwBTOOBIG=\n", |
| } |
| for _, bad := range badTrees { |
| _, err := ParseTree([]byte(bad)) |
| if err == nil { |
| t.Fatalf("ParseTree(%q) succeeded, want failure", in) |
| } |
| } |
| |
| // Check junk on end is ignored. |
| var goodTrees = []string{ |
| in + "JOE", |
| in + "JOE\n", |
| in + strings.Repeat("JOE\n", 1000), |
| } |
| for _, good := range goodTrees { |
| _, err := ParseTree([]byte(good)) |
| if tree.N != goldN || tree.Hash != goldH || err != nil { |
| t.Fatalf("ParseTree(...+%q) = Tree{%d, %v}, %v, want Tree{%d, %v}, nil", good[len(in):], tree.N, tree.Hash, err, goldN, goldH) |
| } |
| } |
| } |
| |
| func TestFormatRecord(t *testing.T) { |
| id := int64(123456789012) |
| text := "hello, world\n" |
| golden := "123456789012\nhello, world\n\n" |
| msg, err := FormatRecord(id, []byte(text)) |
| if err != nil { |
| t.Fatalf("FormatRecord: %v", err) |
| } |
| if string(msg) != golden { |
| t.Fatalf("FormatRecord(...) = %q, want %q", msg, golden) |
| } |
| |
| var badTexts = []string{ |
| "", |
| "hello\nworld", |
| "hello\n\nworld\n", |
| "hello\x01world\n", |
| } |
| for _, bad := range badTexts { |
| msg, err := FormatRecord(id, []byte(bad)) |
| if err == nil { |
| t.Errorf("FormatRecord(id, %q) = %q, want error", bad, msg) |
| } |
| } |
| } |
| |
| func TestParseRecord(t *testing.T) { |
| in := "123456789012\nhello, world\n\njunk on end\x01\xff" |
| goldID := int64(123456789012) |
| goldText := "hello, world\n" |
| goldRest := "junk on end\x01\xff" |
| id, text, rest, err := ParseRecord([]byte(in)) |
| if id != goldID || string(text) != goldText || string(rest) != goldRest || err != nil { |
| t.Fatalf("ParseRecord(%q) = %d, %q, %q, %v, want %d, %q, %q, nil", in, id, text, rest, err, goldID, goldText, goldRest) |
| } |
| |
| in = "123456789012\nhello, world\n\n" |
| id, text, rest, err = ParseRecord([]byte(in)) |
| if id != goldID || string(text) != goldText || len(rest) != 0 || err != nil { |
| t.Fatalf("ParseRecord(%q) = %d, %q, %q, %v, want %d, %q, %q, nil", in, id, text, rest, err, goldID, goldText, "") |
| } |
| if rest == nil { |
| t.Fatalf("ParseRecord(%q): rest = []byte(nil), want []byte{}", in) |
| } |
| |
| // Check invalid records. |
| var badRecords = []string{ |
| "not-" + in, |
| "123\nhello\x01world\n\n", |
| "123\nhello\xffworld\n\n", |
| "123\nhello world\n", |
| "0x123\nhello world\n\n", |
| } |
| for _, bad := range badRecords { |
| id, text, rest, err := ParseRecord([]byte(bad)) |
| if err == nil { |
| t.Fatalf("ParseRecord(%q) = %d, %q, %q, nil, want error", in, id, text, rest) |
| } |
| } |
| } |