forked from robustirc/robustirc
/
serialization_test.go
117 lines (102 loc) · 3.42 KB
/
serialization_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
package main
import (
"flag"
"io/ioutil"
"os"
"path/filepath"
"testing"
"time"
"github.com/hashicorp/raft"
"github.com/robustirc/robustirc/ircserver"
"github.com/robustirc/robustirc/raft_store"
"github.com/robustirc/robustirc/types"
"github.com/sorcix/irc"
)
func createIrcServer(tempdir string) (*raft_store.LevelDBStore, *raft_store.LevelDBStore, FSM, error) {
ircServer = ircserver.NewIRCServer("", "testnetwork", time.Now())
flag.Set("raftdir", tempdir)
logstore, err := raft_store.NewLevelDBStore(filepath.Join(tempdir, "raftlog"), false)
if err != nil {
return nil, nil, FSM{}, err
}
ircstore, err := raft_store.NewLevelDBStore(filepath.Join(tempdir, "irclog"), false)
if err != nil {
return nil, nil, FSM{}, err
}
fsm := FSM{store: logstore, ircstore: ircstore}
return logstore, ircstore, fsm, nil
}
func TestSerialization(t *testing.T) {
tempdir, err := ioutil.TempDir("", "robust-test-")
if err != nil {
t.Fatalf("ioutil.TempDir: %v", err)
}
defer os.RemoveAll(tempdir)
logstore, _, fsm, err := createIrcServer(tempdir)
if err != nil {
t.Fatal(err)
}
var logs []*raft.Log
logs = appendLog(logs, `{"Id": {"Id": 1}, "Type": 0, "Data": "auth"}`)
logs = appendLog(logs, `{"Id": {"Id": 2}, "Session": {"Id": 1}, "Type": 2, "Data": "NICK sECuRE"}`)
logs = appendLog(logs, `{"Id": {"Id": 3}, "Session": {"Id": 1}, "Type": 2, "Data": "USER blah 0 * :Michael Stapelberg"}`)
logs = appendLog(logs, `{"Id": {"Id": 4}, "Type": 0, "Data": "auth"}`)
logs = appendLog(logs, `{"Id": {"Id": 5}, "Session": {"Id": 4}, "Type": 2, "Data": "NICK mero"}`)
logs = appendLog(logs, `{"Id": {"Id": 6}, "Session": {"Id": 4}, "Type": 2, "Data": "USER blah 0 * :Axel Wagner"}`)
logs = appendLog(logs, `{"Id": {"Id": 7}, "Session": {"Id": 1}, "Type": 2, "Data": "JOIN #test"}`)
logs = appendLog(logs, `{"Id": {"Id": 8}, "Session": {"Id": 1}, "Type": 2, "Data": "MODE #test +i"}`)
logs = appendLog(logs, `{"Id": {"Id": 9}, "Session": {"Id": 1}, "Type": 2, "Data": "INVITE mero #test"}`)
if err := logstore.StoreLogs(logs); err != nil {
t.Fatalf("Unexpected error in store.StoreLogs: %v", err)
}
for _, log := range logs {
fsm.Apply(log)
}
state, err := ircServer.Marshal(uint64(len(logs)))
if err != nil {
t.Fatalf("Could not serialize state: %v", err)
}
tempdir, err = ioutil.TempDir("", "robust-test-")
if err != nil {
t.Fatalf("ioutil.TempDir: %v", err)
}
defer os.RemoveAll(tempdir)
logstore, _, fsm, err = createIrcServer(tempdir)
if err != nil {
t.Fatal(err)
}
lastIncludedIndex, err := ircServer.Unmarshal(state)
if err != nil {
t.Fatalf("Could not deserialize state: %v", err)
}
if got, want := lastIncludedIndex, uint64(len(logs)); got != want {
t.Fatalf("lastIncludedIndex is not equal to what we wrote, got %d, want %d", got, want)
}
logs = nil
logs = appendLog(logs, `{"Id": {"Id": 10}, "Session": {"Id": 4}, "Type": 2, "Data": "JOIN #test"}`)
if err := logstore.StoreLogs(logs); err != nil {
t.Fatalf("Unexpected error in store.StoreLogs: %v", err)
}
for _, log := range logs {
fsm.Apply(log)
}
msg, ok := ircServer.Get(types.RobustId{Id: 10})
if !ok {
t.Fatalf("JOIN message did not result in any output")
}
joinFound := false
for _, msg := range msg {
if msg.Type != types.RobustIRCToClient {
continue
}
ircmsg := irc.ParseMessage(string(msg.Data))
if ircmsg.Command != irc.JOIN {
continue
}
joinFound = true
break
}
if !joinFound {
t.Fatalf("No JOIN message found")
}
}