EnvManager: Add Stop method and shutdown server using it in tests

Change-Id: I552db6dc1487ed880bce897c7cec85a89a15355d
diff --git a/core/installer/welcome/env.go b/core/installer/welcome/env.go
index 82fb3d5..31264fe 100644
--- a/core/installer/welcome/env.go
+++ b/core/installer/welcome/env.go
@@ -1,6 +1,7 @@
 package welcome
 
 import (
+	"context"
 	"embed"
 	"encoding/json"
 	"errors"
@@ -8,7 +9,6 @@
 	"html/template"
 	"io"
 	"io/fs"
-	"log"
 	"net"
 	"net/http"
 	"net/netip"
@@ -79,6 +79,7 @@
 }
 
 type EnvServer struct {
+	srv           *http.Server
 	port          int
 	ss            soft.Client
 	repo          soft.RepoIO
@@ -111,6 +112,7 @@
 	tm tasks.TaskManager,
 ) *EnvServer {
 	return &EnvServer{
+		nil,
 		port,
 		ss,
 		repo,
@@ -129,7 +131,7 @@
 	}
 }
 
-func (s *EnvServer) Start() {
+func (s *EnvServer) Start() error {
 	r := mux.NewRouter()
 	r.PathPrefix("/stat/").Handler(cachingHandler{http.FileServer(http.FS(statAssets))})
 	r.Path("/env/{key}").Methods("GET").HandlerFunc(s.monitorTask)
@@ -137,8 +139,19 @@
 	r.Path("/").Methods("GET").HandlerFunc(s.createEnvForm)
 	r.Path("/").Methods("POST").HandlerFunc(s.createEnv)
 	r.Path("/create-invitation").Methods("GET").HandlerFunc(s.createInvitation)
-	http.Handle("/", r)
-	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", s.port), nil))
+	srv := &http.Server{
+		Addr:    fmt.Sprintf(":%d", s.port),
+		Handler: r,
+	}
+	s.srv = srv
+	if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
+		return err
+	}
+	return nil
+}
+
+func (s *EnvServer) Stop() error {
+	return s.srv.Shutdown(context.Background())
 }
 
 func (s *EnvServer) monitorTask(w http.ResponseWriter, r *http.Request) {
diff --git a/core/installer/welcome/env_test.go b/core/installer/welcome/env_test.go
index 448f221..cec2458 100644
--- a/core/installer/welcome/env_test.go
+++ b/core/installer/welcome/env_test.go
@@ -386,6 +386,9 @@
 	if len(httpClient.counts) != 6 {
 		t.Fatal(httpClient.counts)
 	}
+	if err := s.Stop(); err != nil {
+		t.Fatal(err)
+	}
 }
 
 func debugFS(bfs billy.Filesystem, t *testing.T, files ...string) {