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