github.com/annwntech/go-micro/v2@v2.9.5/transport/http/http_test.go (about) 1 package http 2 3 import ( 4 "sync" 5 "testing" 6 7 "github.com/annwntech/go-micro/v2/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 }