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  }