github.com/status-im/status-go@v1.1.0/server/timeout_test.go (about)

     1  package server
     2  
     3  import (
     4  	"crypto/rand"
     5  	"math/big"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  func TestTimeoutManager(t *testing.T) {
    11  	tm := newTimeoutManager()
    12  
    13  	// test 0 timeout means timeout does not occur
    14  	tm.SetTimeout(0)
    15  
    16  	// test fuzzing - 0 timeout - multiple sequential calls to random init and stop funcs
    17  	for i := 0; i < 30; i++ {
    18  		b, err := rand.Int(rand.Reader, big.NewInt(2))
    19  		if err != nil {
    20  			t.Error(err)
    21  		}
    22  
    23  		if b.Int64() == 1 {
    24  			tm.StartTimeout(t.FailNow)
    25  		} else {
    26  			tm.StopTimeout()
    27  		}
    28  	}
    29  
    30  	// test fuzzing - random timeout - multiple sequential calls to random init and stop funcs
    31  	for i := 0; i < 30; i++ {
    32  		b, err := rand.Int(rand.Reader, big.NewInt(2))
    33  		if err != nil {
    34  			t.Error(err)
    35  		}
    36  		to, err := rand.Int(rand.Reader, big.NewInt(11))
    37  		if err != nil {
    38  			t.Error(err)
    39  		}
    40  
    41  		tm.SetTimeout(uint(to.Int64() * 20))
    42  
    43  		if b.Int64() == 1 {
    44  			tm.StartTimeout(t.FailNow)
    45  		} else {
    46  			tm.StopTimeout()
    47  		}
    48  		tm.StopTimeout()
    49  	}
    50  
    51  	// test StopTimeout() prevents termination func
    52  	tm.SetTimeout(20)
    53  	tm.StartTimeout(t.FailNow)
    54  	time.Sleep(10 * time.Millisecond)
    55  	tm.StopTimeout()
    56  
    57  	// test StartTimeout() executes termination func on timeout
    58  	ok := false
    59  	tm.SetTimeout(10)
    60  	tm.StartTimeout(func() {
    61  		ok = true
    62  	})
    63  	time.Sleep(20 * time.Millisecond)
    64  	if !ok {
    65  		t.FailNow()
    66  	}
    67  
    68  }