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  }