safing-portbase/crypto/random/entropy_test.go
2019-05-06 10:36:46 +02:00

72 lines
1.2 KiB
Go

package random
import (
"testing"
"time"
)
func TestFeeder(t *testing.T) {
// wait for start / first round to complete
time.Sleep(1 * time.Millisecond)
f := NewFeeder()
// go through all functions
f.NeedsEntropy()
f.SupplyEntropy([]byte{0}, 0)
f.SupplyEntropyAsInt(0, 0)
f.SupplyEntropyIfNeeded([]byte{0}, 0)
f.SupplyEntropyAsIntIfNeeded(0, 0)
// fill entropy
f.SupplyEntropyAsInt(0, 65535)
// check blocking calls
waitC := make(chan struct{})
go func() {
f.SupplyEntropy([]byte{0}, 0)
close(waitC)
}()
select {
case <-waitC:
t.Error("call does not block!")
case <-time.After(10 * time.Millisecond):
}
waitC = make(chan struct{})
go func() {
f.SupplyEntropyAsInt(0, 0)
close(waitC)
}()
select {
case <-waitC:
t.Error("call does not block!")
case <-time.After(10 * time.Millisecond):
}
// check non-blocking calls
waitC = make(chan struct{})
go func() {
f.SupplyEntropyIfNeeded([]byte{0}, 0)
close(waitC)
}()
select {
case <-waitC:
case <-time.After(10 * time.Millisecond):
t.Error("call blocks!")
}
waitC = make(chan struct{})
go func() {
f.SupplyEntropyAsIntIfNeeded(0, 0)
close(waitC)
}()
select {
case <-waitC:
case <-time.After(10 * time.Millisecond):
t.Error("call blocks!")
}
}