Commit 18584ab0 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 964898fa
...@@ -36,7 +36,7 @@ func TestKVDiff(t *testing.T) { ...@@ -36,7 +36,7 @@ func TestKVDiff(t *testing.T) {
func TestKVTxt(t *testing.T) { func TestKVTxt(t *testing.T) {
kv := map[Key]string{3:"hello", 1:"zzz", 4:"world"} kv := map[Key]string{3:"hello", 1:"zzz", 4:"world"}
got := kvtxt(kv) got := KVTxt(kv)
want := "1:zzz,3:hello,4:world" want := "1:zzz,3:hello,4:world"
if got != want { if got != want {
t.Fatalf("error:\ngot: %q\nwant: %q", got, want) t.Fatalf("error:\ngot: %q\nwant: %q", got, want)
......
// Copyright (C) 2020-2021 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
//
// This program is free software: you can Use, Study, Modify and Redistribute
// it under the terms of the GNU General Public License version 3, or (at your
// option) any later version, as published by the Free Software Foundation.
//
// You can also Link and Combine this program with other software covered by
// the terms of any of the Free Software licenses or any of the Open Source
// Initiative approved licenses and Convey the resulting work. Corresponding
// source of such a combination shall include the source code for all other
// software used.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// See COPYING file for full licensing terms.
// See https://www.nexedi.com/licensing for rationale and options.
package xbtreetest
// testing-related support
import (
"flag"
"math/rand"
"testing"
"time"
)
var (
verylongFlag = flag.Bool("verylong", false, `switch tests to run in "very long" mode`)
randseedFlag = flag.Int64("randseed", -1, `seed for random number generator`)
)
// N returns short, medium, or long depending on whether tests were ran with
// -short, -verylong, or normally.
func N(short, medium, long int) int {
// -short
if testing.Short() {
return short
}
// -verylong
if *verylongFlag {
return long
}
// default
return medium
}
// NewRand returns new random-number generator and seed that was used to initialize it.
//
// The seed can be controlled via -randseed optiong.
func NewRand() (rng *rand.Rand, seed int64) {
seed = *randseedFlag
if seed == -1 {
seed = time.Now().UnixNano()
}
rng = rand.New(rand.NewSource(seed))
return rng, seed
}
...@@ -44,15 +44,12 @@ package xbtree ...@@ -44,15 +44,12 @@ package xbtree
// - to generate set of random tree topologies that all correspond to particular {k->v} dict. // - to generate set of random tree topologies that all correspond to particular {k->v} dict.
import ( import (
"flag"
"fmt" "fmt"
"math" "math"
"math/rand"
"reflect" "reflect"
"sort" "sort"
"strings" "strings"
"testing" "testing"
"time"
"lab.nexedi.com/kirr/go123/exc" "lab.nexedi.com/kirr/go123/exc"
"lab.nexedi.com/kirr/go123/xerr" "lab.nexedi.com/kirr/go123/xerr"
...@@ -1357,10 +1354,6 @@ func TestΔBTail(t *testing.T) { ...@@ -1357,10 +1354,6 @@ func TestΔBTail(t *testing.T) {
} }
// TestΔBTailAllStructs verifies ΔBtail on tree topologies generated by AllStructs. // TestΔBTailAllStructs verifies ΔBtail on tree topologies generated by AllStructs.
var (
verylongFlag = flag.Bool("verylong", false, `switch tests to run in "very long" mode`)
randseedFlag = flag.Int64("randseed", -1, `seed for random number generator`)
)
func TestΔBTailAllStructs(t *testing.T) { func TestΔBTailAllStructs(t *testing.T) {
X := exc.Raiseif X := exc.Raiseif
...@@ -1376,22 +1369,10 @@ func TestΔBTailAllStructs(t *testing.T) { ...@@ -1376,22 +1369,10 @@ func TestΔBTailAllStructs(t *testing.T) {
// imports; https://github.com/pypa/setuptools/issues/510) // imports; https://github.com/pypa/setuptools/issues/510)
// -> we spawn `treegen allstructs` once and use request/response approach. // -> we spawn `treegen allstructs` once and use request/response approach.
N := func(short, medium, long int) int { maxdepth := xbtreetest.N(2, 3, 4)
// -short maxsplit := xbtreetest.N(1, 2, 2)
if testing.Short() { n := xbtreetest.N(10,10,100)
return short nkeys := xbtreetest.N(3, 5, 10)
}
// -verylong
if *verylongFlag {
return long
}
// default
return medium
}
maxdepth := N(2, 3, 4)
maxsplit := N(1, 2, 2)
n := N(10,10,100)
nkeys := N(3, 5, 10)
// server to generate AllStructs(kv, ...) // server to generate AllStructs(kv, ...)
sg, err := xbtreetest.StartAllStructsSrv(); X(err) sg, err := xbtreetest.StartAllStructsSrv(); X(err)
...@@ -1399,12 +1380,8 @@ func TestΔBTailAllStructs(t *testing.T) { ...@@ -1399,12 +1380,8 @@ func TestΔBTailAllStructs(t *testing.T) {
err := sg.Close(); X(err) err := sg.Close(); X(err)
}() }()
// random seed // random-number generator
seed := *randseedFlag rng, seed := xbtreetest.NewRand()
if seed == -1 {
seed = time.Now().UnixNano()
}
rng := rand.New(rand.NewSource(seed))
t.Logf("# maxdepth=%d maxsplit=%d nkeys=%d n=%d seed=%d", maxdepth, maxsplit, nkeys, n, seed) t.Logf("# maxdepth=%d maxsplit=%d nkeys=%d n=%d seed=%d", maxdepth, maxsplit, nkeys, n, seed)
// generate (kv1, kv2, kv3) randomly // generate (kv1, kv2, kv3) randomly
...@@ -1429,7 +1406,7 @@ func TestΔBTailAllStructs(t *testing.T) { ...@@ -1429,7 +1406,7 @@ func TestΔBTailAllStructs(t *testing.T) {
// topology sets (T1, T2, T3). Then iterate through T1->T2->T3->T1... // topology sets (T1, T2, T3). Then iterate through T1->T2->T3->T1...
// elements such that all right-directed triplets are visited and only once. // elements such that all right-directed triplets are visited and only once.
// Test Update and rebuild on the generated tree sequences. // Test Update and rebuild on the generated tree sequences.
vv := "abcdefgh" vv := "abcdefghij"
randv := func() string { randv := func() string {
i := rng.Intn(len(vv)) i := rng.Intn(len(vv))
return vv[i:i+1] return vv[i:i+1]
......
...@@ -47,7 +47,7 @@ const ø = "ø" ...@@ -47,7 +47,7 @@ const ø = "ø"
// ΔFTestEntry represents one entry in ΔFtail tests. // ΔFTestEntry represents one entry in ΔFtail tests.
type ΔFTestEntry struct { type ΔFTestEntry struct {
δblkTab map[int64]string // changes in tree part {} #blk -> ZBlk<oid> δblkTab map[int64]string // changes in tree part {} #blk -> ZBlk<name>
δdataTab setStr // changes to ZBlk objects δdataTab setStr // changes to ZBlk objects
} }
...@@ -82,9 +82,9 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) { ...@@ -82,9 +82,9 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) {
// data built via applying changes from testv // data built via applying changes from testv
vδf := []*ΔFile{} // (rev↑, {}blk) XXX +.Size? vδf := []*ΔFile{} // (rev↑, {}blk) XXX +.Size?
blkTab := map[int64]string{} // #blk -> ZBlk<oid> blkTab := map[int64]string{} // #blk -> ZBlk<name>
dataTab := map[string]string{} // ZBlk<oid> -> data dataTab := map[string]string{} // ZBlk<name> -> data
Zinblk := map[string]setI64{} // ZBlk<oid> -> which #blk refer to it Zinblk := map[string]setI64{} // ZBlk<name> -> which #blk refer to it
// initialize dataTab from root['treegen/values'] // initialize dataTab from root['treegen/values']
for /*oid*/_, zblk := range t.Head().ZBlkDataTab { for /*oid*/_, zblk := range t.Head().ZBlkDataTab {
...@@ -191,6 +191,7 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) { ...@@ -191,6 +191,7 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) {
} }
} }
// TestΔFtail runs ΔFtail tests on set of concrete prepared testcases.
func TestΔFtail(t *testing.T) { func TestΔFtail(t *testing.T) {
// δT is shorthand to create δblkTab. // δT is shorthand to create δblkTab.
type δT = map[int64]string type δT = map[int64]string
...@@ -223,8 +224,46 @@ func TestΔFtail(t *testing.T) { ...@@ -223,8 +224,46 @@ func TestΔFtail(t *testing.T) {
testΔFtail(t, testq) testΔFtail(t, testq)
} }
// TestΔFtailRandom runs ΔFtail tests on randomly-generated file changes.
func TestΔFtailRandom(t *testing.T) { func TestΔFtailRandom(t *testing.T) {
// XXX // XXX
n := xbtreetest.N(1E3, 1E4, 1E5)
// random-number generator
rng, seed := xbtreetest.NewRand()
t.Logf("# n=%d seed=%d", n, seed)
vv := "abcdefghij"
randv := func() string {
i := rng.Intn(len(vv))
return vv[i:i+1]
}
for i := 0; i < n; i++ {
nδblkTab := rng.Intn(10) // XXX -> to maxBlk ?
nδdataTab := rng.Intn(len(vv))
δblkTab := map[int64]string{}
δdataTab := setStr{}
blkv := rng.Perm(100) // XXX = maxBlk ?
for j := 0; j < nδblkTab; j++ {
blk := blkv[j]
zblk := randv()
δblkTab[int64(blk)] = zblk
}
vv_ := rng.Perm(len(vv))
for j := 0; j < nδdataTab; j++ {
k := vv_[j]
v := vv[k:k+1]
δdataTab.Add(v)
}
}
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment