9 func getStackTrace() (string) {
10 buf := make([]byte, 1000)
11 bytes_written := runtime.Stack(buf, false)
12 return "Stack Trace:\n" + string(buf[:bytes_written])
15 func expectFromChannel(t *testing.T, c <-chan string, expected string) {
18 t.Fatalf("Expected to receive %s but channel was closed. %s",
22 if actual != expected {
23 t.Fatalf("Expected %s but got %s instead. %s",
30 func expectChannelClosed(t *testing.T, c <-chan interface{}) {
33 t.Fatalf("Expected channel to be closed, but received %v instead. %s",
39 func expectEqual(t *testing.T, actual interface{}, expected interface{}) {
40 if actual != expected {
41 t.Fatalf("Expected %v but received %v instead. %s",
48 func expectStringSlicesEqual(t *testing.T, actual []string, expected []string) {
49 if len(actual) != len(expected) {
50 t.Fatalf("Expected %v (length %d), but received %v (length %d) instead. %s", expected, len(expected), actual, len(actual), getStackTrace())
52 for i := range actual {
53 if actual[i] != expected[i] {
54 t.Fatalf("Expected %v but received %v instead (first disagreement at position %d). %s", expected, actual, i, getStackTrace())
59 func expectManifestLine(t *testing.T, actual ManifestLine, expected ManifestLine) {
60 expectEqual(t, actual.StreamName, expected.StreamName)
61 expectStringSlicesEqual(t, actual.Blocks, expected.Blocks)
62 expectStringSlicesEqual(t, actual.Files, expected.Files)
65 func expectBlockLocator(t *testing.T, actual BlockLocator, expected BlockLocator) {
66 expectEqual(t, actual.Digest, expected.Digest)
67 expectEqual(t, actual.Size, expected.Size)
68 expectStringSlicesEqual(t, actual.Hints, expected.Hints)
71 func expectLocatorPatternMatch(t *testing.T, s string) {
72 if !LocatorPattern.MatchString(s) {
73 t.Fatalf("Expected \"%s\" to match locator pattern but it did not.",
78 func expectLocatorPatternFail(t *testing.T, s string) {
79 if LocatorPattern.MatchString(s) {
80 t.Fatalf("Expected \"%s\" to fail locator pattern but it passed.",
85 func TestLocatorPatternBasic(t *testing.T) {
86 expectLocatorPatternMatch(t, "12345678901234567890123456789012+12345")
87 expectLocatorPatternMatch(t, "A2345678901234abcdefababdeffdfdf+12345")
88 expectLocatorPatternMatch(t, "12345678901234567890123456789012+12345+A1")
89 expectLocatorPatternMatch(t,
90 "12345678901234567890123456789012+12345+A1+B123wxyz@_-")
91 expectLocatorPatternMatch(t,
92 "12345678901234567890123456789012+12345+A1+B123wxyz@_-+C@")
94 expectLocatorPatternFail(t, "12345678901234567890123456789012")
95 expectLocatorPatternFail(t, "12345678901234567890123456789012+")
96 expectLocatorPatternFail(t, "12345678901234567890123456789012+12345+")
97 expectLocatorPatternFail(t, "1234567890123456789012345678901+12345")
98 expectLocatorPatternFail(t, "123456789012345678901234567890123+12345")
99 expectLocatorPatternFail(t, "g2345678901234abcdefababdeffdfdf+12345")
100 expectLocatorPatternFail(t, "12345678901234567890123456789012+12345 ")
101 expectLocatorPatternFail(t, "12345678901234567890123456789012+12345+1")
102 expectLocatorPatternFail(t, "12345678901234567890123456789012+12345+1A")
103 expectLocatorPatternFail(t, "12345678901234567890123456789012+12345+A")
104 expectLocatorPatternFail(t, "12345678901234567890123456789012+12345+a1")
105 expectLocatorPatternFail(t, "12345678901234567890123456789012+12345+A1+")
106 expectLocatorPatternFail(t, "12345678901234567890123456789012+12345+A1+B")
107 expectLocatorPatternFail(t, "12345678901234567890123456789012+12345+A+B2")
110 func TestParseManifestLineSimple(t *testing.T) {
111 m := parseManifestLine(". 365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf 0:2310:qr1hi-8i9sb-ienvmpve1a0vpoi.log.txt")
112 expectManifestLine(t, m, ManifestLine{StreamName: ".",
113 Blocks: []string{"365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf"},
114 Files: []string{"0:2310:qr1hi-8i9sb-ienvmpve1a0vpoi.log.txt"}})
117 func TestParseBlockLocatorSimple(t *testing.T) {
118 b, err := parseBlockLocator("365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf")
120 t.Fatalf("Unexpected error parsing block locator: %v", err)
122 expectBlockLocator(t, b, BlockLocator{Digest: "365f83f5f808896ec834c8b595288735",
124 Hints: []string{"K@qr1hi",
125 "Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf"}})
128 func TestLineIterShortManifestWithBlankLines(t *testing.T) {
129 content, err := ioutil.ReadFile("testdata/short_manifest")
131 t.Fatalf("Unexpected error reading manifest from file: %v", err)
133 manifest := Manifest{string(content)}
134 lineIter := manifest.LineIter()
136 firstLine := <-lineIter
137 expectManifestLine(t,
139 ManifestLine{StreamName: ".",
140 Blocks: []string{"b746e3d2104645f2f64cd3cc69dd895d+15693477+E2866e643690156651c03d876e638e674dcd79475@5441920c"},
141 Files: []string{"0:15893477:chr10_band0_s0_e3000000.fj"}})
143 received, ok := <- lineIter
145 t.Fatalf("Expected lineIter to be closed, but received %v instead.",
150 func TestBlockIterLongManifest(t *testing.T) {
151 content, err := ioutil.ReadFile("testdata/long_manifest")
153 t.Fatalf("Unexpected error reading manifest from file: %v", err)
155 manifest := Manifest{string(content)}
156 blockChannel := manifest.BlockIterWithDuplicates()
158 firstBlock := <-blockChannel
159 expectBlockLocator(t,
161 BlockLocator{Digest: "b746e3d2104645f2f64cd3cc69dd895d",
163 Hints: []string{"E2866e643690156651c03d876e638e674dcd79475@5441920c"}})
165 var lastBlock BlockLocator
166 for lastBlock = range blockChannel {
167 //log.Printf("Blocks Read: %d", blocksRead)
170 expectEqual(t, blocksRead, 853)
172 expectBlockLocator(t,
174 BlockLocator{Digest: "f9ce82f59e5908d2d70e18df9679b469",
176 Hints: []string{"E53f903684239bcc114f7bf8ff9bd6089f33058db@5441920c"}})