package inventory import ( "testing" "time" ) // Composing and sending one node's declaration is serialised: a second holder waits for the first. func TestHoldingANodeMakesTheNextHolderWait(t *testing.T) { inv := fresh(t) ctx := t.Context() release, err := inv.HoldNodes(ctx, []string{"anchor", "laptop"}) if err != nil { t.Fatal(err) } got := make(chan func(), 1) go func() { second, err := inv.HoldNodes(ctx, []string{"laptop"}) if err != nil { t.Error(err) got <- func() {} return } got <- second }() select { case <-got: t.Fatal("a node held by one caller was held by another at the same time") case <-time.After(300 * time.Millisecond): } // Another node is not held up. other, err := inv.HoldNodes(ctx, []string{"joiner"}) if err != nil { t.Fatal(err) } other() release() select { case second := <-got: second() case <-time.After(5 * time.Second): t.Fatal("releasing the node did not let the next holder in") } }