1package container
2
3import (
4 "errors"
5 "testing"
6
7 "github.com/stretchr/testify/assert"
8 "github.com/stretchr/testify/require"
9
10 mocks "github.com/bnema/gordon/internal/boundaries/out/mocks"
11 "github.com/bnema/gordon/internal/domain"
12)
13
14func TestPollContainerRunning(t *testing.T) {
15 t.Run("container starts running immediately", func(t *testing.T) {
16 runtime := mocks.NewMockContainerRuntime(t)
17 svc := NewService(runtime, nil, nil, nil, Config{}, nil)
18 ctx := testContext()
19
20 runtime.EXPECT().IsContainerRunning(ctx, "ctr-1").Return(true, nil).Once()
21
22 err := svc.pollContainerRunning(ctx, "ctr-1")
23 require.NoError(t, err)
24 })
25
26 t.Run("container exits immediately with non-zero exit code", func(t *testing.T) {
27 runtime := mocks.NewMockContainerRuntime(t)
28 svc := NewService(runtime, nil, nil, nil, Config{}, nil)
29 ctx := testContext()
30
31 runtime.EXPECT().IsContainerRunning(ctx, "ctr-2").Return(false, nil).Once()
32 runtime.EXPECT().InspectContainer(ctx, "ctr-2").Return(&domain.Container{
33 ID: "ctr-2",
34 Status: string(domain.ContainerStatusExited),
35 ExitCode: 127,
36 }, nil).Once()
37
38 err := svc.pollContainerRunning(ctx, "ctr-2")
39 require.Error(t, err)
40 assert.Contains(t, err.Error(), "127")
41 assert.Contains(t, err.Error(), "exited")
42 assert.True(t, errors.Is(err, domain.ErrContainerExited))
43 })
44
45 t.Run("container starts running after one failed poll", func(t *testing.T) {
46 runtime := mocks.NewMockContainerRuntime(t)
47 svc := NewService(runtime, nil, nil, nil, Config{}, nil)
48 ctx := testContext()
49
50 // First poll: not yet running, still in "created" state (not exited)
51 runtime.EXPECT().IsContainerRunning(ctx, "ctr-3").Return(false, nil).Once()
52 runtime.EXPECT().InspectContainer(ctx, "ctr-3").Return(&domain.Container{
53 ID: "ctr-3",
54 Status: string(domain.ContainerStatusCreated),
55 }, nil).Once()
56
57 // Second poll: running
58 runtime.EXPECT().IsContainerRunning(ctx, "ctr-3").Return(true, nil).Once()
59
60 err := svc.pollContainerRunning(ctx, "ctr-3")
61 require.NoError(t, err)
62 })
63}