135 lines
2.8 KiB
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)))
|
|
}
|