blob: 25fbd0918b07eb1018d8897c3fc570725201d777 [file] [log] [blame]
package bt_tracestore
import (
"crypto/md5"
"math/rand"
"testing"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/testutils/unittest"
"go.skia.org/infra/go/tiling"
"go.skia.org/infra/golden/go/types"
)
func TestTraceMapCommitIndicesWithData(t *testing.T) {
unittest.SmallTest(t)
tm := traceMap{
",key=first,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, types.MISSING_DIGEST, AlphaDigest,
AlphaDigest, types.MISSING_DIGEST, BetaDigest,
},
},
",key=second,": &types.GoldenTrace{
Digests: []types.Digest{
GammaDigest, types.MISSING_DIGEST, types.MISSING_DIGEST,
GammaDigest, types.MISSING_DIGEST, GammaDigest,
},
},
}
require.Equal(t, []int{0, 2, 3, 5}, tm.CommitIndicesWithData(10))
empty := traceMap{
",key=first,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, types.MISSING_DIGEST, types.MISSING_DIGEST,
},
},
",key=second,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, types.MISSING_DIGEST, types.MISSING_DIGEST,
},
},
}
require.Empty(t, empty.CommitIndicesWithData(10))
require.Empty(t, traceMap{}.CommitIndicesWithData(10))
}
func TestTraceMapCommitIndicesWithDataTricky(t *testing.T) {
unittest.SmallTest(t)
for i := 0; i < 100; i++ {
tm := traceMap{
",key=first,": &types.GoldenTrace{
Digests: []types.Digest{
AlphaDigest, types.MISSING_DIGEST,
},
},
",key=second,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, GammaDigest,
},
},
",key=third,": &types.GoldenTrace{
Digests: []types.Digest{
AlphaDigest, types.MISSING_DIGEST,
},
},
}
require.Equal(t, []int{0, 1}, tm.CommitIndicesWithData(10))
}
}
func TestTraceMapMakeFromCommitIndexes(t *testing.T) {
unittest.SmallTest(t)
tm := traceMap{
",key=first,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, types.MISSING_DIGEST, AlphaDigest,
AlphaDigest, types.MISSING_DIGEST, BetaDigest,
},
},
",key=second,": &types.GoldenTrace{
Digests: []types.Digest{
GammaDigest, types.MISSING_DIGEST, types.MISSING_DIGEST,
GammaDigest, types.MISSING_DIGEST, GammaDigest,
},
},
}
require.Equal(t, traceMap{
",key=first,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, AlphaDigest,
AlphaDigest, BetaDigest,
},
},
",key=second,": &types.GoldenTrace{
Digests: []types.Digest{
GammaDigest, types.MISSING_DIGEST,
GammaDigest, GammaDigest,
},
},
}, tm.MakeFromCommitIndexes([]int{0, 2, 3, 5}))
require.Equal(t, traceMap{
",key=first,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, types.MISSING_DIGEST, types.MISSING_DIGEST,
},
},
",key=second,": &types.GoldenTrace{
Digests: []types.Digest{
GammaDigest, types.MISSING_DIGEST, types.MISSING_DIGEST,
},
},
}, tm.MakeFromCommitIndexes([]int{0, 1, 4}))
require.Equal(t, traceMap{}, tm.MakeFromCommitIndexes([]int{}))
require.Equal(t, traceMap{}, tm.MakeFromCommitIndexes(nil))
}
func TestTraceMapPrependTraces(t *testing.T) {
unittest.SmallTest(t)
tm1 := traceMap{
",key=first,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, types.MISSING_DIGEST, AlphaDigest,
},
},
",key=second,": &types.GoldenTrace{
Digests: []types.Digest{
GammaDigest, types.MISSING_DIGEST, types.MISSING_DIGEST,
},
},
}
tm2 := traceMap{
",key=first,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, GammaDigest,
},
},
",key=third,": &types.GoldenTrace{
Digests: []types.Digest{
GammaDigest, BetaDigest,
},
},
}
tm1.PrependTraces(tm2)
require.Equal(t, traceMap{
",key=first,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, GammaDigest,
types.MISSING_DIGEST, types.MISSING_DIGEST, AlphaDigest,
},
},
",key=second,": &types.GoldenTrace{
Digests: []types.Digest{
types.MISSING_DIGEST, types.MISSING_DIGEST,
GammaDigest, types.MISSING_DIGEST, types.MISSING_DIGEST,
},
},
",key=third,": &types.GoldenTrace{
Digests: []types.Digest{
GammaDigest, BetaDigest,
types.MISSING_DIGEST, types.MISSING_DIGEST, types.MISSING_DIGEST,
},
},
}, tm1)
}
const (
AlphaDigest = types.Digest("aaa6fc936d06e6569788366f1e3fda4e")
BetaDigest = types.Digest("bbb15c047d150d961573062854f35a55")
GammaDigest = types.Digest("cccd42f3ee0b02687f63963adb36a580")
)
var benchResult []int
func BenchmarkCommitIndicesWithDataDense(b *testing.B) {
tm := makeRandomTraceMap(0.9)
b.ResetTimer()
var r []int
for n := 0; n < b.N; n++ {
r = tm.CommitIndicesWithData(numCommits)
}
benchResult = r
}
func BenchmarkCommitIndicesWithDataSparse(b *testing.B) {
tm := makeRandomTraceMap(0.1)
b.ResetTimer()
var r []int
for n := 0; n < b.N; n++ {
r = tm.CommitIndicesWithData(numCommits)
}
benchResult = r
}
const numTraces = 10000
const numCommits = 500
func makeRandomTraceMap(density float32) traceMap {
rand.Seed(0)
commitsWithData := make([]bool, numCommits)
for i := 0; i < numCommits; i++ {
if rand.Float32() < density {
commitsWithData[i] = true
}
}
tm := make(traceMap, numTraces)
for i := 0; i < numTraces; i++ {
traceID := tiling.TraceID(randomDigest()) // any string should do
gt := &types.GoldenTrace{
// Keys can be blank for the CommitIndicesWithData bench
Digests: make([]types.Digest, numCommits),
}
for j := 0; j < numCommits; j++ {
if commitsWithData[j] && rand.Float32() < density {
gt.Digests[j] = randomDigest()
} else {
gt.Digests[j] = types.MISSING_DIGEST
}
}
tm[traceID] = gt
}
return tm
}
func randomDigest() types.Digest {
b := make([]byte, md5.Size)
_, _ = rand.Read(b)
return fromBytes(b)
}