gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/transport/http/http_test.go (about)

     1  package http
     2  
     3  import (
     4  	"sync"
     5  	"testing"
     6  
     7  	"gitee.com/liuxuezhan/go-micro-v1.18.0/transport"
     8  )
     9  
    10  func call(b *testing.B, c int) {
    11  	b.StopTimer()
    12  
    13  	tr := NewTransport()
    14  
    15  	// server listen
    16  	l, err := tr.Listen("localhost:0")
    17  	if err != nil {
    18  		b.Fatal(err)
    19  	}
    20  	defer l.Close()
    21  
    22  	// socket func
    23  	fn := func(sock transport.Socket) {
    24  		defer sock.Close()
    25  
    26  		for {
    27  			var m transport.Message
    28  			if err := sock.Recv(&m); err != nil {
    29  				return
    30  			}
    31  
    32  			if err := sock.Send(&m); err != nil {
    33  				return
    34  			}
    35  		}
    36  	}
    37  
    38  	done := make(chan bool)
    39  
    40  	// accept connections
    41  	go func() {
    42  		if err := l.Accept(fn); err != nil {
    43  			select {
    44  			case <-done:
    45  			default:
    46  				b.Fatalf("Unexpected accept err: %v", err)
    47  			}
    48  		}
    49  	}()
    50  
    51  	m := transport.Message{
    52  		Header: map[string]string{
    53  			"Content-Type": "application/json",
    54  		},
    55  		Body: []byte(`{"message": "Hello World"}`),
    56  	}
    57  
    58  	// client connection
    59  	client, err := tr.Dial(l.Addr())
    60  	if err != nil {
    61  		b.Fatalf("Unexpected dial err: %v", err)
    62  	}
    63  
    64  	send := func(c transport.Client) {
    65  		// send message
    66  		if err := c.Send(&m); err != nil {
    67  			b.Fatalf("Unexpected send err: %v", err)
    68  		}
    69  
    70  		var rm transport.Message
    71  		// receive message
    72  		if err := c.Recv(&rm); err != nil {
    73  			b.Fatalf("Unexpected recv err: %v", err)
    74  		}
    75  	}
    76  
    77  	// warm
    78  	for i := 0; i < 10; i++ {
    79  		send(client)
    80  	}
    81  
    82  	client.Close()
    83  
    84  	ch := make(chan int, c*4)
    85  
    86  	var wg sync.WaitGroup
    87  	wg.Add(c)
    88  
    89  	for i := 0; i < c; i++ {
    90  		go func() {
    91  			cl, err := tr.Dial(l.Addr())
    92  			if err != nil {
    93  				b.Fatalf("Unexpected dial err: %v", err)
    94  			}
    95  			defer cl.Close()
    96  
    97  			for range ch {
    98  				send(cl)
    99  			}
   100  
   101  			wg.Done()
   102  		}()
   103  	}
   104  
   105  	b.StartTimer()
   106  
   107  	for i := 0; i < b.N; i++ {
   108  		ch <- i
   109  	}
   110  
   111  	b.StopTimer()
   112  	close(ch)
   113  
   114  	wg.Wait()
   115  
   116  	// finish
   117  	close(done)
   118  }
   119  
   120  func BenchmarkTransport1(b *testing.B) {
   121  	call(b, 1)
   122  }
   123  
   124  func BenchmarkTransport8(b *testing.B) {
   125  	call(b, 8)
   126  }
   127  
   128  func BenchmarkTransport16(b *testing.B) {
   129  	call(b, 16)
   130  }
   131  
   132  func BenchmarkTransport64(b *testing.B) {
   133  	call(b, 64)
   134  }
   135  
   136  func BenchmarkTransport128(b *testing.B) {
   137  	call(b, 128)
   138  }