Merge branch 'master' into 9426-collection-tags
[arvados.git] / sdk / go / arvados / collection_fs_test.go
diff --git a/sdk/go/arvados/collection_fs_test.go b/sdk/go/arvados/collection_fs_test.go
new file mode 100644 (file)
index 0000000..7e8588b
--- /dev/null
@@ -0,0 +1,125 @@
+package arvados
+
+import (
+       "io"
+       "net/http"
+       "os"
+       "testing"
+
+       "git.curoverse.com/arvados.git/sdk/go/arvadostest"
+       check "gopkg.in/check.v1"
+)
+
+var _ = check.Suite(&CollectionFSSuite{})
+
+type CollectionFSSuite struct {
+       client *Client
+       coll   Collection
+       fs     http.FileSystem
+}
+
+func (s *CollectionFSSuite) SetUpTest(c *check.C) {
+       s.client = NewClientFromEnv()
+       err := s.client.RequestAndDecode(&s.coll, "GET", "arvados/v1/collections/"+arvadostest.FooAndBarFilesInDirUUID, nil, nil)
+       c.Assert(err, check.IsNil)
+       s.fs = s.coll.FileSystem(s.client, nil)
+}
+
+func (s *CollectionFSSuite) TestReaddirFull(c *check.C) {
+       f, err := s.fs.Open("/dir1")
+       c.Assert(err, check.IsNil)
+
+       st, err := f.Stat()
+       c.Assert(err, check.IsNil)
+       c.Check(st.Size(), check.Equals, int64(2))
+       c.Check(st.IsDir(), check.Equals, true)
+
+       fis, err := f.Readdir(0)
+       c.Check(err, check.IsNil)
+       c.Check(len(fis), check.Equals, 2)
+       if len(fis) > 0 {
+               c.Check(fis[0].Size(), check.Equals, int64(3))
+       }
+}
+
+func (s *CollectionFSSuite) TestReaddirLimited(c *check.C) {
+       f, err := s.fs.Open("./dir1")
+       c.Assert(err, check.IsNil)
+
+       fis, err := f.Readdir(1)
+       c.Check(err, check.IsNil)
+       c.Check(len(fis), check.Equals, 1)
+       if len(fis) > 0 {
+               c.Check(fis[0].Size(), check.Equals, int64(3))
+       }
+
+       fis, err = f.Readdir(1)
+       c.Check(err, check.Equals, io.EOF)
+       c.Check(len(fis), check.Equals, 1)
+       if len(fis) > 0 {
+               c.Check(fis[0].Size(), check.Equals, int64(3))
+       }
+
+       fis, err = f.Readdir(1)
+       c.Check(len(fis), check.Equals, 0)
+       c.Check(err, check.NotNil)
+       c.Check(err, check.Equals, io.EOF)
+
+       f, err = s.fs.Open("dir1")
+       c.Assert(err, check.IsNil)
+       fis, err = f.Readdir(1)
+       c.Check(len(fis), check.Equals, 1)
+       c.Assert(err, check.IsNil)
+       fis, err = f.Readdir(2)
+       c.Check(len(fis), check.Equals, 1)
+       c.Assert(err, check.Equals, io.EOF)
+       fis, err = f.Readdir(2)
+       c.Check(len(fis), check.Equals, 0)
+       c.Assert(err, check.Equals, io.EOF)
+}
+
+func (s *CollectionFSSuite) TestPathMunge(c *check.C) {
+       for _, path := range []string{".", "/", "./", "///", "/../", "/./.."} {
+               f, err := s.fs.Open(path)
+               c.Assert(err, check.IsNil)
+
+               st, err := f.Stat()
+               c.Assert(err, check.IsNil)
+               c.Check(st.Size(), check.Equals, int64(1))
+               c.Check(st.IsDir(), check.Equals, true)
+       }
+       for _, path := range []string{"/dir1", "dir1", "./dir1", "///dir1//.//", "../dir1/../dir1/"} {
+               c.Logf("%q", path)
+               f, err := s.fs.Open(path)
+               c.Assert(err, check.IsNil)
+
+               st, err := f.Stat()
+               c.Assert(err, check.IsNil)
+               c.Check(st.Size(), check.Equals, int64(2))
+               c.Check(st.IsDir(), check.Equals, true)
+       }
+}
+
+func (s *CollectionFSSuite) TestNotExist(c *check.C) {
+       for _, path := range []string{"/no", "no", "./no", "n/o", "/n/o"} {
+               f, err := s.fs.Open(path)
+               c.Assert(f, check.IsNil)
+               c.Assert(err, check.NotNil)
+               c.Assert(os.IsNotExist(err), check.Equals, true)
+       }
+}
+
+func (s *CollectionFSSuite) TestOpenFile(c *check.C) {
+       c.Skip("cannot test files with nil keepclient")
+
+       f, err := s.fs.Open("/foo.txt")
+       c.Assert(err, check.IsNil)
+       st, err := f.Stat()
+       c.Assert(err, check.IsNil)
+       c.Check(st.Size(), check.Equals, int64(3))
+}
+
+// Gocheck boilerplate
+func Test(t *testing.T) {
+       check.TestingT(t)
+}