github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/network/transport/http/http_test.go (about)

     1  // Licensed under the Apache License, Version 2.0 (the "License");
     2  // you may not use this file except in compliance with the License.
     3  // You may obtain a copy of the License at
     4  //
     5  //     https://www.apache.org/licenses/LICENSE-2.0
     6  //
     7  // Unless required by applicable law or agreed to in writing, software
     8  // distributed under the License is distributed on an "AS IS" BASIS,
     9  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    10  // See the License for the specific language governing permissions and
    11  // limitations under the License.
    12  //
    13  // Original source: github.com/micro/go-micro/v3/network/transport/http/http_test.go
    14  
    15  package http
    16  
    17  import (
    18  	"sync"
    19  	"testing"
    20  
    21  	"github.com/tickoalcantara12/micro/v3/service/network/transport"
    22  )
    23  
    24  func call(b *testing.B, c int) {
    25  	b.StopTimer()
    26  
    27  	tr := NewTransport()
    28  
    29  	// server listen
    30  	l, err := tr.Listen("localhost:0")
    31  	if err != nil {
    32  		b.Fatal(err)
    33  	}
    34  	defer l.Close()
    35  
    36  	// socket func
    37  	fn := func(sock transport.Socket) {
    38  		defer sock.Close()
    39  
    40  		for {
    41  			var m transport.Message
    42  			if err := sock.Recv(&m); err != nil {
    43  				return
    44  			}
    45  
    46  			if err := sock.Send(&m); err != nil {
    47  				return
    48  			}
    49  		}
    50  	}
    51  
    52  	done := make(chan bool)
    53  
    54  	// accept connections
    55  	go func() {
    56  		if err := l.Accept(fn); err != nil {
    57  			select {
    58  			case <-done:
    59  			default:
    60  				b.Fatalf("Unexpected accept err: %v", err)
    61  			}
    62  		}
    63  	}()
    64  
    65  	m := transport.Message{
    66  		Header: map[string]string{
    67  			"Content-Type": "application/json",
    68  		},
    69  		Body: []byte(`{"message": "Hello World"}`),
    70  	}
    71  
    72  	// client connection
    73  	client, err := tr.Dial(l.Addr())
    74  	if err != nil {
    75  		b.Fatalf("Unexpected dial err: %v", err)
    76  	}
    77  
    78  	send := func(c transport.Client) {
    79  		// send message
    80  		if err := c.Send(&m); err != nil {
    81  			b.Fatalf("Unexpected send err: %v", err)
    82  		}
    83  
    84  		var rm transport.Message
    85  		// receive message
    86  		if err := c.Recv(&rm); err != nil {
    87  			b.Fatalf("Unexpected recv err: %v", err)
    88  		}
    89  	}
    90  
    91  	// warm
    92  	for i := 0; i < 10; i++ {
    93  		send(client)
    94  	}
    95  
    96  	client.Close()
    97  
    98  	ch := make(chan int, c*4)
    99  
   100  	var wg sync.WaitGroup
   101  	wg.Add(c)
   102  
   103  	for i := 0; i < c; i++ {
   104  		go func() {
   105  			cl, err := tr.Dial(l.Addr())
   106  			if err != nil {
   107  				b.Fatalf("Unexpected dial err: %v", err)
   108  			}
   109  			defer cl.Close()
   110  
   111  			for range ch {
   112  				send(cl)
   113  			}
   114  
   115  			wg.Done()
   116  		}()
   117  	}
   118  
   119  	b.StartTimer()
   120  
   121  	for i := 0; i < b.N; i++ {
   122  		ch <- i
   123  	}
   124  
   125  	b.StopTimer()
   126  	close(ch)
   127  
   128  	wg.Wait()
   129  
   130  	// finish
   131  	close(done)
   132  }
   133  
   134  func BenchmarkTransport1(b *testing.B) {
   135  	call(b, 1)
   136  }
   137  
   138  func BenchmarkTransport8(b *testing.B) {
   139  	call(b, 8)
   140  }
   141  
   142  func BenchmarkTransport16(b *testing.B) {
   143  	call(b, 16)
   144  }
   145  
   146  func BenchmarkTransport64(b *testing.B) {
   147  	call(b, 64)
   148  }
   149  
   150  func BenchmarkTransport128(b *testing.B) {
   151  	call(b, 128)
   152  }