Fix one gofmt and more ineffassign warnings in our golang tests.
[arvados.git] / sdk / go / arvados / collection_fs_test.go
index dabb884a5750580d1f50920362fcce8d9b1fd7c4..2604cefc4e55241a81f3d1a13f228f208c368609 100644 (file)
@@ -77,6 +77,21 @@ func (s *CollectionFSSuite) TestHttpFileSystemInterface(c *check.C) {
        c.Check(ok, check.Equals, true)
 }
 
+func (s *CollectionFSSuite) TestColonInFilename(c *check.C) {
+       fs, err := (&Collection{
+               ManifestText: "./foo:foo 3858f62230ac3c915f300c664312c63f+3 0:3:bar:bar\n",
+       }).FileSystem(s.client, s.kc)
+       c.Assert(err, check.IsNil)
+
+       f, err := fs.Open("/foo:foo")
+       c.Assert(err, check.IsNil)
+
+       fis, err := f.Readdir(0)
+       c.Check(err, check.IsNil)
+       c.Check(len(fis), check.Equals, 1)
+       c.Check(fis[0].Name(), check.Equals, "bar:bar")
+}
+
 func (s *CollectionFSSuite) TestReaddirFull(c *check.C) {
        f, err := s.fs.Open("/dir1")
        c.Assert(err, check.IsNil)
@@ -173,7 +188,7 @@ func (s *CollectionFSSuite) TestReadOnlyFile(c *check.C) {
 }
 
 func (s *CollectionFSSuite) TestCreateFile(c *check.C) {
-       f, err := s.fs.OpenFile("/newfile", os.O_RDWR|os.O_CREATE, 0)
+       f, err := s.fs.OpenFile("/new-file 1", os.O_RDWR|os.O_CREATE, 0)
        c.Assert(err, check.IsNil)
        st, err := f.Stat()
        c.Assert(err, check.IsNil)
@@ -185,11 +200,11 @@ func (s *CollectionFSSuite) TestCreateFile(c *check.C) {
 
        c.Check(f.Close(), check.IsNil)
 
-       f, err = s.fs.OpenFile("/newfile", os.O_RDWR|os.O_CREATE|os.O_EXCL, 0)
+       f, err = s.fs.OpenFile("/new-file 1", os.O_RDWR|os.O_CREATE|os.O_EXCL, 0)
        c.Check(f, check.IsNil)
        c.Assert(err, check.NotNil)
 
-       f, err = s.fs.OpenFile("/newfile", os.O_RDWR, 0)
+       f, err = s.fs.OpenFile("/new-file 1", os.O_RDWR, 0)
        c.Assert(err, check.IsNil)
        st, err = f.Stat()
        c.Assert(err, check.IsNil)
@@ -197,8 +212,9 @@ func (s *CollectionFSSuite) TestCreateFile(c *check.C) {
 
        c.Check(f.Close(), check.IsNil)
 
-       // TODO: serialize to Collection, confirm manifest contents,
-       // make new FileSystem, confirm file contents.
+       m, err := s.fs.MarshalManifest(".")
+       c.Assert(err, check.IsNil)
+       c.Check(m, check.Matches, `. 37b51d194a7513e45b56f6524f2d51f2\+3\+\S+ 0:3:new-file\\0401\n./dir1 .* 3:3:bar 0:3:foo\n`)
 }
 
 func (s *CollectionFSSuite) TestReadWriteFile(c *check.C) {
@@ -222,7 +238,7 @@ func (s *CollectionFSSuite) TestReadWriteFile(c *check.C) {
        c.Check(err, check.Equals, io.EOF)
        c.Check(string(buf[:3]), check.DeepEquals, "foo")
 
-       pos, err := f.Seek(-2, os.SEEK_CUR)
+       pos, err := f.Seek(-2, io.SeekCurrent)
        c.Check(pos, check.Equals, int64(1))
        c.Check(err, check.IsNil)
 
@@ -231,11 +247,11 @@ func (s *CollectionFSSuite) TestReadWriteFile(c *check.C) {
        c.Check(n, check.Equals, 1)
        c.Check(err, check.IsNil)
 
-       pos, err = f.Seek(0, os.SEEK_CUR)
+       pos, err = f.Seek(0, io.SeekCurrent)
        c.Check(pos, check.Equals, int64(2))
        c.Check(err, check.IsNil)
 
-       pos, err = f.Seek(0, os.SEEK_SET)
+       pos, err = f.Seek(0, io.SeekStart)
        c.Check(pos, check.Equals, int64(0))
        c.Check(err, check.IsNil)
 
@@ -245,13 +261,15 @@ func (s *CollectionFSSuite) TestReadWriteFile(c *check.C) {
        c.Check(string(rbuf), check.Equals, "f*o")
 
        // Write multiple blocks in one call
-       f.Seek(1, os.SEEK_SET)
+       f.Seek(1, io.SeekStart)
        n, err = f.Write([]byte("0123456789abcdefg"))
        c.Check(n, check.Equals, 17)
        c.Check(err, check.IsNil)
-       pos, err = f.Seek(0, os.SEEK_CUR)
+       pos, err = f.Seek(0, io.SeekCurrent)
        c.Check(pos, check.Equals, int64(18))
-       pos, err = f.Seek(-18, os.SEEK_CUR)
+       c.Check(err, check.IsNil)
+       pos, err = f.Seek(-18, io.SeekCurrent)
+       c.Check(pos, check.Equals, int64(0))
        c.Check(err, check.IsNil)
        n, err = io.ReadFull(f, buf)
        c.Check(n, check.Equals, 18)
@@ -264,52 +282,55 @@ func (s *CollectionFSSuite) TestReadWriteFile(c *check.C) {
 
        // truncate to current size
        err = f.Truncate(18)
-       f2.Seek(0, os.SEEK_SET)
+       c.Check(err, check.IsNil)
+       f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
        c.Check(string(buf2), check.Equals, "f0123456789abcdefg")
 
        // shrink to zero some data
        f.Truncate(15)
-       f2.Seek(0, os.SEEK_SET)
+       f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
        c.Check(string(buf2), check.Equals, "f0123456789abcd")
 
        // grow to partial block/extent
        f.Truncate(20)
-       f2.Seek(0, os.SEEK_SET)
+       f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
        c.Check(string(buf2), check.Equals, "f0123456789abcd\x00\x00\x00\x00\x00")
 
        f.Truncate(0)
-       f2.Seek(0, os.SEEK_SET)
+       f2.Seek(0, io.SeekStart)
        f2.Write([]byte("12345678abcdefghijkl"))
 
        // grow to block/extent boundary
        f.Truncate(64)
-       f2.Seek(0, os.SEEK_SET)
+       f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
        c.Check(len(buf2), check.Equals, 64)
-       c.Check(len(f.(*file).inode.(*filenode).extents), check.Equals, 8)
+       c.Check(len(f.(*filehandle).inode.(*filenode).segments), check.Equals, 8)
 
        // shrink to block/extent boundary
        err = f.Truncate(32)
-       f2.Seek(0, os.SEEK_SET)
+       c.Check(err, check.IsNil)
+       f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
        c.Check(len(buf2), check.Equals, 32)
-       c.Check(len(f.(*file).inode.(*filenode).extents), check.Equals, 4)
+       c.Check(len(f.(*filehandle).inode.(*filenode).segments), check.Equals, 4)
 
        // shrink to partial block/extent
        err = f.Truncate(15)
-       f2.Seek(0, os.SEEK_SET)
+       c.Check(err, check.IsNil)
+       f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
        c.Check(string(buf2), check.Equals, "12345678abcdefg")
-       c.Check(len(f.(*file).inode.(*filenode).extents), check.Equals, 2)
+       c.Check(len(f.(*filehandle).inode.(*filenode).segments), check.Equals, 2)
 
        // Force flush to ensure the block "12345678" gets stored, so
        // we know what to expect in the final manifest below.
@@ -322,11 +343,11 @@ func (s *CollectionFSSuite) TestReadWriteFile(c *check.C) {
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
        c.Check(string(buf2), check.Equals, "")
-       f2.Seek(0, os.SEEK_SET)
+       f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
        c.Check(string(buf2), check.Equals, "123")
-       c.Check(len(f.(*file).inode.(*filenode).extents), check.Equals, 1)
+       c.Check(len(f.(*filehandle).inode.(*filenode).segments), check.Equals, 1)
 
        m, err := s.fs.MarshalManifest(".")
        c.Check(err, check.IsNil)
@@ -343,28 +364,31 @@ func (s *CollectionFSSuite) TestSeekSparse(c *check.C) {
 
        checkSize := func(size int64) {
                fi, err := f.Stat()
+               c.Assert(err, check.IsNil)
                c.Check(fi.Size(), check.Equals, size)
 
                f, err := fs.OpenFile("test", os.O_CREATE|os.O_RDWR, 0755)
                c.Assert(err, check.IsNil)
                defer f.Close()
                fi, err = f.Stat()
+               c.Check(err, check.IsNil)
                c.Check(fi.Size(), check.Equals, size)
-               pos, err := f.Seek(0, os.SEEK_END)
+               pos, err := f.Seek(0, io.SeekEnd)
+               c.Check(err, check.IsNil)
                c.Check(pos, check.Equals, size)
        }
 
-       f.Seek(2, os.SEEK_END)
+       f.Seek(2, io.SeekEnd)
        checkSize(0)
        f.Write([]byte{1})
        checkSize(3)
 
-       f.Seek(2, os.SEEK_CUR)
+       f.Seek(2, io.SeekCurrent)
        checkSize(3)
        f.Write([]byte{})
        checkSize(5)
 
-       f.Seek(8, os.SEEK_SET)
+       f.Seek(8, io.SeekStart)
        checkSize(5)
        n, err := f.Read(make([]byte, 1))
        c.Check(n, check.Equals, 0)
@@ -418,7 +442,7 @@ func (s *CollectionFSSuite) TestMkdir(c *check.C) {
        err = s.fs.Remove("foo/bar")
        c.Check(err, check.IsNil)
 
-       // mkdir succeds after the file is deleted
+       // mkdir succeeds after the file is deleted
        err = s.fs.Mkdir("foo/bar", 0755)
        c.Check(err, check.IsNil)
 
@@ -466,7 +490,7 @@ func (s *CollectionFSSuite) TestConcurrentWriters(c *check.C) {
                                case 0:
                                        f.Truncate(int64(rand.Intn(64)))
                                case 1:
-                                       f.Seek(int64(rand.Intn(64)), os.SEEK_SET)
+                                       f.Seek(int64(rand.Intn(64)), io.SeekStart)
                                case 2:
                                        _, err := f.Write([]byte("beep boop"))
                                        c.Check(err, check.IsNil)
@@ -521,13 +545,13 @@ func (s *CollectionFSSuite) TestRandomWrites(c *check.C) {
                                }
                                copy(expect[woff:], wbytes)
                                f.Truncate(int64(trunc))
-                               pos, err := f.Seek(int64(woff), os.SEEK_SET)
+                               pos, err := f.Seek(int64(woff), io.SeekStart)
                                c.Check(pos, check.Equals, int64(woff))
                                c.Check(err, check.IsNil)
                                n, err := f.Write(wbytes)
                                c.Check(n, check.Equals, len(wbytes))
                                c.Check(err, check.IsNil)
-                               pos, err = f.Seek(0, os.SEEK_SET)
+                               pos, err = f.Seek(0, io.SeekStart)
                                c.Check(pos, check.Equals, int64(0))
                                c.Check(err, check.IsNil)
                                buf, err := ioutil.ReadAll(f)
@@ -584,6 +608,30 @@ func (s *CollectionFSSuite) TestRemove(c *check.C) {
        c.Check(err, check.IsNil)
 }
 
+func (s *CollectionFSSuite) TestRenameError(c *check.C) {
+       fs, err := (&Collection{}).FileSystem(s.client, s.kc)
+       c.Assert(err, check.IsNil)
+       err = fs.Mkdir("first", 0755)
+       c.Assert(err, check.IsNil)
+       err = fs.Mkdir("first/second", 0755)
+       c.Assert(err, check.IsNil)
+       f, err := fs.OpenFile("first/second/file", os.O_CREATE|os.O_WRONLY, 0755)
+       c.Assert(err, check.IsNil)
+       f.Write([]byte{1, 2, 3, 4, 5})
+       f.Close()
+       err = fs.Rename("first", "first/second/third")
+       c.Check(err, check.Equals, ErrInvalidArgument)
+       err = fs.Rename("first", "first/third")
+       c.Check(err, check.Equals, ErrInvalidArgument)
+       err = fs.Rename("first/second", "second")
+       c.Check(err, check.IsNil)
+       f, err = fs.OpenFile("second/file", 0, 0)
+       c.Assert(err, check.IsNil)
+       data, err := ioutil.ReadAll(f)
+       c.Check(err, check.IsNil)
+       c.Check(data, check.DeepEquals, []byte{1, 2, 3, 4, 5})
+}
+
 func (s *CollectionFSSuite) TestRename(c *check.C) {
        fs, err := (&Collection{}).FileSystem(s.client, s.kc)
        c.Assert(err, check.IsNil)
@@ -745,10 +793,10 @@ func (s *CollectionFSSuite) TestPersistEmptyFiles(c *check.C) {
 
        expect := map[string][]byte{
                "0":                nil,
-               "00":               []byte{},
-               "one":              []byte{1},
+               "00":               {},
+               "one":              {1},
                "dir/0":            nil,
-               "dir/two":          []byte{1, 2},
+               "dir/two":          {1, 2},
                "dir/zero":         nil,
                "dir/zerodir/zero": nil,
                "zero/zero/zero":   nil,
@@ -771,10 +819,10 @@ func (s *CollectionFSSuite) TestPersistEmptyFiles(c *check.C) {
        c.Assert(err, check.IsNil)
 
        for name, data := range expect {
-               f, err := persisted.Open("bogus-" + name)
+               _, err = persisted.Open("bogus-" + name)
                c.Check(err, check.NotNil)
 
-               f, err = persisted.Open(name)
+               f, err := persisted.Open(name)
                c.Assert(err, check.IsNil)
 
                if data == nil {
@@ -815,7 +863,7 @@ func (s *CollectionFSSuite) TestOpenFileFlags(c *check.C) {
        f, err = fs.OpenFile("new", os.O_TRUNC|os.O_RDWR, 0)
        c.Assert(err, check.IsNil)
        defer f.Close()
-       pos, err := f.Seek(0, os.SEEK_END)
+       pos, err := f.Seek(0, io.SeekEnd)
        c.Check(pos, check.Equals, int64(0))
        c.Check(err, check.IsNil)
        fi, err = f.Stat()
@@ -827,16 +875,18 @@ func (s *CollectionFSSuite) TestOpenFileFlags(c *check.C) {
        f, err = fs.OpenFile("append", os.O_EXCL|os.O_CREATE|os.O_RDWR|os.O_APPEND, 0)
        c.Assert(err, check.IsNil)
        f.Write([]byte{1, 2, 3})
-       f.Seek(0, os.SEEK_SET)
+       f.Seek(0, io.SeekStart)
        n, _ = f.Read(buf[:1])
        c.Check(n, check.Equals, 1)
        c.Check(buf[:1], check.DeepEquals, []byte{1})
-       pos, err = f.Seek(0, os.SEEK_CUR)
+       pos, err = f.Seek(0, io.SeekCurrent)
+       c.Assert(err, check.IsNil)
        c.Check(pos, check.Equals, int64(1))
        f.Write([]byte{4, 5, 6})
-       pos, err = f.Seek(0, os.SEEK_CUR)
+       pos, err = f.Seek(0, io.SeekCurrent)
+       c.Assert(err, check.IsNil)
        c.Check(pos, check.Equals, int64(6))
-       f.Seek(0, os.SEEK_SET)
+       f.Seek(0, io.SeekStart)
        n, err = f.Read(buf)
        c.Check(buf[:n], check.DeepEquals, []byte{1, 2, 3, 4, 5, 6})
        c.Check(err, check.Equals, io.EOF)
@@ -844,14 +894,15 @@ func (s *CollectionFSSuite) TestOpenFileFlags(c *check.C) {
 
        f, err = fs.OpenFile("append", os.O_RDWR|os.O_APPEND, 0)
        c.Assert(err, check.IsNil)
-       pos, err = f.Seek(0, os.SEEK_CUR)
+       pos, err = f.Seek(0, io.SeekCurrent)
        c.Check(pos, check.Equals, int64(0))
        c.Check(err, check.IsNil)
        f.Read(buf[:3])
-       pos, _ = f.Seek(0, os.SEEK_CUR)
+       pos, _ = f.Seek(0, io.SeekCurrent)
        c.Check(pos, check.Equals, int64(3))
        f.Write([]byte{7, 8, 9})
-       pos, err = f.Seek(0, os.SEEK_CUR)
+       pos, err = f.Seek(0, io.SeekCurrent)
+       c.Check(err, check.IsNil)
        c.Check(pos, check.Equals, int64(9))
        f.Close()
 
@@ -860,9 +911,9 @@ func (s *CollectionFSSuite) TestOpenFileFlags(c *check.C) {
        n, err = f.Write([]byte{3, 2, 1})
        c.Check(n, check.Equals, 3)
        c.Check(err, check.IsNil)
-       pos, _ = f.Seek(0, os.SEEK_CUR)
+       pos, _ = f.Seek(0, io.SeekCurrent)
        c.Check(pos, check.Equals, int64(3))
-       pos, _ = f.Seek(0, os.SEEK_SET)
+       pos, _ = f.Seek(0, io.SeekStart)
        c.Check(pos, check.Equals, int64(0))
        n, err = f.Read(buf)
        c.Check(n, check.Equals, 0)
@@ -901,9 +952,9 @@ func (s *CollectionFSSuite) TestFlushFullBlocks(c *check.C) {
        }
 
        currentMemExtents := func() (memExtents []int) {
-               for idx, e := range f.(*file).inode.(*filenode).extents {
+               for idx, e := range f.(*filehandle).inode.(*filenode).segments {
                        switch e.(type) {
-                       case *memExtent:
+                       case *memSegment:
                                memExtents = append(memExtents, idx)
                        }
                }
@@ -928,7 +979,7 @@ func (s *CollectionFSSuite) TestBrokenManifests(c *check.C) {
                ".  0:0:foo\n",
                ". 0:0:foo 0:0:bar\n",
                ". d41d8cd98f00b204e9800998ecf8427e 0:0:foo\n",
-               ". d41d8cd98f00b204e9800998ecf8427e+0 0:0:foo:bar\n",
+               ". d41d8cd98f00b204e9800998ecf8427e+0 :0:0:foo\n",
                ". d41d8cd98f00b204e9800998ecf8427e+0 foo:0:foo\n",
                ". d41d8cd98f00b204e9800998ecf8427e+0 0:foo:foo\n",
                ". d41d8cd98f00b204e9800998ecf8427e+1 0:1:foo 1:1:bar\n",
@@ -959,10 +1010,10 @@ func (s *CollectionFSSuite) TestEdgeCaseManifests(c *check.C) {
 }
 
 func (s *CollectionFSSuite) checkMemSize(c *check.C, f File) {
-       fn := f.(*file).inode.(*filenode)
+       fn := f.(*filehandle).inode.(*filenode)
        var memsize int64
-       for _, ext := range fn.extents {
-               if e, ok := ext.(*memExtent); ok {
+       for _, seg := range fn.segments {
+               if e, ok := seg.(*memSegment); ok {
                        memsize += int64(len(e.buf))
                }
        }