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  }