go.etcd.io/etcd@v3.3.27+incompatible/integration/member_test.go (about) 1 // Copyright 2015 The etcd Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package integration 16 17 import ( 18 "context" 19 "fmt" 20 "io/ioutil" 21 "os" 22 "reflect" 23 "testing" 24 25 "github.com/coreos/etcd/client" 26 "github.com/coreos/etcd/pkg/testutil" 27 ) 28 29 func TestPauseMember(t *testing.T) { 30 defer testutil.AfterTest(t) 31 c := NewCluster(t, 5) 32 c.Launch(t) 33 defer c.Terminate(t) 34 35 for i := 0; i < 5; i++ { 36 c.Members[i].Pause() 37 membs := append([]*member{}, c.Members[:i]...) 38 membs = append(membs, c.Members[i+1:]...) 39 c.waitLeader(t, membs) 40 clusterMustProgress(t, membs) 41 c.Members[i].Resume() 42 } 43 c.waitLeader(t, c.Members) 44 clusterMustProgress(t, c.Members) 45 } 46 47 func TestRestartMember(t *testing.T) { 48 defer testutil.AfterTest(t) 49 c := NewCluster(t, 3) 50 c.Launch(t) 51 defer c.Terminate(t) 52 53 for i := 0; i < 3; i++ { 54 c.Members[i].Stop(t) 55 membs := append([]*member{}, c.Members[:i]...) 56 membs = append(membs, c.Members[i+1:]...) 57 c.waitLeader(t, membs) 58 clusterMustProgress(t, membs) 59 err := c.Members[i].Restart(t) 60 if err != nil { 61 t.Fatal(err) 62 } 63 } 64 c.waitLeader(t, c.Members) 65 clusterMustProgress(t, c.Members) 66 } 67 68 func TestLaunchDuplicateMemberShouldFail(t *testing.T) { 69 size := 3 70 c := NewCluster(t, size) 71 m := c.Members[0].Clone(t) 72 var err error 73 m.DataDir, err = ioutil.TempDir(os.TempDir(), "etcd") 74 if err != nil { 75 t.Fatal(err) 76 } 77 c.Launch(t) 78 defer c.Terminate(t) 79 80 if err := m.Launch(); err == nil { 81 t.Errorf("unexpect successful launch") 82 } 83 } 84 85 func TestSnapshotAndRestartMember(t *testing.T) { 86 defer testutil.AfterTest(t) 87 m := mustNewMember(t, memberConfig{name: "snapAndRestartTest"}) 88 m.SnapCount = 100 89 m.Launch() 90 defer m.Terminate(t) 91 m.WaitOK(t) 92 93 resps := make([]*client.Response, 120) 94 var err error 95 for i := 0; i < 120; i++ { 96 cc := MustNewHTTPClient(t, []string{m.URL()}, nil) 97 kapi := client.NewKeysAPI(cc) 98 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 99 key := fmt.Sprintf("foo%d", i) 100 resps[i], err = kapi.Create(ctx, "/"+key, "bar") 101 if err != nil { 102 t.Fatalf("#%d: create on %s error: %v", i, m.URL(), err) 103 } 104 cancel() 105 } 106 m.Stop(t) 107 m.Restart(t) 108 109 m.WaitOK(t) 110 for i := 0; i < 120; i++ { 111 cc := MustNewHTTPClient(t, []string{m.URL()}, nil) 112 kapi := client.NewKeysAPI(cc) 113 ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) 114 key := fmt.Sprintf("foo%d", i) 115 resp, err := kapi.Get(ctx, "/"+key, nil) 116 if err != nil { 117 t.Fatalf("#%d: get on %s error: %v", i, m.URL(), err) 118 } 119 cancel() 120 121 if !reflect.DeepEqual(resp.Node, resps[i].Node) { 122 t.Errorf("#%d: node = %v, want %v", i, resp.Node, resps[i].Node) 123 } 124 } 125 }