Skip to content

Commit c01827d

Browse files
committed
unittest: Add helper to run a cross-namespace HTTP server
Add helper to run a cross-namespace HTTP server. Signed-off-by: ChengyuZhu6 <[email protected]>
1 parent 4f292f0 commit c01827d

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

cmd/nerdctl/image/image_import_linux_test.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"bytes"
2222
"errors"
2323
"net/http"
24-
"net/http/httptest"
2524
"os"
2625
"path/filepath"
2726
"strings"
@@ -72,7 +71,7 @@ func TestImageImportErrors(t *testing.T) {
7271
func TestImageImport(t *testing.T) {
7372
testCase := nerdtest.Setup()
7473

75-
var urlServer *httptest.Server
74+
var stopServer func()
7675

7776
testCase.SubTests = []*test.Case{
7877
{
@@ -170,17 +169,21 @@ func TestImageImport(t *testing.T) {
170169
{
171170
Description: "image import from URL",
172171
Cleanup: func(data test.Data, helpers test.Helpers) {
173-
if urlServer != nil {
174-
urlServer.Close()
172+
if stopServer != nil {
173+
stopServer()
174+
stopServer = nil
175175
}
176176
helpers.Anyhow("rmi", "-f", data.Identifier())
177177
},
178178
Setup: func(data test.Data, helpers test.Helpers) {
179-
urlServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
179+
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
180180
w.Header().Set("Content-Type", "application/x-tar")
181181
_, _ = w.Write(minimalRootfsTar(t).Bytes())
182-
}))
183-
data.Labels().Set("url", urlServer.URL)
182+
})
183+
url, stop, err := nerdtest.StartHTTPServer(handler)
184+
assert.NilError(t, err)
185+
stopServer = stop
186+
data.Labels().Set("url", url)
184187
},
185188
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
186189
return helpers.Command("import", data.Labels().Get("url"), data.Identifier())

pkg/testutil/nerdtest/utilities_linux.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
package nerdtest
1818

1919
import (
20+
"net"
21+
"net/http"
22+
"net/http/httptest"
2023
"os"
2124
"strconv"
2225
"strings"
@@ -26,6 +29,7 @@ import (
2629
"github.com/containerd/nerdctl/mod/tigron/test"
2730

2831
"github.com/containerd/nerdctl/v2/pkg/testutil"
32+
"github.com/containerd/nerdctl/v2/pkg/testutil/nettestutil"
2933
)
3034

3135
const SignalCaught = "received"
@@ -73,3 +77,27 @@ func RunSigProxyContainer(signal os.Signal, exitOnSignal bool, args []string, da
7377

7478
return cmd
7579
}
80+
81+
// StartHTTPServer starts an HTTP server bound to 0.0.0.0 and returns a URL reachable
82+
// from processes that cannot access 127.0.0.1 due to namespace isolation.
83+
// It also returns a cleanup function that stops the server.
84+
func StartHTTPServer(handler http.Handler) (url string, stop func(), err error) {
85+
l, err := net.Listen("tcp", "0.0.0.0:0")
86+
if err != nil {
87+
return "", nil, err
88+
}
89+
srv := &httptest.Server{Config: &http.Server{Handler: handler}}
90+
srv.Listener = l
91+
srv.Start()
92+
hostIP, herr := nettestutil.NonLoopbackIPv4()
93+
if herr != nil {
94+
srv.Close()
95+
return "", nil, herr
96+
}
97+
_, port, perr := net.SplitHostPort(l.Addr().String())
98+
if perr != nil {
99+
srv.Close()
100+
return "", nil, perr
101+
}
102+
return "http://" + hostIP.String() + ":" + port, func() { srv.Close() }, nil
103+
}

0 commit comments

Comments
 (0)