github.com/safing/portbase@v0.19.5/rng/entropy_test.go (about) 1 package rng 2 3 import ( 4 "testing" 5 "time" 6 ) 7 8 func TestFeeder(t *testing.T) { 9 t.Parallel() 10 11 // wait for start / first round to complete 12 time.Sleep(1 * time.Millisecond) 13 14 f := NewFeeder() 15 16 // go through all functions 17 f.NeedsEntropy() 18 f.SupplyEntropy([]byte{0}, 0) 19 f.SupplyEntropyAsInt(0, 0) 20 f.SupplyEntropyIfNeeded([]byte{0}, 0) 21 f.SupplyEntropyAsIntIfNeeded(0, 0) 22 23 // fill entropy 24 f.SupplyEntropyAsInt(0, 65535) 25 26 // check blocking calls 27 28 waitOne := make(chan struct{}) 29 go func() { 30 f.SupplyEntropy([]byte{0}, 0) 31 close(waitOne) 32 }() 33 select { 34 case <-waitOne: 35 t.Error("call does not block!") 36 case <-time.After(10 * time.Millisecond): 37 } 38 39 waitTwo := make(chan struct{}) 40 go func() { 41 f.SupplyEntropyAsInt(0, 0) 42 close(waitTwo) 43 }() 44 select { 45 case <-waitTwo: 46 t.Error("call does not block!") 47 case <-time.After(10 * time.Millisecond): 48 } 49 50 // check non-blocking calls 51 52 waitThree := make(chan struct{}) 53 go func() { 54 f.SupplyEntropyIfNeeded([]byte{0}, 0) 55 close(waitThree) 56 }() 57 select { 58 case <-waitThree: 59 case <-time.After(10 * time.Millisecond): 60 t.Error("call blocks!") 61 } 62 63 waitFour := make(chan struct{}) 64 go func() { 65 f.SupplyEntropyAsIntIfNeeded(0, 0) 66 close(waitFour) 67 }() 68 select { 69 case <-waitFour: 70 case <-time.After(10 * time.Millisecond): 71 t.Error("call blocks!") 72 } 73 }