gitee.com/sasukebo/go-micro/v4@v4.7.1/broker/http_test.go (about) 1 package broker_test 2 3 import ( 4 "sync" 5 "testing" 6 "time" 7 8 "gitee.com/sasukebo/go-micro/v4/broker" 9 "gitee.com/sasukebo/go-micro/v4/registry" 10 "github.com/google/uuid" 11 ) 12 13 var ( 14 // mock data 15 testData = map[string][]*registry.Service{ 16 "foo": { 17 { 18 Name: "foo", 19 Version: "1.0.0", 20 Nodes: []*registry.Node{ 21 { 22 Id: "foo-1.0.0-123", 23 Address: "localhost:9999", 24 }, 25 { 26 Id: "foo-1.0.0-321", 27 Address: "localhost:9999", 28 }, 29 }, 30 }, 31 { 32 Name: "foo", 33 Version: "1.0.1", 34 Nodes: []*registry.Node{ 35 { 36 Id: "foo-1.0.1-321", 37 Address: "localhost:6666", 38 }, 39 }, 40 }, 41 { 42 Name: "foo", 43 Version: "1.0.3", 44 Nodes: []*registry.Node{ 45 { 46 Id: "foo-1.0.3-345", 47 Address: "localhost:8888", 48 }, 49 }, 50 }, 51 }, 52 } 53 ) 54 55 func newTestRegistry() registry.Registry { 56 return registry.NewMemoryRegistry(registry.Services(testData)) 57 } 58 59 func sub(be *testing.B, c int) { 60 be.StopTimer() 61 m := newTestRegistry() 62 63 b := broker.NewBroker(broker.Registry(m)) 64 topic := uuid.New().String() 65 66 if err := b.Init(); err != nil { 67 be.Fatalf("Unexpected init error: %v", err) 68 } 69 70 if err := b.Connect(); err != nil { 71 be.Fatalf("Unexpected connect error: %v", err) 72 } 73 74 msg := &broker.Message{ 75 Header: map[string]string{ 76 "Content-Type": "application/json", 77 }, 78 Body: []byte(`{"message": "Hello World"}`), 79 } 80 81 var subs []broker.Subscriber 82 done := make(chan bool, c) 83 84 for i := 0; i < c; i++ { 85 sub, err := b.Subscribe(topic, func(p broker.Event) error { 86 done <- true 87 m := p.Message() 88 89 if string(m.Body) != string(msg.Body) { 90 be.Fatalf("Unexpected msg %s, expected %s", string(m.Body), string(msg.Body)) 91 } 92 93 return nil 94 }, broker.Queue("shared")) 95 if err != nil { 96 be.Fatalf("Unexpected subscribe error: %v", err) 97 } 98 subs = append(subs, sub) 99 } 100 101 for i := 0; i < be.N; i++ { 102 be.StartTimer() 103 if err := b.Publish(topic, msg); err != nil { 104 be.Fatalf("Unexpected publish error: %v", err) 105 } 106 <-done 107 be.StopTimer() 108 } 109 110 for _, sub := range subs { 111 sub.Unsubscribe() 112 } 113 114 if err := b.Disconnect(); err != nil { 115 be.Fatalf("Unexpected disconnect error: %v", err) 116 } 117 } 118 119 func pub(be *testing.B, c int) { 120 be.StopTimer() 121 m := newTestRegistry() 122 b := broker.NewBroker(broker.Registry(m)) 123 topic := uuid.New().String() 124 125 if err := b.Init(); err != nil { 126 be.Fatalf("Unexpected init error: %v", err) 127 } 128 129 if err := b.Connect(); err != nil { 130 be.Fatalf("Unexpected connect error: %v", err) 131 } 132 133 msg := &broker.Message{ 134 Header: map[string]string{ 135 "Content-Type": "application/json", 136 }, 137 Body: []byte(`{"message": "Hello World"}`), 138 } 139 140 done := make(chan bool, c*4) 141 142 sub, err := b.Subscribe(topic, func(p broker.Event) error { 143 done <- true 144 m := p.Message() 145 if string(m.Body) != string(msg.Body) { 146 be.Fatalf("Unexpected msg %s, expected %s", string(m.Body), string(msg.Body)) 147 } 148 return nil 149 }, broker.Queue("shared")) 150 if err != nil { 151 be.Fatalf("Unexpected subscribe error: %v", err) 152 } 153 154 var wg sync.WaitGroup 155 ch := make(chan int, c*4) 156 be.StartTimer() 157 158 for i := 0; i < c; i++ { 159 go func() { 160 for range ch { 161 if err := b.Publish(topic, msg); err != nil { 162 be.Fatalf("Unexpected publish error: %v", err) 163 } 164 select { 165 case <-done: 166 case <-time.After(time.Second): 167 } 168 wg.Done() 169 } 170 }() 171 } 172 173 for i := 0; i < be.N; i++ { 174 wg.Add(1) 175 ch <- i 176 } 177 178 wg.Wait() 179 be.StopTimer() 180 sub.Unsubscribe() 181 close(ch) 182 close(done) 183 184 if err := b.Disconnect(); err != nil { 185 be.Fatalf("Unexpected disconnect error: %v", err) 186 } 187 } 188 189 func TestBroker(t *testing.T) { 190 m := newTestRegistry() 191 b := broker.NewBroker(broker.Registry(m)) 192 193 if err := b.Init(); err != nil { 194 t.Fatalf("Unexpected init error: %v", err) 195 } 196 197 if err := b.Connect(); err != nil { 198 t.Fatalf("Unexpected connect error: %v", err) 199 } 200 201 msg := &broker.Message{ 202 Header: map[string]string{ 203 "Content-Type": "application/json", 204 }, 205 Body: []byte(`{"message": "Hello World"}`), 206 } 207 208 done := make(chan bool) 209 210 sub, err := b.Subscribe("test", func(p broker.Event) error { 211 m := p.Message() 212 213 if string(m.Body) != string(msg.Body) { 214 t.Fatalf("Unexpected msg %s, expected %s", string(m.Body), string(msg.Body)) 215 } 216 217 close(done) 218 return nil 219 }) 220 if err != nil { 221 t.Fatalf("Unexpected subscribe error: %v", err) 222 } 223 224 if err := b.Publish("test", msg); err != nil { 225 t.Fatalf("Unexpected publish error: %v", err) 226 } 227 228 <-done 229 sub.Unsubscribe() 230 231 if err := b.Disconnect(); err != nil { 232 t.Fatalf("Unexpected disconnect error: %v", err) 233 } 234 } 235 236 func TestConcurrentSubBroker(t *testing.T) { 237 m := newTestRegistry() 238 b := broker.NewBroker(broker.Registry(m)) 239 240 if err := b.Init(); err != nil { 241 t.Fatalf("Unexpected init error: %v", err) 242 } 243 244 if err := b.Connect(); err != nil { 245 t.Fatalf("Unexpected connect error: %v", err) 246 } 247 248 msg := &broker.Message{ 249 Header: map[string]string{ 250 "Content-Type": "application/json", 251 }, 252 Body: []byte(`{"message": "Hello World"}`), 253 } 254 255 var subs []broker.Subscriber 256 var wg sync.WaitGroup 257 258 for i := 0; i < 10; i++ { 259 sub, err := b.Subscribe("test", func(p broker.Event) error { 260 defer wg.Done() 261 262 m := p.Message() 263 264 if string(m.Body) != string(msg.Body) { 265 t.Fatalf("Unexpected msg %s, expected %s", string(m.Body), string(msg.Body)) 266 } 267 268 return nil 269 }) 270 if err != nil { 271 t.Fatalf("Unexpected subscribe error: %v", err) 272 } 273 274 wg.Add(1) 275 subs = append(subs, sub) 276 } 277 278 if err := b.Publish("test", msg); err != nil { 279 t.Fatalf("Unexpected publish error: %v", err) 280 } 281 282 wg.Wait() 283 284 for _, sub := range subs { 285 sub.Unsubscribe() 286 } 287 288 if err := b.Disconnect(); err != nil { 289 t.Fatalf("Unexpected disconnect error: %v", err) 290 } 291 } 292 293 func TestConcurrentPubBroker(t *testing.T) { 294 m := newTestRegistry() 295 b := broker.NewBroker(broker.Registry(m)) 296 297 if err := b.Init(); err != nil { 298 t.Fatalf("Unexpected init error: %v", err) 299 } 300 301 if err := b.Connect(); err != nil { 302 t.Fatalf("Unexpected connect error: %v", err) 303 } 304 305 msg := &broker.Message{ 306 Header: map[string]string{ 307 "Content-Type": "application/json", 308 }, 309 Body: []byte(`{"message": "Hello World"}`), 310 } 311 312 var wg sync.WaitGroup 313 314 sub, err := b.Subscribe("test", func(p broker.Event) error { 315 defer wg.Done() 316 317 m := p.Message() 318 319 if string(m.Body) != string(msg.Body) { 320 t.Fatalf("Unexpected msg %s, expected %s", string(m.Body), string(msg.Body)) 321 } 322 323 return nil 324 }) 325 if err != nil { 326 t.Fatalf("Unexpected subscribe error: %v", err) 327 } 328 329 for i := 0; i < 10; i++ { 330 wg.Add(1) 331 332 if err := b.Publish("test", msg); err != nil { 333 t.Fatalf("Unexpected publish error: %v", err) 334 } 335 } 336 337 wg.Wait() 338 339 sub.Unsubscribe() 340 341 if err := b.Disconnect(); err != nil { 342 t.Fatalf("Unexpected disconnect error: %v", err) 343 } 344 } 345 346 func BenchmarkSub1(b *testing.B) { 347 sub(b, 1) 348 } 349 func BenchmarkSub8(b *testing.B) { 350 sub(b, 8) 351 } 352 353 func BenchmarkSub32(b *testing.B) { 354 sub(b, 32) 355 } 356 357 func BenchmarkSub64(b *testing.B) { 358 sub(b, 64) 359 } 360 361 func BenchmarkSub128(b *testing.B) { 362 sub(b, 128) 363 } 364 365 func BenchmarkPub1(b *testing.B) { 366 pub(b, 1) 367 } 368 369 func BenchmarkPub8(b *testing.B) { 370 pub(b, 8) 371 } 372 373 func BenchmarkPub32(b *testing.B) { 374 pub(b, 32) 375 } 376 377 func BenchmarkPub64(b *testing.B) { 378 pub(b, 64) 379 } 380 381 func BenchmarkPub128(b *testing.B) { 382 pub(b, 128) 383 }