From d23b4052c0866698b14ac13ac98581d9f5440a9b Mon Sep 17 00:00:00 2001 From: Stefan Majewsky Date: Sun, 11 Mar 2018 19:38:27 +0100 Subject: revamp the Headers API 1. Move common methods of AccountHeaders, ContainerHeaders, ObjectHeaders into a base type Headers. 2. Fold Headers into RequestOptions to remove one of the two optional arguments on request methods. The new Headers.ToOpts() method offers a nice experience for users passing Headers to request methods. The Update() methods keep the explicit Headers argument since the Headers argument is not optional there. The only downside is that we lose a bit of type-safety because RequestOptions takes any Headers instance, so e.g. ContainerHeaders could be passed to Object.Upload(). I believe the benefits outweigh this problem. --- tests/account_test.go | 6 +++--- tests/bulk_delete_test.go | 10 ++++----- tests/bulk_upload_test.go | 6 +++--- tests/container_iterator_test.go | 2 +- tests/container_test.go | 8 +++---- tests/field_test.go | 46 ++++++++++++++++++++-------------------- tests/headers_test.go | 12 ++++++----- tests/object_iterator_test.go | 4 ++-- tests/object_test.go | 36 +++++++++++++++---------------- tests/shared_test.go | 4 ++-- 10 files changed, 68 insertions(+), 66 deletions(-) (limited to 'tests') diff --git a/tests/account_test.go b/tests/account_test.go index 310d4ce..2885bfa 100644 --- a/tests/account_test.go +++ b/tests/account_test.go @@ -41,7 +41,7 @@ func TestAccountBasic(t *testing.T) { func TestAccountMetadata(t *testing.T) { testWithAccount(t, func(a *schwift.Account) { //test creating some metadata - hdr := make(schwift.AccountHeaders) + hdr := schwift.NewAccountHeaders() hdr.Metadata().Set("schwift-test1", "first") hdr.Metadata().Set("schwift-test2", "second") err := a.Update(hdr, nil) @@ -57,7 +57,7 @@ func TestAccountMetadata(t *testing.T) { expectString(t, hdr.Metadata().Get("schwift-test2"), "second") //test deleting some metadata - hdr = make(schwift.AccountHeaders) + hdr = schwift.NewAccountHeaders() hdr.Metadata().Clear("schwift-test1") err = a.Update(hdr, nil) if !expectSuccess(t, err) { @@ -72,7 +72,7 @@ func TestAccountMetadata(t *testing.T) { expectString(t, hdr.Metadata().Get("schwift-test2"), "second") //test updating some metadata - hdr = make(schwift.AccountHeaders) + hdr = schwift.NewAccountHeaders() hdr.Metadata().Set("schwift-test1", "will not be set") hdr.Metadata().Del("schwift-test1") hdr.Metadata().Set("schwift-test2", "changed") diff --git a/tests/bulk_delete_test.go b/tests/bulk_delete_test.go index 52294ba..c498419 100644 --- a/tests/bulk_delete_test.go +++ b/tests/bulk_delete_test.go @@ -33,13 +33,13 @@ func TestBulkDeleteSuccess(t *testing.T) { objs, err := createTestObjects(c) expectSuccess(t, err) - numDeleted, numNotFound, err := c.Account().BulkDelete(objs, nil, nil, nil) + numDeleted, numNotFound, err := c.Account().BulkDelete(objs, nil, nil) expectSuccess(t, err) expectInt(t, numDeleted, len(objs)) expectInt(t, numNotFound, 0) expectContainerExistence(t, c, true) - numDeleted, numNotFound, err = c.Account().BulkDelete(objs, nil, nil, nil) + numDeleted, numNotFound, err = c.Account().BulkDelete(objs, nil, nil) expectSuccess(t, err) expectInt(t, numDeleted, 0) expectInt(t, numNotFound, len(objs)) @@ -49,7 +49,7 @@ func TestBulkDeleteSuccess(t *testing.T) { expectSuccess(t, err) cs := []*schwift.Container{c} - numDeleted, numNotFound, err = c.Account().BulkDelete(objs, cs, nil, nil) + numDeleted, numNotFound, err = c.Account().BulkDelete(objs, cs, nil) expectSuccess(t, err) expectInt(t, numDeleted, len(objs)+1) expectInt(t, numNotFound, 0) @@ -65,7 +65,7 @@ func TestBulkDeleteError(t *testing.T) { cs := []*schwift.Container{c} //not deleting all objects should lead to 409 Conflict when deleting the Container - numDeleted, numNotFound, err := c.Account().BulkDelete(objs, cs, nil, nil) + numDeleted, numNotFound, err := c.Account().BulkDelete(objs, cs, nil) expectInt(t, numDeleted, len(objs)) expectInt(t, numNotFound, 0) expectError(t, err, "400 Bad Request (+1 object errors)") @@ -77,7 +77,7 @@ func createTestObjects(c *schwift.Container) ([]*schwift.Object, error) { var objs []*schwift.Object for idx := 1; idx <= 5; idx++ { obj := c.Object(fmt.Sprintf("object%d", idx)) - err := obj.Upload(strings.NewReader("example"), nil, nil) + err := obj.Upload(strings.NewReader("example"), nil) if err != nil { return nil, err } diff --git a/tests/bulk_upload_test.go b/tests/bulk_upload_test.go index 68cb791..6cbae42 100644 --- a/tests/bulk_upload_test.go +++ b/tests/bulk_upload_test.go @@ -40,7 +40,7 @@ func TestBulkUploadSuccess(t *testing.T) { "", //upload path schwift.BulkUploadTar, bytes.NewReader(archive), - nil, nil, + nil, ) expectInt(t, n, 2) expectSuccess(t, err) @@ -58,7 +58,7 @@ func TestBulkUploadArchiveError(t *testing.T) { c.Name(), //upload path schwift.BulkUploadTar, strings.NewReader("This is not the TAR archive you're looking for."), - nil, nil, + nil, ) expectInt(t, n, 0) expectError(t, err, "400 Bad Request: Invalid Tar File: truncated header") @@ -83,7 +83,7 @@ func TestBulkUploadObjectError(t *testing.T) { c.Name(), //upload path schwift.BulkUploadTar, bytes.NewReader(archive), - nil, nil, + nil, ) expectInt(t, n, 1) expectError(t, err, "400 Bad Request (+1 object errors)") diff --git a/tests/container_iterator_test.go b/tests/container_iterator_test.go index b9813db..d682a59 100644 --- a/tests/container_iterator_test.go +++ b/tests/container_iterator_test.go @@ -126,7 +126,7 @@ func TestContainerIterator(t *testing.T) { iter = a.Containers() iter.Prefix = "schwift-test-listing" expectSuccess(t, iter.Foreach(func(c *schwift.Container) error { - return c.Delete(nil, nil) + return c.Delete(nil) })) }) } diff --git a/tests/container_test.go b/tests/container_test.go index c90a339..0efc4e6 100644 --- a/tests/container_test.go +++ b/tests/container_test.go @@ -46,17 +46,17 @@ func TestContainerLifecycle(t *testing.T) { //DELETE should be idempotent and not return success on non-existence, but //OpenStack LOVES to be inconsistent with everything (including, notably, itself) - err = c.Delete(nil, nil) + err = c.Delete(nil) expectError(t, err, "expected 204 response, got 404 instead:

Not Found

The resource could not be found.

") - err = c.Create(nil, nil) + err = c.Create(nil) expectSuccess(t, err) exists, err = c.Exists() expectSuccess(t, err) expectBool(t, exists, true) - err = c.Delete(nil, nil) + err = c.Delete(nil) expectSuccess(t, err) }) } @@ -69,7 +69,7 @@ func TestContainerUpdate(t *testing.T) { expectBool(t, hdr.ObjectCount().Exists(), true) expectUint64(t, hdr.ObjectCount().Get(), 0) - hdr = make(schwift.ContainerHeaders) + hdr = schwift.NewContainerHeaders() hdr.ObjectCountQuota().Set(23) hdr.BytesUsedQuota().Set(42) diff --git a/tests/field_test.go b/tests/field_test.go index f3c03ca..8166f2d 100644 --- a/tests/field_test.go +++ b/tests/field_test.go @@ -27,33 +27,33 @@ import ( ) func TestFieldString(t *testing.T) { - hdr := make(schwift.AccountHeaders) + hdr := schwift.NewAccountHeaders() expectBool(t, hdr.TempURLKey().Exists(), false) expectString(t, hdr.TempURLKey().Get(), "") expectSuccess(t, hdr.Validate()) - hdr["X-Account-Meta-Temp-Url-Key"] = "" + hdr.Headers["X-Account-Meta-Temp-Url-Key"] = "" expectBool(t, hdr.TempURLKey().Exists(), false) expectString(t, hdr.TempURLKey().Get(), "") expectSuccess(t, hdr.Validate()) - hdr["X-Account-Meta-Temp-Url-Key"] = "foo" + hdr.Headers["X-Account-Meta-Temp-Url-Key"] = "foo" expectBool(t, hdr.TempURLKey().Exists(), true) expectString(t, hdr.TempURLKey().Get(), "foo") expectSuccess(t, hdr.Validate()) hdr.TempURLKey().Set("bar") - expectHeaders(t, hdr, map[string]string{ + expectHeaders(t, hdr.Headers, map[string]string{ "X-Account-Meta-Temp-Url-Key": "bar", }) hdr.TempURLKey().Clear() - expectHeaders(t, hdr, map[string]string{ + expectHeaders(t, hdr.Headers, map[string]string{ "X-Account-Meta-Temp-Url-Key": "", }) hdr.TempURLKey().Del() - expectHeaders(t, hdr, nil) + expectHeaders(t, hdr.Headers, nil) hdr.TempURLKey().Clear() - expectHeaders(t, hdr, map[string]string{ + expectHeaders(t, hdr.Headers, map[string]string{ "X-Account-Meta-Temp-Url-Key": "", }) } @@ -70,16 +70,16 @@ func TestFieldTimestamp(t *testing.T) { expectBool(t, hdr.CreatedAt().Exists(), true) actual := float64(hdr.CreatedAt().Get().UnixNano()) / 1e9 - expected, _ := strconv.ParseFloat(hdr["X-Timestamp"], 64) + expected, _ := strconv.ParseFloat(hdr.Headers["X-Timestamp"], 64) expectFloat64(t, actual, expected) }) - hdr := make(schwift.AccountHeaders) + hdr := schwift.NewAccountHeaders() expectBool(t, hdr.CreatedAt().Exists(), false) expectBool(t, hdr.CreatedAt().Get().IsZero(), true) expectSuccess(t, hdr.Validate()) - hdr["X-Timestamp"] = "wtf" + hdr.Headers["X-Timestamp"] = "wtf" expectBool(t, hdr.CreatedAt().Exists(), true) expectBool(t, hdr.CreatedAt().Get().IsZero(), true) expectError(t, hdr.Validate(), `Bad header X-Timestamp: strconv.ParseFloat: parsing "wtf": invalid syntax`) @@ -88,7 +88,7 @@ func TestFieldTimestamp(t *testing.T) { func TestFieldHTTPTimestamp(t *testing.T) { testWithContainer(t, func(c *schwift.Container) { obj := c.Object("test") - err := obj.Upload(nil, nil, nil) + err := obj.Upload(nil, nil) if !expectSuccess(t, err) { return } @@ -104,12 +104,12 @@ func TestFieldHTTPTimestamp(t *testing.T) { expectInt64(t, actual.Unix(), expected.Unix()) }) - hdr := make(schwift.ObjectHeaders) + hdr := schwift.NewObjectHeaders() expectBool(t, hdr.UpdatedAt().Exists(), false) expectBool(t, hdr.UpdatedAt().Get().IsZero(), true) expectSuccess(t, hdr.Validate()) - hdr["Last-Modified"] = "wtf" + hdr.Headers["Last-Modified"] = "wtf" expectBool(t, hdr.UpdatedAt().Exists(), true) expectBool(t, hdr.UpdatedAt().Get().IsZero(), true) expectError(t, hdr.Validate(), `Bad header Last-Modified: parsing time "wtf" as "Mon Jan _2 15:04:05 2006": cannot parse "wtf" as "Mon"`) @@ -118,49 +118,49 @@ func TestFieldHTTPTimestamp(t *testing.T) { //////////////////////////////////////////////////////////////////////////////// func TestFieldUint64(t *testing.T) { - hdr := make(schwift.AccountHeaders) + hdr := schwift.NewAccountHeaders() expectBool(t, hdr.BytesUsedQuota().Exists(), false) expectUint64(t, hdr.BytesUsedQuota().Get(), 0) expectSuccess(t, hdr.Validate()) - hdr["X-Account-Meta-Quota-Bytes"] = "23" + hdr.Headers["X-Account-Meta-Quota-Bytes"] = "23" expectBool(t, hdr.BytesUsedQuota().Exists(), true) expectUint64(t, hdr.BytesUsedQuota().Get(), 23) expectSuccess(t, hdr.Validate()) - hdr["X-Account-Meta-Quota-Bytes"] = "-23" + hdr.Headers["X-Account-Meta-Quota-Bytes"] = "-23" expectBool(t, hdr.BytesUsedQuota().Exists(), true) expectUint64(t, hdr.BytesUsedQuota().Get(), 0) expectError(t, hdr.Validate(), `Bad header X-Account-Meta-Quota-Bytes: strconv.ParseUint: parsing "-23": invalid syntax`) hdr.BytesUsedQuota().Set(9001) - expectHeaders(t, hdr, map[string]string{ + expectHeaders(t, hdr.Headers, map[string]string{ "X-Account-Meta-Quota-Bytes": "9001", }) hdr.BytesUsedQuota().Clear() - expectHeaders(t, hdr, map[string]string{ + expectHeaders(t, hdr.Headers, map[string]string{ "X-Account-Meta-Quota-Bytes": "", }) hdr.BytesUsedQuota().Del() - expectHeaders(t, hdr, nil) + expectHeaders(t, hdr.Headers, nil) hdr.BytesUsedQuota().Clear() - expectHeaders(t, hdr, map[string]string{ + expectHeaders(t, hdr.Headers, map[string]string{ "X-Account-Meta-Quota-Bytes": "", }) } func TestFieldUint64Readonly(t *testing.T) { - hdr := make(schwift.AccountHeaders) + hdr := schwift.NewAccountHeaders() expectBool(t, hdr.BytesUsed().Exists(), false) expectUint64(t, hdr.BytesUsed().Get(), 0) expectSuccess(t, hdr.Validate()) - hdr["X-Account-Bytes-Used"] = "23" + hdr.Headers["X-Account-Bytes-Used"] = "23" expectBool(t, hdr.BytesUsed().Exists(), true) expectUint64(t, hdr.BytesUsed().Get(), 23) expectSuccess(t, hdr.Validate()) - hdr["X-Account-Bytes-Used"] = "-23" + hdr.Headers["X-Account-Bytes-Used"] = "-23" expectBool(t, hdr.BytesUsed().Exists(), true) expectUint64(t, hdr.BytesUsed().Get(), 0) expectError(t, hdr.Validate(), `Bad header X-Account-Bytes-Used: strconv.ParseUint: parsing "-23": invalid syntax`) diff --git a/tests/headers_test.go b/tests/headers_test.go index 8067ef4..6b229ae 100644 --- a/tests/headers_test.go +++ b/tests/headers_test.go @@ -26,11 +26,13 @@ import ( func TestParseAccountHeadersSuccess(t *testing.T) { headers := schwift.AccountHeaders{ - "X-Account-Bytes-Used": "1234", - "X-Account-Object-Count": "42", - "X-Account-Container-Count": "23", - "X-Account-Meta-Quota-Bytes": "1048576", - "X-Account-Meta-Foo": "bar", + Headers: schwift.Headers{ + "X-Account-Bytes-Used": "1234", + "X-Account-Object-Count": "42", + "X-Account-Container-Count": "23", + "X-Account-Meta-Quota-Bytes": "1048576", + "X-Account-Meta-Foo": "bar", + }, } expectSuccess(t, headers.Validate()) diff --git a/tests/object_iterator_test.go b/tests/object_iterator_test.go index 5112324..009189d 100644 --- a/tests/object_iterator_test.go +++ b/tests/object_iterator_test.go @@ -37,9 +37,9 @@ func TestObjectIterator(t *testing.T) { //create test objects that can be listed for idx := 1; idx <= 4; idx++ { - hdr := make(schwift.ObjectHeaders) + hdr := schwift.NewObjectHeaders() hdr.ContentType().Set("application/json") - err := c.Object(oname(idx)).Upload(bytes.NewReader(objectExampleContent), hdr, nil) + err := c.Object(oname(idx)).Upload(bytes.NewReader(objectExampleContent), hdr.ToOpts()) expectSuccess(t, err) } diff --git a/tests/object_test.go b/tests/object_test.go index 090fc48..b42294a 100644 --- a/tests/object_test.go +++ b/tests/object_test.go @@ -47,15 +47,15 @@ func TestObjectLifecycle(t *testing.T) { //DELETE should be idempotent and not return success on non-existence, but //OpenStack LOVES to be inconsistent with everything (including, notably, itself) - err = o.Delete(nil, nil) + err = o.Delete(nil) expectError(t, err, "expected 204 response, got 404 instead:

Not Found

The resource could not be found.

") - err = o.Upload(bytes.NewReader([]byte("test")), nil, nil) + err = o.Upload(bytes.NewReader([]byte("test")), nil) expectSuccess(t, err) expectObjectExistence(t, o, true) - err = o.Delete(nil, nil) + err = o.Delete(nil) expectSuccess(t, err) }) } @@ -65,25 +65,25 @@ func TestObjectUpload(t *testing.T) { //test upload with bytes.Reader obj := c.Object("upload1") - err := obj.Upload(bytes.NewReader(objectExampleContent), nil, nil) + err := obj.Upload(bytes.NewReader(objectExampleContent), nil) expectSuccess(t, err) expectObjectContent(t, obj, objectExampleContent) //test upload with bytes.Buffer obj = c.Object("upload2") - err = obj.Upload(bytes.NewBuffer(objectExampleContent), nil, nil) + err = obj.Upload(bytes.NewBuffer(objectExampleContent), nil) expectSuccess(t, err) expectObjectContent(t, obj, objectExampleContent) //test upload with opaque io.Reader obj = c.Object("upload3") - err = obj.Upload(opaqueReader{bytes.NewReader(objectExampleContent)}, nil, nil) + err = obj.Upload(opaqueReader{bytes.NewReader(objectExampleContent)}, nil) expectSuccess(t, err) expectObjectContent(t, obj, objectExampleContent) //test upload with io.Writer obj = c.Object("upload4") - err = obj.UploadWithWriter(nil, nil, func(w io.Writer) error { + err = obj.UploadWithWriter(nil, func(w io.Writer) error { _, err := w.Write(objectExampleContent) return err }) @@ -92,13 +92,13 @@ func TestObjectUpload(t *testing.T) { //test upload with empty reader (should create zero-byte-sized object) obj = c.Object("upload5") - err = obj.Upload(eofReader{}, nil, nil) + err = obj.Upload(eofReader{}, nil) expectSuccess(t, err) expectObjectContent(t, obj, nil) //test upload without reader (should create zero-byte-sized object) obj = c.Object("upload6") - err = obj.Upload(nil, nil, nil) + err = obj.Upload(nil, nil) expectSuccess(t, err) expectObjectContent(t, obj, nil) }) @@ -122,21 +122,21 @@ func TestObjectDownload(t *testing.T) { testWithContainer(t, func(c *schwift.Container) { //upload example object obj := c.Object("example") - err := obj.Upload(bytes.NewReader(objectExampleContent), nil, nil) + err := obj.Upload(bytes.NewReader(objectExampleContent), nil) expectSuccess(t, err) //test download as string - str, err := obj.Download(nil, nil).AsString() + str, err := obj.Download(nil).AsString() expectSuccess(t, err) expectString(t, str, string(objectExampleContent)) //test download as byte slice - buf, err := obj.Download(nil, nil).AsByteSlice() + buf, err := obj.Download(nil).AsByteSlice() expectSuccess(t, err) expectString(t, string(buf), string(objectExampleContent)) //test download as io.ReadCloser slice - reader, err := obj.Download(nil, nil).AsReadCloser() + reader, err := obj.Download(nil).AsReadCloser() expectSuccess(t, err) buf = make([]byte, 4) _, err = reader.Read(buf) @@ -156,14 +156,14 @@ func TestObjectUpdate(t *testing.T) { obj := c.Object("example") //test that metadata update fails for non-existing object - newHeaders := make(schwift.ObjectHeaders) + newHeaders := schwift.NewObjectHeaders() newHeaders.ContentType().Set("application/json") err := obj.Update(newHeaders, nil) expectBool(t, schwift.Is(err, http.StatusNotFound), true) expectError(t, err, "expected 202 response, got 404 instead:

Not Found

The resource could not be found.

") //create object - err = obj.Upload(nil, nil, nil) + err = obj.Upload(nil, nil) expectSuccess(t, err) hdr, err := obj.Headers() @@ -183,12 +183,12 @@ func TestObjectUpdate(t *testing.T) { func TestObjectCopyMove(t *testing.T) { testWithContainer(t, func(c *schwift.Container) { obj1 := c.Object("location1") - err := obj1.Upload(bytes.NewReader(objectExampleContent), nil, nil) + err := obj1.Upload(bytes.NewReader(objectExampleContent), nil) expectSuccess(t, err) expectObjectExistence(t, obj1, true) obj2 := c.Object("location2") - expectSuccess(t, obj1.CopyTo(obj2, nil, nil)) + expectSuccess(t, obj1.CopyTo(obj2, nil)) expectObjectExistence(t, obj1, true) expectObjectExistence(t, obj2, true) expectObjectContent(t, obj2, objectExampleContent) @@ -212,7 +212,7 @@ func expectObjectExistence(t *testing.T, obj *schwift.Object, expectedExists boo func expectObjectContent(t *testing.T, obj *schwift.Object, expected []byte) { t.Helper() - str, err := obj.Download(nil, nil).AsString() + str, err := obj.Download(nil).AsString() expectSuccess(t, err) expectString(t, str, string(expected)) obj.Invalidate() diff --git a/tests/shared_test.go b/tests/shared_test.go index 187d0b4..c35951f 100644 --- a/tests/shared_test.go +++ b/tests/shared_test.go @@ -99,9 +99,9 @@ func testWithContainer(t *testing.T, testCode func(c *schwift.Container)) { expectSuccess(t, err) if exists { expectSuccess(t, container.Objects().Foreach(func(o *schwift.Object) error { - return o.Delete(nil, nil) + return o.Delete(nil) })) - err = container.Delete(nil, nil) + err = container.Delete(nil) expectSuccess(t, err) } }) -- cgit v1.2.3