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