61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
package hw3test
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"math/rand"
|
|
"testing"
|
|
)
|
|
|
|
func TestComparisonReaderMatchesEnvFile(t *testing.T) {
|
|
for _, seed := range []int64{-7824, 0, 1, 7824, 9223372036854775807} {
|
|
for _, chunkSize := range []int{1, 6, 7, 8, 13, 64 * 1024, 131071} {
|
|
const total = 1024*1024 + 19
|
|
expected := make([]byte, total)
|
|
actual := make([]byte, total)
|
|
_, err := io.ReadFull(rand.New(rand.NewSource(seed)), expected)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
reader := newComparisonReader(seed)
|
|
for offset := 0; offset < total; {
|
|
end := offset + chunkSize
|
|
if end > total {
|
|
end = total
|
|
}
|
|
if _, err := io.ReadFull(reader, actual[offset:end]); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
offset = end
|
|
}
|
|
if !bytes.Equal(actual, expected) {
|
|
t.Fatalf("different bytes for seed %d and chunk size %d", seed, chunkSize)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkComparisonReaders(b *testing.B) {
|
|
const size = 128 * 1024 * 1024
|
|
buffer := make([]byte, 64*1024)
|
|
for _, candidate := range []struct {
|
|
name string
|
|
open func() io.Reader
|
|
}{
|
|
{"math/rand", func() io.Reader { return rand.New(rand.NewSource(7824)) }},
|
|
{"comparison", func() io.Reader { return newComparisonReader(7824) }},
|
|
} {
|
|
b.Run(candidate.name, func(b *testing.B) {
|
|
b.SetBytes(size)
|
|
for i := 0; i < b.N; i++ {
|
|
reader := candidate.open()
|
|
for remaining := size; remaining > 0; remaining -= len(buffer) {
|
|
if _, err := io.ReadFull(reader, buffer); err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|