package inventory import ( "errors" "testing" "time" ) // novox/hq issue 213: while a machine hands its controller over from the container to the process, // two controllers run on one store for a moment. Working the plans is one act at a time across them. func TestThePlansAreWorkedByOneControllerAtATime(t *testing.T) { first := ForTest(t) // A second controller: its own connections to the same store. second, err := Open(t.Context()) if err != nil { t.Fatal(err) } t.Cleanup(second.Close) release, err := first.HoldPlans(t.Context(), false) if err != nil { t.Fatalf("the plans could not be held when nobody held them: %v", err) } t.Cleanup(release) // a pool closing waits for a connection still held; release is idempotent if _, err := second.HoldPlans(t.Context(), false); !errors.Is(err, ErrPlansBusy) { t.Fatalf("a second controller held the plans while the first did: %v", err) } // A waiter gets them once they are let go. was := HoldPoll HoldPoll = 10 * time.Millisecond defer func() { HoldPoll = was }() go func() { time.Sleep(50 * time.Millisecond); release() }() again, err := second.HoldPlans(t.Context(), true) if err != nil { t.Fatalf("a waiting controller never got the plans once they were let go: %v", err) } again() }