-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathpaxos_test.go
102 lines (86 loc) · 2.54 KB
/
paxos_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
package paxos
import (
"log"
"testing"
"time"
)
func TestBasicNetwork(t *testing.T) {
log.Println("TestBasicNetowk........................")
nt := CreateNetwork(1, 3, 5, 2, 4)
go func() {
nt.recevFrom(5)
nt.recevFrom(1)
nt.recevFrom(3)
nt.recevFrom(2)
m := nt.recevFrom(4)
if m == nil {
t.Errorf("No message detected.")
}
}()
m1 := message{from: 3, to: 1, typ: Prepare, seq: 1, preSeq: 0, val: "m1"}
nt.sendTo(m1)
m2 := message{from: 5, to: 3, typ: Accept, seq: 2, preSeq: 1, val: "m2"}
nt.sendTo(m2)
m3 := message{from: 4, to: 2, typ: Promise, seq: 3, preSeq: 2, val: "m3"}
nt.sendTo(m3)
time.Sleep(time.Second)
}
func TestSingleProser(t *testing.T) {
log.Println("TestProserFunction........................")
//Three acceptor and one proposer
network := CreateNetwork(100, 1, 2, 3, 200)
//Create acceptors
var acceptors []acceptor
aId := 1
for aId <= 3 {
acctor := NewAcceptor(aId, network.getNodeNetwork(aId), 200)
acceptors = append(acceptors, acctor)
aId++
}
//Create proposer
proposer := NewProposer(100, "value1", network.getNodeNetwork(100), 1, 2, 3)
//Run proposer and acceptors
go proposer.run()
for index, _ := range acceptors {
go acceptors[index].run()
}
//Create learner and learner will wait until reach majority.
learner := NewLearner(200, network.getNodeNetwork(200), 1, 2, 3)
learnValue := learner.run()
if learnValue != "value1" {
t.Errorf("Learner learn wrong proposal.")
}
}
func TestTwoProsers(t *testing.T) {
log.Println("TestProserFunction........................")
//Three acceptor and one proposer
network := CreateNetwork(100, 1, 2, 3, 200, 101)
//Create acceptors
var acceptors []acceptor
aId := 1
for aId <= 3 {
acctor := NewAcceptor(aId, network.getNodeNetwork(aId), 200)
acceptors = append(acceptors, acctor)
aId++
}
//Create proposer 1
proposer1 := NewProposer(100, "ExpectValue", network.getNodeNetwork(100), 1, 2, 3)
//Run proposer and acceptors
go proposer1.run()
//Need sleep to make sure first proposer reach majority
//Create proposer 2
proposer2 := NewProposer(101, "WrongValue", network.getNodeNetwork(101), 1, 2, 3)
//Run proposer and acceptors
time.AfterFunc(time.Second, func() {
proposer2.run()
})
for index, _ := range acceptors {
go acceptors[index].run()
}
//Create learner and learner will wait until reach majority.
learner := NewLearner(200, network.getNodeNetwork(200), 1, 2, 3)
learnValue := learner.run()
if learnValue != "ExpectValue" {
t.Errorf("Learner learn wrong proposal. Expect:'ExpectValue', learnValue: %v", learnValue)
}
}