github.com/micro/go-micro/v2@v2.9.1/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  }