From 98555509f778040fd89746b933d48f9e2c16943a Mon Sep 17 00:00:00 2001 From: Viktor Liu Date: Fri, 13 Jun 2025 20:16:36 +0200 Subject: [PATCH] Fix unix test --- client/cmd/service_test.go | 61 ++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/client/cmd/service_test.go b/client/cmd/service_test.go index 8a829d7ad..c3c8eeff0 100644 --- a/client/cmd/service_test.go +++ b/client/cmd/service_test.go @@ -14,10 +14,49 @@ import ( ) const ( - serviceStartTimeout = 5 * time.Second + serviceStartTimeout = 10 * time.Second serviceStopTimeout = 5 * time.Second + statusPollInterval = 500 * time.Millisecond ) +// waitForServiceStatus waits for service to reach expected status with timeout +func waitForServiceStatus(expectedStatus service.Status, timeout time.Duration) (bool, error) { + cfg, err := newSVCConfig() + if err != nil { + return false, err + } + + ctxSvc, cancel := context.WithCancel(context.Background()) + defer cancel() + + s, err := newSVC(newProgram(ctxSvc, cancel), cfg) + if err != nil { + return false, err + } + + ctx, timeoutCancel := context.WithTimeout(context.Background(), timeout) + defer timeoutCancel() + + ticker := time.NewTicker(statusPollInterval) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return false, fmt.Errorf("timeout waiting for service status %v", expectedStatus) + case <-ticker.C: + status, err := s.Status() + if err != nil { + // Continue polling on transient errors + continue + } + if status == expectedStatus { + return true, nil + } + } + } +} + // TestServiceLifecycle tests the complete service lifecycle func TestServiceLifecycle(t *testing.T) { if os.Getenv("CONTAINER") == "true" { @@ -25,7 +64,7 @@ func TestServiceLifecycle(t *testing.T) { } originalServiceName := serviceName - serviceName = "netbird-test-" + fmt.Sprintf("%d", time.Now().Unix()) + serviceName = "netbirdtest" + fmt.Sprintf("%d", time.Now().Unix()) defer func() { serviceName = originalServiceName }() @@ -60,9 +99,7 @@ func TestServiceLifecycle(t *testing.T) { err := startCmd.RunE(startCmd, []string{}) require.NoError(t, err) - time.Sleep(serviceStartTimeout) - - running, err := isServiceRunning() + running, err := waitForServiceStatus(service.StatusRunning, serviceStartTimeout) require.NoError(t, err) assert.True(t, running) }) @@ -72,9 +109,7 @@ func TestServiceLifecycle(t *testing.T) { err := restartCmd.RunE(restartCmd, []string{}) require.NoError(t, err) - time.Sleep(serviceStartTimeout) - - running, err := isServiceRunning() + running, err := waitForServiceStatus(service.StatusRunning, serviceStartTimeout) require.NoError(t, err) assert.True(t, running) }) @@ -90,9 +125,7 @@ func TestServiceLifecycle(t *testing.T) { err := reconfigureCmd.RunE(reconfigureCmd, []string{}) require.NoError(t, err) - time.Sleep(serviceStartTimeout) - - running, err := isServiceRunning() + running, err := waitForServiceStatus(service.StatusRunning, serviceStartTimeout) require.NoError(t, err) assert.True(t, running) }) @@ -102,11 +135,9 @@ func TestServiceLifecycle(t *testing.T) { err := stopCmd.RunE(stopCmd, []string{}) require.NoError(t, err) - time.Sleep(serviceStopTimeout) - - running, err := isServiceRunning() + stopped, err := waitForServiceStatus(service.StatusStopped, serviceStopTimeout) require.NoError(t, err) - assert.False(t, running) + assert.True(t, stopped) }) t.Run("Uninstall", func(t *testing.T) {