1// +build !binary_log
2
3package zerolog
4
5import (
6	"testing"
7	"time"
8)
9
10var samplers = []struct {
11	name    string
12	sampler func() Sampler
13	total   int
14	wantMin int
15	wantMax int
16}{
17	{
18		"BasicSampler_1",
19		func() Sampler {
20			return &BasicSampler{N: 1}
21		},
22		100, 100, 100,
23	},
24	{
25		"BasicSampler_5",
26		func() Sampler {
27			return &BasicSampler{N: 5}
28		},
29		100, 20, 20,
30	},
31	{
32		"RandomSampler",
33		func() Sampler {
34			return RandomSampler(5)
35		},
36		100, 10, 30,
37	},
38	{
39		"BurstSampler",
40		func() Sampler {
41			return &BurstSampler{Burst: 20, Period: time.Second}
42		},
43		100, 20, 20,
44	},
45	{
46		"BurstSamplerNext",
47		func() Sampler {
48			return &BurstSampler{Burst: 20, Period: time.Second, NextSampler: &BasicSampler{N: 5}}
49		},
50		120, 40, 40,
51	},
52}
53
54func TestSamplers(t *testing.T) {
55	for i := range samplers {
56		s := samplers[i]
57		t.Run(s.name, func(t *testing.T) {
58			sampler := s.sampler()
59			got := 0
60			for t := s.total; t > 0; t-- {
61				if sampler.Sample(0) {
62					got++
63				}
64			}
65			if got < s.wantMin || got > s.wantMax {
66				t.Errorf("%s.Sample(0) == true %d on %d, want [%d, %d]", s.name, got, s.total, s.wantMin, s.wantMax)
67			}
68		})
69	}
70}
71
72func BenchmarkSamplers(b *testing.B) {
73	for i := range samplers {
74		s := samplers[i]
75		b.Run(s.name, func(b *testing.B) {
76			sampler := s.sampler()
77			b.RunParallel(func(pb *testing.PB) {
78				for pb.Next() {
79					sampler.Sample(0)
80				}
81			})
82		})
83	}
84}
85