diff options
| author | Stefan Majewsky <majewsky@gmx.net> | 2018-02-19 21:30:33 +0100 |
|---|---|---|
| committer | Stefan Majewsky <majewsky@gmx.net> | 2018-02-19 21:33:49 +0100 |
| commit | 60d4779889baedc44972d4749daa073efca3b25c (patch) | |
| tree | d47746971f659d6f7e3affe428f239b289954f5b /tests/container_iterator_test.go | |
| parent | 8f777460661bbbcbe42730979140f525b382110e (diff) | |
| download | go-schwift-60d4779889baedc44972d4749daa073efca3b25c.tar.gz | |
reorganize code
* Gophercloud dependencies move into subpackage gopherschwift.
* Tests move into subpackage tests (to avoid import cycles).
+ Rename "Client" to "Backend".
Diffstat (limited to 'tests/container_iterator_test.go')
| -rw-r--r-- | tests/container_iterator_test.go | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/tests/container_iterator_test.go b/tests/container_iterator_test.go new file mode 100644 index 0000000..b9813db --- /dev/null +++ b/tests/container_iterator_test.go @@ -0,0 +1,187 @@ +/****************************************************************************** +* +* 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 tests + +import ( + "fmt" + "testing" + + "github.com/majewsky/schwift" +) + +func TestContainerIterator(t *testing.T) { + testWithAccount(t, func(a *schwift.Account) { + cname := func(idx int) string { + return fmt.Sprintf("schwift-test-listing%d", idx) + } + + //create test containers that can be listed + for idx := 1; idx <= 4; idx++ { + _, err := a.Container(cname(idx)).EnsureExists() + expectSuccess(t, err) + } + + //test iteration with empty last page + iter := a.Containers() + iter.Prefix = "schwift-test-listing" + cs, err := iter.NextPage(2) + expectSuccess(t, err) + expectContainerNames(t, cs, cname(1), cname(2)) + cs, err = iter.NextPage(2) + expectSuccess(t, err) + expectContainerNames(t, cs, cname(3), cname(4)) + cs, err = iter.NextPage(2) + expectSuccess(t, err) + expectContainerNames(t, cs) + cs, err = iter.NextPage(2) + expectSuccess(t, err) + expectContainerNames(t, cs) + + //test iteration with partial last page + iter = a.Containers() + iter.Prefix = "schwift-test-listing" + cs, err = iter.NextPage(3) + expectSuccess(t, err) + expectContainerNames(t, cs, cname(1), cname(2), cname(3)) + cs, err = iter.NextPage(3) + expectSuccess(t, err) + expectContainerNames(t, cs, cname(4)) + cs, err = iter.NextPage(4) + expectSuccess(t, err) + expectContainerNames(t, cs) + + //test detailed iteration + iter = a.Containers() + iter.Prefix = "schwift-test-listing" + cis, err := iter.NextPageDetailed(2) + expectSuccess(t, err) + expectContainerInfos(t, cis, cname(1), cname(2)) + cis, err = iter.NextPageDetailed(3) + expectSuccess(t, err) + expectContainerInfos(t, cis, cname(3), cname(4)) + cis, err = iter.NextPageDetailed(3) + expectSuccess(t, err) + expectContainerInfos(t, cis) + cis, err = iter.NextPageDetailed(3) + expectSuccess(t, err) + expectContainerInfos(t, cis) + + //test Foreach + a.Invalidate() + iter = a.Containers() + iter.Prefix = "schwift-test-listing" + idx := 0 + expectSuccess(t, iter.Foreach(func(c *schwift.Container) error { + idx++ + expectString(t, c.Name(), cname(idx)) + return nil + })) + expectInt(t, idx, 4) + expectAccountHeadersCached(t, a) + + //test ForeachDetailed + a.Invalidate() + iter = a.Containers() + iter.Prefix = "schwift-test-listing" + idx = 0 + expectSuccess(t, iter.ForeachDetailed(func(info schwift.ContainerInfo) error { + idx++ + expectString(t, info.Container.Name(), cname(idx)) + return nil + })) + expectInt(t, idx, 4) + expectAccountHeadersCached(t, a) + + //test Collect + iter = a.Containers() + iter.Prefix = "schwift-test-listing" + cs, err = iter.Collect() + expectSuccess(t, err) + expectContainerNames(t, cs, cname(1), cname(2), cname(3), cname(4)) + + //test CollectDetailed + iter = a.Containers() + iter.Prefix = "schwift-test-listing" + cis, err = iter.CollectDetailed() + expectSuccess(t, err) + expectContainerInfos(t, cis, cname(1), cname(2), cname(3), cname(4)) + + //cleanup + iter = a.Containers() + iter.Prefix = "schwift-test-listing" + expectSuccess(t, iter.Foreach(func(c *schwift.Container) error { + return c.Delete(nil, nil) + })) + }) +} + +func expectAccountHeadersCached(t *testing.T, a *schwift.Account) { + requestCountBefore := a.Backend().(*RequestCountingBackend).Count + _, err := a.Headers() + expectSuccess(t, err) + requestCountAfter := a.Backend().(*RequestCountingBackend).Count + + t.Helper() + if requestCountBefore != requestCountAfter { + t.Error("Account.Headers was expected to use cache, but issued HEAD request") + } +} + +func expectContainerNames(t *testing.T, actualContainers []*schwift.Container, expectedNames ...string) { + t.Helper() + if len(actualContainers) != len(expectedNames) { + t.Errorf("expected %d containers, got %d containers", + len(expectedNames), len(actualContainers)) + return + } + for idx, c := range actualContainers { + if c.Name() != expectedNames[idx] { + t.Errorf("expected containers[%d].Name() == %q, got %q", + idx, expectedNames[idx], c.Name()) + } + } +} + +func expectContainerInfos(t *testing.T, actualInfos []schwift.ContainerInfo, expectedNames ...string) { + t.Helper() + if len(actualInfos) != len(expectedNames) { + t.Errorf("expected %d containers, got %d containers", + len(expectedNames), len(actualInfos)) + return + } + for idx, info := range actualInfos { + if info.Container.Name() != expectedNames[idx] { + t.Errorf("expected containers[%d].Name() == %q, got %q", + idx, expectedNames[idx], info.Container.Name()) + } + //TODO: upload test object of defined size to the listed containers to + //check if this zero is not just the default value + if info.BytesUsed != 0 { + t.Errorf("expected containers[%d] bytesUsed == 0, got %d", + idx, info.BytesUsed) + } + if info.ObjectCount != 0 { + t.Errorf("expected containers[%d] objectCount == 0, got %d", + idx, info.ObjectCount) + } + if info.LastModified.IsZero() { + t.Errorf("containers[%d].LastModified is zero", idx) + } + } +} |
