github.com/lfch/etcd-io/tests/v3@v3.0.0-20221004140520-eac99acd3e9d/integration/clientv3/naming/endpoints_test.go (about) 1 // Copyright 2016 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 naming_test 16 17 import ( 18 "context" 19 "reflect" 20 "testing" 21 22 etcd "github.com/lfch/etcd-io/client/v3" 23 "github.com/lfch/etcd-io/client/v3/naming/endpoints" 24 integration2 "github.com/lfch/etcd-io/tests/v3/framework/integration" 25 ) 26 27 func TestEndpointManager(t *testing.T) { 28 integration2.BeforeTest(t) 29 30 clus := integration2.NewCluster(t, &integration2.ClusterConfig{Size: 1}) 31 defer clus.Terminate(t) 32 33 em, err := endpoints.NewManager(clus.RandClient(), "foo") 34 if err != nil { 35 t.Fatal("failed to create EndpointManager", err) 36 } 37 ctx, watchCancel := context.WithCancel(context.Background()) 38 defer watchCancel() 39 w, err := em.NewWatchChannel(ctx) 40 if err != nil { 41 t.Fatal("failed to establish watch", err) 42 } 43 44 e1 := endpoints.Endpoint{Addr: "127.0.0.1", Metadata: "metadata"} 45 err = em.AddEndpoint(context.TODO(), "foo/a1", e1) 46 if err != nil { 47 t.Fatal("failed to add foo", err) 48 } 49 50 us := <-w 51 52 if us == nil { 53 t.Fatal("failed to get update") 54 } 55 56 wu := &endpoints.Update{ 57 Op: endpoints.Add, 58 Key: "foo/a1", 59 Endpoint: e1, 60 } 61 62 if !reflect.DeepEqual(us[0], wu) { 63 t.Fatalf("up = %#v, want %#v", us[0], wu) 64 } 65 66 err = em.DeleteEndpoint(context.TODO(), "foo/a1") 67 if err != nil { 68 t.Fatalf("failed to udpate %v", err) 69 } 70 71 us = <-w 72 if us == nil { 73 t.Fatal("failed to get udpate") 74 } 75 76 wu = &endpoints.Update{ 77 Op: endpoints.Delete, 78 Key: "foo/a1", 79 } 80 81 if !reflect.DeepEqual(us[0], wu) { 82 t.Fatalf("up = %#v, want %#v", us[1], wu) 83 } 84 } 85 86 // TestEndpointManagerAtomicity ensures the resolver will initialize 87 // correctly with multiple hosts and correctly receive multiple 88 // updates in a single revision. 89 func TestEndpointManagerAtomicity(t *testing.T) { 90 integration2.BeforeTest(t) 91 92 clus := integration2.NewCluster(t, &integration2.ClusterConfig{Size: 1}) 93 defer clus.Terminate(t) 94 95 c := clus.RandClient() 96 em, err := endpoints.NewManager(c, "foo") 97 if err != nil { 98 t.Fatal("failed to create EndpointManager", err) 99 } 100 101 err = em.Update(context.TODO(), []*endpoints.UpdateWithOpts{ 102 endpoints.NewAddUpdateOpts("foo/host", endpoints.Endpoint{Addr: "127.0.0.1:2000"}), 103 endpoints.NewAddUpdateOpts("foo/host2", endpoints.Endpoint{Addr: "127.0.0.1:2001"})}) 104 if err != nil { 105 t.Fatal(err) 106 } 107 108 ctx, watchCancel := context.WithCancel(context.Background()) 109 defer watchCancel() 110 w, err := em.NewWatchChannel(ctx) 111 if err != nil { 112 t.Fatal(err) 113 } 114 115 updates := <-w 116 if len(updates) != 2 { 117 t.Fatalf("expected two updates, got %+v", updates) 118 } 119 120 _, err = c.Txn(context.TODO()).Then(etcd.OpDelete("foo/host"), etcd.OpDelete("foo/host2")).Commit() 121 if err != nil { 122 t.Fatal(err) 123 } 124 125 updates = <-w 126 if len(updates) != 2 || (updates[0].Op != endpoints.Delete && updates[1].Op != endpoints.Delete) { 127 t.Fatalf("expected two delete updates, got %+v", updates) 128 } 129 } 130 131 func TestEndpointManagerCRUD(t *testing.T) { 132 integration2.BeforeTest(t) 133 134 clus := integration2.NewCluster(t, &integration2.ClusterConfig{Size: 1}) 135 defer clus.Terminate(t) 136 137 em, err := endpoints.NewManager(clus.RandClient(), "foo") 138 if err != nil { 139 t.Fatal("failed to create EndpointManager", err) 140 } 141 142 // Add 143 k1 := "foo/a1" 144 e1 := endpoints.Endpoint{Addr: "127.0.0.1", Metadata: "metadata1"} 145 err = em.AddEndpoint(context.TODO(), k1, e1) 146 if err != nil { 147 t.Fatal("failed to add", k1, err) 148 } 149 150 k2 := "foo/a2" 151 e2 := endpoints.Endpoint{Addr: "127.0.0.2", Metadata: "metadata2"} 152 err = em.AddEndpoint(context.TODO(), k2, e2) 153 if err != nil { 154 t.Fatal("failed to add", k2, err) 155 } 156 157 eps, err := em.List(context.TODO()) 158 if err != nil { 159 t.Fatal("failed to list foo") 160 } 161 if len(eps) != 2 { 162 t.Fatalf("unexpected the number of endpoints: %d", len(eps)) 163 } 164 if !reflect.DeepEqual(eps[k1], e1) { 165 t.Fatalf("unexpected endpoints: %s", k1) 166 } 167 if !reflect.DeepEqual(eps[k2], e2) { 168 t.Fatalf("unexpected endpoints: %s", k2) 169 } 170 171 // Delete 172 err = em.DeleteEndpoint(context.TODO(), k1) 173 if err != nil { 174 t.Fatal("failed to delete", k2, err) 175 } 176 177 eps, err = em.List(context.TODO()) 178 if err != nil { 179 t.Fatal("failed to list foo") 180 } 181 if len(eps) != 1 { 182 t.Fatalf("unexpected the number of endpoints: %d", len(eps)) 183 } 184 if !reflect.DeepEqual(eps[k2], e2) { 185 t.Fatalf("unexpected endpoints: %s", k2) 186 } 187 188 // Update 189 k3 := "foo/a3" 190 e3 := endpoints.Endpoint{Addr: "127.0.0.3", Metadata: "metadata3"} 191 updates := []*endpoints.UpdateWithOpts{ 192 {Update: endpoints.Update{Op: endpoints.Add, Key: k3, Endpoint: e3}}, 193 {Update: endpoints.Update{Op: endpoints.Delete, Key: k2}}, 194 } 195 err = em.Update(context.TODO(), updates) 196 if err != nil { 197 t.Fatal("failed to update", err) 198 } 199 200 eps, err = em.List(context.TODO()) 201 if err != nil { 202 t.Fatal("failed to list foo") 203 } 204 if len(eps) != 1 { 205 t.Fatalf("unexpected the number of endpoints: %d", len(eps)) 206 } 207 if !reflect.DeepEqual(eps[k3], e3) { 208 t.Fatalf("unexpected endpoints: %s", k3) 209 } 210 }