Skip to content

Commit 7ec7ecf

Browse files
committed
Add tests
1 parent 451a438 commit 7ec7ecf

File tree

2 files changed

+186
-5
lines changed

2 files changed

+186
-5
lines changed

internal/config/config_test.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,127 @@ func TestConfigFileErrors(t *testing.T) {
143143
})
144144
}
145145
}
146+
147+
func TestValidateRunnerPorts(t *testing.T) {
148+
tests := []struct {
149+
name string
150+
runnerConfigs map[string]*RunnerConfig
151+
expectedError string
152+
}{
153+
{
154+
name: "valid unique ports",
155+
runnerConfigs: map[string]*RunnerConfig{
156+
"javascript": {HealthCheckServerPort: "5681"},
157+
"python": {HealthCheckServerPort: "5682"},
158+
},
159+
expectedError: "",
160+
},
161+
{
162+
name: "duplicate ports",
163+
runnerConfigs: map[string]*RunnerConfig{
164+
"javascript": {HealthCheckServerPort: "5681"},
165+
"python": {HealthCheckServerPort: "5681"},
166+
},
167+
expectedError: "cannot use the same health-check-server-port",
168+
},
169+
{
170+
name: "reserved port conflict",
171+
runnerConfigs: map[string]*RunnerConfig{
172+
"javascript": {HealthCheckServerPort: "5679"},
173+
},
174+
expectedError: "conflicts with n8n broker server",
175+
},
176+
{
177+
name: "invalid port number",
178+
runnerConfigs: map[string]*RunnerConfig{
179+
"javascript": {HealthCheckServerPort: "not-a-port"},
180+
},
181+
expectedError: "must be a valid port number",
182+
},
183+
{
184+
name: "port out of range",
185+
runnerConfigs: map[string]*RunnerConfig{
186+
"javascript": {HealthCheckServerPort: "70000"},
187+
},
188+
expectedError: "must be a valid port number",
189+
},
190+
}
191+
192+
for _, tt := range tests {
193+
t.Run(tt.name, func(t *testing.T) {
194+
err := validateRunnerPorts(tt.runnerConfigs)
195+
if tt.expectedError == "" {
196+
assert.NoError(t, err)
197+
} else {
198+
assert.Error(t, err)
199+
assert.Contains(t, err.Error(), tt.expectedError)
200+
}
201+
})
202+
}
203+
}
204+
205+
func TestBackwardsCompatibilityPortDefaults(t *testing.T) {
206+
tests := []struct {
207+
name string
208+
configContent string
209+
runnerTypes []string
210+
expectError bool
211+
expectedPorts map[string]string
212+
}{
213+
{
214+
name: "single runner gets default port",
215+
configContent: `{
216+
"task-runners": [{
217+
"runner-type": "javascript",
218+
"workdir": "/test",
219+
"command": "node",
220+
"args": ["test.js"]
221+
}]
222+
}`,
223+
runnerTypes: []string{"javascript"},
224+
expectedPorts: map[string]string{
225+
"javascript": "5681",
226+
},
227+
},
228+
{
229+
name: "multiple runners require explicit ports",
230+
configContent: `{
231+
"task-runners": [
232+
{
233+
"runner-type": "javascript",
234+
"workdir": "/test",
235+
"command": "node",
236+
"args": ["test.js"]
237+
},
238+
{
239+
"runner-type": "python",
240+
"workdir": "/test",
241+
"command": "python",
242+
"args": ["test.py"]
243+
}
244+
]
245+
}`,
246+
runnerTypes: []string{"javascript", "python"},
247+
expectError: true,
248+
},
249+
}
250+
251+
for _, tt := range tests {
252+
t.Run(tt.name, func(t *testing.T) {
253+
configPath = filepath.Join(t.TempDir(), "test-config.json")
254+
err := os.WriteFile(configPath, []byte(tt.configContent), 0600)
255+
require.NoError(t, err)
256+
257+
configs, err := readLauncherConfigFile(tt.runnerTypes)
258+
259+
if tt.expectError {
260+
assert.Error(t, err)
261+
} else {
262+
assert.NoError(t, err)
263+
for runnerType, expectedPort := range tt.expectedPorts {
264+
assert.Equal(t, expectedPort, configs[runnerType].HealthCheckServerPort)
265+
}
266+
}
267+
})
268+
}
269+
}

