start starts server. Other goroutines should block on s.readyChan for further operations.
(t *testing.T, port int, serverConfig *ServerConfig, ht hType)
| 390 | |
| 391 | // start starts server. Other goroutines should block on s.readyChan for further operations. |
| 392 | func (s *server) start(t *testing.T, port int, serverConfig *ServerConfig, ht hType) { |
| 393 | var err error |
| 394 | if port == 0 { |
| 395 | s.lis, err = net.Listen("tcp", "localhost:0") |
| 396 | } else { |
| 397 | s.lis, err = net.Listen("tcp", "localhost:"+strconv.Itoa(port)) |
| 398 | } |
| 399 | if err != nil { |
| 400 | s.startedErr <- fmt.Errorf("failed to listen: %v", err) |
| 401 | return |
| 402 | } |
| 403 | _, p, err := net.SplitHostPort(s.lis.Addr().String()) |
| 404 | if err != nil { |
| 405 | s.startedErr <- fmt.Errorf("failed to parse listener address: %v", err) |
| 406 | return |
| 407 | } |
| 408 | s.port = p |
| 409 | s.conns = make(map[ServerTransport]net.Conn) |
| 410 | s.startedErr <- nil |
| 411 | wg := sync.WaitGroup{} |
| 412 | defer func() { |
| 413 | wg.Wait() |
| 414 | close(s.servingTasksDone) |
| 415 | }() |
| 416 | |
| 417 | for { |
| 418 | conn, err := s.lis.Accept() |
| 419 | if err != nil { |
| 420 | return |
| 421 | } |
| 422 | rawConn := conn |
| 423 | if serverConfig.MaxStreams == 0 { |
| 424 | serverConfig.MaxStreams = math.MaxUint32 |
| 425 | } |
| 426 | transport, err := NewServerTransport(conn, serverConfig) |
| 427 | if err != nil { |
| 428 | return |
| 429 | } |
| 430 | s.mu.Lock() |
| 431 | if s.conns == nil { |
| 432 | s.mu.Unlock() |
| 433 | transport.Close(errors.New("s.conns is nil")) |
| 434 | return |
| 435 | } |
| 436 | s.conns[transport] = rawConn |
| 437 | h := &testStreamHandler{t: transport.(*http2Server)} |
| 438 | s.h = h |
| 439 | s.mu.Unlock() |
| 440 | ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) |
| 441 | defer cancel() |
| 442 | wg.Add(1) |
| 443 | switch ht { |
| 444 | case notifyCall: |
| 445 | go func() { |
| 446 | transport.HandleStreams(ctx, h.handleStreamAndNotify) |
| 447 | wg.Done() |
| 448 | }() |
| 449 | case suspended: |
no test coverage detected