influxdb/test.go

180 lines
4.4 KiB
Go
Raw Normal View History

2013-04-17 02:28:08 +00:00
package raft
import (
2013-05-01 05:11:23 +00:00
"fmt"
2013-04-17 02:28:08 +00:00
"io/ioutil"
"os"
2013-06-08 02:19:18 +00:00
"time"
2013-05-01 05:21:56 +00:00
)
const (
2013-08-02 00:58:03 +00:00
testHeartbeatTimeout = 50 * time.Millisecond
testElectionTimeout = 200 * time.Millisecond
2013-04-17 02:28:08 +00:00
)
2013-05-10 03:50:57 +00:00
func init() {
2013-07-06 04:49:47 +00:00
RegisterCommand(&testCommand1{})
RegisterCommand(&testCommand2{})
2013-05-10 03:50:57 +00:00
}
2013-04-17 02:28:08 +00:00
//------------------------------------------------------------------------------
//
// Helpers
//
//------------------------------------------------------------------------------
//--------------------------------------
// Logs
//--------------------------------------
func getLogPath() string {
f, _ := ioutil.TempFile("", "raft-log-")
f.Close()
os.Remove(f.Name())
return f.Name()
}
func setupLog(entries []*LogEntry) (*Log, string) {
2013-04-17 02:28:08 +00:00
f, _ := ioutil.TempFile("", "raft-log-")
for _, entry := range entries {
entry.encode(f)
}
2013-07-23 22:30:14 +00:00
err := f.Close()
2013-07-18 16:26:31 +00:00
if err != nil {
panic(err)
}
2013-07-06 04:49:47 +00:00
log := newLog()
log.ApplyFunc = func(c Command) (interface{}, error) {
return nil, nil
}
if err := log.open(f.Name()); err != nil {
2013-07-18 16:26:31 +00:00
panic(err)
2013-04-30 04:13:50 +00:00
}
return log, f.Name()
2013-04-30 04:13:50 +00:00
}
2013-04-17 02:28:08 +00:00
//--------------------------------------
// Servers
//--------------------------------------
2013-05-28 19:57:38 +00:00
func newTestServer(name string, transporter Transporter) *Server {
p, _ := ioutil.TempDir("", "raft-server-")
if err := os.MkdirAll(p, 0644); err != nil {
panic(err.Error())
}
server, _ := NewServer(name, p, transporter, nil, nil)
2013-04-17 02:28:08 +00:00
return server
}
func newTestServerWithLog(name string, transporter Transporter, entries []*LogEntry) *Server {
2013-05-28 19:57:38 +00:00
server := newTestServer(name, transporter)
f, err := os.Create(server.LogPath())
if err != nil {
panic(err)
}
for _, entry := range entries {
entry.encode(f)
}
f.Close()
return server
}
2013-05-28 19:57:38 +00:00
func newTestCluster(names []string, transporter Transporter, lookup map[string]*Server) []*Server {
servers := []*Server{}
2013-08-02 00:58:03 +00:00
e0, _ := newLogEntry(newLog(), 1, 1, &testCommand1{Val: "foo", I: 20})
2013-07-25 22:40:20 +00:00
2013-05-01 05:11:23 +00:00
for _, name := range names {
if lookup[name] != nil {
2013-06-08 02:41:36 +00:00
panic(fmt.Sprintf("raft: Duplicate server in test cluster! %v", name))
2013-05-01 05:11:23 +00:00
}
2013-07-25 22:40:20 +00:00
server := newTestServerWithLog("1", transporter, []*LogEntry{e0})
2013-05-27 02:17:20 +00:00
server.SetElectionTimeout(testElectionTimeout)
2013-05-01 05:11:23 +00:00
servers = append(servers, server)
lookup[name] = server
}
for _, server := range servers {
2013-07-06 19:41:42 +00:00
server.SetHeartbeatTimeout(testHeartbeatTimeout)
2013-07-25 22:40:20 +00:00
server.Start()
2013-05-01 05:11:23 +00:00
for _, peer := range servers {
server.AddPeer(peer.Name())
2013-05-01 05:11:23 +00:00
}
}
2013-05-28 19:57:38 +00:00
return servers
2013-05-01 05:11:23 +00:00
}
2013-05-28 19:57:38 +00:00
//--------------------------------------
// Transporter
//--------------------------------------
type testTransporter struct {
2013-07-07 20:21:04 +00:00
sendVoteRequestFunc func(server *Server, peer *Peer, req *RequestVoteRequest) *RequestVoteResponse
sendAppendEntriesRequestFunc func(server *Server, peer *Peer, req *AppendEntriesRequest) *AppendEntriesResponse
sendSnapshotRequestFunc func(server *Server, peer *Peer, req *SnapshotRequest) *SnapshotResponse
2013-05-28 19:57:38 +00:00
}
2013-07-07 20:21:04 +00:00
func (t *testTransporter) SendVoteRequest(server *Server, peer *Peer, req *RequestVoteRequest) *RequestVoteResponse {
2013-05-28 19:57:38 +00:00
return t.sendVoteRequestFunc(server, peer, req)
}
2013-07-07 20:21:04 +00:00
func (t *testTransporter) SendAppendEntriesRequest(server *Server, peer *Peer, req *AppendEntriesRequest) *AppendEntriesResponse {
2013-05-28 19:57:38 +00:00
return t.sendAppendEntriesRequestFunc(server, peer, req)
}
2013-07-07 20:21:04 +00:00
func (t *testTransporter) SendSnapshotRequest(server *Server, peer *Peer, req *SnapshotRequest) *SnapshotResponse {
2013-06-06 03:25:17 +00:00
return t.sendSnapshotRequestFunc(server, peer, req)
2013-06-08 02:19:18 +00:00
}
2013-06-06 20:54:27 +00:00
func (t *testTransporter) SendSnapshotRecoveryRequest(server *Server, peer *Peer, req *SnapshotRecoveryRequest) *SnapshotRecoveryResponse {
return t.SendSnapshotRecoveryRequest(server, peer, req)
}
2013-06-06 20:54:27 +00:00
type testStateMachine struct {
2013-06-08 02:19:18 +00:00
saveFunc func() ([]byte, error)
2013-06-06 20:54:27 +00:00
recoveryFunc func([]byte) error
}
func (sm *testStateMachine) Save() ([]byte, error) {
return sm.saveFunc()
}
func (sm *testStateMachine) Recovery(state []byte) error {
return sm.recoveryFunc(state)
}
2013-04-17 02:28:08 +00:00
//--------------------------------------
// Command1
//--------------------------------------
2013-07-06 04:49:47 +00:00
type testCommand1 struct {
2013-04-17 02:28:08 +00:00
Val string `json:"val"`
2013-04-28 21:23:21 +00:00
I int `json:"i"`
2013-04-17 02:28:08 +00:00
}
2013-07-06 04:49:47 +00:00
func (c *testCommand1) CommandName() string {
2013-04-17 02:28:08 +00:00
return "cmd_1"
}
2013-07-06 04:49:47 +00:00
func (c *testCommand1) Apply(server *Server) (interface{}, error) {
return nil, nil
2013-04-28 22:36:46 +00:00
}
2013-04-17 02:28:08 +00:00
//--------------------------------------
// Command2
//--------------------------------------
2013-07-06 04:49:47 +00:00
type testCommand2 struct {
2013-04-17 02:28:08 +00:00
X int `json:"x"`
}
2013-07-06 04:49:47 +00:00
func (c *testCommand2) CommandName() string {
2013-04-17 02:28:08 +00:00
return "cmd_2"
}
2013-04-28 22:36:46 +00:00
2013-07-06 04:49:47 +00:00
func (c *testCommand2) Apply(server *Server) (interface{}, error) {
2013-06-24 16:52:51 +00:00
return nil, nil
}