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 }