package app import ( "context" "net/http" "os" "testing" "time" "galaxy/notification/internal/config" "github.com/stretchr/testify/require" testcontainers "github.com/testcontainers/testcontainers-go" rediscontainer "github.com/testcontainers/testcontainers-go/modules/redis" ) const ( realRuntimeSmokeEnv = "NOTIFICATION_REAL_RUNTIME_SMOKE" realRuntimeRedisImage = "redis:7" ) func TestRealRuntimeCompatibility(t *testing.T) { if os.Getenv(realRuntimeSmokeEnv) != "1" { t.Skipf("set %s=1 to run the real runtime smoke suite", realRuntimeSmokeEnv) } ctx := context.Background() redisContainer, err := rediscontainer.Run(ctx, realRuntimeRedisImage) require.NoError(t, err) testcontainers.CleanupContainer(t, redisContainer) redisAddr, err := redisContainer.Endpoint(ctx, "") require.NoError(t, err) cfg := config.DefaultConfig() cfg.Redis.Addr = redisAddr cfg.UserService.BaseURL = "http://user-service.internal" cfg.InternalHTTP.Addr = mustFreeAddr(t) cfg.ShutdownTimeout = 2 * time.Second cfg.Telemetry.TracesExporter = "none" cfg.Telemetry.MetricsExporter = "none" runtime, err := NewRuntime(context.Background(), cfg, testLogger()) require.NoError(t, err) defer func() { require.NoError(t, runtime.Close()) }() runCtx, cancel := context.WithCancel(context.Background()) defer cancel() runErrCh := make(chan error, 1) go func() { runErrCh <- runtime.Run(runCtx) }() client := &http.Client{ Timeout: 500 * time.Millisecond, Transport: &http.Transport{ DisableKeepAlives: true, }, } t.Cleanup(client.CloseIdleConnections) waitForRuntimeReady(t, client, cfg.InternalHTTP.Addr) assertHTTPStatus(t, client, "http://"+cfg.InternalHTTP.Addr+"/healthz", http.StatusOK) assertHTTPStatus(t, client, "http://"+cfg.InternalHTTP.Addr+"/readyz", http.StatusOK) cancel() waitForRunResult(t, runErrCh, cfg.ShutdownTimeout+2*time.Second) }