68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
|
package jottacloud
|
||
|
|
||
|
import (
|
||
|
"crypto/md5"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"io/ioutil"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
// A test reader to return a test pattern of size
|
||
|
type testReader struct {
|
||
|
size int64
|
||
|
c byte
|
||
|
}
|
||
|
|
||
|
// Reader is the interface that wraps the basic Read method.
|
||
|
func (r *testReader) Read(p []byte) (n int, err error) {
|
||
|
for i := range p {
|
||
|
if r.size <= 0 {
|
||
|
return n, io.EOF
|
||
|
}
|
||
|
p[i] = r.c
|
||
|
r.c = (r.c + 1) % 253
|
||
|
r.size--
|
||
|
n++
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func TestReadMD5(t *testing.T) {
|
||
|
// smoke test the reader
|
||
|
b, err := ioutil.ReadAll(&testReader{size: 10})
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, b)
|
||
|
|
||
|
// Check readMD5 for different size and threshold
|
||
|
for _, size := range []int64{0, 1024, 10 * 1024, 100 * 1024} {
|
||
|
t.Run(fmt.Sprintf("%d", size), func(t *testing.T) {
|
||
|
hasher := md5.New()
|
||
|
n, err := io.Copy(hasher, &testReader{size: size})
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, n, size)
|
||
|
wantMD5 := fmt.Sprintf("%x", hasher.Sum(nil))
|
||
|
for _, threshold := range []int64{512, 1024, 10 * 1024, 20 * 1024} {
|
||
|
t.Run(fmt.Sprintf("%d", threshold), func(t *testing.T) {
|
||
|
in := &testReader{size: size}
|
||
|
gotMD5, out, cleanup, err := readMD5(in, size, threshold)
|
||
|
defer cleanup()
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, wantMD5, gotMD5)
|
||
|
|
||
|
// check md5hash of out
|
||
|
hasher := md5.New()
|
||
|
n, err := io.Copy(hasher, out)
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, n, size)
|
||
|
outMD5 := fmt.Sprintf("%x", hasher.Sum(nil))
|
||
|
assert.Equal(t, wantMD5, outMD5)
|
||
|
})
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|