8784: Add keep-web directory listings via (*arvados.Collection)FileSystem().
[arvados.git] / sdk / go / arvados / collection_fs_test.go
1 package arvados
2
3 import (
4         "io"
5         "net/http"
6         "os"
7         "testing"
8
9         "git.curoverse.com/arvados.git/sdk/go/arvadostest"
10         check "gopkg.in/check.v1"
11 )
12
13 var _ = check.Suite(&CollectionFSSuite{})
14
15 type CollectionFSSuite struct {
16         client *Client
17         coll   Collection
18         fs     http.FileSystem
19 }
20
21 func (s *CollectionFSSuite) SetUpTest(c *check.C) {
22         s.client = NewClientFromEnv()
23         err := s.client.RequestAndDecode(&s.coll, "GET", "arvados/v1/collections/"+arvadostest.FooAndBarFilesInDirUUID, nil, nil)
24         c.Assert(err, check.IsNil)
25         s.fs = s.coll.FileSystem(s.client, nil)
26 }
27
28 func (s *CollectionFSSuite) TestReaddirFull(c *check.C) {
29         f, err := s.fs.Open("/dir1")
30         c.Assert(err, check.IsNil)
31
32         st, err := f.Stat()
33         c.Assert(err, check.IsNil)
34         c.Check(st.Size(), check.Equals, int64(2))
35         c.Check(st.IsDir(), check.Equals, true)
36
37         fis, err := f.Readdir(0)
38         c.Check(err, check.IsNil)
39         c.Check(len(fis), check.Equals, 2)
40         if len(fis) > 0 {
41                 c.Check(fis[0].Size(), check.Equals, int64(3))
42         }
43 }
44
45 func (s *CollectionFSSuite) TestReaddirLimited(c *check.C) {
46         f, err := s.fs.Open("./dir1")
47         c.Assert(err, check.IsNil)
48         for i := 0; i < 2; i++ {
49                 fis, err := f.Readdir(1)
50                 c.Check(err, check.IsNil)
51                 c.Check(len(fis), check.Equals, 1)
52                 if len(fis) > 0 {
53                         c.Check(fis[0].Size(), check.Equals, int64(3))
54                 }
55         }
56         fis, err := f.Readdir(1)
57         c.Check(len(fis), check.Equals, 0)
58         c.Check(err, check.NotNil)
59         c.Check(err, check.Equals, io.EOF)
60
61         f, err = s.fs.Open("dir1")
62         c.Assert(err, check.IsNil)
63         fis, err = f.Readdir(1)
64         c.Check(len(fis), check.Equals, 1)
65         c.Assert(err, check.IsNil)
66         fis, err = f.Readdir(2)
67         c.Check(len(fis), check.Equals, 1)
68         c.Assert(err, check.IsNil)
69         fis, err = f.Readdir(2)
70         c.Check(len(fis), check.Equals, 0)
71         c.Assert(err, check.Equals, io.EOF)
72 }
73
74 func (s *CollectionFSSuite) TestPathMunge(c *check.C) {
75         for _, path := range []string{".", "/", "./", "///", "/../", "/./.."} {
76                 f, err := s.fs.Open(path)
77                 c.Assert(err, check.IsNil)
78
79                 st, err := f.Stat()
80                 c.Assert(err, check.IsNil)
81                 c.Check(st.Size(), check.Equals, int64(1))
82                 c.Check(st.IsDir(), check.Equals, true)
83         }
84         for _, path := range []string{"/dir1", "dir1", "./dir1", "///dir1//.//", "../dir1/../dir1/"} {
85                 c.Logf("%q", path)
86                 f, err := s.fs.Open(path)
87                 c.Assert(err, check.IsNil)
88
89                 st, err := f.Stat()
90                 c.Assert(err, check.IsNil)
91                 c.Check(st.Size(), check.Equals, int64(2))
92                 c.Check(st.IsDir(), check.Equals, true)
93         }
94 }
95
96 func (s *CollectionFSSuite) TestNotExist(c *check.C) {
97         for _, path := range []string{"/no", "no", "./no", "n/o", "/n/o"} {
98                 f, err := s.fs.Open(path)
99                 c.Assert(f, check.IsNil)
100                 c.Assert(err, check.NotNil)
101                 c.Assert(os.IsNotExist(err), check.Equals, true)
102         }
103 }
104
105 func (s *CollectionFSSuite) TestOpenFile(c *check.C) {
106         c.Skip("cannot test files with nil keepclient")
107
108         f, err := s.fs.Open("/foo.txt")
109         c.Assert(err, check.IsNil)
110         st, err := f.Stat()
111         c.Assert(err, check.IsNil)
112         c.Check(st.Size(), check.Equals, int64(3))
113 }
114
115 // Gocheck boilerplate
116 func Test(t *testing.T) {
117         check.TestingT(t)
118 }