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  }