mirror of https://github.com/stashapp/stash.git
76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
package utils
|
|
|
|
import (
|
|
"math/rand"
|
|
"testing"
|
|
)
|
|
|
|
// Note that the public API returns "" instead.
|
|
func TestOshashEmpty(t *testing.T) {
|
|
var size int64
|
|
head := make([]byte, chunkSize)
|
|
tail := make([]byte, chunkSize)
|
|
want := "0000000000000000"
|
|
got, err := oshash(size, head, tail)
|
|
if err != nil {
|
|
t.Errorf("TestOshashEmpty: Error from oshash: %v", err)
|
|
}
|
|
if got != want {
|
|
t.Errorf("TestOshashEmpty: oshash(0, 0, 0) = %q; want %q", got, want)
|
|
}
|
|
}
|
|
|
|
// As oshash sums byte values, causing collisions is trivial.
|
|
func TestOshashCollisions(t *testing.T) {
|
|
buf1 := []byte("this is dumb")
|
|
buf2 := []byte("dumb is this")
|
|
size := int64(len(buf1))
|
|
head := make([]byte, chunkSize)
|
|
|
|
tail1 := make([]byte, chunkSize)
|
|
copy(tail1[len(tail1)-len(buf1):], buf1)
|
|
hash1, err := oshash(size, head, tail1)
|
|
if err != nil {
|
|
t.Errorf("TestOshashCollisions: Error from oshash: %v", err)
|
|
}
|
|
|
|
tail2 := make([]byte, chunkSize)
|
|
copy(tail2[len(tail2)-len(buf2):], buf2)
|
|
hash2, err := oshash(size, head, tail2)
|
|
if err != nil {
|
|
t.Errorf("TestOshashCollisions: Error from oshash: %v", err)
|
|
}
|
|
|
|
if hash1 != hash2 {
|
|
t.Errorf("TestOshashCollisions: oshash(n, k, ... %v) =! oshash(n, k, ... %v)", buf1, buf2)
|
|
}
|
|
}
|
|
|
|
func BenchmarkOsHash(b *testing.B) {
|
|
src := rand.NewSource(9999)
|
|
r := rand.New(src)
|
|
|
|
size := int64(1234567890)
|
|
|
|
head := make([]byte, 1024*64)
|
|
_, err := r.Read(head)
|
|
if err != nil {
|
|
b.Errorf("unable to generate head array: %v", err)
|
|
}
|
|
|
|
tail := make([]byte, 1024*64)
|
|
_, err = r.Read(tail)
|
|
if err != nil {
|
|
b.Errorf("unable to generate tail array: %v", err)
|
|
}
|
|
|
|
b.ResetTimer()
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
_, err := oshash(size, head, tail)
|
|
if err != nil {
|
|
b.Errorf("unexpected error: %v", err)
|
|
}
|
|
}
|
|
}
|