diff options
Diffstat (limited to 'object_iterator_test.go')
| -rw-r--r-- | object_iterator_test.go | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/object_iterator_test.go b/object_iterator_test.go new file mode 100644 index 0000000..4a2387d --- /dev/null +++ b/object_iterator_test.go @@ -0,0 +1,184 @@ +/****************************************************************************** +* +* Copyright 2018 Stefan Majewsky <majewsky@gmx.net> +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +******************************************************************************/ + +package schwift + +import ( + "bytes" + "crypto/md5" + "encoding/hex" + "fmt" + "testing" +) + +var objectExampleContent = []byte(`{"message":"Hello World!"}`) +var objectExampleContentEtag = etagOf(objectExampleContent) + +func etagOf(buf []byte) string { + hash := md5.Sum(buf) + return hex.EncodeToString(hash[:]) +} + +func TestObjectIterator(t *testing.T) { + testWithContainer(t, func(c *Container) { + oname := func(idx int) string { + return fmt.Sprintf("schwift-test-listing%d", idx) + } + + //create test objects that can be listed + for idx := 1; idx <= 4; idx++ { + hdr := make(ObjectHeaders) + hdr.ContentType().Set("application/json") + err := c.Object(oname(idx)).Upload(bytes.NewReader(objectExampleContent), hdr, nil) + expectSuccess(t, err) + } + + //test iteration with empty last page + iter := c.Objects() + iter.Prefix = "schwift-test-listing" + os, err := iter.NextPage(2) + expectSuccess(t, err) + expectObjectNames(t, os, oname(1), oname(2)) + os, err = iter.NextPage(2) + expectSuccess(t, err) + expectObjectNames(t, os, oname(3), oname(4)) + os, err = iter.NextPage(2) + expectSuccess(t, err) + expectObjectNames(t, os) + os, err = iter.NextPage(2) + expectSuccess(t, err) + expectObjectNames(t, os) + + //test iteration with partial last page + iter = c.Objects() + iter.Prefix = "schwift-test-listing" + os, err = iter.NextPage(3) + expectSuccess(t, err) + expectObjectNames(t, os, oname(1), oname(2), oname(3)) + os, err = iter.NextPage(3) + expectSuccess(t, err) + expectObjectNames(t, os, oname(4)) + os, err = iter.NextPage(4) + expectSuccess(t, err) + expectObjectNames(t, os) + + //test detailed iteration + iter = c.Objects() + iter.Prefix = "schwift-test-listing" + ois, err := iter.NextPageDetailed(2) + expectSuccess(t, err) + expectObjectInfos(t, ois, oname(1), oname(2)) + ois, err = iter.NextPageDetailed(3) + expectSuccess(t, err) + expectObjectInfos(t, ois, oname(3), oname(4)) + ois, err = iter.NextPageDetailed(3) + expectSuccess(t, err) + expectObjectInfos(t, ois) + ois, err = iter.NextPageDetailed(3) + expectSuccess(t, err) + expectObjectInfos(t, ois) + + //test Foreach + iter = c.Objects() + iter.Prefix = "schwift-test-listing" + idx := 0 + expectSuccess(t, iter.Foreach(func(o *Object) error { + idx++ + expectString(t, o.Name(), oname(idx)) + return nil + })) + expectInt(t, idx, 4) + + //test ForeachDetailed + iter = c.Objects() + iter.Prefix = "schwift-test-listing" + idx = 0 + expectSuccess(t, iter.ForeachDetailed(func(info ObjectInfo) error { + idx++ + expectString(t, info.Object.Name(), oname(idx)) + return nil + })) + expectInt(t, idx, 4) + + //test Collect + iter = c.Objects() + iter.Prefix = "schwift-test-listing" + os, err = iter.Collect() + expectSuccess(t, err) + expectObjectNames(t, os, oname(1), oname(2), oname(3), oname(4)) + + //test CollectDetailed + iter = c.Objects() + iter.Prefix = "schwift-test-listing" + ois, err = iter.CollectDetailed() + expectSuccess(t, err) + expectObjectInfos(t, ois, oname(1), oname(2), oname(3), oname(4)) + + //cleanup + iter = c.Objects() + iter.Prefix = "schwift-test-listing" + expectSuccess(t, iter.Foreach(func(o *Object) error { + return o.Delete(nil, nil) + })) + }) +} + +func expectObjectNames(t *testing.T, actualObjects []*Object, expectedNames ...string) { + t.Helper() + if len(actualObjects) != len(expectedNames) { + t.Errorf("expected %d objects, got %d objects", + len(expectedNames), len(actualObjects)) + return + } + for idx, c := range actualObjects { + if c.Name() != expectedNames[idx] { + t.Errorf("expected objects[%d].Name() == %q, got %q", + idx, expectedNames[idx], c.Name()) + } + } +} + +func expectObjectInfos(t *testing.T, actualInfos []ObjectInfo, expectedNames ...string) { + t.Helper() + if len(actualInfos) != len(expectedNames) { + t.Errorf("expected %d objects, got %d objects", + len(expectedNames), len(actualInfos)) + return + } + for idx, info := range actualInfos { + if info.Object.Name() != expectedNames[idx] { + t.Errorf("expected objects[%d].Name() == %q, got %q", + idx, expectedNames[idx], info.Object.Name()) + } + if info.SizeBytes != uint64(len(objectExampleContent)) { + t.Errorf("expected objects[%d] sizeBytes == %d, got %d", + idx, len(objectExampleContent), info.SizeBytes) + } + if info.ContentType != "application/json" { + t.Errorf(`expected objects[%d] contentType == "application/json", got %q`, + idx, info.ContentType) + } + if info.Etag != objectExampleContentEtag { + t.Errorf("expected objects[%d] etag == %q, got %q", + idx, objectExampleContentEtag, info.Etag) + } + if info.LastModified.IsZero() { + t.Errorf("objects[%d].LastModified is zero", idx) + } + } +} |
