TestElectionFailover tests that an election will
(t *testing.T)
| 112 | |
| 113 | // TestElectionFailover tests that an election will |
| 114 | func TestElectionFailover(t *testing.T) { |
| 115 | integration.BeforeTest(t) |
| 116 | clus := integration.NewCluster(t, &integration.ClusterConfig{Size: 3}) |
| 117 | defer clus.Terminate(t) |
| 118 | |
| 119 | cctx, cancel := context.WithCancel(context.TODO()) |
| 120 | defer cancel() |
| 121 | |
| 122 | ss := make([]*concurrency.Session, 3) |
| 123 | |
| 124 | for i := 0; i < 3; i++ { |
| 125 | var err error |
| 126 | ss[i], err = concurrency.NewSession(clus.Client(i)) |
| 127 | if err != nil { |
| 128 | t.Error(err) |
| 129 | } |
| 130 | defer ss[i].Orphan() |
| 131 | } |
| 132 | |
| 133 | // first leader (elected) |
| 134 | e := concurrency.NewElection(ss[0], "test-election") |
| 135 | if err := e.Campaign(context.TODO(), "foo"); err != nil { |
| 136 | t.Fatalf("failed volunteer (%v)", err) |
| 137 | } |
| 138 | |
| 139 | // check first leader |
| 140 | resp, ok := <-e.Observe(cctx) |
| 141 | if !ok { |
| 142 | t.Fatalf("could not wait for first election; channel closed") |
| 143 | } |
| 144 | s := string(resp.Kvs[0].Value) |
| 145 | if s != "foo" { |
| 146 | t.Fatalf("wrong election result. got %s, wanted foo", s) |
| 147 | } |
| 148 | |
| 149 | // next leader |
| 150 | electedErrC := make(chan error, 1) |
| 151 | go func() { |
| 152 | ee := concurrency.NewElection(ss[1], "test-election") |
| 153 | eer := ee.Campaign(context.TODO(), "bar") |
| 154 | electedErrC <- eer // If eer != nil, the test will fail by calling t.Fatal(eer) |
| 155 | }() |
| 156 | |
| 157 | // invoke leader failover |
| 158 | err := ss[0].Close() |
| 159 | require.NoError(t, err) |
| 160 | |
| 161 | // check new leader |
| 162 | e = concurrency.NewElection(ss[2], "test-election") |
| 163 | resp, ok = <-e.Observe(cctx) |
| 164 | if !ok { |
| 165 | t.Fatalf("could not wait for second election; channel closed") |
| 166 | } |
| 167 | s = string(resp.Kvs[0].Value) |
| 168 | if s != "bar" { |
| 169 | t.Fatalf("wrong election result. got %s, wanted bar", s) |
| 170 | } |
| 171 |
nothing calls this directly
no test coverage detected
searching dependent graphs…