decred.org/dcrdex@v1.0.5/dex/meter/meterer_test.go (about)

     1  package meter
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  func TestDelayedRelay(t *testing.T) {
    11  	ctx, cancel := context.WithCancel(context.Background())
    12  	minDelay := time.Millisecond * 20
    13  	out, in := DelayedRelay(ctx, minDelay, 4)
    14  	defer func() { <-out }() // wait for channel close (relay shutdown)
    15  	defer cancel()
    16  
    17  	gotTimes := make([]time.Time, 0)
    18  
    19  	countSignals := func() (n int) {
    20  		for {
    21  			select {
    22  			case <-out:
    23  				gotTimes = append(gotTimes, time.Now())
    24  				n++
    25  			case <-time.After(minDelay * 2):
    26  				return
    27  			}
    28  		}
    29  	}
    30  
    31  	sendSignals := func(n int, err error) {
    32  		for i := 0; i < n; i++ {
    33  			in <- err
    34  		}
    35  	}
    36  
    37  	go sendSignals(1, nil)
    38  	if n := countSignals(); n != 1 {
    39  		t.Fatalf("wrong signal count. expected 1, got %d", n)
    40  	}
    41  
    42  	// 2nd signal should be delayed at least for minDelay.
    43  	sentTime := time.Now()
    44  	go sendSignals(2, nil)
    45  	if n := countSignals(); n != 2 {
    46  		t.Fatalf("wrong signal count. expected 2, got %d", n)
    47  	}
    48  	if d := gotTimes[len(gotTimes)-1].Sub(sentTime); d < minDelay {
    49  		t.Fatalf("last delay was less than minimum. %s < %s", d, minDelay)
    50  	}
    51  
    52  	// Should get the same exact result as above (for 3 or more simultaneous signals
    53  	// 3rd, 4th, 5th should be skipped).
    54  	sentTime = time.Now()
    55  	go sendSignals(5, nil)
    56  	if n := countSignals(); n != 2 {
    57  		t.Fatalf("wrong signal count. expected reduction to 2, got %d", n)
    58  	}
    59  	if d := gotTimes[len(gotTimes)-1].Sub(sentTime); d < minDelay {
    60  		t.Fatalf("last delay was less than minimum. %s < %s", d, minDelay)
    61  	}
    62  
    63  	// Errors should go right through.
    64  	go sendSignals(10, errors.New(""))
    65  	if n := countSignals(); n != 10 {
    66  		t.Fatalf("wrong signal count. expected 10 errors, got %d", n)
    67  	}
    68  }