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