go-micro.dev/v5@v5.12.0/broker/rabbitmq/rabbitmq_test.go (about) 1 package rabbitmq_test 2 3 import ( 4 "context" 5 "encoding/json" 6 "os" 7 "testing" 8 "time" 9 10 "go-micro.dev/v5/logger" 11 12 micro "go-micro.dev/v5" 13 broker "go-micro.dev/v5/broker" 14 rabbitmq "go-micro.dev/v5/broker/rabbitmq" 15 server "go-micro.dev/v5/server" 16 ) 17 18 type Example struct{} 19 20 func init() { 21 rabbitmq.DefaultRabbitURL = "amqp://rabbitmq:rabbitmq@127.0.0.1:5672" 22 } 23 24 type TestEvent struct { 25 Name string `json:"name"` 26 Age int `json:"age"` 27 Time time.Time `json:"time"` 28 } 29 30 func (e *Example) Handler(ctx context.Context, r interface{}) error { 31 return nil 32 } 33 34 func TestDurable(t *testing.T) { 35 if tr := os.Getenv("TRAVIS"); len(tr) > 0 { 36 t.Skip() 37 } 38 brkrSub := broker.NewSubscribeOptions( 39 broker.Queue("queue.default"), 40 broker.DisableAutoAck(), 41 rabbitmq.DurableQueue(), 42 ) 43 44 b := rabbitmq.NewBroker() 45 b.Init() 46 if err := b.Connect(); err != nil { 47 t.Logf("cant conect to broker, skip: %v", err) 48 t.Skip() 49 } 50 51 s := server.NewServer(server.Broker(b)) 52 53 service := micro.NewService( 54 micro.Server(s), 55 micro.Broker(b), 56 ) 57 h := &Example{} 58 // Register a subscriber 59 micro.RegisterSubscriber( 60 "topic", 61 service.Server(), 62 h.Handler, 63 server.SubscriberContext(brkrSub.Context), 64 server.SubscriberQueue("queue.default"), 65 ) 66 67 // service.Init() 68 69 if err := service.Run(); err != nil { 70 t.Fatal(err) 71 } 72 } 73 74 func TestWithoutExchange(t *testing.T) { 75 76 b := rabbitmq.NewBroker(rabbitmq.WithoutExchange()) 77 b.Init() 78 if err := b.Connect(); err != nil { 79 t.Logf("cant conect to broker, skip: %v", err) 80 t.Skip() 81 } 82 83 s := server.NewServer(server.Broker(b)) 84 85 service := micro.NewService( 86 micro.Server(s), 87 micro.Broker(b), 88 ) 89 brkrSub := broker.NewSubscribeOptions( 90 broker.Queue("direct.queue"), 91 broker.DisableAutoAck(), 92 rabbitmq.DurableQueue(), 93 ) 94 // Register a subscriber 95 err := micro.RegisterSubscriber( 96 "direct.queue", 97 service.Server(), 98 func(ctx context.Context, evt *TestEvent) error { 99 logger.Logf(logger.InfoLevel, "receive event: %+v", evt) 100 return nil 101 }, 102 server.SubscriberContext(brkrSub.Context), 103 server.SubscriberQueue("direct.queue"), 104 ) 105 if err != nil { 106 t.Fatal(err) 107 } 108 109 go func() { 110 time.Sleep(5 * time.Second) 111 logger.Logf(logger.InfoLevel, "pub event") 112 jsonData, _ := json.Marshal(&TestEvent{ 113 Name: "test", 114 Age: 16, 115 }) 116 err := b.Publish("direct.queue", &broker.Message{ 117 Body: jsonData, 118 }, 119 rabbitmq.DeliveryMode(2), 120 rabbitmq.ContentType("application/json")) 121 if err != nil { 122 t.Fatal(err) 123 } 124 }() 125 126 // service.Init() 127 128 if err := service.Run(); err != nil { 129 t.Fatal(err) 130 } 131 } 132 133 func TestFanoutExchange(t *testing.T) { 134 b := rabbitmq.NewBroker(rabbitmq.ExchangeType(rabbitmq.ExchangeTypeFanout), rabbitmq.ExchangeName("fanout.test")) 135 b.Init() 136 if err := b.Connect(); err != nil { 137 t.Logf("cant conect to broker, skip: %v", err) 138 t.Skip() 139 } 140 141 s := server.NewServer(server.Broker(b)) 142 143 service := micro.NewService( 144 micro.Server(s), 145 micro.Broker(b), 146 ) 147 brkrSub := broker.NewSubscribeOptions( 148 broker.Queue("fanout.queue"), 149 broker.DisableAutoAck(), 150 rabbitmq.DurableQueue(), 151 ) 152 // Register a subscriber 153 err := micro.RegisterSubscriber( 154 "fanout.queue", 155 service.Server(), 156 func(ctx context.Context, evt *TestEvent) error { 157 logger.Logf(logger.InfoLevel, "receive event: %+v", evt) 158 return nil 159 }, 160 server.SubscriberContext(brkrSub.Context), 161 server.SubscriberQueue("fanout.queue"), 162 ) 163 if err != nil { 164 t.Fatal(err) 165 } 166 167 go func() { 168 time.Sleep(5 * time.Second) 169 logger.Logf(logger.InfoLevel, "pub event") 170 jsonData, _ := json.Marshal(&TestEvent{ 171 Name: "test", 172 Age: 16, 173 }) 174 err := b.Publish("fanout.queue", &broker.Message{ 175 Body: jsonData, 176 }, 177 rabbitmq.DeliveryMode(2), 178 rabbitmq.ContentType("application/json")) 179 if err != nil { 180 t.Fatal(err) 181 } 182 }() 183 184 // service.Init() 185 186 if err := service.Run(); err != nil { 187 t.Fatal(err) 188 } 189 } 190 191 func TestDirectExchange(t *testing.T) { 192 b := rabbitmq.NewBroker(rabbitmq.ExchangeType(rabbitmq.ExchangeTypeDirect), rabbitmq.ExchangeName("direct.test")) 193 b.Init() 194 if err := b.Connect(); err != nil { 195 t.Logf("cant conect to broker, skip: %v", err) 196 t.Skip() 197 } 198 199 s := server.NewServer(server.Broker(b)) 200 201 service := micro.NewService( 202 micro.Server(s), 203 micro.Broker(b), 204 ) 205 brkrSub := broker.NewSubscribeOptions( 206 broker.Queue("direct.exchange.queue"), 207 broker.DisableAutoAck(), 208 rabbitmq.DurableQueue(), 209 ) 210 // Register a subscriber 211 err := micro.RegisterSubscriber( 212 "direct.exchange.queue", 213 service.Server(), 214 func(ctx context.Context, evt *TestEvent) error { 215 logger.Logf(logger.InfoLevel, "receive event: %+v", evt) 216 return nil 217 }, 218 server.SubscriberContext(brkrSub.Context), 219 server.SubscriberQueue("direct.exchange.queue"), 220 ) 221 if err != nil { 222 t.Fatal(err) 223 } 224 225 go func() { 226 time.Sleep(5 * time.Second) 227 logger.Logf(logger.InfoLevel, "pub event") 228 jsonData, _ := json.Marshal(&TestEvent{ 229 Name: "test", 230 Age: 16, 231 }) 232 err := b.Publish("direct.exchange.queue", &broker.Message{ 233 Body: jsonData, 234 }, 235 rabbitmq.DeliveryMode(2), 236 rabbitmq.ContentType("application/json")) 237 if err != nil { 238 t.Fatal(err) 239 } 240 }() 241 242 // service.Init() 243 244 if err := service.Run(); err != nil { 245 t.Fatal(err) 246 } 247 } 248 249 func TestTopicExchange(t *testing.T) { 250 b := rabbitmq.NewBroker() 251 b.Init() 252 if err := b.Connect(); err != nil { 253 t.Logf("cant conect to broker, skip: %v", err) 254 t.Skip() 255 } 256 257 s := server.NewServer(server.Broker(b)) 258 259 service := micro.NewService( 260 micro.Server(s), 261 micro.Broker(b), 262 ) 263 brkrSub := broker.NewSubscribeOptions( 264 broker.Queue("topic.exchange.queue"), 265 broker.DisableAutoAck(), 266 rabbitmq.DurableQueue(), 267 ) 268 // Register a subscriber 269 err := micro.RegisterSubscriber( 270 "my-test-topic", 271 service.Server(), 272 func(ctx context.Context, evt *TestEvent) error { 273 logger.Logf(logger.InfoLevel, "receive event: %+v", evt) 274 return nil 275 }, 276 server.SubscriberContext(brkrSub.Context), 277 server.SubscriberQueue("topic.exchange.queue"), 278 ) 279 if err != nil { 280 t.Fatal(err) 281 } 282 283 go func() { 284 time.Sleep(5 * time.Second) 285 logger.Logf(logger.InfoLevel, "pub event") 286 jsonData, _ := json.Marshal(&TestEvent{ 287 Name: "test", 288 Age: 16, 289 }) 290 err := b.Publish("my-test-topic", &broker.Message{ 291 Body: jsonData, 292 }, 293 rabbitmq.DeliveryMode(2), 294 rabbitmq.ContentType("application/json")) 295 if err != nil { 296 t.Fatal(err) 297 } 298 }() 299 300 // service.Init() 301 302 if err := service.Run(); err != nil { 303 t.Fatal(err) 304 } 305 }