master
go 141 lines 4.29 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package dockerfunc
4
5 import (
6 "context"
7 "errors"
8 "testing"
9 "time"
10
11 "github.com/docker/docker/api/types"
12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14 )
15
16 func TestFuncContainers_HandleUnavailable(t *testing.T) {
17 r := newRouter(mockDeps{err: errors.New("collector docker client is not ready")})
18
19 resp := r.Handle(context.Background(), containersMethodID, nil)
20
21 require.NotNil(t, resp)
22 assert.Equal(t, 503, resp.Status)
23 assert.Contains(t, resp.Message, "initializing")
24 }
25
26 func TestFuncContainers_HandleTimeout(t *testing.T) {
27 r := newRouter(mockDeps{
28 client: mockDockerClient{listErr: context.DeadlineExceeded},
29 })
30
31 resp := r.Handle(context.Background(), containersMethodID, nil)
32
33 require.NotNil(t, resp)
34 assert.Equal(t, 504, resp.Status)
35 }
36
37 func TestFuncContainers_HandleSuccess(t *testing.T) {
38 now := time.Now()
39 newerCreated := now.Add(-2 * time.Hour).Unix()
40 olderCreated := now.Add(-24 * time.Hour).Unix()
41
42 r := newRouter(mockDeps{
43 client: mockDockerClient{containers: []types.Container{
44 {
45 ID: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
46 Image: "postgres:16",
47 Command: "docker-entrypoint.sh postgres",
48 Created: olderCreated,
49 Status: "Exited (0) 4 days ago",
50 State: "exited",
51 Ports: []types.Port{
52 {IP: "[::]", PrivatePort: 5432, PublicPort: 5432, Type: "tcp"},
53 {IP: "0.0.0.0", PrivatePort: 5432, PublicPort: 5432, Type: "tcp"},
54 },
55 Names: []string{"/postgres-dev"},
56 },
57 {
58 ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
59 Image: "almalinux:8",
60 Command: "sleep infinity",
61 Created: newerCreated,
62 State: "exited",
63 Names: []string{"/alma8"},
64 },
65 }},
66 })
67
68 resp := r.Handle(context.Background(), containersMethodID, nil)
69
70 require.NotNil(t, resp)
71 assert.Equal(t, 200, resp.Status)
72 assert.Equal(t, containersColCreatedUnix, resp.DefaultSortColumn)
73 assert.Equal(t, containersMethodHelp, resp.Help)
74
75 columns := resp.Columns
76 require.NotNil(t, columns)
77 for _, key := range []string{
78 containersColID,
79 containersColImage,
80 containersColCommand,
81 containersColCreated,
82 containersColStatus,
83 containersColState,
84 containersColPorts,
85 containersColNames,
86 containersColIDFull,
87 containersColCreatedUnix,
88 } {
89 _, ok := columns[key]
90 assert.True(t, ok, "missing column %s", key)
91 }
92
93 data, ok := resp.Data.([][]any)
94 require.True(t, ok)
95 require.Len(t, data, 2)
96
97 // sorted by Created desc: "alma8" first
98 assert.Equal(t, "alma8", data[0][colNames])
99 assert.Equal(t, newerCreated, data[0][colCreatedUnix])
100 assert.Equal(t, "bbbbbbbbbbbb", data[0][colContainerID])
101 assert.Contains(t, data[0][colCreated].(string), "ago")
102 assert.Equal(t, "sleep infinity", data[0][colCommand])
103 assert.Equal(t, "Exited", data[0][colStatus])
104 assert.Equal(t, "exited", data[0][colState])
105
106 // second row includes formatted ports and truncated command
107 assert.Equal(t, "postgres-dev", data[1][colNames])
108 assert.Equal(t, "0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp", data[1][colPorts])
109 assert.Equal(t, "aaaaaaaaaaaa", data[1][colContainerID])
110 assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", data[1][colContainerIDFull])
111 assert.Equal(t, "docker-entrypoint.sh postgres", data[1][colCommand])
112 assert.Equal(t, "exited", data[1][colState])
113 }
114
115 func TestFormatHelpers(t *testing.T) {
116 t.Run("shortContainerID", func(t *testing.T) {
117 assert.Equal(t, "123456789012", shortContainerID("1234567890123456"))
118 assert.Equal(t, "abc", shortContainerID("abc"))
119 })
120
121 t.Run("formatContainerNames", func(t *testing.T) {
122 assert.Equal(t, "a, b", formatContainerNames([]string{"/a", " /b "}))
123 assert.Equal(t, "", formatContainerNames(nil))
124 })
125
126 t.Run("formatCreated", func(t *testing.T) {
127 now := time.Unix(1_730_000_000, 0)
128 assert.Equal(t, "", formatCreated(0, now))
129 assert.Contains(t, formatCreated(now.Add(-48*time.Hour).Unix(), now), "ago")
130 })
131
132 t.Run("formatPorts", func(t *testing.T) {
133 ports := []types.Port{
134 {IP: "[::]", PrivatePort: 5432, PublicPort: 5432, Type: "tcp"},
135 {IP: "0.0.0.0", PrivatePort: 5432, PublicPort: 5432, Type: "tcp"},
136 {PrivatePort: 80, Type: "tcp"},
137 }
138 assert.Equal(t, "80/tcp, 0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp", formatPorts(ports))
139 assert.Equal(t, "", formatPorts(nil))
140 })
141 }