gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/router/default_test.go (about) 1 package router 2 3 import ( 4 "fmt" 5 "sync" 6 "testing" 7 "time" 8 9 "gitee.com/liuxuezhan/go-micro-v1.18.0/registry/memory" 10 "gitee.com/liuxuezhan/go-micro-v1.18.0/util/log" 11 ) 12 13 func routerTestSetup() Router { 14 r := memory.NewRegistry() 15 return newRouter(Registry(r)) 16 } 17 18 func TestRouterStartStop(t *testing.T) { 19 r := routerTestSetup() 20 21 log.Debugf("TestRouterStartStop STARTING") 22 if err := r.Start(); err != nil { 23 t.Errorf("failed to start router: %v", err) 24 } 25 26 _, err := r.Advertise() 27 if err != nil { 28 t.Errorf("failed to start advertising: %v", err) 29 } 30 31 if err := r.Stop(); err != nil { 32 t.Errorf("failed to stop router: %v", err) 33 } 34 log.Debugf("TestRouterStartStop STOPPED") 35 } 36 37 func TestRouterAdvertise(t *testing.T) { 38 r := routerTestSetup() 39 40 // lower the advertise interval 41 AdvertiseEventsTick = 500 * time.Millisecond 42 AdvertiseTableTick = 1 * time.Second 43 44 if err := r.Start(); err != nil { 45 t.Errorf("failed to start router: %v", err) 46 } 47 48 ch, err := r.Advertise() 49 if err != nil { 50 t.Errorf("failed to start advertising: %v", err) 51 } 52 53 // receive announce event 54 ann := <-ch 55 log.Debugf("received announce advert: %v", ann) 56 57 // Generate random unique routes 58 nrRoutes := 5 59 routes := make([]Route, nrRoutes) 60 route := Route{ 61 Service: "dest.svc", 62 Address: "dest.addr", 63 Gateway: "dest.gw", 64 Network: "dest.network", 65 Router: "src.router", 66 Link: "local", 67 Metric: 10, 68 } 69 70 for i := 0; i < nrRoutes; i++ { 71 testRoute := route 72 testRoute.Service = fmt.Sprintf("%s-%d", route.Service, i) 73 routes[i] = testRoute 74 } 75 76 var advertErr error 77 78 createDone := make(chan bool) 79 errChan := make(chan error) 80 81 var wg sync.WaitGroup 82 wg.Add(1) 83 go func() { 84 wg.Done() 85 defer close(createDone) 86 for _, route := range routes { 87 log.Debugf("Creating route %v", route) 88 if err := r.Table().Create(route); err != nil { 89 log.Debugf("Failed to create route: %v", err) 90 errChan <- err 91 return 92 } 93 } 94 }() 95 96 var adverts int 97 readDone := make(chan bool) 98 99 wg.Add(1) 100 go func() { 101 defer func() { 102 wg.Done() 103 readDone <- true 104 }() 105 for advert := range ch { 106 select { 107 case advertErr = <-errChan: 108 t.Errorf("failed advertising events: %v", advertErr) 109 default: 110 // do nothing for now 111 log.Debugf("Router advert received: %v", advert) 112 adverts += len(advert.Events) 113 } 114 return 115 } 116 }() 117 118 // done adding routes to routing table 119 <-createDone 120 // done reading adverts from the routing table 121 <-readDone 122 123 if adverts != nrRoutes { 124 t.Errorf("Expected %d adverts, received: %d", nrRoutes, adverts) 125 } 126 127 wg.Wait() 128 129 if err := r.Stop(); err != nil { 130 t.Errorf("failed to stop router: %v", err) 131 } 132 }