Merge branch 'master' into wtsi-hgi-8087-arv-cli-request-body-from-file
[arvados.git] / sdk / go / crunchrunner / upload_test.go
1 package main
2
3 import (
4         "crypto/md5"
5         "errors"
6         "fmt"
7         . "gopkg.in/check.v1"
8         "io/ioutil"
9         "os"
10 )
11
12 type UploadTestSuite struct{}
13
14 // Gocheck boilerplate
15 var _ = Suite(&UploadTestSuite{})
16
17 type KeepTestClient struct {
18 }
19
20 func (k KeepTestClient) PutHB(hash string, buf []byte) (string, int, error) {
21         return fmt.Sprintf("%x+%v", md5.Sum(buf), len(buf)), len(buf), nil
22 }
23
24 func (s *TestSuite) TestSimpleUpload(c *C) {
25         tmpdir, _ := ioutil.TempDir("", "")
26         defer func() {
27                 os.RemoveAll(tmpdir)
28         }()
29
30         ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte("foo"), 0600)
31
32         str, err := WriteTree(KeepTestClient{}, tmpdir)
33         c.Check(err, IsNil)
34         c.Check(str, Equals, ". acbd18db4cc2f85cedef654fccc4a4d8+3 0:3:file1.txt\n")
35 }
36
37 func (s *TestSuite) TestSimpleUploadTwofiles(c *C) {
38         tmpdir, _ := ioutil.TempDir("", "")
39         defer func() {
40                 os.RemoveAll(tmpdir)
41         }()
42
43         ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte("foo"), 0600)
44         ioutil.WriteFile(tmpdir+"/"+"file2.txt", []byte("bar"), 0600)
45
46         str, err := WriteTree(KeepTestClient{}, tmpdir)
47         c.Check(err, IsNil)
48         c.Check(str, Equals, ". 3858f62230ac3c915f300c664312c63f+6 0:3:file1.txt 3:3:file2.txt\n")
49 }
50
51 func (s *TestSuite) TestSimpleUploadSubdir(c *C) {
52         tmpdir, _ := ioutil.TempDir("", "")
53         defer func() {
54                 os.RemoveAll(tmpdir)
55         }()
56
57         os.Mkdir(tmpdir+"/subdir", 0700)
58
59         ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte("foo"), 0600)
60         ioutil.WriteFile(tmpdir+"/subdir/file2.txt", []byte("bar"), 0600)
61
62         str, err := WriteTree(KeepTestClient{}, tmpdir)
63         c.Check(err, IsNil)
64         c.Check(str, Equals, `. acbd18db4cc2f85cedef654fccc4a4d8+3 0:3:file1.txt
65 ./subdir 37b51d194a7513e45b56f6524f2d51f2+3 0:3:file2.txt
66 `)
67 }
68
69 func (s *TestSuite) TestSimpleUploadLarge(c *C) {
70         tmpdir, _ := ioutil.TempDir("", "")
71         defer func() {
72                 os.RemoveAll(tmpdir)
73         }()
74
75         file, _ := os.Create(tmpdir + "/" + "file1.txt")
76         data := make([]byte, 1024*1024-1)
77         for i := range data {
78                 data[i] = byte(i % 10)
79         }
80         for i := 0; i < 65; i++ {
81                 file.Write(data)
82         }
83         file.Close()
84
85         ioutil.WriteFile(tmpdir+"/"+"file2.txt", []byte("bar"), 0600)
86
87         str, err := WriteTree(KeepTestClient{}, tmpdir)
88         c.Check(err, IsNil)
89         c.Check(str, Equals, ". 00ecf01e0d93385115c9f8bed757425d+67108864 485cd630387b6b1846fe429f261ea05f+1048514 0:68157375:file1.txt 68157375:3:file2.txt\n")
90 }
91
92 func (s *TestSuite) TestUploadEmptySubdir(c *C) {
93         tmpdir, _ := ioutil.TempDir("", "")
94         defer func() {
95                 os.RemoveAll(tmpdir)
96         }()
97
98         os.Mkdir(tmpdir+"/subdir", 0700)
99
100         ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte("foo"), 0600)
101
102         str, err := WriteTree(KeepTestClient{}, tmpdir)
103         c.Check(err, IsNil)
104         c.Check(str, Equals, `. acbd18db4cc2f85cedef654fccc4a4d8+3 0:3:file1.txt
105 `)
106 }
107
108 func (s *TestSuite) TestUploadEmptyFile(c *C) {
109         tmpdir, _ := ioutil.TempDir("", "")
110         defer func() {
111                 os.RemoveAll(tmpdir)
112         }()
113
114         ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte(""), 0600)
115
116         str, err := WriteTree(KeepTestClient{}, tmpdir)
117         c.Check(err, IsNil)
118         c.Check(str, Equals, `. d41d8cd98f00b204e9800998ecf8427e+0 0:0:file1.txt
119 `)
120 }
121
122 type KeepErrorTestClient struct {
123 }
124
125 func (k KeepErrorTestClient) PutHB(hash string, buf []byte) (string, int, error) {
126         return "", 0, errors.New("Failed!")
127 }
128
129 func (s *TestSuite) TestUploadError(c *C) {
130         tmpdir, _ := ioutil.TempDir("", "")
131         defer func() {
132                 os.RemoveAll(tmpdir)
133         }()
134
135         ioutil.WriteFile(tmpdir+"/"+"file1.txt", []byte("foo"), 0600)
136
137         str, err := WriteTree(KeepErrorTestClient{}, tmpdir)
138         c.Check(err, NotNil)
139         c.Check(str, Equals, "")
140 }