diff --git a/service/api/server.go b/service/api/server.go index 01e696d..7c13749 100644 --- a/service/api/server.go +++ b/service/api/server.go @@ -58,6 +58,7 @@ func (s *Server) Start() error { s.log.Info("api: server is listening on " + s.listener.Addr().String()) + startErrCh := make(chan error, 1) go func() { var err error if s.cfg.TLS.Enable && s.cfg.TLS.CertFile != "" && s.cfg.TLS.CertKey != "" { @@ -67,12 +68,21 @@ func (s *Server) Start() error { s.log.Debug("api: serving plaintext") err = s.srv.Serve(s.listener) } + if err != nil && err != http.ErrServerClosed { + startErrCh <- err s.log.Critical("error starting HTTP server", mlog.Err(err)) } }() - return nil + // We wait for a second in order to return an error in case of failure to + // start the HTTP server. + select { + case err = <-startErrCh: + case <-time.After(time.Second): + } + + return err } func (s *Server) Stop() error { diff --git a/service/api/server_test.go b/service/api/server_test.go index 0d18182..f62ba98 100644 --- a/service/api/server_test.go +++ b/service/api/server_test.go @@ -67,6 +67,23 @@ func TestStartServer(t *testing.T) { require.Error(t, err) }) + t.Run("invalid certificate", func(t *testing.T) { + cfg := Config{ + ListenAddress: ":0", + TLS: TLSConfig{ + Enable: true, + CertFile: "../../testfiles/invalid_tls_test_cert.pem", + CertKey: "../../testfiles/tls_test_key.pem", + }, + } + s, err := NewServer(cfg, log) + require.NoError(t, err) + require.NotNil(t, s) + + err = s.Start() + require.EqualError(t, err, "open ../../testfiles/invalid_tls_test_cert.pem: no such file or directory") + }) + t.Run("tls", func(t *testing.T) { cfg := Config{ ListenAddress: ":0",