|
1 | 1 | package gofcgi |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "testing" |
5 | | - "io/ioutil" |
6 | 4 | "bytes" |
| 5 | + "io/ioutil" |
| 6 | + "strings" |
| 7 | + "sync" |
| 8 | + "testing" |
7 | 9 | "time" |
8 | 10 | ) |
9 | 11 |
|
@@ -63,7 +65,7 @@ func TestClientGetAlive(t *testing.T) { |
63 | 65 | t.Fatal("connect err:", err.Error()) |
64 | 66 | } |
65 | 67 |
|
66 | | - for i := 0; i < 10; i ++ { |
| 68 | + for i := 0; i < 10; i++ { |
67 | 69 | req := NewRequest() |
68 | 70 | req.SetParams(map[string]string{ |
69 | 71 | "SCRIPT_FILENAME": "/Users/liuxiangchao/Documents/Projects/pp/apps/baleshop.ppk/index.php", |
@@ -151,3 +153,78 @@ func TestClientPost(t *testing.T) { |
151 | 153 | } |
152 | 154 | t.Log("resp body:", string(data)) |
153 | 155 | } |
| 156 | + |
| 157 | +func TestClientPerformance(t *testing.T) { |
| 158 | + threads := 100 |
| 159 | + countRequests := 200 |
| 160 | + countSuccess := 0 |
| 161 | + countFail := 0 |
| 162 | + locker := sync.Mutex{} |
| 163 | + beforeTime := time.Now() |
| 164 | + wg := sync.WaitGroup{} |
| 165 | + wg.Add(threads) |
| 166 | + |
| 167 | + pool := SharedPool("tcp", "127.0.0.1:9000", 16) |
| 168 | + |
| 169 | + for i := 0; i < threads; i++ { |
| 170 | + go func(i int) { |
| 171 | + defer wg.Done() |
| 172 | + |
| 173 | + for j := 0; j < countRequests; j++ { |
| 174 | + client, err := pool.Client() |
| 175 | + if err != nil { |
| 176 | + t.Fatal("connect err:", err.Error()) |
| 177 | + } |
| 178 | + |
| 179 | + req := NewRequest() |
| 180 | + req.SetTimeout(5 * time.Second) |
| 181 | + req.SetParams(map[string]string{ |
| 182 | + "SCRIPT_FILENAME": "/Users/liuxiangchao/Documents/Projects/pp/apps/baleshop.ppk/index.php", |
| 183 | + "SERVER_SOFTWARE": "gofcgi/1.0.0", |
| 184 | + "REMOTE_ADDR": "127.0.0.1", |
| 185 | + "QUERY_STRING": "name=value&__ACTION__=/@wx", |
| 186 | + |
| 187 | + "SERVER_NAME": "wx.balefm.cn", |
| 188 | + "SERVER_ADDR": "127.0.0.1:80", |
| 189 | + "SERVER_PORT": "80", |
| 190 | + "REQUEST_URI": "/index.php?__ACTION__=/@wx", |
| 191 | + "DOCUMENT_ROOT": "/Users/liuxiangchao/Documents/Projects/pp/apps/baleshop.ppk/", |
| 192 | + "GATEWAY_INTERFACE": "CGI/1.1", |
| 193 | + "REDIRECT_STATUS": "200", |
| 194 | + "HTTP_HOST": "wx.balefm.cn", |
| 195 | + |
| 196 | + "REQUEST_METHOD": "GET", |
| 197 | + }) |
| 198 | + |
| 199 | + resp, err := client.Call(req) |
| 200 | + if err != nil { |
| 201 | + locker.Lock() |
| 202 | + countFail++ |
| 203 | + locker.Unlock() |
| 204 | + continue |
| 205 | + } |
| 206 | + |
| 207 | + if resp.StatusCode == 200 { |
| 208 | + data, err := ioutil.ReadAll(resp.Body) |
| 209 | + if err != nil || strings.Index(string(data), "Welcome") == -1 { |
| 210 | + locker.Lock() |
| 211 | + countFail++ |
| 212 | + locker.Unlock() |
| 213 | + } else { |
| 214 | + locker.Lock() |
| 215 | + countSuccess++ |
| 216 | + locker.Unlock() |
| 217 | + } |
| 218 | + } else { |
| 219 | + locker.Lock() |
| 220 | + countFail++ |
| 221 | + locker.Unlock() |
| 222 | + } |
| 223 | + } |
| 224 | + }(i) |
| 225 | + } |
| 226 | + |
| 227 | + wg.Wait() |
| 228 | + |
| 229 | + t.Log("success:", countSuccess, "fail:", countFail, "qps:", int(float64(countSuccess+countFail)/time.Since(beforeTime).Seconds())) |
| 230 | +} |
0 commit comments