This repository has been archived by the owner on Mar 23, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnode_test.go
185 lines (151 loc) · 5.33 KB
/
node_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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
package raftify
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"testing"
"time"
)
func TestMemberlist(t *testing.T) {
// Reserve ports for this test
ports := reservePorts(1)
// Initialize dummy node
node := initDummyNode("TestNode", 1, 1, ports[0])
if err := node.createMemberlist(); err != nil {
t.Logf("Expected successful creation of memberlist, instead got error: %v", err.Error())
t.FailNow()
}
if err := node.memberlist.Shutdown(); err != nil {
t.Logf("Expected successful shutdown of memberlist, instead got error: %v", err.Error())
t.FailNow()
}
}
func TestTryJoin(t *testing.T) {
// Reserve ports for this test
ports := reservePorts(2)
// Initialize dummy nodes
node1 := initDummyNode("TestNode_1", 1, 2, ports[0])
node2 := initDummyNode("TestNode_2", 1, 2, ports[1])
node1.config.PeerList = []string{fmt.Sprintf("127.0.0.1:%v", node2.config.BindPort)}
node2.config.PeerList = []string{fmt.Sprintf("127.0.0.1:%v", node1.config.BindPort)}
// Start node1 and fail while trying to join node2
node1.createMemberlist()
defer node1.memberlist.Shutdown()
if err := node1.tryJoin(); err == nil {
t.Logf("Expected node1 to throw an error on tryJoin, instead error was nil")
t.FailNow()
}
// Start node2 and succeed while trying to join node1
node2.createMemberlist()
defer node2.memberlist.Shutdown()
if err := node2.tryJoin(); err != nil {
t.Logf("Expected node2 to successfully join node1, instead got error: %v", err.Error())
t.FailNow()
}
}
func ExampleNode_printMemberlist() {
node := initDummyNode("TestNode", 1, 1, 4000)
node.createMemberlist()
node.printMemberlist()
// Output:
// [INFO] raftify: ->[] TestNode [127.0.0.1:4000] joined the cluster.
// [INFO] raftify: The cluster has currently 1 members:
// [INFO] raftify: - TestNode [127.0.0.1]
}
func TestInitNodeAndShutdown(t *testing.T) {
// Reserve ports for this test
ports := reservePorts(1)
// Initialize dummy node
node := initDummyNode("TestNode", 1, 1, ports[0])
tdir := fmt.Sprintf("%v/testing/TestNode", node.workingDir)
os.MkdirAll(tdir, 0755)
defer os.RemoveAll(fmt.Sprintf("%v/testing", node.workingDir))
configBytes, _ := json.Marshal(node.config)
ioutil.WriteFile(fmt.Sprintf("%v/raftify.json", tdir), configBytes, 0755)
node, err := initNode(node.logger, tdir)
if err != nil {
t.Logf("Expected successful initialization of node, instead got error: %v", err.Error())
t.FailNow()
}
if err = node.Shutdown(); err != nil {
t.Logf("Expected successful shutdown of node, instead got error: %v", err.Error())
t.FailNow()
}
}
func TestGetNodeByName(t *testing.T) {
// Reserve ports for this test
ports := reservePorts(1)
// Initialize and start dummy node
node := initDummyNode("TestNode", 1, 1, ports[0])
node.createMemberlist()
defer node.memberlist.Shutdown()
if _, err := node.getNodeByName("TestNode"); err != nil {
t.Logf("Expected TestNode to be found by its name, instead got error: %v", err.Error())
t.FailNow()
}
if _, err := node.getNodeByName("NonExistentNode"); err == nil {
t.Logf("Expected NonExistentNode to not be found, instead it was found")
t.FailNow()
}
}
func TestResetTimeout(t *testing.T) {
// Reserve ports for this test
ports := reservePorts(1)
node := initDummyNode("TestNode", 1, 1, ports[0])
node.timeoutTimer = time.NewTimer(time.Second)
node.timeoutTimer.Stop()
start := time.Now()
node.resetTimeout()
end := <-node.timeoutTimer.C
if end.Sub(start) > ((MaxTimeout*time.Duration(node.config.Performance)+10)*time.Millisecond) || time.Since(start) < (800*time.Duration(node.config.Performance)*time.Millisecond) {
t.Logf("Expected timeout to elapse after %v-%vms, instead it took %vms", node.config.Performance*MinTimeout, node.config.Performance*MaxTimeout, time.Since(start))
t.FailNow()
}
node.config.Performance = 2
start = time.Now()
node.resetTimeout()
end = <-node.timeoutTimer.C
if end.Sub(start) > ((MaxTimeout*time.Duration(node.config.Performance)+10)*time.Millisecond) || time.Since(start) < (800*time.Duration(node.config.Performance)*time.Millisecond) {
t.Logf("Expected timeout to elapse after %v-%vms, instead it took %vms", node.config.Performance*MinTimeout, node.config.Performance*MaxTimeout, time.Since(start))
t.FailNow()
}
}
func TestStartMessageTicker(t *testing.T) {
// Reserve ports for this test
ports := reservePorts(1)
// Initialize dummy node
node := initDummyNode("TestNode", 1, 1, ports[0])
node.messageTicker = time.NewTicker(time.Millisecond)
select {
case <-node.messageTicker.C:
node.messageTicker.Stop()
case <-time.After(210 * time.Millisecond):
t.Logf("Expected message ticker to have been called after 200ms, instead nothing happened")
t.FailNow()
}
}
func TestQuorum(t *testing.T) {
// Reserve ports for this test
ports := reservePorts(1)
// Initialize dummy node
node := initDummyNode("TestNode", 1, 1, ports[0])
node.quorum = 2
node.createMemberlist()
if node.quorumReached(1) {
t.Log("Expected first quorum check to return false, instead got true")
t.FailNow()
}
if !node.quorumReached(2) {
t.Log("Expected second quorum check to return true, instead got false")
t.FailNow()
}
if node.quorum != 1 {
t.Logf("Expected new quorum to be 1, instead got %v", node.quorum)
t.FailNow()
}
if err := node.memberlist.Shutdown(); err != nil {
t.Logf("Expected successful shutdown, instead got error: %v", err.Error())
t.FailNow()
}
}