func (s *PeekerSuite) TestPeeksBlockUntilConsumed(c *gc.C) { source := hooktesting.NewFullBufferedSource() defer statetesting.AssertStop(c, source) peeker := hook.NewPeeker(source) defer statetesting.AssertStop(c, peeker) // Collect a peek... timeout := time.After(coretesting.LongWait) select { case <-timeout: c.Fatalf("failed to receive peek") case peek, ok := <-peeker.Peeks(): c.Assert(ok, jc.IsTrue) c.Assert(peek.HookInfo(), gc.Equals, hook.Info{Kind: hooks.Install}) // ...and check that changes can't be delivered... select { case source.ChangesC <- source.NewChange(nil): c.Fatalf("delivered change while supposedly peeking") default: } // ...before the peek is consumed, at which point changes are unblocked. peek.Consume() select { case source.ChangesC <- source.NewChange(nil): case <-timeout: c.Fatalf("failed to unblock changes") } } }
func (s *PeekerSuite) TestStopWhileUpdating(c *gc.C) { source := hooktesting.NewFullBufferedSource() defer statetesting.AssertStop(c, source) peeker := hook.NewPeeker(source) defer statetesting.AssertStop(c, peeker) // Deliver a change; do not accept updates. select { case source.ChangesC <- source.NewChange(nil): assertStopPeeker(c, peeker, source) case <-time.After(coretesting.LongWait): c.Fatalf("timed out") } }
func (s *HookSenderSuite) TestHandlesUpdatesFullQueueSpam(c *gc.C) { source := hooktesting.NewFullBufferedSource() defer statetesting.AssertStop(c, source) out := make(chan hook.Info) sender := hook.NewSender(out, source) defer statetesting.AssertStop(c, sender) // Spam all channels continuously for a bit. timeout := time.After(coretesting.LongWait) hookCount := 0 changeCount := 0 updateCount := 0 for i := 0; i < 100; i++ { select { case hi, ok := <-out: c.Assert(ok, jc.IsTrue) c.Assert(hi, gc.DeepEquals, hook.Info{Kind: hooks.Install}) hookCount++ case source.ChangesC <- source.NewChange("sent"): changeCount++ case update, ok := <-source.UpdatesC: c.Assert(ok, jc.IsTrue) c.Assert(update, gc.Equals, "sent") updateCount++ case <-timeout: c.Fatalf("not enough things happened in time") } } // Once we've finished sending, exhaust the updates... for i := updateCount; i < changeCount && updateCount < changeCount; i++ { select { case update, ok := <-source.UpdatesC: c.Assert(ok, jc.IsTrue) c.Assert(update, gc.Equals, "sent") updateCount++ case <-timeout: c.Fatalf("expected %d updates, got %d", changeCount, updateCount) } } // ...and check sane end state to validate the foregoing. c.Check(hookCount, gc.Not(gc.Equals), 0) c.Check(changeCount, gc.Not(gc.Equals), 0) }