package main import ( "context" "testing" "time" ) // An apply runs in a context the bus's loss cannot end: the link's context ends when the bus goes, and the bus may go // because of the apply itself (it replaces the bus's own container), which then must finish (issue 1945, live on // 2026-10-25 at 11:23: novox's node-engine removed the bus container, its link's context ended, and the docker run that // would have made the new one was never made). func TestAnApplyOutlivesTheLinksContext(t *testing.T) { type key struct{} link, cancel := context.WithCancel(context.WithValue(context.Background(), key{}, "v")) ctx, done := applyContext(link) defer done() cancel() if ctx.Err() != nil { t.Fatalf("the apply's context ended with the link's: %v", ctx.Err()) } if ctx.Value(key{}) != "v" { t.Fatal("the apply's context lost the link's values") } } // An apply is bounded all the same: a step that hangs (a docker call that never returns) cannot hold the node agent for // ever (the review of issue 1945). func TestAnApplyIsBounded(t *testing.T) { t.Run("the marks of the haves never hold the pass", marksOfTheHavesNeverHoldThePass) ctx, done := applyContext(context.Background()) defer done() at, ok := ctx.Deadline() if !ok { t.Fatal("an apply has no bound") } if left := time.Until(at); left > applyBound || left < applyBound-time.Minute { t.Fatalf("the bound is %s away, want about %s", left, applyBound) } }