go_study/fabric-main/gossip/util/misc_test.go

135 lines
2.8 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package util
import (
"crypto/rand"
"errors"
"testing"
"time"
"github.com/spf13/viper"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
func testHappyPath(t *testing.T) {
n1 := RandomInt(10000)
n2 := RandomInt(10000)
require.NotEqual(t, n1, n2)
n3 := RandomUInt64()
n4 := RandomUInt64()
require.NotEqual(t, n3, n4)
}
func TestContains(t *testing.T) {
require.True(t, Contains("foo", []string{"bar", "foo", "baz"}))
require.False(t, Contains("foo", []string{"bar", "baz"}))
}
func TestGetRandomInt(t *testing.T) {
testHappyPath(t)
}
func TestNonNegativeValues(t *testing.T) {
require.True(t, RandomInt(1000000) >= 0)
}
func TestGetRandomIntBadInput(t *testing.T) {
f1 := func() {
RandomInt(0)
}
f2 := func() {
RandomInt(-500)
}
require.Panics(t, f1)
require.Panics(t, f2)
}
type reader struct {
mock.Mock
}
func (r *reader) Read(p []byte) (int, error) {
args := r.Mock.Called(p)
n := args.Get(0).(int)
err := args.Get(1)
if err == nil {
return n, nil
}
return n, err.(error)
}
func TestGetRandomIntNoEntropy(t *testing.T) {
rr := rand.Reader
defer func() {
rand.Reader = rr
}()
r := &reader{}
r.On("Read", mock.Anything).Return(0, errors.New("Not enough entropy"))
rand.Reader = r
// Make sure randomness still works even when we have no entropy
testHappyPath(t)
}
func TestRandomIndices(t *testing.T) {
// not enough choices as needed
require.Nil(t, GetRandomIndices(10, 5))
// exact number of choices as available
require.Len(t, GetRandomIndices(10, 9), 10)
// more choices available than needed
require.Len(t, GetRandomIndices(10, 90), 10)
}
func TestGetIntOrDefault(t *testing.T) {
viper.Set("N", 100)
n := GetIntOrDefault("N", 100)
require.Equal(t, 100, n)
m := GetIntOrDefault("M", 101)
require.Equal(t, 101, m)
}
func TestGetDurationOrDefault(t *testing.T) {
viper.Set("foo", time.Second)
foo := GetDurationOrDefault("foo", time.Second*2)
require.Equal(t, time.Second, foo)
bar := GetDurationOrDefault("bar", time.Second*2)
require.Equal(t, time.Second*2, bar)
}
func TestPrintStackTrace(t *testing.T) {
PrintStackTrace()
}
func TestGetLogger(t *testing.T) {
l1 := GetLogger("foo", "bar")
l2 := GetLogger("foo", "bar")
require.Equal(t, l1, l2)
}
func TestSet(t *testing.T) {
s := NewSet()
require.Len(t, s.ToArray(), 0)
require.Equal(t, s.Size(), 0)
require.False(t, s.Exists(42))
s.Add(42)
require.True(t, s.Exists(42))
require.Len(t, s.ToArray(), 1)
require.Equal(t, s.Size(), 1)
s.Remove(42)
require.False(t, s.Exists(42))
s.Add(42)
require.True(t, s.Exists(42))
s.Clear()
require.False(t, s.Exists(42))
}
func TestStringsToBytesToStrings(t *testing.T) {
strings := []string{"foo", "bar"}
require.Equal(t, strings, BytesToStrings(StringsToBytes(strings)))
}