Merge branch 'master' of git.curoverse.com:arvados into 3408-production-datamanager
[arvados.git] / sdk / go / 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 expectLocatorPatternFail(t *testing.T, s string) {
78         if LocatorPattern.MatchString(s) {
79                 t.Fatalf("Expected \"%s\" to fail locator pattern but it passed.",
80                         s)
81         }
82 }
83
84 func TestLocatorPatternBasic(t *testing.T) {
85         expectLocatorPatternMatch(t, "12345678901234567890123456789012+12345")
86         expectLocatorPatternMatch(t, "A2345678901234abcdefababdeffdfdf+12345")
87         expectLocatorPatternMatch(t, "12345678901234567890123456789012+12345+A1")
88         expectLocatorPatternMatch(t,
89                 "12345678901234567890123456789012+12345+A1+B123wxyz@_-")
90         expectLocatorPatternMatch(t,
91                 "12345678901234567890123456789012+12345+A1+B123wxyz@_-+C@")
92
93         expectLocatorPatternFail(t,  "12345678901234567890123456789012")
94         expectLocatorPatternFail(t,  "12345678901234567890123456789012+")
95         expectLocatorPatternFail(t,  "12345678901234567890123456789012+12345+")
96         expectLocatorPatternFail(t,  "1234567890123456789012345678901+12345")
97         expectLocatorPatternFail(t,  "123456789012345678901234567890123+12345")
98         expectLocatorPatternFail(t,  "g2345678901234abcdefababdeffdfdf+12345")
99         expectLocatorPatternFail(t,  "12345678901234567890123456789012+12345 ")
100         expectLocatorPatternFail(t,  "12345678901234567890123456789012+12345+1")
101         expectLocatorPatternFail(t,  "12345678901234567890123456789012+12345+1A")
102         expectLocatorPatternFail(t,  "12345678901234567890123456789012+12345+A")
103         expectLocatorPatternFail(t,  "12345678901234567890123456789012+12345+a1")
104         expectLocatorPatternFail(t,  "12345678901234567890123456789012+12345+A1+")
105         expectLocatorPatternFail(t,  "12345678901234567890123456789012+12345+A1+B")
106         expectLocatorPatternFail(t,  "12345678901234567890123456789012+12345+A+B2")
107 }
108
109 func TestParseManifestLineSimple(t *testing.T) {
110         m := parseManifestLine(". 365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf 0:2310:qr1hi-8i9sb-ienvmpve1a0vpoi.log.txt")
111         expectManifestLine(t, m, ManifestLine{StreamName: ".",
112                 Blocks: []string{"365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf"},
113                 Files: []string{"0:2310:qr1hi-8i9sb-ienvmpve1a0vpoi.log.txt"}})
114 }
115
116 func TestParseBlockLocatorSimple(t *testing.T) {
117         b, err := parseBlockLocator("365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf")
118         if err != nil {
119                 t.Fatalf("Unexpected error parsing block locator: %v", err)
120         }
121         expectBlockLocator(t, b, BlockLocator{Digest: "365f83f5f808896ec834c8b595288735",
122                 Size: 2310,
123                 Hints: []string{"K@qr1hi",
124                         "Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf"}})
125 }