func TestSetPeers(t *testing.T) { home, err := ioutil.TempDir("", "test-peers") if err != nil { t.Fatal(err) } defer os.RemoveAll(home) _, trans := raft.NewInmemTransport() p := newPeerStore(home, trans) peers, err := p.Peers() if err != nil { t.Fatal(err) } if len(peers) != 0 { t.Fatalf("expected peers to be empty but got %v", peers) } peer := "1.2.3.4:1234" err = p.SetPeers([]string{peer}) if err != nil { t.Fatal(err) } peers, err = p.Peers() if err != nil { t.Fatal(err) } if len(peers) != 1 { t.Fatalf("expected 1 peer, got %v", peers) } if peers[0] != peer { t.Fatalf("expected peer %s, got %s", peer, peers[0]) } }
// makeRaft returns a Raft and its FSM, with snapshots based in the given dir. func makeRaft(t *testing.T, dir string) (*raft.Raft, *MockFSM) { snaps, err := raft.NewFileSnapshotStore(dir, 5, nil) if err != nil { t.Fatalf("err: %v", err) } fsm := &MockFSM{} store := raft.NewInmemStore() addr, trans := raft.NewInmemTransport("") config := raft.DefaultConfig() config.LocalID = raft.ServerID(fmt.Sprintf("server-%s", addr)) var members raft.Configuration members.Servers = append(members.Servers, raft.Server{ Suffrage: raft.Voter, ID: config.LocalID, Address: addr, }) err = raft.BootstrapCluster(config, store, store, snaps, trans, members) if err != nil { t.Fatalf("err: %v", err) } raft, err := raft.NewRaft(config, fsm, store, store, snaps, trans) if err != nil { t.Fatalf("err: %v", err) } timeout := time.After(10 * time.Second) for { if raft.Leader() != "" { break } select { case <-raft.LeaderCh(): case <-time.After(1 * time.Second): // Need to poll because we might have missed the first // go with the leader channel. case <-timeout: t.Fatalf("timed out waiting for leader") } } return raft, fsm }