Committing just to get some input on my Go Style.
[arvados.git] / services / datamanager / manifest / manifest_test.go
1 package manifest
2
3 import (
4         "runtime"
5         "testing"
6 )
7
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])
12 }
13
14 func expectFromChannel(t *testing.T, c <-chan string, expected string) {
15         actual, ok := <- c
16         if !ok {
17                 t.Fatalf("Expected to receive %s but channel was closed. %s",
18                         expected,
19                         getStackTrace())
20         }
21         if actual != expected {
22                 t.Fatalf("Expected %s but got %s instead. %s",
23                         expected,
24                         actual,
25                         getStackTrace())
26         }
27 }
28
29 func expectChannelClosed(t *testing.T, c <-chan interface{}) {
30         received, ok := <- c
31         if ok {
32                 t.Fatalf("Expected channel to be closed, but received %v instead. %s",
33                         received,
34                         getStackTrace())
35         }
36 }
37
38 func expectEqual(t *testing.T, actual interface{}, expected interface{}) {
39         if actual != expected {
40                 t.Fatalf("Expected %v but received %v instead. %s",
41                         expected,
42                         actual,
43                         getStackTrace())
44         }
45 }
46
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())
50         }
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())
54                 }
55         }
56 }
57
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)
62 }
63
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)
68 }
69
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.",
73                         s)
74         }
75 }
76
77 func TestLocatorPatternBasic(t *testing.T) {
78         expectLocatorPatternMatch(t, "12345678901234567890123456789012+12345")
79 }
80
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"}})
86 }
87
88 func TestParseBlockLocatorSimple(t *testing.T) {
89         b, err := parseBlockLocator("365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf")
90         if err != nil {
91                 t.Fatalf("Unexpected error parsing block locator: %v", err)
92         }
93         expectBlockLocator(t, b, BlockLocator{digest: "365f83f5f808896ec834c8b595288735",
94                 size: 2310,
95                 hints: []string{"K@qr1hi",
96                         "Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf"}})
97 }