1
// Swift double testing service - HTTP API tests
9
. "launchpad.net/gocheck"
10
"launchpad.net/goose/swift"
11
"launchpad.net/goose/testing/httpsuite"
12
"launchpad.net/goose/testservices/identityservice"
17
type SwiftHTTPSuite struct {
23
var _ = Suite(&SwiftHTTPSuite{})
25
func (s *SwiftHTTPSuite) SetUpSuite(c *C) {
26
s.HTTPSuite.SetUpSuite(c)
27
identityDouble := identityservice.NewUserPass()
28
s.service = New(s.Server.URL, versionPath, tenantId, region, identityDouble)
29
userInfo := identityDouble.AddUser("fred", "secret", "tenant")
30
s.token = userInfo.Token
33
func (s *SwiftHTTPSuite) SetUpTest(c *C) {
34
s.HTTPSuite.SetUpTest(c)
35
s.service.SetupHTTP(s.Mux)
38
func (s *SwiftHTTPSuite) TearDownTest(c *C) {
39
s.HTTPSuite.TearDownTest(c)
42
func (s *SwiftHTTPSuite) TearDownSuite(c *C) {
43
s.HTTPSuite.TearDownSuite(c)
46
func (s *SwiftHTTPSuite) sendRequest(c *C, method, path string, body []byte,
47
expectedStatusCode int) (resp *http.Response) {
48
return s.sendRequestWithParams(c, method, path, nil, body, expectedStatusCode)
51
func (s *SwiftHTTPSuite) sendRequestWithParams(c *C, method, path string, params map[string]string, body []byte,
52
expectedStatusCode int) (resp *http.Response) {
55
URL := s.service.endpointURL(path)
57
urlParams := make(url.Values, len(params))
58
for k, v := range params {
61
URL += "?" + urlParams.Encode()
64
req, err = http.NewRequest(method, URL, bytes.NewBuffer(body))
66
req, err = http.NewRequest(method, URL, nil)
70
req.Header.Add("X-Auth-Token", s.token)
72
client := &http.DefaultClient
73
resp, err = client.Do(req)
75
c.Assert(resp.StatusCode, Equals, expectedStatusCode)
79
func (s *SwiftHTTPSuite) ensureNotContainer(name string, c *C) {
80
ok := s.service.HasContainer("test")
81
c.Assert(ok, Equals, false)
84
func (s *SwiftHTTPSuite) ensureContainer(name string, c *C) {
85
s.ensureNotContainer(name, c)
86
err := s.service.AddContainer("test")
90
func (s *SwiftHTTPSuite) removeContainer(name string, c *C) {
91
ok := s.service.HasContainer("test")
92
c.Assert(ok, Equals, true)
93
err := s.service.RemoveContainer("test")
97
func (s *SwiftHTTPSuite) ensureNotObject(container, object string, c *C) {
98
_, err := s.service.GetObject(container, object)
99
c.Assert(err, Not(IsNil))
102
func (s *SwiftHTTPSuite) ensureObject(container, object string, data []byte, c *C) {
103
s.ensureNotObject(container, object, c)
104
err := s.service.AddObject(container, object, data)
108
func (s *SwiftHTTPSuite) ensureObjectData(container, object string, data []byte, c *C) {
109
objdata, err := s.service.GetObject(container, object)
111
c.Assert(objdata, DeepEquals, data)
114
func (s *SwiftHTTPSuite) removeObject(container, object string, c *C) {
115
err := s.service.RemoveObject(container, object)
117
s.ensureNotObject(container, object, c)
120
func (s *SwiftHTTPSuite) TestPUTContainerMissingCreated(c *C) {
121
s.ensureNotContainer("test", c)
123
s.sendRequest(c, "PUT", "test", nil, http.StatusCreated)
125
s.removeContainer("test", c)
128
func (s *SwiftHTTPSuite) TestPUTContainerExistsAccepted(c *C) {
129
s.ensureContainer("test", c)
131
s.sendRequest(c, "PUT", "test", nil, http.StatusAccepted)
133
s.removeContainer("test", c)
136
func (s *SwiftHTTPSuite) TestGETContainerMissingNotFound(c *C) {
137
s.ensureNotContainer("test", c)
139
s.sendRequest(c, "GET", "test", nil, http.StatusNotFound)
141
s.ensureNotContainer("test", c)
144
func (s *SwiftHTTPSuite) TestGETContainerExistsOK(c *C) {
145
s.ensureContainer("test", c)
146
data := []byte("test data")
147
s.ensureObject("test", "obj", data, c)
149
resp := s.sendRequest(c, "GET", "test", nil, http.StatusOK)
151
defer resp.Body.Close()
152
body, err := ioutil.ReadAll(resp.Body)
154
var containerData []swift.ContainerContents
155
err = json.Unmarshal(body, &containerData)
157
c.Assert(len(containerData), Equals, 1)
158
c.Assert(containerData[0].Name, Equals, "obj")
160
s.removeContainer("test", c)
163
func (s *SwiftHTTPSuite) TestGETContainerWithPrefix(c *C) {
164
s.ensureContainer("test", c)
165
data := []byte("test data")
166
s.ensureObject("test", "foo", data, c)
167
s.ensureObject("test", "foobar", data, c)
169
resp := s.sendRequestWithParams(c, "GET", "test", map[string]string{"prefix": "foob"}, nil, http.StatusOK)
171
defer resp.Body.Close()
172
body, err := ioutil.ReadAll(resp.Body)
174
var containerData []swift.ContainerContents
175
err = json.Unmarshal(body, &containerData)
177
c.Assert(len(containerData), Equals, 1)
178
c.Assert(containerData[0].Name, Equals, "foobar")
180
s.removeContainer("test", c)
183
func (s *SwiftHTTPSuite) TestDELETEContainerMissingNotFound(c *C) {
184
s.ensureNotContainer("test", c)
186
s.sendRequest(c, "DELETE", "test", nil, http.StatusNotFound)
189
func (s *SwiftHTTPSuite) TestDELETEContainerExistsNoContent(c *C) {
190
s.ensureContainer("test", c)
192
s.sendRequest(c, "DELETE", "test", nil, http.StatusNoContent)
194
s.ensureNotContainer("test", c)
197
func (s *SwiftHTTPSuite) TestPUTObjectMissingCreated(c *C) {
198
s.ensureContainer("test", c)
199
s.ensureNotObject("test", "obj", c)
201
data := []byte("test data")
202
s.sendRequest(c, "PUT", "test/obj", data, http.StatusCreated)
204
s.ensureObjectData("test", "obj", data, c)
205
s.removeContainer("test", c)
208
func (s *SwiftHTTPSuite) TestPUTObjectExistsCreated(c *C) {
209
data := []byte("test data")
210
s.ensureContainer("test", c)
211
s.ensureObject("test", "obj", data, c)
213
newdata := []byte("new test data")
214
s.sendRequest(c, "PUT", "test/obj", newdata, http.StatusCreated)
216
s.ensureObjectData("test", "obj", newdata, c)
217
s.removeContainer("test", c)
220
func (s *SwiftHTTPSuite) TestPUTObjectContainerMissingNotFound(c *C) {
221
s.ensureNotContainer("test", c)
223
data := []byte("test data")
224
s.sendRequest(c, "PUT", "test/obj", data, http.StatusNotFound)
226
s.ensureNotContainer("test", c)
229
func (s *SwiftHTTPSuite) TestGETObjectMissingNotFound(c *C) {
230
s.ensureContainer("test", c)
231
s.ensureNotObject("test", "obj", c)
233
s.sendRequest(c, "GET", "test/obj", nil, http.StatusNotFound)
235
s.removeContainer("test", c)
238
func (s *SwiftHTTPSuite) TestGETObjectContainerMissingNotFound(c *C) {
239
s.ensureNotContainer("test", c)
241
s.sendRequest(c, "GET", "test/obj", nil, http.StatusNotFound)
243
s.ensureNotContainer("test", c)
246
func (s *SwiftHTTPSuite) TestGETObjectExistsOK(c *C) {
247
data := []byte("test data")
248
s.ensureContainer("test", c)
249
s.ensureObject("test", "obj", data, c)
251
resp := s.sendRequest(c, "GET", "test/obj", nil, http.StatusOK)
253
s.ensureObjectData("test", "obj", data, c)
255
defer resp.Body.Close()
256
body, err := ioutil.ReadAll(resp.Body)
258
c.Assert(body, DeepEquals, data)
260
s.removeContainer("test", c)
263
func (s *SwiftHTTPSuite) TestDELETEObjectMissingNotFound(c *C) {
264
s.ensureContainer("test", c)
265
s.ensureNotObject("test", "obj", c)
267
s.sendRequest(c, "DELETE", "test/obj", nil, http.StatusNotFound)
269
s.removeContainer("test", c)
272
func (s *SwiftHTTPSuite) TestDELETEObjectContainerMissingNotFound(c *C) {
273
s.ensureNotContainer("test", c)
275
s.sendRequest(c, "DELETE", "test/obj", nil, http.StatusNotFound)
277
s.ensureNotContainer("test", c)
280
func (s *SwiftHTTPSuite) TestDELETEObjectExistsNoContent(c *C) {
281
data := []byte("test data")
282
s.ensureContainer("test", c)
283
s.ensureObject("test", "obj", data, c)
285
s.sendRequest(c, "DELETE", "test/obj", nil, http.StatusNoContent)
287
s.removeContainer("test", c)
290
func (s *SwiftHTTPSuite) TestUnauthorizedFails(c *C) {
295
// TODO(wallyworld) - 2013-02-11 bug=1121682
296
// until ACLs are supported, empty tokens are assumed to be used when we need to access a public container.
298
// s.sendRequest(c, "GET", "test", nil, http.StatusUnauthorized)
301
s.sendRequest(c, "PUT", "test", nil, http.StatusUnauthorized)
303
s.sendRequest(c, "DELETE", "test", nil, http.StatusUnauthorized)