1
// Copyright 2013 Joyent Inc.
2
// Licensed under the AGPLv3, see LICENCE file for details.
14
"github.com/joyent/gocommon/errors"
15
jujuerrors "github.com/juju/errors"
16
jc "github.com/juju/testing/checkers"
17
gc "gopkg.in/check.v1"
19
"github.com/juju/juju/provider/joyent"
20
jp "github.com/juju/juju/provider/joyent"
23
type storageSuite struct {
29
storageName = "testStorage"
31
fileBlobContent = "Juju Joyent Provider Storage - Test"
34
var _ = gc.Suite(&storageSuite{})
36
func (s *storageSuite) SetUpSuite(c *gc.C) {
37
s.providerSuite.SetUpSuite(c)
38
s.localMantaServer.setupServer(c)
39
jp.RegisterMachinesEndpoint()
40
s.AddSuiteCleanup(func(*gc.C) { jp.UnregisterMachinesEndpoint() })
43
func (s *storageSuite) TearDownSuite(c *gc.C) {
44
s.localMantaServer.destroyServer()
45
s.providerSuite.TearDownSuite(c)
48
// makeStorage creates a Manta storage object for the running test.
49
func (s *storageSuite) makeStorage(name string, c *gc.C) *jp.JoyentStorage {
50
stor := joyent.MakeStorage(c, GetFakeConfig("test://test.api.joyentcloud.com", s.localMantaServer.Server.URL))
51
return stor.(*jp.JoyentStorage)
54
func (s *storageSuite) assertContainer(storage *jp.JoyentStorage, c *gc.C) {
55
err := jp.CreateContainer(storage)
56
c.Assert(err, jc.ErrorIsNil)
59
func (s *storageSuite) assertFile(storage *jp.JoyentStorage, c *gc.C) {
60
err := storage.Put(fileName, strings.NewReader(fileBlobContent), int64(len(fileBlobContent)))
61
c.Assert(err, jc.ErrorIsNil)
64
// makeRandomBytes returns an array of arbitrary byte values.
65
func makeRandomBytes(length int) []byte {
66
data := make([]byte, length)
67
for index := range data {
68
data[index] = byte(rand.Intn(256))
73
func makeResponse(content string, status int) *http.Response {
74
return &http.Response{
75
Status: fmt.Sprintf("%d", status),
77
Body: ioutil.NopCloser(strings.NewReader(content)),
81
func (s *storageSuite) TestList(c *gc.C) {
82
mantaStorage := s.makeStorage(storageName, c)
83
s.assertContainer(mantaStorage, c)
84
s.assertFile(mantaStorage, c)
86
names, err := mantaStorage.List("")
87
c.Assert(err, jc.ErrorIsNil)
88
c.Check(names, gc.DeepEquals, []string{fileName})
91
func (s *storageSuite) TestListWithPrefix(c *gc.C) {
92
mantaStorage := s.makeStorage(storageName, c)
93
s.assertContainer(mantaStorage, c)
94
s.assertFile(mantaStorage, c)
95
err := mantaStorage.Put("pr/fileName", strings.NewReader(fileBlobContent), int64(len(fileBlobContent)))
96
c.Assert(err, jc.ErrorIsNil)
98
names, err := mantaStorage.List("p")
99
c.Assert(err, jc.ErrorIsNil)
100
c.Check(names, gc.DeepEquals, []string{"pr/fileName"})
103
func (s *storageSuite) TestGet(c *gc.C) {
104
mantaStorage := s.makeStorage(storageName, c)
105
s.assertFile(mantaStorage, c)
107
reader, err := mantaStorage.Get(fileName)
108
c.Assert(err, jc.ErrorIsNil)
109
c.Assert(reader, gc.NotNil)
112
data, err := ioutil.ReadAll(reader)
113
c.Assert(err, jc.ErrorIsNil)
114
c.Check(string(data), gc.Equals, fileBlobContent)
117
func (s *storageSuite) TestGetFileNotExists(c *gc.C) {
118
mantaStorage := s.makeStorage(storageName, c)
120
_, err := mantaStorage.Get("noFile")
121
c.Assert(err, gc.NotNil)
122
c.Assert(err, jc.Satisfies, jujuerrors.IsNotFound)
125
func (s *storageSuite) TestPut(c *gc.C) {
126
mantaStorage := s.makeStorage(storageName, c)
128
s.assertFile(mantaStorage, c)
131
func (s *storageSuite) TestRemove(c *gc.C) {
132
mantaStorage := s.makeStorage(storageName, c)
133
s.assertFile(mantaStorage, c)
135
err := mantaStorage.Remove(fileName)
136
c.Assert(err, jc.ErrorIsNil)
139
func (s *storageSuite) TestRemoveFileNotExists(c *gc.C) {
140
mantaStorage := s.makeStorage(storageName, c)
142
err := mantaStorage.Remove("nofile")
143
c.Assert(err, jc.ErrorIsNil)
146
func (s *storageSuite) TestRemoveAll(c *gc.C) {
147
mantaStorage := s.makeStorage(storageName, c)
149
err := mantaStorage.RemoveAll()
150
c.Assert(err, jc.ErrorIsNil)
153
func (s *storageSuite) TestURL(c *gc.C) {
154
mantaStorage := s.makeStorage(storageName, c)
156
URL, err := mantaStorage.URL(fileName)
157
c.Assert(err, jc.ErrorIsNil)
158
parsedURL, err := url.Parse(URL)
159
c.Assert(err, jc.ErrorIsNil)
160
c.Check(parsedURL.Host, gc.Matches, mantaStorage.GetMantaUrl()[strings.LastIndex(mantaStorage.GetMantaUrl(), "/")+1:])
161
c.Check(parsedURL.Path, gc.Matches, fmt.Sprintf("/%s/stor/%s/%s", mantaStorage.GetMantaUser(), mantaStorage.GetContainerName(), fileName))
164
func (s *storageSuite) TestCreateContainer(c *gc.C) {
165
mantaStorage := s.makeStorage(storageName, c)
167
s.assertContainer(mantaStorage, c)
170
func (s *storageSuite) TestCreateContainerAlreadyExists(c *gc.C) {
171
mantaStorage := s.makeStorage(storageName, c)
173
s.assertContainer(mantaStorage, c)
174
s.assertContainer(mantaStorage, c)
177
func (s *storageSuite) TestDeleteContainer(c *gc.C) {
178
mantaStorage := s.makeStorage(storageName, c)
179
s.assertContainer(mantaStorage, c)
181
err := mantaStorage.DeleteContainer(mantaStorage.GetContainerName())
182
c.Assert(err, jc.ErrorIsNil)
185
func (s *storageSuite) TestDeleteContainerNotEmpty(c *gc.C) {
186
mantaStorage := s.makeStorage(storageName, c)
187
s.assertContainer(mantaStorage, c)
188
s.assertFile(mantaStorage, c)
190
err := mantaStorage.DeleteContainer(mantaStorage.GetContainerName())
191
c.Assert(err, gc.NotNil)
192
c.Assert(err, jc.Satisfies, errors.IsBadRequest)
195
func (s *storageSuite) TestDeleteContainerNotExists(c *gc.C) {
196
mantaStorage := s.makeStorage(storageName, c)
198
err := mantaStorage.DeleteContainer("noContainer")
199
c.Assert(err, gc.NotNil)
200
c.Assert(err, jc.Satisfies, jujuerrors.IsNotFound)