diff --git a/player/agent/internal/app/app.go b/player/agent/internal/app/app.go index 5b783d2..a7f439d 100644 --- a/player/agent/internal/app/app.go +++ b/player/agent/internal/app/app.go @@ -88,8 +88,16 @@ func (a *App) Run(ctx context.Context) error { return fmt.Errorf("screen id is required") } + select { + case <-ctx.Done(): + a.mu.Lock() + a.status = StatusStopped + a.mu.Unlock() + return nil + default: + } + a.mu.Lock() - a.status = StatusRunning a.startedAt = a.now() a.mu.Unlock() @@ -101,6 +109,9 @@ func (a *App) Run(ctx context.Context) error { a.Config.HeartbeatEvery, ) a.emitHeartbeat() + a.mu.Lock() + a.status = StatusRunning + a.mu.Unlock() ticker := time.NewTicker(time.Duration(a.Config.HeartbeatEvery) * time.Second) defer ticker.Stop() diff --git a/player/agent/internal/app/app_test.go b/player/agent/internal/app/app_test.go index d7a83b3..874ae05 100644 --- a/player/agent/internal/app/app_test.go +++ b/player/agent/internal/app/app_test.go @@ -107,3 +107,31 @@ func TestAppSnapshotIncludesConfiguredTargets(t *testing.T) { t.Fatalf("HeartbeatEvery = %d, want %d", got, want) } } + +func TestAppRunWithCanceledContextDoesNotLogConfiguredOrHeartbeat(t *testing.T) { + var logBuffer bytes.Buffer + application := newApp(config.Config{ + ScreenID: "screen-canceled", + ServerBaseURL: "http://127.0.0.1:8080", + MQTTBroker: "tcp://127.0.0.1:1883", + HeartbeatEvery: 5, + }, log.New(&logBuffer, "", 0), time.Now) + + ctx, cancel := context.WithCancel(context.Background()) + cancel() + + if err := application.Run(ctx); err != nil { + t.Fatalf("Run() error = %v", err) + } + + if got, want := application.Snapshot().Status, StatusStopped; got != want { + t.Fatalf("final status = %q, want %q", got, want) + } + + logs := logBuffer.String() + for _, needle := range []string{"event=agent_configured", "event=heartbeat_tick"} { + if strings.Contains(logs, needle) { + t.Fatalf("logs unexpectedly contain %q: %s", needle, logs) + } + } +}