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  }