8 func getStackTrace() (string) {
9 buf := make([]byte, 1000)
10 bytes_written := runtime.Stack(buf, false)
11 return "Stack Trace:\n" + string(buf[:bytes_written])
14 func expectFromChannel(t *testing.T, c <-chan string, expected string) {
17 t.Fatalf("Expected to receive %s but channel was closed. %s",
21 if actual != expected {
22 t.Fatalf("Expected %s but got %s instead. %s",
29 func expectChannelClosed(t *testing.T, c <-chan interface{}) {
32 t.Fatalf("Expected channel to be closed, but received %v instead. %s",
38 func expectEqual(t *testing.T, actual interface{}, expected interface{}) {
39 if actual != expected {
40 t.Fatalf("Expected %v but received %v instead. %s",
47 func expectStringSlicesEqual(t *testing.T, actual []string, expected []string) {
48 if len(actual) != len(expected) {
49 t.Fatalf("Expected %v (length %d), but received %v (length %d) instead. %s", expected, len(expected), actual, len(actual), getStackTrace())
51 for i := range actual {
52 if actual[i] != expected[i] {
53 t.Fatalf("Expected %v but received %v instead (first disagreement at position %d). %s", expected, actual, i, getStackTrace())
58 func expectManifestLine(t *testing.T, actual ManifestLine, expected ManifestLine) {
59 expectEqual(t, actual.streamName, expected.streamName)
60 expectStringSlicesEqual(t, actual.blocks, expected.blocks)
61 expectStringSlicesEqual(t, actual.files, expected.files)
64 func expectBlockLocator(t *testing.T, actual BlockLocator, expected BlockLocator) {
65 expectEqual(t, actual.digest, expected.digest)
66 expectEqual(t, actual.size, expected.size)
67 expectStringSlicesEqual(t, actual.hints, expected.hints)
70 func expectLocatorPatternMatch(t *testing.T, s string) {
71 if !locatorPattern.MatchString(s) {
72 t.Fatalf("Expected \"%s\" to match locator pattern but it did not.",
77 func TestLocatorPatternBasic(t *testing.T) {
78 expectLocatorPatternMatch(t, "12345678901234567890123456789012+12345")
81 func TestParseManifestLineSimple(t *testing.T) {
82 m := parseManifestLine(". 365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf 0:2310:qr1hi-8i9sb-ienvmpve1a0vpoi.log.txt")
83 expectManifestLine(t, m, ManifestLine{streamName: ".",
84 blocks: []string{"365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf"},
85 files: []string{"0:2310:qr1hi-8i9sb-ienvmpve1a0vpoi.log.txt"}})
88 func TestParseBlockLocatorSimple(t *testing.T) {
89 b, err := parseBlockLocator("365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf")
91 t.Fatalf("Unexpected error parsing block locator: %v", err)
93 expectBlockLocator(t, b, BlockLocator{digest: "365f83f5f808896ec834c8b595288735",
95 hints: []string{"K@qr1hi",
96 "Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf"}})