File: limiter_test.go

package info (click to toggle)
golang-github-google-certificate-transparency 0.0~git20160709.0.0f6e3d1~ds1-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster
  • size: 5,676 kB
  • sloc: cpp: 35,278; python: 11,838; java: 1,911; sh: 1,885; makefile: 950; xml: 520; ansic: 225
file content (65 lines) | stat: -rw-r--r-- 1,396 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package ratelimiter

import (
	"sync"
	"testing"
	"time"
)

var testlimits = []int{1, 10, 50, 100, 1000}

func TestRateLimiterSingleThreaded(t *testing.T) {
	for i, limit := range testlimits {
		l := NewLimiter(limit)
		count := 0
		tick := time.NewTicker(time.Second)
		go func() {
			for _ = range tick.C {
				// Allow a count up to one more than the limit as scheduling of
				// goroutine vs the main thread could cause this check to not be
				// run quite in time for limit.
				if count > limit+1 {
					t.Errorf("#%d: Too many operations per second. Expected %d, got %d", i, limit, count)
				}
				count = 0
			}
		}()

		for i := 0; i < 3*limit; i++ {
			l.Wait()
			count++
		}
		tick.Stop()
	}
}

func TestRateLimiterGoroutines(t *testing.T) {
	for i, limit := range testlimits {
		l := NewLimiter(limit)
		count := 0
		tick := time.NewTicker(time.Second)
		go func() {
			for _ = range tick.C {
				// Allow a count up to one more than the limit as scheduling of
				// goroutine vs the main thread could cause this check to not be
				// run quite in time for limit.
				if count > limit+1 {
					t.Errorf("#%d: Too many operations per second. Expected %d, got %d", i, limit, count)
				}
				count = 0
			}
		}()

		var wg sync.WaitGroup
		for i := 0; i < 3*limit; i++ {
			wg.Add(1)
			go func() {
				l.Wait()
				count++
				wg.Done()
			}()
		}
		wg.Wait()
		tick.Stop()
	}
}