package test import ( "context" "net/http" "net/url" "strconv" "strings" "testing" xcontainer "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "github.com/docker/go-connections/nat" "github.com/stretchr/testify/require" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/wait" "github.com/xlgmokha/x/pkg/env" "github.com/xlgmokha/x/pkg/x" ) func normalizeIssuer(t *testing.T, issuer string) (string, int) { for _, loopback := range []string{"0.0.0.0", "127.0.0.1", "[::]", "localhost"} { issuer = strings.Replace(issuer, loopback, testcontainers.HostInternal, 1) } u, err := url.Parse(issuer) require.NoError(t, err) port, err := strconv.Atoi(u.Port()) require.NoError(t, err) return issuer, port } func NewContainer(t *testing.T, ctx context.Context, envVars map[string]string) *testcontainers.DockerContainer { require.Equal(t, http.StatusOK, HttpGet(t, ctx, envVars["OIDC_ISSUER"]+"/.well-known/openid-configuration").StatusCode) container, err := testcontainers.Run( ctx, env.Fetch("IMAGE_TAG", "sparkled:invalid"), containerOptions(t, envVars)..., ) require.NoError(t, err) return container } func containerOptions(t *testing.T, envVars map[string]string) []testcontainers.ContainerCustomizer { options := []testcontainers.ContainerCustomizer{ testcontainers.WithEnv(envVars), testcontainers.WithLogConsumers(&LogConsumer{t: t}), // testcontainers.WithWaitStrategy(wait.ForLog("Listening on").WithStartupTimeout(10 * time.Second)), testcontainers.WithWaitStrategy(wait.ForListeningPort(x.Must(nat.NewPort("tcp", "10000")))), } if isGitlabCI(t) { options = append(options, testcontainers.WithHostConfigModifier(func(cfg *xcontainer.HostConfig) { cfg.NetworkMode = xcontainer.NetworkMode(network.NetworkHost) })) } else { issuer, port := normalizeIssuer(t, envVars["OIDC_ISSUER"]) envVars["OIDC_ISSUER"] = issuer options = append(options, testcontainers.WithExposedPorts("8080/tcp", "9901/tcp", "10000/tcp")) options = append(options, testcontainers.WithHostPortAccess(port)) } return options } func isGitlabCI(t *testing.T) bool { t.Logf("CI? %v", env.Fetch("CI", "")) return env.Fetch("CI", "") == "true" }