Skip to content

Commit b157612

Browse files
Dan LaineStephenButtolph
andauthored
merkledb and sync -- use time based rand seed (ava-labs#1607)
Signed-off-by: Dan Laine <daniel.laine@avalabs.org> Co-authored-by: Stephen Buttolph <stephen@avalabs.org>
1 parent 13863e3 commit b157612

File tree

7 files changed

+92
-25
lines changed

7 files changed

+92
-25
lines changed

x/merkledb/db_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"math/rand"
1010
"strconv"
1111
"testing"
12+
"time"
1213

1314
"github.com/prometheus/client_golang/prometheus"
1415
"github.com/stretchr/testify/require"
@@ -613,7 +614,9 @@ func Test_MerkleDB_Random_Insert_Ordering(t *testing.T) {
613614
}
614615

615616
for i := 0; i < 3; i++ {
616-
r := rand.New(rand.NewSource(int64(i))) // #nosec G404
617+
now := time.Now().UnixNano()
618+
t.Logf("seed for iter %d: %d", i, now)
619+
r := rand.New(rand.NewSource(now)) // #nosec G404
617620

618621
ops := make([]*testOperation, 0, totalState)
619622
allKeys = [][]byte{}
@@ -675,15 +678,19 @@ func Test_MerkleDB_RandomCases(t *testing.T) {
675678
require := require.New(t)
676679

677680
for i := 150; i < 500; i += 10 {
678-
r := rand.New(rand.NewSource(int64(i))) // #nosec G404
681+
now := time.Now().UnixNano()
682+
t.Logf("seed for iter %d: %d", i, now)
683+
r := rand.New(rand.NewSource(now)) // #nosec G404
679684
runRandDBTest(require, r, generate(require, r, i, .01))
680685
}
681686
}
682687

683688
func Test_MerkleDB_RandomCases_InitialValues(t *testing.T) {
684689
require := require.New(t)
685690

686-
r := rand.New(rand.NewSource(int64(0))) // #nosec G404
691+
now := time.Now().UnixNano()
692+
t.Logf("seed: %d", now)
693+
r := rand.New(rand.NewSource(now)) // #nosec G404
687694
runRandDBTest(require, r, generateInitialValues(require, r, 1000, 2500, 0.0))
688695
}
689696

x/merkledb/history_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"math/rand"
99
"testing"
10+
"time"
1011

1112
"github.com/stretchr/testify/require"
1213

@@ -87,7 +88,9 @@ func Test_History_Large(t *testing.T) {
8788
require := require.New(t)
8889

8990
for i := 1; i < 10; i++ {
90-
r := rand.New(rand.NewSource(int64(i))) // #nosec G404
91+
now := time.Now().UnixNano()
92+
t.Logf("seed for iter %d: %d", i, now)
93+
r := rand.New(rand.NewSource(now)) // #nosec G404
9194
db, err := New(
9295
context.Background(),
9396
memdb.New(),

x/merkledb/proof_test.go

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"math/rand"
99
"testing"
10+
"time"
1011

1112
"github.com/stretchr/testify/require"
1213

@@ -1204,7 +1205,9 @@ func TestVerifyProofPath(t *testing.T) {
12041205
}
12051206

12061207
func TestProofNodeUnmarshalProtoInvalidMaybe(t *testing.T) {
1207-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
1208+
now := time.Now().UnixNano()
1209+
t.Logf("seed: %d", now)
1210+
rand := rand.New(rand.NewSource(now)) // #nosec G404
12081211

12091212
node := newRandomProofNode(rand)
12101213
protoNode := node.ToProto()
@@ -1221,7 +1224,9 @@ func TestProofNodeUnmarshalProtoInvalidMaybe(t *testing.T) {
12211224
}
12221225

12231226
func TestProofNodeUnmarshalProtoInvalidChildBytes(t *testing.T) {
1224-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
1227+
now := time.Now().UnixNano()
1228+
t.Logf("seed: %d", now)
1229+
rand := rand.New(rand.NewSource(now)) // #nosec G404
12251230

12261231
node := newRandomProofNode(rand)
12271232
protoNode := node.ToProto()
@@ -1236,7 +1241,9 @@ func TestProofNodeUnmarshalProtoInvalidChildBytes(t *testing.T) {
12361241
}
12371242

12381243
func TestProofNodeUnmarshalProtoInvalidChildIndex(t *testing.T) {
1239-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
1244+
now := time.Now().UnixNano()
1245+
t.Logf("seed: %d", now)
1246+
rand := rand.New(rand.NewSource(now)) // #nosec G404
12401247

12411248
node := newRandomProofNode(rand)
12421249
protoNode := node.ToProto()
@@ -1250,7 +1257,9 @@ func TestProofNodeUnmarshalProtoInvalidChildIndex(t *testing.T) {
12501257
}
12511258

12521259
func TestProofNodeUnmarshalProtoMissingFields(t *testing.T) {
1253-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
1260+
now := time.Now().UnixNano()
1261+
t.Logf("seed: %d", now)
1262+
rand := rand.New(rand.NewSource(now)) // #nosec G404
12541263

12551264
type test struct {
12561265
name string
@@ -1299,7 +1308,9 @@ func TestProofNodeUnmarshalProtoMissingFields(t *testing.T) {
12991308

13001309
func TestProofNodeProtoMarshalUnmarshal(t *testing.T) {
13011310
require := require.New(t)
1302-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
1311+
now := time.Now().UnixNano()
1312+
t.Logf("seed: %d", now)
1313+
rand := rand.New(rand.NewSource(now)) // #nosec G404
13031314

13041315
for i := 0; i < 1_000; i++ {
13051316
node := newRandomProofNode(rand)
@@ -1319,7 +1330,9 @@ func TestProofNodeProtoMarshalUnmarshal(t *testing.T) {
13191330

13201331
func TestRangeProofProtoMarshalUnmarshal(t *testing.T) {
13211332
require := require.New(t)
1322-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
1333+
now := time.Now().UnixNano()
1334+
t.Logf("seed: %d", now)
1335+
rand := rand.New(rand.NewSource(now)) // #nosec G404
13231336

13241337
for i := 0; i < 500; i++ {
13251338
// Make a random range proof.
@@ -1373,7 +1386,9 @@ func TestRangeProofProtoMarshalUnmarshal(t *testing.T) {
13731386

13741387
func TestChangeProofProtoMarshalUnmarshal(t *testing.T) {
13751388
require := require.New(t)
1376-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
1389+
now := time.Now().UnixNano()
1390+
t.Logf("seed: %d", now)
1391+
rand := rand.New(rand.NewSource(now)) // #nosec G404
13771392

13781393
for i := 0; i < 500; i++ {
13791394
// Make a random change proof.
@@ -1437,7 +1452,9 @@ func TestChangeProofUnmarshalProtoNil(t *testing.T) {
14371452
}
14381453

14391454
func TestChangeProofUnmarshalProtoNilValue(t *testing.T) {
1440-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
1455+
now := time.Now().UnixNano()
1456+
t.Logf("seed: %d", now)
1457+
rand := rand.New(rand.NewSource(now)) // #nosec G404
14411458

14421459
// Make a random change proof.
14431460
startProofLen := rand.Intn(32)
@@ -1508,7 +1525,9 @@ func TestChangeProofUnmarshalProtoInvalidMaybe(t *testing.T) {
15081525

15091526
func TestProofProtoMarshalUnmarshal(t *testing.T) {
15101527
require := require.New(t)
1511-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
1528+
now := time.Now().UnixNano()
1529+
t.Logf("seed: %d", now)
1530+
rand := rand.New(rand.NewSource(now)) // #nosec G404
15121531

15131532
for i := 0; i < 500; i++ {
15141533
// Make a random proof.

x/merkledb/view_iterator_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"math/rand"
1010
"sort"
1111
"testing"
12+
"time"
1213

1314
"github.com/stretchr/testify/require"
1415
"golang.org/x/exp/maps"
@@ -158,7 +159,9 @@ func Test_TrieView_IteratorStartPrefix(t *testing.T) {
158159
// iterating over the last view.
159160
func Test_TrieView_Iterator_Random(t *testing.T) {
160161
require := require.New(t)
161-
rand := rand.New(rand.NewSource(1337)) // #nosec G404
162+
now := time.Now().UnixNano()
163+
t.Logf("seed: %d", now)
164+
rand := rand.New(rand.NewSource(now)) // #nosec G404
162165

163166
var (
164167
numKeyChanges = 5_000

x/sync/client_test.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ func sendRangeRequest(
123123
}
124124

125125
func TestGetRangeProof(t *testing.T) {
126+
// TODO use time as random seed instead of 1
127+
// once we move to go 1.20 which allows for
128+
// joining multiple errors with %w. Right now,
129+
// for some of these tests, we may get different
130+
// errors based on randomness but we can only
131+
// assert one error.
126132
r := rand.New(rand.NewSource(1)) // #nosec G404
127133

128134
smallTrieKeyCount := defaultRequestKeyLimit
@@ -383,6 +389,12 @@ func sendChangeRequest(
383389
}
384390

385391
func TestGetChangeProof(t *testing.T) {
392+
// TODO use time as random seed instead of 1
393+
// once we move to go 1.20 which allows for
394+
// joining multiple errors with %w. Right now,
395+
// for some of these tests, we may get different
396+
// errors based on randomness but we can only
397+
// assert one error.
386398
r := rand.New(rand.NewSource(1)) // #nosec G404
387399

388400
trieDB, err := merkledb.New(
@@ -560,7 +572,9 @@ func TestGetChangeProof(t *testing.T) {
560572
}
561573

562574
func TestRangeProofRetries(t *testing.T) {
563-
r := rand.New(rand.NewSource(1)) // #nosec G404
575+
now := time.Now().UnixNano()
576+
t.Logf("seed: %d", now)
577+
r := rand.New(rand.NewSource(now)) // #nosec G404
564578
require := require.New(t)
565579

566580
keyCount := defaultRequestKeyLimit

x/sync/network_server_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"math/rand"
99
"testing"
10+
"time"
1011

1112
"github.com/golang/mock/gomock"
1213

@@ -23,7 +24,9 @@ import (
2324
)
2425

2526
func Test_Server_GetRangeProof(t *testing.T) {
26-
r := rand.New(rand.NewSource(1)) // #nosec G404
27+
now := time.Now().UnixNano()
28+
t.Logf("seed: %d", now)
29+
r := rand.New(rand.NewSource(now)) // #nosec G404
2730

2831
smallTrieDB, _, err := generateTrieWithMinKeyLen(t, r, defaultRequestKeyLimit, 1)
2932
require.NoError(t, err)
@@ -143,7 +146,9 @@ func Test_Server_GetRangeProof(t *testing.T) {
143146
}
144147

145148
func Test_Server_GetChangeProof(t *testing.T) {
146-
r := rand.New(rand.NewSource(1)) // #nosec G404
149+
now := time.Now().UnixNano()
150+
t.Logf("seed: %d", now)
151+
r := rand.New(rand.NewSource(now)) // #nosec G404
147152
trieDB, _, err := generateTrieWithMinKeyLen(t, r, defaultRequestKeyLimit, 1)
148153
require.NoError(t, err)
149154

x/sync/sync_test.go

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,9 @@ func Test_Midpoint(t *testing.T) {
177177

178178
func Test_Sync_FindNextKey_InSync(t *testing.T) {
179179
for i := 0; i < 3; i++ {
180-
r := rand.New(rand.NewSource(int64(i))) // #nosec G404
180+
now := time.Now().UnixNano()
181+
t.Logf("seed: %d", now)
182+
r := rand.New(rand.NewSource(now)) // #nosec G404
181183
dbToSync, err := generateTrie(t, r, 1000)
182184
require.NoError(t, err)
183185
syncRoot, err := dbToSync.GetMerkleRoot(context.Background())
@@ -352,7 +354,9 @@ func Test_Sync_FindNextKey_BranchInReceived(t *testing.T) {
352354

353355
func Test_Sync_FindNextKey_ExtraValues(t *testing.T) {
354356
for i := 0; i < 10; i++ {
355-
r := rand.New(rand.NewSource(int64(i))) // #nosec G404
357+
now := time.Now().UnixNano()
358+
t.Logf("seed: %d", now)
359+
r := rand.New(rand.NewSource(now)) // #nosec G404
356360
dbToSync, err := generateTrie(t, r, 1000)
357361
require.NoError(t, err)
358362
syncRoot, err := dbToSync.GetMerkleRoot(context.Background())
@@ -425,7 +429,9 @@ func isPrefix(data []byte, prefix []byte) bool {
425429

426430
func Test_Sync_FindNextKey_DifferentChild(t *testing.T) {
427431
for i := 0; i < 10; i++ {
428-
r := rand.New(rand.NewSource(int64(i))) // #nosec G404
432+
now := time.Now().UnixNano()
433+
t.Logf("seed: %d", now)
434+
r := rand.New(rand.NewSource(now)) // #nosec G404
429435
dbToSync, err := generateTrie(t, r, 500)
430436
require.NoError(t, err)
431437
syncRoot, err := dbToSync.GetMerkleRoot(context.Background())
@@ -471,7 +477,9 @@ func Test_Sync_FindNextKey_DifferentChild(t *testing.T) {
471477
// Test findNextKey by computing the expected result in a naive, inefficient
472478
// way and comparing it to the actual result
473479
func TestFindNextKeyRandom(t *testing.T) {
474-
rand := rand.New(rand.NewSource(1337)) //nolint:gosec
480+
now := time.Now().UnixNano()
481+
t.Logf("seed: %d", now)
482+
rand := rand.New(rand.NewSource(now)) // #nosec G404
475483
require := require.New(t)
476484

477485
// Create a "remote" database and "local" database
@@ -676,7 +684,9 @@ func TestFindNextKeyRandom(t *testing.T) {
676684

677685
func Test_Sync_Result_Correct_Root(t *testing.T) {
678686
for i := 0; i < 3; i++ {
679-
r := rand.New(rand.NewSource(int64(i))) // #nosec G404
687+
now := time.Now().UnixNano()
688+
t.Logf("seed: %d", now)
689+
r := rand.New(rand.NewSource(now)) // #nosec G404
680690
dbToSync, err := generateTrie(t, r, 1000)
681691
require.NoError(t, err)
682692
syncRoot, err := dbToSync.GetMerkleRoot(context.Background())
@@ -730,7 +740,9 @@ func Test_Sync_Result_Correct_Root(t *testing.T) {
730740

731741
func Test_Sync_Result_Correct_Root_With_Sync_Restart(t *testing.T) {
732742
for i := 0; i < 3; i++ {
733-
r := rand.New(rand.NewSource(int64(i))) // #nosec G404
743+
now := time.Now().UnixNano()
744+
t.Logf("seed: %d", now)
745+
r := rand.New(rand.NewSource(now)) // #nosec G404
734746
dbToSync, err := generateTrie(t, r, 3*maxKeyValuesLimit)
735747
require.NoError(t, err)
736748
syncRoot, err := dbToSync.GetMerkleRoot(context.Background())
@@ -793,7 +805,9 @@ func Test_Sync_Error_During_Sync(t *testing.T) {
793805
require := require.New(t)
794806
ctrl := gomock.NewController(t)
795807
defer ctrl.Finish()
796-
r := rand.New(rand.NewSource(int64(0))) // #nosec G404
808+
now := time.Now().UnixNano()
809+
t.Logf("seed: %d", now)
810+
r := rand.New(rand.NewSource(now)) // #nosec G404
797811

798812
dbToSync, err := generateTrie(t, r, 100)
799813
require.NoError(err)
@@ -846,7 +860,9 @@ func Test_Sync_Result_Correct_Root_Update_Root_During(t *testing.T) {
846860
defer ctrl.Finish()
847861

848862
for i := 0; i < 3; i++ {
849-
r := rand.New(rand.NewSource(int64(i))) // #nosec G404
863+
now := time.Now().UnixNano()
864+
t.Logf("seed: %d", now)
865+
r := rand.New(rand.NewSource(now)) // #nosec G404
850866

851867
dbToSync, err := generateTrie(t, r, 3*maxKeyValuesLimit)
852868
require.NoError(err)

0 commit comments

Comments
 (0)