//go:build unix package e2e import ( "context" "errors" "syscall" "testing" "time" "albedo/cli/internal/daemon" ) func TestDaemonStartsFromCrashedManifest(t *testing.T) { old := suite.daemonPID if err := syscall.Kill(old, syscall.SIGKILL); err != nil { t.Fatal(err) } if !awaitExit(old, 5*time.Second) { t.Fatal("crashed daemon process did not exit") } cli(t, "daemon") snap, err := readDaemonSnapshot(suite.home) if err != nil { t.Fatal(err) } suite.daemonPID = snap.Pid if err := suite.conn.Refresh(t.Context()); err != nil { t.Fatal(err) } if snap.Pid == old { t.Fatal("daemon did not replace the crashed daemon") } cli(t, "sessions") } func TestDaemonStartDuringShutdown(t *testing.T) { for range 5 { old := suite.daemonPID snapshot, err := readDaemonSnapshot(suite.home) if err != nil { t.Fatal(err) } current := daemon.NewConnection(snapshot, nil) defer current.HTTPClient().CloseIdleConnections() if err = daemon.StopDaemon(t.Context(), current, false); err != nil { t.Fatal(err) } ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second) for { server, probeErr := daemon.ProbeServer(ctx, current) if ctx.Err() != nil { cancel() t.Fatal("daemon never started shutting down") } if probeErr != nil || server.State == "draining" { break } time.Sleep(time.Millisecond) } cancel() cli(t, "daemon") snap, err := readDaemonSnapshot(suite.home) if err != nil { t.Fatal(err) } suite.daemonPID = snap.Pid if err := suite.conn.Refresh(t.Context()); err != nil { t.Fatal(err) } if snap.Pid == old { t.Fatal("daemon attached to the daemon being shut down") } cli(t, "sessions") } } func TestDaemonStopThenStartImmediately(t *testing.T) { for range 5 { old := suite.daemonPID cli(t, "daemon", "--stop") exited := errors.Is(syscall.Kill(old, 0), syscall.ESRCH) cli(t, "daemon") snap, err := readDaemonSnapshot(suite.home) if err != nil { t.Fatal(err) } suite.daemonPID = snap.Pid if err := suite.conn.Refresh(t.Context()); err != nil { t.Fatal(err) } if !exited { t.Fatalf("daemon --stop returned while daemon %d was still running", old) } if snap.Pid == old { t.Fatal("daemon reused the stopped daemon instead of starting a replacement") } cli(t, "sessions") } }