test(integration): extract app startup logic
This commit is contained in:
parent
5f6b6fa3a9
commit
579dfeef22
@ -6,6 +6,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"log/slog"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
@ -13,13 +14,41 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.netflux.io/rob/octoplex/internal/app"
|
||||||
"git.netflux.io/rob/octoplex/internal/config"
|
"git.netflux.io/rob/octoplex/internal/config"
|
||||||
|
"git.netflux.io/rob/octoplex/internal/container"
|
||||||
|
"git.netflux.io/rob/octoplex/internal/domain"
|
||||||
"git.netflux.io/rob/octoplex/internal/terminal"
|
"git.netflux.io/rob/octoplex/internal/terminal"
|
||||||
"github.com/gdamore/tcell/v2"
|
"github.com/gdamore/tcell/v2"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/testcontainers/testcontainers-go"
|
"github.com/testcontainers/testcontainers-go"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func buildAppParams(
|
||||||
|
t *testing.T,
|
||||||
|
configService *config.Service,
|
||||||
|
dockerClient container.DockerClient,
|
||||||
|
screen tcell.SimulationScreen,
|
||||||
|
screenCaptureC chan<- terminal.ScreenCapture,
|
||||||
|
logger *slog.Logger,
|
||||||
|
) app.RunParams {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
return app.RunParams{
|
||||||
|
ConfigService: configService,
|
||||||
|
DockerClient: dockerClient,
|
||||||
|
Screen: &terminal.Screen{
|
||||||
|
Screen: screen,
|
||||||
|
Width: 180,
|
||||||
|
Height: 25,
|
||||||
|
CaptureC: screenCaptureC,
|
||||||
|
},
|
||||||
|
ClipboardAvailable: false,
|
||||||
|
BuildInfo: domain.BuildInfo{Version: "0.0.1", GoVersion: "go1.16.3"},
|
||||||
|
Logger: logger,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func setupSimulationScreen(t *testing.T) (tcell.SimulationScreen, chan<- terminal.ScreenCapture, func() []string) {
|
func setupSimulationScreen(t *testing.T) (tcell.SimulationScreen, chan<- terminal.ScreenCapture, func() []string) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
|
@ -7,10 +7,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
|
||||||
"net"
|
"net"
|
||||||
"os"
|
|
||||||
"runtime"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -69,20 +66,13 @@ func testIntegration(t *testing.T, streamKey string) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
logger := testhelpers.NewTestLogger(t).With("component", "integration")
|
logger := testhelpers.NewTestLogger(t).With("component", "integration")
|
||||||
logger.Info("Initialised logger", "debug_level", logger.Enabled(ctx, slog.LevelDebug), "runner_debug", os.Getenv("RUNNER_DEBUG"))
|
|
||||||
dockerClient, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv, dockerclient.WithAPIVersionNegotiation())
|
dockerClient, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv, dockerclient.WithAPIVersionNegotiation())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
screen, screenCaptureC, getContents := setupSimulationScreen(t)
|
screen, screenCaptureC, getContents := setupSimulationScreen(t)
|
||||||
|
|
||||||
// https://stackoverflow.com/a/60740997/62871
|
destURL1 := fmt.Sprintf("rtmp://%s:%d/%s/dest1", hostIP, destServerPort.Int(), wantStreamKey)
|
||||||
if runtime.GOOS != "linux" {
|
destURL2 := fmt.Sprintf("rtmp://%s:%d/%s/dest2", hostIP, destServerPort.Int(), wantStreamKey)
|
||||||
panic("TODO: try host.docker.internal or Mac equivalent here")
|
|
||||||
}
|
|
||||||
const destHost = "172.17.0.1"
|
|
||||||
|
|
||||||
destURL1 := fmt.Sprintf("rtmp://%s:%d/%s/dest1", destHost, destServerPort.Int(), wantStreamKey)
|
|
||||||
destURL2 := fmt.Sprintf("rtmp://%s:%d/%s/dest2", destHost, destServerPort.Int(), wantStreamKey)
|
|
||||||
configService := setupConfigService(t, config.Config{
|
configService := setupConfigService(t, config.Config{
|
||||||
Sources: config.Sources{RTMP: config.RTMPSource{Enabled: true, StreamKey: streamKey}},
|
Sources: config.Sources{RTMP: config.RTMPSource{Enabled: true, StreamKey: streamKey}},
|
||||||
// Load one destination from config, add the other in-app.
|
// Load one destination from config, add the other in-app.
|
||||||
@ -289,7 +279,6 @@ func TestIntegrationRestartDestination(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
logger := testhelpers.NewTestLogger(t).With("component", "integration")
|
logger := testhelpers.NewTestLogger(t).With("component", "integration")
|
||||||
logger.Info("Initialised logger", "debug_level", logger.Enabled(ctx, slog.LevelDebug), "runner_debug", os.Getenv("RUNNER_DEBUG"))
|
|
||||||
dockerClient, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv, dockerclient.WithAPIVersionNegotiation())
|
dockerClient, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv, dockerclient.WithAPIVersionNegotiation())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@ -309,20 +298,7 @@ func TestIntegrationRestartDestination(t *testing.T) {
|
|||||||
done <- struct{}{}
|
done <- struct{}{}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
err := app.Run(ctx, app.RunParams{
|
require.NoError(t, app.Run(ctx, buildAppParams(t, configService, dockerClient, screen, screenCaptureC, logger)))
|
||||||
ConfigService: configService,
|
|
||||||
DockerClient: dockerClient,
|
|
||||||
Screen: &terminal.Screen{
|
|
||||||
Screen: screen,
|
|
||||||
Width: 160,
|
|
||||||
Height: 25,
|
|
||||||
CaptureC: screenCaptureC,
|
|
||||||
},
|
|
||||||
ClipboardAvailable: false,
|
|
||||||
BuildInfo: domain.BuildInfo{Version: "0.0.1", GoVersion: "go1.16.3"},
|
|
||||||
Logger: logger,
|
|
||||||
})
|
|
||||||
require.NoError(t, err)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
require.EventuallyWithT(
|
require.EventuallyWithT(
|
||||||
@ -465,20 +441,7 @@ func TestIntegrationStartDestinationFailed(t *testing.T) {
|
|||||||
done <- struct{}{}
|
done <- struct{}{}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
err := app.Run(ctx, app.RunParams{
|
require.NoError(t, app.Run(ctx, buildAppParams(t, configService, dockerClient, screen, screenCaptureC, logger)))
|
||||||
ConfigService: configService,
|
|
||||||
DockerClient: dockerClient,
|
|
||||||
Screen: &terminal.Screen{
|
|
||||||
Screen: screen,
|
|
||||||
Width: 160,
|
|
||||||
Height: 25,
|
|
||||||
CaptureC: screenCaptureC,
|
|
||||||
},
|
|
||||||
ClipboardAvailable: false,
|
|
||||||
BuildInfo: domain.BuildInfo{Version: "0.0.1", GoVersion: "go1.16.3"},
|
|
||||||
Logger: logger,
|
|
||||||
})
|
|
||||||
require.NoError(t, err)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
require.EventuallyWithT(
|
require.EventuallyWithT(
|
||||||
@ -553,20 +516,7 @@ func TestIntegrationDestinationValidations(t *testing.T) {
|
|||||||
done <- struct{}{}
|
done <- struct{}{}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
err := app.Run(ctx, app.RunParams{
|
require.NoError(t, app.Run(ctx, buildAppParams(t, configService, dockerClient, screen, screenCaptureC, logger)))
|
||||||
ConfigService: configService,
|
|
||||||
DockerClient: dockerClient,
|
|
||||||
Screen: &terminal.Screen{
|
|
||||||
Screen: screen,
|
|
||||||
Width: 160,
|
|
||||||
Height: 25,
|
|
||||||
CaptureC: screenCaptureC,
|
|
||||||
},
|
|
||||||
ClipboardAvailable: false,
|
|
||||||
BuildInfo: domain.BuildInfo{Version: "0.0.1", GoVersion: "go1.16.3"},
|
|
||||||
Logger: logger,
|
|
||||||
})
|
|
||||||
require.NoError(t, err)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
require.EventuallyWithT(
|
require.EventuallyWithT(
|
||||||
@ -709,20 +659,7 @@ func TestIntegrationStartupCheck(t *testing.T) {
|
|||||||
done <- struct{}{}
|
done <- struct{}{}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
err := app.Run(ctx, app.RunParams{
|
require.NoError(t, app.Run(ctx, buildAppParams(t, configService, dockerClient, screen, screenCaptureC, logger)))
|
||||||
ConfigService: configService,
|
|
||||||
DockerClient: dockerClient,
|
|
||||||
Screen: &terminal.Screen{
|
|
||||||
Screen: screen,
|
|
||||||
Width: 200,
|
|
||||||
Height: 25,
|
|
||||||
CaptureC: screenCaptureC,
|
|
||||||
},
|
|
||||||
ClipboardAvailable: false,
|
|
||||||
BuildInfo: domain.BuildInfo{Version: "0.0.1", GoVersion: "go1.16.3"},
|
|
||||||
Logger: logger,
|
|
||||||
})
|
|
||||||
require.NoError(t, err)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
require.EventuallyWithT(
|
require.EventuallyWithT(
|
||||||
@ -791,20 +728,7 @@ func TestIntegrationMediaServerError(t *testing.T) {
|
|||||||
done <- struct{}{}
|
done <- struct{}{}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
err := app.Run(ctx, app.RunParams{
|
require.NoError(t, app.Run(ctx, buildAppParams(t, configService, dockerClient, screen, screenCaptureC, logger)))
|
||||||
ConfigService: configService,
|
|
||||||
DockerClient: dockerClient,
|
|
||||||
Screen: &terminal.Screen{
|
|
||||||
Screen: screen,
|
|
||||||
Width: 200,
|
|
||||||
Height: 25,
|
|
||||||
CaptureC: screenCaptureC,
|
|
||||||
},
|
|
||||||
ClipboardAvailable: false,
|
|
||||||
BuildInfo: domain.BuildInfo{Version: "0.0.1", GoVersion: "go1.16.3"},
|
|
||||||
Logger: logger,
|
|
||||||
})
|
|
||||||
require.NoError(t, err)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
require.EventuallyWithT(
|
require.EventuallyWithT(
|
||||||
@ -843,20 +767,11 @@ func TestIntegrationDockerClientError(t *testing.T) {
|
|||||||
done <- struct{}{}
|
done <- struct{}{}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
err := app.Run(ctx, app.RunParams{
|
require.EqualError(
|
||||||
ConfigService: configService,
|
t,
|
||||||
DockerClient: &dockerClient,
|
app.Run(ctx, buildAppParams(t, configService, &dockerClient, screen, screenCaptureC, logger)),
|
||||||
Screen: &terminal.Screen{
|
"create container client: network create: boom",
|
||||||
Screen: screen,
|
)
|
||||||
Width: 200,
|
|
||||||
Height: 25,
|
|
||||||
CaptureC: screenCaptureC,
|
|
||||||
},
|
|
||||||
ClipboardAvailable: false,
|
|
||||||
BuildInfo: domain.BuildInfo{Version: "0.0.1", GoVersion: "go1.16.3"},
|
|
||||||
Logger: logger,
|
|
||||||
})
|
|
||||||
require.EqualError(t, err, "create container client: network create: boom")
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
require.EventuallyWithT(
|
require.EventuallyWithT(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user