Generalise interleaving of test data

This commit is contained in:
Steve Streeting 2015-11-26 11:46:13 +00:00
parent b655a158e6
commit 39102e9152
2 changed files with 33 additions and 23 deletions

@ -243,6 +243,32 @@ func callBatchApi(op string, objs []TestObject) ([]*lfs.ObjectResource, error) {
return lfs.Batch(apiobjs, op)
}
// Combine 2 slices into one by "randomly" interleaving
// Not actually random, same sequence each time so repeatable
func interleaveTestData(slice1, slice2 []TestObject) []TestObject {
// Predictable sequence, mixin existing & missing semi-randomly
rand.Seed(21)
count := len(slice1) + len(slice2)
ret := make([]TestObject, 0, count)
slice1Idx := 0
slice2Idx := 0
for left := count; left > 0; {
for i := rand.Intn(3) + 1; slice1Idx < len(slice1) && i > 0; i-- {
obj := slice1[slice1Idx]
ret = append(ret, obj)
slice1Idx++
left--
}
for i := rand.Intn(3) + 1; slice2Idx < len(slice2) && i > 0; i-- {
obj := slice2[slice2Idx]
ret = append(ret, obj)
slice2Idx++
left--
}
}
return ret
}
func init() {
RootCmd.Flags().StringVarP(&apiUrl, "url", "u", "", "URL of the API (must supply this or --clone)")
RootCmd.Flags().StringVarP(&cloneUrl, "clone", "c", "", "Clone URL from which to find API (must supply this or --url)")

@ -4,7 +4,6 @@ import (
"bytes"
"errors"
"fmt"
"math/rand"
"github.com/github/git-lfs/lfs"
)
@ -72,37 +71,22 @@ func downloadAllMissing(oidsExist, oidsMissing []TestObject) error {
func downloadMixed(oidsExist, oidsMissing []TestObject) error {
existSet := lfs.NewStringSetWithCapacity(len(oidsExist))
for _, o := range oidsExist {
existSet.Add(o.Oid)
}
missingSet := lfs.NewStringSetWithCapacity(len(oidsMissing))
// Predictable sequence, mixin existing & missing semi-randomly
rand.Seed(21)
count := len(oidsExist) + len(oidsMissing)
calloids := make([]TestObject, 0, count)
existIdx := 0
missingIdx := 0
for left := count; left > 0; {
for i := rand.Intn(3) + 1; existIdx < len(oidsExist) && i > 0; i-- {
obj := oidsExist[existIdx]
existSet.Add(obj.Oid)
calloids = append(calloids, obj)
existIdx++
left--
}
for i := rand.Intn(3) + 1; missingIdx < len(oidsMissing) && i > 0; i-- {
obj := oidsMissing[missingIdx]
missingSet.Add(obj.Oid)
calloids = append(calloids, obj)
missingIdx++
left--
}
for _, o := range oidsMissing {
missingSet.Add(o.Oid)
}
calloids := interleaveTestData(oidsExist, oidsMissing)
retobjs, err := callBatchApi("download", calloids)
if err != nil {
return err
}
count := len(oidsExist) + len(oidsMissing)
if len(retobjs) != count {
return fmt.Errorf("Incorrect number of returned objects, expected %d, got %d", count, len(retobjs))
}