// 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) } } }