-
Notifications
You must be signed in to change notification settings - Fork 15
/
pinger_test.go
119 lines (103 loc) · 2.42 KB
/
pinger_test.go
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package pinger
import (
"net"
"sync"
"testing"
"time"
)
var localhost = net.ParseIP("127.0.0.1")
func TestBadProto(t *testing.T) {
_, err := NewPinger("foo", 100)
if err == nil {
t.Fatalf("pinger should have failed to initialize")
}
}
func TestPing(t *testing.T) {
p, err := NewPinger("all", 100)
if err != nil {
t.Fatalf("failed to initialize pinger. %s", err)
}
p.Start()
defer p.Stop()
p.Debug = true
p.RLock()
if len(p.inFlight) > 0 {
t.Fatalf("inFlight should be empty")
}
p.RUnlock()
type resp struct {
stats *PingStats
err error
}
respChan := make(chan resp, 10)
go func() {
stats, err := p.Ping(localhost, 3, time.Second)
respChan <- resp{stats, err}
}()
results := <-respChan
if results.err != nil {
t.Fatalf("pings were not sent. %s", results.err)
}
p.RLock()
if len(p.inFlight) != 0 {
t.Fatalf("inFlight should be empty")
}
p.RUnlock()
if results.stats.Sent != 3 {
t.Fatalf("3 ping should have been sent. %d were sent instead", results.stats.Sent)
}
if results.stats.Received != 3 {
t.Fatalf("3 ping should have been recieved. %d were reveived instead", results.stats.Received)
}
if len(results.stats.Latency) != 3 {
t.Fatalf("there should be 3 latency measurements. Found %d instead", len(results.stats.Latency))
}
}
func TestConcurrentPing(t *testing.T) {
p, err := NewPinger("all", 100)
if err != nil {
t.Fatalf("failed to initialize pinger. %s", err)
}
p.Start()
p.RLock()
if len(p.inFlight) > 0 {
t.Fatalf("inFlight should be empty")
}
p.RUnlock()
defer p.Stop()
var wg sync.WaitGroup
type resp struct {
stats *PingStats
err error
}
respChan := make(chan resp, 50)
for i := 0; i < 50; i++ {
wg.Add(1)
go func() {
stats, err := p.Ping(localhost, 3, time.Second)
respChan <- resp{stats, err}
wg.Done()
}()
}
wg.Wait()
close(respChan)
p.RLock()
if len(p.inFlight) != 0 {
t.Fatalf("inFlight should be empty")
}
p.RUnlock()
for results := range respChan {
if results.err != nil {
t.Fatalf("pings were not sent. %s", results.err)
}
if results.stats.Sent != 3 {
t.Fatalf("3 ping should have been sent. %d were sent instead", results.stats.Sent)
}
if results.stats.Received != 3 {
t.Fatalf("3 ping should have been recieved. %d were reveived instead", results.stats.Received)
}
if len(results.stats.Latency) != 3 {
t.Fatalf("there should be 3 latency measurements. Found %d instead", len(results.stats.Latency))
}
}
}