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  }