Merge branch '7241-azure-blob-volume' closes #7241
[arvados.git] / sdk / go / manifest / manifest_test.go
1 package manifest
2
3 import (
4         "git.curoverse.com/arvados.git/sdk/go/blockdigest"
5         "io/ioutil"
6         "runtime"
7         "testing"
8 )
9
10 func getStackTrace() string {
11         buf := make([]byte, 1000)
12         bytes_written := runtime.Stack(buf, false)
13         return "Stack Trace:\n" + string(buf[:bytes_written])
14 }
15
16 func expectFromChannel(t *testing.T, c <-chan string, expected string) {
17         actual, ok := <-c
18         if !ok {
19                 t.Fatalf("Expected to receive %s but channel was closed. %s",
20                         expected,
21                         getStackTrace())
22         }
23         if actual != expected {
24                 t.Fatalf("Expected %s but got %s instead. %s",
25                         expected,
26                         actual,
27                         getStackTrace())
28         }
29 }
30
31 func expectChannelClosed(t *testing.T, c <-chan interface{}) {
32         received, ok := <-c
33         if ok {
34                 t.Fatalf("Expected channel to be closed, but received %v instead. %s",
35                         received,
36                         getStackTrace())
37         }
38 }
39
40 func expectEqual(t *testing.T, actual interface{}, expected interface{}) {
41         if actual != expected {
42                 t.Fatalf("Expected %v but received %v instead. %s",
43                         expected,
44                         actual,
45                         getStackTrace())
46         }
47 }
48
49 func expectStringSlicesEqual(t *testing.T, actual []string, expected []string) {
50         if len(actual) != len(expected) {
51                 t.Fatalf("Expected %v (length %d), but received %v (length %d) instead. %s", expected, len(expected), actual, len(actual), getStackTrace())
52         }
53         for i := range actual {
54                 if actual[i] != expected[i] {
55                         t.Fatalf("Expected %v but received %v instead (first disagreement at position %d). %s", expected, actual, i, getStackTrace())
56                 }
57         }
58 }
59
60 func expectManifestStream(t *testing.T, actual ManifestStream, expected ManifestStream) {
61         expectEqual(t, actual.StreamName, expected.StreamName)
62         expectStringSlicesEqual(t, actual.Blocks, expected.Blocks)
63         expectStringSlicesEqual(t, actual.Files, expected.Files)
64 }
65
66 func expectBlockLocator(t *testing.T, actual blockdigest.BlockLocator, expected blockdigest.BlockLocator) {
67         expectEqual(t, actual.Digest, expected.Digest)
68         expectEqual(t, actual.Size, expected.Size)
69         expectStringSlicesEqual(t, actual.Hints, expected.Hints)
70 }
71
72 func TestParseManifestStreamSimple(t *testing.T) {
73         m := parseManifestStream(". 365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf 0:2310:qr1hi-8i9sb-ienvmpve1a0vpoi.log.txt")
74         expectManifestStream(t, m, ManifestStream{StreamName: ".",
75                 Blocks: []string{"365f83f5f808896ec834c8b595288735+2310+K@qr1hi+Af0c9a66381f3b028677411926f0be1c6282fe67c@542b5ddf"},
76                 Files:  []string{"0:2310:qr1hi-8i9sb-ienvmpve1a0vpoi.log.txt"}})
77 }
78
79 func TestStreamIterShortManifestWithBlankStreams(t *testing.T) {
80         content, err := ioutil.ReadFile("testdata/short_manifest")
81         if err != nil {
82                 t.Fatalf("Unexpected error reading manifest from file: %v", err)
83         }
84         manifest := Manifest{string(content)}
85         streamIter := manifest.StreamIter()
86
87         firstStream := <-streamIter
88         expectManifestStream(t,
89                 firstStream,
90                 ManifestStream{StreamName: ".",
91                         Blocks: []string{"b746e3d2104645f2f64cd3cc69dd895d+15693477+E2866e643690156651c03d876e638e674dcd79475@5441920c"},
92                         Files:  []string{"0:15893477:chr10_band0_s0_e3000000.fj"}})
93
94         received, ok := <-streamIter
95         if ok {
96                 t.Fatalf("Expected streamIter to be closed, but received %v instead.",
97                         received)
98         }
99 }
100
101 func TestBlockIterLongManifest(t *testing.T) {
102         content, err := ioutil.ReadFile("testdata/long_manifest")
103         if err != nil {
104                 t.Fatalf("Unexpected error reading manifest from file: %v", err)
105         }
106         manifest := Manifest{string(content)}
107         blockChannel := manifest.BlockIterWithDuplicates()
108
109         firstBlock := <-blockChannel
110         expectBlockLocator(t,
111                 firstBlock,
112                 blockdigest.BlockLocator{Digest: blockdigest.AssertFromString("b746e3d2104645f2f64cd3cc69dd895d"),
113                         Size:  15693477,
114                         Hints: []string{"E2866e643690156651c03d876e638e674dcd79475@5441920c"}})
115         blocksRead := 1
116         var lastBlock blockdigest.BlockLocator
117         for lastBlock = range blockChannel {
118                 //log.Printf("Blocks Read: %d", blocksRead)
119                 blocksRead++
120         }
121         expectEqual(t, blocksRead, 853)
122
123         expectBlockLocator(t,
124                 lastBlock,
125                 blockdigest.BlockLocator{Digest: blockdigest.AssertFromString("f9ce82f59e5908d2d70e18df9679b469"),
126                         Size:  31367794,
127                         Hints: []string{"E53f903684239bcc114f7bf8ff9bd6089f33058db@5441920c"}})
128 }