github.com/annwntech/go-micro/v2@v2.9.5/router/table_test.go (about) 1 package router 2 3 import ( 4 "fmt" 5 "testing" 6 ) 7 8 func testSetup() (*table, Route) { 9 table := newTable() 10 11 route := Route{ 12 Service: "dest.svc", 13 Address: "dest.addr", 14 Gateway: "dest.gw", 15 Network: "dest.network", 16 Router: "src.router", 17 Link: "det.link", 18 Metric: 10, 19 } 20 21 return table, route 22 } 23 24 func TestCreate(t *testing.T) { 25 table, route := testSetup() 26 27 if err := table.Create(route); err != nil { 28 t.Errorf("error adding route: %s", err) 29 } 30 31 // adds new route for the original destination 32 route.Gateway = "dest.gw2" 33 34 if err := table.Create(route); err != nil { 35 t.Errorf("error adding route: %s", err) 36 } 37 38 // adding the same route under Insert policy must error 39 if err := table.Create(route); err != ErrDuplicateRoute { 40 t.Errorf("error adding route. Expected error: %s, found: %s", ErrDuplicateRoute, err) 41 } 42 } 43 44 func TestDelete(t *testing.T) { 45 table, route := testSetup() 46 47 if err := table.Create(route); err != nil { 48 t.Errorf("error adding route: %s", err) 49 } 50 51 // should fail to delete non-existant route 52 prevSvc := route.Service 53 route.Service = "randDest" 54 55 if err := table.Delete(route); err != ErrRouteNotFound { 56 t.Errorf("error deleting route. Expected: %s, found: %s", ErrRouteNotFound, err) 57 } 58 59 // we should be able to delete the existing route 60 route.Service = prevSvc 61 62 if err := table.Delete(route); err != nil { 63 t.Errorf("error deleting route: %s", err) 64 } 65 } 66 67 func TestUpdate(t *testing.T) { 68 table, route := testSetup() 69 70 if err := table.Create(route); err != nil { 71 t.Errorf("error adding route: %s", err) 72 } 73 74 // change the metric of the original route 75 route.Metric = 200 76 77 if err := table.Update(route); err != nil { 78 t.Errorf("error updating route: %s", err) 79 } 80 81 // this should add a new route 82 route.Service = "rand.dest" 83 84 if err := table.Update(route); err != nil { 85 t.Errorf("error updating route: %s", err) 86 } 87 } 88 89 func TestList(t *testing.T) { 90 table, route := testSetup() 91 92 svc := []string{"one.svc", "two.svc", "three.svc"} 93 94 for i := 0; i < len(svc); i++ { 95 route.Service = svc[i] 96 if err := table.Create(route); err != nil { 97 t.Errorf("error adding route: %s", err) 98 } 99 } 100 101 routes, err := table.List() 102 if err != nil { 103 t.Errorf("error listing routes: %s", err) 104 } 105 106 if len(routes) != len(svc) { 107 t.Errorf("incorrect number of routes listed. Expected: %d, found: %d", len(svc), len(routes)) 108 } 109 } 110 111 func TestQuery(t *testing.T) { 112 table, route := testSetup() 113 114 svc := []string{"svc1", "svc2", "svc3", "svc1"} 115 net := []string{"net1", "net2", "net1", "net3"} 116 gw := []string{"gw1", "gw2", "gw3", "gw3"} 117 rtr := []string{"rtr1", "rt2", "rt3", "rtr3"} 118 119 for i := 0; i < len(svc); i++ { 120 route.Service = svc[i] 121 route.Network = net[i] 122 route.Gateway = gw[i] 123 route.Router = rtr[i] 124 if err := table.Create(route); err != nil { 125 t.Errorf("error adding route: %s", err) 126 } 127 } 128 129 // return all routes 130 routes, err := table.Query() 131 if err != nil { 132 t.Errorf("error looking up routes: %s", err) 133 } else if len(routes) == 0 { 134 t.Errorf("error looking up routes: not found") 135 } 136 137 // query routes particular network 138 network := "net1" 139 140 routes, err = table.Query(QueryNetwork(network)) 141 if err != nil { 142 t.Errorf("error looking up routes: %s", err) 143 } 144 145 if len(routes) != 2 { 146 t.Errorf("incorrect number of routes returned. Expected: %d, found: %d", 2, len(routes)) 147 } 148 149 for _, route := range routes { 150 if route.Network != network { 151 t.Errorf("incorrect route returned. Expected network: %s, found: %s", network, route.Network) 152 } 153 } 154 155 // query routes for particular gateway 156 gateway := "gw1" 157 158 routes, err = table.Query(QueryGateway(gateway)) 159 if err != nil { 160 t.Errorf("error looking up routes: %s", err) 161 } 162 163 if len(routes) != 1 { 164 t.Errorf("incorrect number of routes returned. Expected: %d, found: %d", 1, len(routes)) 165 } 166 167 if routes[0].Gateway != gateway { 168 t.Errorf("incorrect route returned. Expected gateway: %s, found: %s", gateway, routes[0].Gateway) 169 } 170 171 // query routes for particular router 172 router := "rtr1" 173 174 routes, err = table.Query(QueryRouter(router)) 175 if err != nil { 176 t.Errorf("error looking up routes: %s", err) 177 } 178 179 if len(routes) != 1 { 180 t.Errorf("incorrect number of routes returned. Expected: %d, found: %d", 1, len(routes)) 181 } 182 183 if routes[0].Router != router { 184 t.Errorf("incorrect route returned. Expected router: %s, found: %s", router, routes[0].Router) 185 } 186 187 // query particular gateway and network 188 query := []QueryOption{ 189 QueryGateway(gateway), 190 QueryNetwork(network), 191 QueryRouter(router), 192 } 193 194 routes, err = table.Query(query...) 195 if err != nil { 196 t.Errorf("error looking up routes: %s", err) 197 } 198 199 if len(routes) != 1 { 200 t.Errorf("incorrect number of routes returned. Expected: %d, found: %d", 1, len(routes)) 201 } 202 203 if routes[0].Gateway != gateway { 204 t.Errorf("incorrect route returned. Expected gateway: %s, found: %s", gateway, routes[0].Gateway) 205 } 206 207 if routes[0].Network != network { 208 t.Errorf("incorrect network returned. Expected network: %s, found: %s", network, routes[0].Network) 209 } 210 211 if routes[0].Router != router { 212 t.Errorf("incorrect route returned. Expected router: %s, found: %s", router, routes[0].Router) 213 } 214 215 // non-existen route query 216 routes, err = table.Query(QueryService("foobar")) 217 if err != ErrRouteNotFound { 218 t.Errorf("error looking up routes. Expected: %s, found: %s", ErrRouteNotFound, err) 219 } 220 221 if len(routes) != 0 { 222 t.Errorf("incorrect number of routes returned. Expected: %d, found: %d", 0, len(routes)) 223 } 224 225 // query NO routes 226 query = []QueryOption{ 227 QueryGateway(gateway), 228 QueryNetwork(network), 229 QueryStrategy(AdvertiseNone), 230 } 231 232 routes, err = table.Query(query...) 233 if err != nil { 234 t.Errorf("error looking up routes: %s", err) 235 } 236 237 if len(routes) > 0 { 238 t.Errorf("incorrect number of routes returned. Expected: %d, found: %d", 0, len(routes)) 239 } 240 241 // insert local routes to query 242 for i := 0; i < 2; i++ { 243 route.Link = "local" 244 route.Address = fmt.Sprintf("local.route.address-%d", i) 245 if err := table.Create(route); err != nil { 246 t.Errorf("error adding route: %s", err) 247 } 248 } 249 250 // query local routes 251 query = []QueryOption{ 252 QueryGateway("*"), 253 QueryNetwork("*"), 254 QueryStrategy(AdvertiseLocal), 255 } 256 257 routes, err = table.Query(query...) 258 if err != nil { 259 t.Errorf("error looking up routes: %s", err) 260 } 261 262 if len(routes) != 2 { 263 t.Errorf("incorrect number of routes returned. Expected: %d, found: %d", 2, len(routes)) 264 } 265 266 // add two different routes for svcX with different metric 267 for i := 0; i < 2; i++ { 268 route.Service = "svcX" 269 route.Address = fmt.Sprintf("svcX.route.address-%d", i) 270 route.Metric = int64(100 + i) 271 if err := table.Create(route); err != nil { 272 t.Errorf("error adding route: %s", err) 273 } 274 } 275 276 // query best routes for svcX 277 query = []QueryOption{ 278 QueryService("svcX"), 279 QueryStrategy(AdvertiseBest), 280 } 281 282 routes, err = table.Query(query...) 283 if err != nil { 284 t.Errorf("error looking up routes: %s", err) 285 } 286 287 if len(routes) != 1 { 288 t.Errorf("incorrect number of routes returned. Expected: %d, found: %d", 1, len(routes)) 289 } 290 }