github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/gossip/util/misc_test.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package util 8 9 import ( 10 "crypto/rand" 11 "errors" 12 "testing" 13 "time" 14 15 "github.com/spf13/viper" 16 "github.com/stretchr/testify/mock" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func testHappyPath(t *testing.T) { 21 n1 := RandomInt(10000) 22 n2 := RandomInt(10000) 23 require.NotEqual(t, n1, n2) 24 n3 := RandomUInt64() 25 n4 := RandomUInt64() 26 require.NotEqual(t, n3, n4) 27 } 28 29 func TestContains(t *testing.T) { 30 require.True(t, Contains("foo", []string{"bar", "foo", "baz"})) 31 require.False(t, Contains("foo", []string{"bar", "baz"})) 32 } 33 34 func TestGetRandomInt(t *testing.T) { 35 testHappyPath(t) 36 } 37 38 func TestNonNegativeValues(t *testing.T) { 39 require.True(t, RandomInt(1000000) >= 0) 40 } 41 42 func TestGetRandomIntBadInput(t *testing.T) { 43 f1 := func() { 44 RandomInt(0) 45 } 46 f2 := func() { 47 RandomInt(-500) 48 } 49 require.Panics(t, f1) 50 require.Panics(t, f2) 51 } 52 53 type reader struct { 54 mock.Mock 55 } 56 57 func (r *reader) Read(p []byte) (int, error) { 58 args := r.Mock.Called(p) 59 n := args.Get(0).(int) 60 err := args.Get(1) 61 if err == nil { 62 return n, nil 63 } 64 return n, err.(error) 65 } 66 67 func TestGetRandomIntNoEntropy(t *testing.T) { 68 rr := rand.Reader 69 defer func() { 70 rand.Reader = rr 71 }() 72 r := &reader{} 73 r.On("Read", mock.Anything).Return(0, errors.New("Not enough entropy")) 74 rand.Reader = r 75 // Make sure randomness still works even when we have no entropy 76 testHappyPath(t) 77 } 78 79 func TestRandomIndices(t *testing.T) { 80 // not enough choices as needed 81 require.Nil(t, GetRandomIndices(10, 5)) 82 // exact number of choices as available 83 require.Len(t, GetRandomIndices(10, 9), 10) 84 // more choices available than needed 85 require.Len(t, GetRandomIndices(10, 90), 10) 86 } 87 88 func TestGetIntOrDefault(t *testing.T) { 89 viper.Set("N", 100) 90 n := GetIntOrDefault("N", 100) 91 require.Equal(t, 100, n) 92 m := GetIntOrDefault("M", 101) 93 require.Equal(t, 101, m) 94 } 95 96 func TestGetDurationOrDefault(t *testing.T) { 97 viper.Set("foo", time.Second) 98 foo := GetDurationOrDefault("foo", time.Second*2) 99 require.Equal(t, time.Second, foo) 100 bar := GetDurationOrDefault("bar", time.Second*2) 101 require.Equal(t, time.Second*2, bar) 102 } 103 104 func TestPrintStackTrace(t *testing.T) { 105 PrintStackTrace() 106 } 107 108 func TestGetLogger(t *testing.T) { 109 l1 := GetLogger("foo", "bar") 110 l2 := GetLogger("foo", "bar") 111 require.Equal(t, l1, l2) 112 } 113 114 func TestSet(t *testing.T) { 115 s := NewSet() 116 require.Len(t, s.ToArray(), 0) 117 require.Equal(t, s.Size(), 0) 118 require.False(t, s.Exists(42)) 119 s.Add(42) 120 require.True(t, s.Exists(42)) 121 require.Len(t, s.ToArray(), 1) 122 require.Equal(t, s.Size(), 1) 123 s.Remove(42) 124 require.False(t, s.Exists(42)) 125 s.Add(42) 126 require.True(t, s.Exists(42)) 127 s.Clear() 128 require.False(t, s.Exists(42)) 129 } 130 131 func TestStringsToBytesToStrings(t *testing.T) { 132 strings := []string{"foo", "bar"} 133 require.Equal(t, strings, BytesToStrings(StringsToBytes(strings))) 134 }