internal/env/env_test.go

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package env
33
import (
44
"os"
55
"reflect"
6+
"slices"
67
"sort"
78
"task-runner-launcher/internal/config"
89
"task-runner-launcher/internal/logs"
@@ -179,7 +180,8 @@ func TestPrepareRunnerEnv(t *testing.T) {
179180
},
180181
RunnerConfigs: map[string]*config.RunnerConfig{
181182
"javascript": {
182-
AllowedEnv: []string{"CUSTOM_VAR1", "CUSTOM_VAR2"},
183+
AllowedEnv: []string{"CUSTOM_VAR1", "CUSTOM_VAR2"},
184+
HealthCheckServerPort: "5681",
183185
},
184186
},
185187
},
@@ -198,6 +200,7 @@ func TestPrepareRunnerEnv(t *testing.T) {
198200
"LANG=en_US.UTF-8",
199201
"N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT=15",
200202
"N8N_RUNNERS_HEALTH_CHECK_SERVER_ENABLED=true",
203+
"N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT=5681",
201204
"N8N_RUNNERS_TASK_BROKER_URI=http://localhost:5679",
202205
"N8N_RUNNERS_TASK_TIMEOUT=60",
203206
"PATH=/usr/bin",
@@ -215,7 +218,8 @@ func TestPrepareRunnerEnv(t *testing.T) {
215218
},
216219
RunnerConfigs: map[string]*config.RunnerConfig{
217220
"javascript": {
218-
AllowedEnv: []string{},
221+
AllowedEnv: []string{},
222+
HealthCheckServerPort: "5681",
219223
},
220224
},
221225
},
@@ -228,6 +232,7 @@ func TestPrepareRunnerEnv(t *testing.T) {
228232
"LANG=en_US.UTF-8",
229233
"N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT=15",
230234
"N8N_RUNNERS_HEALTH_CHECK_SERVER_ENABLED=true",
235+
"N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT=5681",
231236
"N8N_RUNNERS_TASK_BROKER_URI=http://localhost:5679",
232237
"N8N_RUNNERS_TASK_TIMEOUT=60",
233238
"PATH=/usr/bin",
@@ -243,7 +248,8 @@ func TestPrepareRunnerEnv(t *testing.T) {
243248
},
244249
RunnerConfigs: map[string]*config.RunnerConfig{
245250
"javascript": {
246-
AllowedEnv: []string{},
251+
AllowedEnv: []string{},
252+
HealthCheckServerPort: "5681",
247253
},
248254
},
249255
},
@@ -254,6 +260,7 @@ func TestPrepareRunnerEnv(t *testing.T) {
254260
expected: []string{
255261
"N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT=30",
256262
"N8N_RUNNERS_HEALTH_CHECK_SERVER_ENABLED=true",
263+
"N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT=5681",
257264
"N8N_RUNNERS_TASK_BROKER_URI=http://localhost:5679",
258265
"N8N_RUNNERS_TASK_TIMEOUT=60",
259266
"PATH=/usr/bin",
@@ -269,7 +276,8 @@ func TestPrepareRunnerEnv(t *testing.T) {
269276
},
270277
RunnerConfigs: map[string]*config.RunnerConfig{
271278
"javascript": {
272-
AllowedEnv: []string{"CUSTOM_VAR1", "CUSTOM_VAR2"},
279+
AllowedEnv: []string{"CUSTOM_VAR1", "CUSTOM_VAR2"},
280+
HealthCheckServerPort: "5681",
273281
EnvOverrides: map[string]string{
274282
"CUSTOM_VAR1": "overridden",
275283
"NEW_VAR": "added",
@@ -289,6 +297,7 @@ func TestPrepareRunnerEnv(t *testing.T) {
289297
"LANG=en_US.UTF-8",
290298
"N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT=30",
291299
"N8N_RUNNERS_HEALTH_CHECK_SERVER_ENABLED=true",
300+
"N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT=5681",
292301
"N8N_RUNNERS_TASK_BROKER_URI=http://localhost:5679",
293302
"N8N_RUNNERS_TASK_TIMEOUT=60",
294303
"NEW_VAR=added",
@@ -306,7 +315,8 @@ func TestPrepareRunnerEnv(t *testing.T) {
306315

307316
RunnerConfigs: map[string]*config.RunnerConfig{
308317
"javascript": {
309-
AllowedEnv: []string{"CUSTOM_VAR1", "CUSTOM_VAR2"},
318+
AllowedEnv: []string{"CUSTOM_VAR1", "CUSTOM_VAR2"},
319+
HealthCheckServerPort: "5681",
310320
EnvOverrides: map[string]string{
311321
"N8N_RUNNERS_TASK_BROKER_URI": "http://evil:5679",
312322
"N8N_RUNNERS_HEALTH_CHECK_SERVER_ENABLED": "false",
@@ -324,6 +334,7 @@ func TestPrepareRunnerEnv(t *testing.T) {
324334
"LANG=en_US.UTF-8",
325335
"N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT=30",
326336
"N8N_RUNNERS_HEALTH_CHECK_SERVER_ENABLED=true",
337+
"N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT=5681",
327338
"N8N_RUNNERS_TASK_BROKER_URI=http://localhost:5679",
328339
"N8N_RUNNERS_TASK_TIMEOUT=60",
329340
"PATH=/usr/bin",
@@ -356,3 +367,49 @@ func TestPrepareRunnerEnv(t *testing.T) {
356367
})
357368
}
358369
}
370+
371+
func TestRunnerPortPassedToEnv(t *testing.T) {
372+
tests := []struct {
373+
name string
374+
port string
375+
expectedEnv string
376+
}{
377+
{
378+
name: "standard port",
379+
port: "5683",
380+
expectedEnv: "N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT=5683",
381+
},
382+
{
383+
name: "alternative port",
384+
port: "8080",
385+
expectedEnv: "N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT=8080",
386+
},
387+
{
388+
name: "high port number",
389+
port: "65000",
390+
expectedEnv: "N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT=65000",
391+
},
392+
}
393+
394+
for _, tt := range tests {
395+
t.Run(tt.name, func(t *testing.T) {
396+
runnerConfig := &config.RunnerConfig{
397+
HealthCheckServerPort: tt.port,
398+
AllowedEnv: []string{},
399+
EnvOverrides: map[string]string{},
400+
}
401+
402+
baseConfig := &config.BaseConfig{
403+
AutoShutdownTimeout: "15",
404+
TaskTimeout: "60",
405+
TaskBrokerURI: "http://localhost:5679",
406+
}
407+
408+
logger := logs.NewLogger(logs.InfoLevel, "")
409+
env := PrepareRunnerEnv(baseConfig, runnerConfig, logger)
410+
411+
found := slices.Contains(env, tt.expectedEnv)
412+
assert.True(t, found, "Expected %s in runner environment", tt.expectedEnv)
413+
})
414+
}
415+
}

0 commit comments

Comments
 (0)