41 lines
1.3 KiB
Go
41 lines
1.3 KiB
Go
//go:build integration
|
|
|
|
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()
|
|
}
|