github.com/rogpeppe/juju@v0.0.0-20140613142852-6337964b789e/provider/joyent/storage_test.go (about) 1 // Copyright 2013 Joyent Inc. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package joyent_test 5 6 import ( 7 "fmt" 8 "io/ioutil" 9 "math/rand" 10 "net/http" 11 "net/url" 12 "strings" 13 14 "github.com/joyent/gocommon/errors" 15 jujuerrors "github.com/juju/errors" 16 jc "github.com/juju/testing/checkers" 17 gc "launchpad.net/gocheck" 18 19 "github.com/juju/juju/provider/joyent" 20 jp "github.com/juju/juju/provider/joyent" 21 ) 22 23 type storageSuite struct { 24 providerSuite 25 localMantaServer 26 } 27 28 const ( 29 storageName = "testStorage" 30 fileName = "testFile" 31 fileBlobContent = "Juju Joyent Provider Storage - Test" 32 ) 33 34 var _ = gc.Suite(&storageSuite{}) 35 36 func (s *storageSuite) SetUpSuite(c *gc.C) { 37 s.providerSuite.SetUpSuite(c) 38 s.localMantaServer.setupServer(c) 39 } 40 41 func (s *storageSuite) TearDownSuite(c *gc.C) { 42 s.localMantaServer.destroyServer() 43 s.providerSuite.TearDownSuite(c) 44 } 45 46 // makeStorage creates a Manta storage object for the running test. 47 func (s *storageSuite) makeStorage(name string, c *gc.C) *jp.JoyentStorage { 48 stor := joyent.MakeStorage(c, GetFakeConfig("localhost", s.localMantaServer.Server.URL)) 49 return stor.(*jp.JoyentStorage) 50 } 51 52 func (s *storageSuite) assertContainer(storage *jp.JoyentStorage, c *gc.C) { 53 err := jp.CreateContainer(storage) 54 c.Assert(err, gc.IsNil) 55 } 56 57 func (s *storageSuite) assertFile(storage *jp.JoyentStorage, c *gc.C) { 58 err := storage.Put(fileName, strings.NewReader(fileBlobContent), int64(len(fileBlobContent))) 59 c.Assert(err, gc.IsNil) 60 } 61 62 // makeRandomBytes returns an array of arbitrary byte values. 63 func makeRandomBytes(length int) []byte { 64 data := make([]byte, length) 65 for index := range data { 66 data[index] = byte(rand.Intn(256)) 67 } 68 return data 69 } 70 71 func makeResponse(content string, status int) *http.Response { 72 return &http.Response{ 73 Status: fmt.Sprintf("%d", status), 74 StatusCode: status, 75 Body: ioutil.NopCloser(strings.NewReader(content)), 76 } 77 } 78 79 func (s *storageSuite) TestList(c *gc.C) { 80 mantaStorage := s.makeStorage(storageName, c) 81 s.assertContainer(mantaStorage, c) 82 s.assertFile(mantaStorage, c) 83 84 names, err := mantaStorage.List("") 85 c.Assert(err, gc.IsNil) 86 c.Check(names, gc.DeepEquals, []string{fileName}) 87 } 88 89 func (s *storageSuite) TestListWithPrefix(c *gc.C) { 90 mantaStorage := s.makeStorage(storageName, c) 91 s.assertContainer(mantaStorage, c) 92 s.assertFile(mantaStorage, c) 93 err := mantaStorage.Put("pr/fileName", strings.NewReader(fileBlobContent), int64(len(fileBlobContent))) 94 c.Assert(err, gc.IsNil) 95 96 names, err := mantaStorage.List("p") 97 c.Assert(err, gc.IsNil) 98 c.Check(names, gc.DeepEquals, []string{"pr/fileName"}) 99 } 100 101 func (s *storageSuite) TestGet(c *gc.C) { 102 mantaStorage := s.makeStorage(storageName, c) 103 s.assertFile(mantaStorage, c) 104 105 reader, err := mantaStorage.Get(fileName) 106 c.Assert(err, gc.IsNil) 107 c.Assert(reader, gc.NotNil) 108 defer reader.Close() 109 110 data, err := ioutil.ReadAll(reader) 111 c.Assert(err, gc.IsNil) 112 c.Check(string(data), gc.Equals, fileBlobContent) 113 } 114 115 func (s *storageSuite) TestGetFileNotExists(c *gc.C) { 116 mantaStorage := s.makeStorage(storageName, c) 117 118 _, err := mantaStorage.Get("noFile") 119 c.Assert(err, gc.NotNil) 120 c.Assert(err, jc.Satisfies, jujuerrors.IsNotFound) 121 } 122 123 func (s *storageSuite) TestPut(c *gc.C) { 124 mantaStorage := s.makeStorage(storageName, c) 125 126 s.assertFile(mantaStorage, c) 127 } 128 129 func (s *storageSuite) TestRemove(c *gc.C) { 130 mantaStorage := s.makeStorage(storageName, c) 131 s.assertFile(mantaStorage, c) 132 133 err := mantaStorage.Remove(fileName) 134 c.Assert(err, gc.IsNil) 135 } 136 137 func (s *storageSuite) TestRemoveFileNotExists(c *gc.C) { 138 mantaStorage := s.makeStorage(storageName, c) 139 140 err := mantaStorage.Remove("nofile") 141 c.Assert(err, gc.IsNil) 142 } 143 144 func (s *storageSuite) TestRemoveAll(c *gc.C) { 145 mantaStorage := s.makeStorage(storageName, c) 146 147 err := mantaStorage.RemoveAll() 148 c.Assert(err, gc.IsNil) 149 } 150 151 func (s *storageSuite) TestURL(c *gc.C) { 152 mantaStorage := s.makeStorage(storageName, c) 153 154 URL, err := mantaStorage.URL(fileName) 155 c.Assert(err, gc.IsNil) 156 parsedURL, err := url.Parse(URL) 157 c.Assert(err, gc.IsNil) 158 c.Check(parsedURL.Host, gc.Matches, mantaStorage.GetMantaUrl()[strings.LastIndex(mantaStorage.GetMantaUrl(), "/")+1:]) 159 c.Check(parsedURL.Path, gc.Matches, fmt.Sprintf("/%s/stor/%s/%s", mantaStorage.GetMantaUser(), mantaStorage.GetContainerName(), fileName)) 160 } 161 162 func (s *storageSuite) TestCreateContainer(c *gc.C) { 163 mantaStorage := s.makeStorage(storageName, c) 164 165 s.assertContainer(mantaStorage, c) 166 } 167 168 func (s *storageSuite) TestCreateContainerAlreadyExists(c *gc.C) { 169 mantaStorage := s.makeStorage(storageName, c) 170 171 s.assertContainer(mantaStorage, c) 172 s.assertContainer(mantaStorage, c) 173 } 174 175 func (s *storageSuite) TestDeleteContainer(c *gc.C) { 176 mantaStorage := s.makeStorage(storageName, c) 177 s.assertContainer(mantaStorage, c) 178 179 err := mantaStorage.DeleteContainer(mantaStorage.GetContainerName()) 180 c.Assert(err, gc.IsNil) 181 } 182 183 func (s *storageSuite) TestDeleteContainerNotEmpty(c *gc.C) { 184 mantaStorage := s.makeStorage(storageName, c) 185 s.assertContainer(mantaStorage, c) 186 s.assertFile(mantaStorage, c) 187 188 err := mantaStorage.DeleteContainer(mantaStorage.GetContainerName()) 189 c.Assert(err, gc.NotNil) 190 c.Assert(err, jc.Satisfies, errors.IsBadRequest) 191 } 192 193 func (s *storageSuite) TestDeleteContainerNotExists(c *gc.C) { 194 mantaStorage := s.makeStorage(storageName, c) 195 196 err := mantaStorage.DeleteContainer("noContainer") 197 c.Assert(err, gc.NotNil) 198 c.Assert(err, jc.Satisfies, jujuerrors.IsNotFound) 199 }