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