func (ss *stateSuite) TestImplicitCheckpointModifiedOnly(c *C) { restore := state.MockCheckpointRetryDelay(2*time.Millisecond, 1*time.Second) defer restore() b := &fakeStateBackend{} st := state.New(b) st.Lock() st.Unlock() st.Lock() st.Unlock() c.Assert(b.checkpoints, HasLen, 1) st.Lock() st.Set("foo", "bar") st.Unlock() c.Assert(b.checkpoints, HasLen, 2) }
func (ss *stateSuite) TestImplicitCheckpointPanicsAfterFailedRetries(c *C) { restore := state.MockCheckpointRetryDelay(2*time.Millisecond, 10*time.Millisecond) defer restore() boom := errors.New("boom") retries := 0 error := func() error { retries++ return boom } b := &fakeStateBackend{error: error} st := state.New(b) st.Lock() // implicit checkpoint will panic after all failed retries t0 := time.Now() c.Check(func() { st.Unlock() }, PanicMatches, "cannot checkpoint even after 10ms of retries every 2ms: boom") // we did at least a couple c.Check(retries > 2, Equals, true) c.Check(time.Since(t0) > 10*time.Millisecond, Equals, true) }
func (ss *stateSuite) TestImplicitCheckpointRetry(c *C) { restore := state.MockCheckpointRetryDelay(2*time.Millisecond, 1*time.Second) defer restore() retries := 0 boom := errors.New("boom") error := func() error { retries++ if retries == 2 { return nil } return boom } b := &fakeStateBackend{error: error} st := state.New(b) st.Lock() // implicit checkpoint will retry st.Unlock() c.Check(retries, Equals, 2) }