Skip to content

Commit

Permalink
counter: Add a helper for counting streamed readers
Browse files Browse the repository at this point in the history
This makes it easy to get the size and digest from a single streamed
Put, since you need both to construct a valid image-spec Descriptor.

Signed-off-by: W. Trevor King <wking@tremily.us>
  • Loading branch information
wking committed Oct 18, 2017
1 parent 76d4062 commit 45b4b35
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
32 changes: 32 additions & 0 deletions counter/counter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2017 casengine contributors
//
// 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 counter defines a byte-counting writer. One use case is measuring the size of content being streamed into CAS.
package counter

type Counter struct {
count uint64
}

// Write implements io.Writer for Counter.
func (c *Counter) Write(p []byte) (n int, err error) {
c.count += uint64(len(p))
return len(p), nil
}

// Count returns the number of bytes which have been written to this
// Counter.
func (c *Counter) Count() (n uint64) {
return c.count
}
38 changes: 38 additions & 0 deletions counter/counter_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Copyright 2017 casengine contributors
//
// 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 counter defines a byte-counting writer. One use case is measuring the size of content being streamed into CAS.
package counter

import (
"io"
"io/ioutil"
"strings"
"testing"

"github.com/stretchr/testify/assert"
)

func Test(t *testing.T) {
bodyIn := "Hello, World!"
counter := &Counter{}
reader := strings.NewReader(bodyIn)
countedReader := io.TeeReader(reader, counter)
bodyOut, err := ioutil.ReadAll(countedReader)
if err != nil {
t.Fatal(err)
}
assert.Equal(t, bodyIn, string(bodyOut))
assert.Equal(t, uint64(len(bodyIn)), counter.Count())
}

0 comments on commit 45b4b35

Please sign in to comment.