func TestCandidateToLeader(t *testing.T) { log.SetOutput(&bytes.Buffer{}) defer log.SetOutput(os.Stdout) oldMin, oldMax := raft.ResetElectionTimeoutMs(25, 50) defer raft.ResetElectionTimeoutMs(oldMin, oldMax) noop := func([]byte) ([]byte, error) { return []byte{}, nil } server := raft.NewServer(1, &bytes.Buffer{}, noop) server.SetPeers(raft.MakePeers(nonresponsivePeer(1), approvingPeer(2), nonresponsivePeer(3))) server.Start() defer func() { server.Stop(); t.Logf("server stopped") }() time.Sleep(raft.MaximumElectionTimeout()) cutoff := time.Now().Add(2 * raft.MaximumElectionTimeout()) backoff := raft.BroadcastInterval() for { if time.Now().After(cutoff) { t.Fatal("failed to become Leader") } if state := server.State(); state != raft.Leader { time.Sleep(backoff) backoff *= 2 continue } t.Logf("became Leader") break } }
func testServers(t *testing.T, n int) { log.SetFlags(log.Lmicroseconds) oldMin, oldMax := raft.ResetElectionTimeoutMs(50, 100) defer raft.ResetElectionTimeoutMs(oldMin, oldMax) // node = Raft protocol server + a HTTP server + a transport bridge raftServers := make([]*raft.Server, n) httpServers := make([]*http.Server, n) raftHttpServers := make([]*rafthttp.Server, n) // create them individually for i := 0; i < n; i++ { // create a Raft protocol server raftServers[i] = raft.NewServer(uint64(i+1), &bytes.Buffer{}, noop) // wrap that server in a HTTP transport raftHttpServers[i] = rafthttp.NewServer(raftServers[i]) // connect that HTTP transport to a unique HTTP server mux := http.NewServeMux() httpServers[i] = &http.Server{ Addr: fmt.Sprintf("%s:%d", listenHost, basePort+i+1), Handler: mux, } raftHttpServers[i].Install(mux) // we have to start the HTTP server, so the NewHTTPPeer ID check works // (it can work without starting the actual Raft protocol server) go httpServers[i].ListenAndServe() t.Logf("Server id=%d @ %s", raftServers[i].Id(), httpServers[i].Addr) } // build the common set of peers in the network peers := raft.Peers{} for i := 0; i < n; i++ { u, err := url.Parse(fmt.Sprintf("http://%s:%d", listenHost, basePort+i+1)) if err != nil { t.Fatal(err) } peer, err := rafthttp.NewPeer(*u) if err != nil { t.Fatal(err) } peers[peer.Id()] = peer } // inject each Raft protocol server with its peers for _, raftServer := range raftServers { raftServer.SetPeers(peers) } // start each Raft protocol server for _, raftServer := range raftServers { raftServer.Start() defer raftServer.Stop() } time.Sleep(2 * raft.MaximumElectionTimeout()) }