(c *C)
| 169 | } |
| 170 | |
| 171 | func (s *SimplePoolSuite) TestMaxConnTimeoutFails(c *C) { |
| 172 | server, addr := test_utils.SetupTestServer(false) |
| 173 | defer server.Close() |
| 174 | |
| 175 | params := ConnectionParams{ |
| 176 | MaxConns: 2, |
| 177 | MaxIdle: 1, |
| 178 | ConnectionAcquireTimeout: 1 * time.Second, |
| 179 | } |
| 180 | pool := NewSimplePool(addr, params) |
| 181 | pool.closeWait = 100 * time.Millisecond |
| 182 | |
| 183 | // do 10 requests concurrently |
| 184 | origMaxProcs := runtime.GOMAXPROCS(runtime.NumCPU()) |
| 185 | defer func() { runtime.GOMAXPROCS(origMaxProcs) }() |
| 186 | |
| 187 | tooManyConn := make(chan int) |
| 188 | |
| 189 | const count = 5 |
| 190 | for i := 0; i < count; i++ { |
| 191 | go func() { |
| 192 | // /slow_request takes about 500ms. With 5 requests in parallel and 2 connections |
| 193 | // we should finish within 1.5 seconds. Since ConnectionAcquireTimeout is 1 second |
| 194 | // the last request will fail |
| 195 | req, err := http.NewRequest("GET", "/slow_request", nil) |
| 196 | c.Assert(err, IsNil) |
| 197 | |
| 198 | _, err = pool.Do(req) |
| 199 | if err == nil { |
| 200 | tooManyConn <- 0 |
| 201 | } else { |
| 202 | _, ok := err.(DialError) |
| 203 | c.Assert(ok, IsTrue) |
| 204 | c.Log(err) |
| 205 | c.Assert( |
| 206 | strings.HasPrefix( |
| 207 | err.Error(), |
| 208 | "Dial Error: Reached maximum active requests for connection pool"), |
| 209 | IsTrue) |
| 210 | tooManyConn <- 1 |
| 211 | } |
| 212 | }() |
| 213 | } |
| 214 | |
| 215 | tooManyConnCount := 0 |
| 216 | for i := 0; i < count; i++ { |
| 217 | select { |
| 218 | case cnt := <-tooManyConn: |
| 219 | tooManyConnCount += cnt |
| 220 | case <-time.After(5 * time.Second): |
| 221 | c.FailNow() |
| 222 | } |
| 223 | } |
| 224 | |
| 225 | c.Assert(tooManyConnCount, Equals, 1) |
| 226 | } |
| 227 | |
| 228 | func (s *SimplePoolSuite) TestMaxConn(c *C) { |
nothing calls this directly
no test coverage detected