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 }