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 }