aboutsummaryrefslogtreecommitdiff
path: root/src/bytes/reader_test.go
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2015-01-22 14:15:47 -0800
committerBrad Fitzpatrick <bradfitz@golang.org>2015-04-06 08:53:47 +0000
commitc264c87335ff4b3111d43f830dbe37eac1509f2e (patch)
tree72a631779b376ae0ec4b584453d4b07ba897bf02 /src/bytes/reader_test.go
parentc50a8416c851ab6897f9efcd932ac26b5862dcad (diff)
downloadgo-c264c87335ff4b3111d43f830dbe37eac1509f2e.tar.xz
bytes, strings: add Reader.Size methods
As noted on recently on golang-nuts, there's currently no way to know the total size of a strings.Reader or bytes.Reader when using ReadAt on them. Most callers resort to wrapping it in an io.SectionReader to retain that information. The SizeReaderAt abstraction (an io.ReaderAt with a Size() int64 method) has proven useful as a way of expressing a concurrency-safe read-only number of bytes. As one example, see http://talks.golang.org/2013/oscon-dl.slide#49 and the rest of that presentation for its use in dl.google.com. SizeReaderAt is also used in the open source google-api-go-client, and within Google's internal codebase, where it exists in a public package created in 2013 with the package comment: "These may migrate to the standard library after we have enough experience with their feel." I'm still as happy with the SizeReaderAt abstraction and its composabilty as I was in 2013, so I'd like to make these two Readers also be SizeReaderAts. Fixes #9667 Change-Id: Ie6f145ada419dd116280472d8c029f046d5edf70 Reviewed-on: https://go-review.googlesource.com/3199 Reviewed-by: Andrew Gerrand <adg@golang.org> Reviewed-by: Russ Cox <rsc@golang.org> Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src/bytes/reader_test.go')
-rw-r--r--src/bytes/reader_test.go12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/bytes/reader_test.go b/src/bytes/reader_test.go
index d3dce53499..b929a28260 100644
--- a/src/bytes/reader_test.go
+++ b/src/bytes/reader_test.go
@@ -244,3 +244,15 @@ func TestReaderCopyNothing(t *testing.T) {
t.Errorf("behavior differs: with = %#v; without: %#v", with, withOut)
}
}
+
+// tests that Len is affected by reads, but Size is not.
+func TestReaderLenSize(t *testing.T) {
+ r := NewReader([]byte("abc"))
+ io.CopyN(ioutil.Discard, r, 1)
+ if r.Len() != 2 {
+ t.Errorf("Len = %d; want 2", r.Len())
+ }
+ if r.Size() != 3 {
+ t.Errorf("Size = %d; want 3", r.Size())
+ }
+}