From 11716f06f05687d5726cc044834662bead5b85c8 Mon Sep 17 00:00:00 2001 From: Sylvain Baubeau Date: Thu, 5 Feb 2015 15:51:30 +0100 Subject: [PATCH] Add test suite for the Swift backend --- Gomfile | 2 +- swift/public.go | 2 +- swift/public_test.go | 191 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 swift/public_test.go diff --git a/Gomfile b/Gomfile index 75a60f40..642e816d 100644 --- a/Gomfile +++ b/Gomfile @@ -10,7 +10,7 @@ gom 'github.com/julienschmidt/httprouter', :commit => '46807412fe50aaceb73bb5706 gom 'github.com/mattn/go-shellwords', :commit => 'c7ca6f94add751566a61cf2199e1de78d4c3eee4' gom 'github.com/mitchellh/goamz/s3', :commit => 'e7664b32019f31fd1bdf33f9e85f28722f700405' gom 'github.com/mkrautz/goar', :commit => '36eb5f3452b1283a211fa35bc00c646fd0db5c4b' -gom 'github.com/ncw/swift', :commit => '71da36c561d45ba5420b99262689f91f2d9b8db4' +gom 'github.com/lebauce/swift', :commit => '075195d7dd6167c2d4eeb1bd04daef806bdbbc81' gom 'github.com/smira/commander', :commit => 'f408b00e68d5d6e21b9f18bd310978dafc604e47' gom 'github.com/smira/flag', :commit => '357ed3e599ffcbd4aeaa828e1d10da2df3ea5107' gom 'github.com/smira/go-ftp-protocol/protocol', :commit => '066b75c2b70dca7ae10b1b88b47534a3c31ccfaa' diff --git a/swift/public.go b/swift/public.go index 6861ad35..1ccd540f 100644 --- a/swift/public.go +++ b/swift/public.go @@ -2,7 +2,7 @@ package swift import ( "fmt" - "github.com/ncw/swift" + "github.com/lebauce/swift" "github.com/smira/aptly/aptly" "github.com/smira/aptly/files" "time" diff --git a/swift/public_test.go b/swift/public_test.go new file mode 100644 index 00000000..f455d310 --- /dev/null +++ b/swift/public_test.go @@ -0,0 +1,191 @@ +package swift + +import ( + "github.com/smira/aptly/files" + "github.com/lebauce/swift" + + "io/ioutil" + "os" + "path/filepath" + . "gopkg.in/check.v1" +) + +const ( + TEST_ADDRESS = "localhost:5324" + AUTH_URL = "http://" + TEST_ADDRESS + "/v1.0" + PROXY_URL = "http://" + TEST_ADDRESS + "/proxy" + USERNAME = "test" + APIKEY = "apikey" + AUTH_TOKEN = "token" +) + +type PublishedStorageSuite struct { + srv *swift.SwiftServer + storage, prefixedStorage *PublishedStorage +} + +var _ = Suite(&PublishedStorageSuite{}) + +func (s *PublishedStorageSuite) SetUpTest(c *C) { + var err error + s.srv, err = swift.NewSwiftServer(TEST_ADDRESS) + c.Assert(err, IsNil) + c.Assert(s.srv, NotNil) + + s.storage, err = NewPublishedStorage("swifttest", "swifttest", AUTH_URL, "", "", "test", "") + c.Assert(err, IsNil) + + s.prefixedStorage, err = NewPublishedStorage("swifttest", "swifttest", AUTH_URL, "", "", "test", "lala") + c.Assert(err, IsNil) + + s.storage.conn.ContainerCreate("test", nil) +} + +func (s *PublishedStorageSuite) TearDownTest(c *C) { + s.srv.Close() +} + +func (s *PublishedStorageSuite) TestNewPublishedStorage(c *C) { + stor, err := NewPublishedStorage("swifttest", "swifttest", AUTH_URL, "", "", "", "") + c.Check(stor, NotNil) + c.Check(err, IsNil) +} + +func (s *PublishedStorageSuite) TestPutFile(c *C) { + dir := c.MkDir() + err := ioutil.WriteFile(filepath.Join(dir, "a"), []byte("welcome to swift!"), 0644) + c.Assert(err, IsNil) + + err = s.storage.PutFile("a/b.txt", filepath.Join(dir, "a")) + c.Check(err, IsNil) + + data, err := s.storage.conn.ObjectGetBytes("test", "a/b.txt") + c.Check(err, IsNil) + c.Check(data, DeepEquals, []byte("welcome to swift!")) + + err = s.prefixedStorage.PutFile("a/b.txt", filepath.Join(dir, "a")) + c.Check(err, IsNil) + + data, err = s.storage.conn.ObjectGetBytes("test", "lala/a/b.txt") + c.Check(err, IsNil) + c.Check(data, DeepEquals, []byte("welcome to swift!")) +} + +func (s *PublishedStorageSuite) TestFilelist(c *C) { + dir := c.MkDir() + err := ioutil.WriteFile(filepath.Join(dir, "a"), []byte("welcome to swift!"), 0644) + c.Assert(err, IsNil) + + paths := []string{"a", "b", "c", "testa", "test/a", "test/b", "lala/a", "lala/b", "lala/c"} + for _, path := range paths { + err = s.storage.PutFile(path, filepath.Join(dir, "a")) + c.Check(err, IsNil) + } + + list, err := s.storage.Filelist("") + c.Check(err, IsNil) + c.Check(list, DeepEquals, []string{"a", "b", "c", "lala/a", "lala/b", "lala/c", "test/a", "test/b", "testa"}) + + list, err = s.storage.Filelist("test") + c.Check(err, IsNil) + c.Check(list, DeepEquals, []string{"a", "b"}) + + list, err = s.storage.Filelist("test2") + c.Check(err, IsNil) + c.Check(list, DeepEquals, []string{}) + + list, err = s.prefixedStorage.Filelist("") + c.Check(err, IsNil) + c.Check(list, DeepEquals, []string{"a", "b", "c"}) +} + +func (s *PublishedStorageSuite) TestRemove(c *C) { + dir := c.MkDir() + err := ioutil.WriteFile(filepath.Join(dir, "a"), []byte("welcome to swift!"), 0644) + c.Assert(err, IsNil) + + err = s.storage.PutFile("a/b.txt", filepath.Join(dir, "a")) + c.Check(err, IsNil) + + err = s.storage.Remove("a/b.txt") + c.Check(err, IsNil) + + _, err = s.storage.conn.ObjectGetBytes("test", "a/b.txt") + c.Check(err, ErrorMatches, "Object Not Found") +} + +func (s *PublishedStorageSuite) TestRemoveDirs(c *C) { + c.Skip("bulk-delete not available in s3test") + + dir := c.MkDir() + err := ioutil.WriteFile(filepath.Join(dir, "a"), []byte("welcome to swift!"), 0644) + c.Assert(err, IsNil) + + paths := []string{"a", "b", "c", "testa", "test/a", "test/b", "lala/a", "lala/b", "lala/c"} + for _, path := range paths { + err = s.storage.PutFile(path, filepath.Join(dir, "a")) + c.Check(err, IsNil) + } + + err = s.storage.RemoveDirs("test", nil) + c.Check(err, IsNil) + + list, err := s.storage.Filelist("") + c.Check(err, IsNil) + c.Check(list, DeepEquals, []string{"a", "b", "c", "lala/a", "lala/b", "lala/c", "test/a", "test/b", "testa"}) +} + +func (s *PublishedStorageSuite) TestRenameFile(c *C) { + c.Skip("copy not available in s3test") +} + +func (s *PublishedStorageSuite) TestLinkFromPool(c *C) { + root := c.MkDir() + pool := files.NewPackagePool(root) + + sourcePath := filepath.Join(root, "pool/c1/df/mars-invaders_1.03.deb") + err := os.MkdirAll(filepath.Dir(sourcePath), 0755) + c.Assert(err, IsNil) + + err = ioutil.WriteFile(sourcePath, []byte("Contents"), 0644) + c.Assert(err, IsNil) + + sourcePath2 := filepath.Join(root, "pool/e9/df/mars-invaders_1.03.deb") + err = os.MkdirAll(filepath.Dir(sourcePath2), 0755) + c.Assert(err, IsNil) + + err = ioutil.WriteFile(sourcePath2, []byte("Spam"), 0644) + c.Assert(err, IsNil) + + // first link from pool + err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath, "c1df1da7a1ce305a3b60af9d5733ac1d", false) + c.Check(err, IsNil) + + data, err := s.storage.conn.ObjectGetBytes("test", "pool/main/m/mars-invaders/mars-invaders_1.03.deb") + c.Check(err, IsNil) + c.Check(data, DeepEquals, []byte("Contents")) + + // duplicate link from pool + err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath, "c1df1da7a1ce305a3b60af9d5733ac1d", false) + c.Check(err, IsNil) + + data, err = s.storage.conn.ObjectGetBytes("test", "pool/main/m/mars-invaders/mars-invaders_1.03.deb") + c.Check(err, IsNil) + c.Check(data, DeepEquals, []byte("Contents")) + + // link from pool with conflict + err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath2, "e9dfd31cc505d51fc26975250750deab", false) + c.Check(err, ErrorMatches, ".*file already exists and is different.*") + + data, err = s.storage.conn.ObjectGetBytes("test", "pool/main/m/mars-invaders/mars-invaders_1.03.deb") + c.Check(err, IsNil) + c.Check(data, DeepEquals, []byte("Contents")) + + // link from pool with conflict and force + err = s.storage.LinkFromPool(filepath.Join("", "pool", "main", "m/mars-invaders"), pool, sourcePath2, "e9dfd31cc505d51fc26975250750deab", true) + c.Check(err, IsNil) + + data, err = s.storage.conn.ObjectGetBytes("test", "pool/main/m/mars-invaders/mars-invaders_1.03.deb") + c.Check(err, IsNil) + c.Check(data, DeepEquals, []byte("Spam")) +}