Skip to content

Commit 9409b69

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 d4d34ac commit 9409b69

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
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 & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@
1717
package nerdtest
1818

1919
import (
20+
"net"
21+
"net/http"
22+
"net/http/httptest"
2023
"os"
2124
"strconv"
2225
"strings"
2326
"syscall"
2427
"time"
2528

2629
"github.com/containerd/nerdctl/mod/tigron/test"
27-
2830
"github.com/containerd/nerdctl/v2/pkg/testutil"
31+
"github.com/containerd/nerdctl/v2/pkg/testutil/nettestutil"
2932
)
3033

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

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

0 commit comments

Comments
 (0)