diff options
| author | Stefan Majewsky <majewsky@gmx.net> | 2018-04-30 14:14:56 +0200 |
|---|---|---|
| committer | Stefan Majewsky <majewsky@gmx.net> | 2018-05-02 19:33:46 +0200 |
| commit | f9749638e3393f471d7e28362795689bf37cc023 (patch) | |
| tree | 57d56e88387b6ceef39ba23e29d009d683e44be4 /largeobject_test.go | |
| parent | a5ad3ae67e9c42aa738adae7e7fd535109bc9005 (diff) | |
| download | go-schwift-f9749638e3393f471d7e28362795689bf37cc023.tar.gz | |
revamp the LargeObject API
I thought about this some more, and I believe the Writer-based approach
in the previous version of the LargeObject API does not scale: It makes
it very hard to write code that uploads segments without resorting to a
buffer the same size as the segments. I don't want gigabyte-scale
buffers filling up my RAM, so this commit switches to a different API
based on Readers. LargeObject.Append() now behaves very similar to
Object.Upload(), which I find quite nice.
Diffstat (limited to 'largeobject_test.go')
| -rw-r--r-- | largeobject_test.go | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/largeobject_test.go b/largeobject_test.go index fe781ab..724654a 100644 --- a/largeobject_test.go +++ b/largeobject_test.go @@ -18,7 +18,11 @@ package schwift -import "testing" +import ( + "bytes" + "io/ioutil" + "testing" +) func TestParseHTTPRange(t *testing.T) { testCases := []struct { @@ -62,3 +66,47 @@ func TestParseHTTPRange(t *testing.T) { } } } + +func TestSegmentingReader(t *testing.T) { + testCases := []struct { + input string + segments []string + }{ + {"abcdefghi", []string{"abc", "def", "ghi"}}, + {"abcdefgh", []string{"abc", "def", "gh"}}, + {"abcdefg", []string{"abc", "def", "g"}}, + } + + for _, tc := range testCases { + sr := segmentingReader{ + Reader: bytes.NewReader([]byte(tc.input)), + SegmentSizeBytes: 3, + } + + for _, expected := range tc.segments { + segment := sr.NextSegment() + if segment == nil { + t.Errorf("expected segment %q, but NextSegment() returned nil", expected) + break + } + actual, err := ioutil.ReadAll(segment) + if err != nil { + t.Errorf("expected segment %q, but got read error %q", expected, err.Error()) + break + } + if string(actual) != expected { + t.Errorf("expected segment %q, but got %q", expected, string(actual)) + } + } + + segment := sr.NextSegment() + if segment != nil { + actual, err := ioutil.ReadAll(segment) + if err == nil { + t.Errorf("expected no more segments, but got segment producing read error %q", err.Error()) + } else { + t.Errorf("expected no more segments, but got %q", string(actual)) + } + } + } +} |
