go-micro.dev/v5@v5.12.0/registry/options_test.go (about)

     1  //go:build nats
     2  // +build nats
     3  
     4  package registry
     5  
     6  import (
     7  	"fmt"
     8  	"log"
     9  	"os"
    10  	"sync"
    11  	"testing"
    12  	"time"
    13  
    14  	"github.com/nats-io/nats.go"
    15  )
    16  
    17  var addrTestCases = []struct {
    18  	name        string
    19  	description string
    20  	addrs       map[string]string // expected address : set address
    21  }{
    22  	{
    23  		"registryOption",
    24  		"set registry addresses through a registry.Option in constructor",
    25  		map[string]string{
    26  			"nats://192.168.10.1:5222": "192.168.10.1:5222",
    27  			"nats://10.20.10.0:4222":   "10.20.10.0:4222"},
    28  	},
    29  	{
    30  		"natsOption",
    31  		"set registry addresses through the nats.Option in constructor",
    32  		map[string]string{
    33  			"nats://192.168.10.1:5222": "192.168.10.1:5222",
    34  			"nats://10.20.10.0:4222":   "10.20.10.0:4222"},
    35  	},
    36  	{
    37  		"default",
    38  		"check if default Address is set correctly",
    39  		map[string]string{
    40  			nats.DefaultURL: "",
    41  		},
    42  	},
    43  }
    44  
    45  func TestInitAddrs(t *testing.T) {
    46  	for _, tc := range addrTestCases {
    47  		t.Run(fmt.Sprintf("%s: %s", tc.name, tc.description), func(t *testing.T) {
    48  			var reg Registry
    49  			var addrs []string
    50  
    51  			for _, addr := range tc.addrs {
    52  				addrs = append(addrs, addr)
    53  			}
    54  
    55  			switch tc.name {
    56  			case "registryOption":
    57  				// we know that there are just two addrs in the dict
    58  				reg = NewRegistry(Addrs(addrs[0], addrs[1]))
    59  			case "natsOption":
    60  				nopts := nats.GetDefaultOptions()
    61  				nopts.Servers = addrs
    62  				reg = NewRegistry(Options(nopts))
    63  			case "default":
    64  				reg = NewRegistry()
    65  			}
    66  
    67  			// if err := reg.Register(dummyService); err != nil {
    68  			// 	t.Fatal(err)
    69  			// }
    70  
    71  			natsRegistry, ok := reg.(*natsRegistry)
    72  			if !ok {
    73  				t.Fatal("Expected registry to be of types *natsRegistry")
    74  			}
    75  			// check if the same amount of addrs we set has actually been set
    76  			if len(natsRegistry.addrs) != len(tc.addrs) {
    77  				t.Errorf("Expected Addr = %v, Actual Addr = %v",
    78  					natsRegistry.addrs, tc.addrs)
    79  				t.Errorf("Expected Addr count = %d, Actual Addr count = %d",
    80  					len(natsRegistry.addrs), len(tc.addrs))
    81  			}
    82  
    83  			for _, addr := range natsRegistry.addrs {
    84  				_, ok := tc.addrs[addr]
    85  				if !ok {
    86  					t.Errorf("Expected Addr = %v, Actual Addr = %v",
    87  						natsRegistry.addrs, tc.addrs)
    88  					t.Errorf("Expected '%s' has not been set", addr)
    89  				}
    90  			}
    91  		})
    92  	}
    93  }
    94  
    95  func TestWatchQueryTopic(t *testing.T) {
    96  	natsURL := os.Getenv("NATS_URL")
    97  	if natsURL == "" {
    98  		log.Println("NATS_URL is undefined - skipping tests")
    99  		return
   100  	}
   101  
   102  	watchTopic := "custom.test.watch"
   103  	queryTopic := "custom.test.query"
   104  	wt := WatchTopic(watchTopic)
   105  	qt := QueryTopic(queryTopic)
   106  
   107  	// connect to NATS and subscribe to the Watch & Query topics where the
   108  	// registry will publish a msg
   109  	nopts := nats.GetDefaultOptions()
   110  	nopts.Servers = setAddrs([]string{natsURL})
   111  	conn, err := nopts.Connect()
   112  	if err != nil {
   113  		t.Fatal(err)
   114  	}
   115  
   116  	wg := sync.WaitGroup{}
   117  	wg.Add(2)
   118  
   119  	okCh := make(chan struct{})
   120  
   121  	// Wait until we have received something on both topics
   122  	go func() {
   123  		wg.Wait()
   124  		close(okCh)
   125  	}()
   126  
   127  	// handler just calls wg.Done()
   128  	rcvdHdlr := func(m *nats.Msg) {
   129  		wg.Done()
   130  	}
   131  
   132  	_, err = conn.Subscribe(queryTopic, rcvdHdlr)
   133  	if err != nil {
   134  		t.Fatal(err)
   135  	}
   136  
   137  	_, err = conn.Subscribe(watchTopic, rcvdHdlr)
   138  	if err != nil {
   139  		t.Fatal(err)
   140  	}
   141  
   142  	dummyService := &Service{
   143  		Name:    "TestInitAddr",
   144  		Version: "1.0.0",
   145  	}
   146  
   147  	reg := NewRegistry(qt, wt, Addrs(natsURL))
   148  
   149  	// trigger registry to send out message on watchTopic
   150  	if err := reg.Register(dummyService); err != nil {
   151  		t.Fatal(err)
   152  	}
   153  
   154  	// trigger registry to send out message on queryTopic
   155  	if _, err := reg.ListServices(); err != nil {
   156  		t.Fatal(err)
   157  	}
   158  
   159  	// make sure that we received something on tc.topic
   160  	select {
   161  	case <-okCh:
   162  		// fine - we received on both topics a message from the registry
   163  	case <-time.After(time.Millisecond * 200):
   164  		t.Fatal("timeout - no data received on watch topic")
   165  	}
   166  }