Skip to content
6 changes: 3 additions & 3 deletions port_forwarding.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,11 +159,11 @@ func exposeHostPorts(ctx context.Context, req *ContainerRequest, ports ...int) (
},
}

// after the container is ready, create the SSH tunnel
// before the container is created, create the SSH tunnel
// for each exposed port from the host.
sshdConnectHook = ContainerLifecycleHooks{
PostReadies: []ContainerHook{
func(ctx context.Context, _ Container) error {
PreCreates: []ContainerRequestHook{
func(ctx context.Context, req ContainerRequest) error {
return sshdContainer.exposeHostPort(ctx, req.HostAccessPorts...)
},
},
Expand Down
24 changes: 23 additions & 1 deletion port_forwarding_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,41 @@ import (
"github.com/testcontainers/testcontainers-go"
tcexec "github.com/testcontainers/testcontainers-go/exec"
"github.com/testcontainers/testcontainers-go/network"
"github.com/testcontainers/testcontainers-go/wait"
)

const (
expectedResponse = "Hello, World!"
)

func TestExposeHostPorts(t *testing.T) {
hostPorts := make([]int, 3)
const numberOfPorts = 3

servers := make([]*httptest.Server, numberOfPorts)
hostPorts := make([]int, numberOfPorts)
waitStrategies := make([]wait.Strategy, numberOfPorts)

for i := range hostPorts {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
fmt.Fprint(w, expectedResponse)
}))
hostPorts[i] = server.Listener.Addr().(*net.TCPAddr).Port

servers[i] = server
freePort := server.Listener.Addr().(*net.TCPAddr).Port
hostPorts[i] = freePort

waitStrategies[i] = wait.
ForExec([]string{"wget", "-q", "-O", "-", fmt.Sprintf("http://%s:%d", testcontainers.HostInternal, freePort)}).
WithExitCodeMatcher(func(code int) bool {
return code == 0
}).
WithResponseMatcher(func(body io.Reader) bool {
bs, err := io.ReadAll(body)
require.NoError(t, err)
return string(bs) == expectedResponse
})

t.Cleanup(server.Close)
}

Expand Down
Loading