func (ss *stateSuite) TestPrune(c *C) { st := state.New(&fakeStateBackend{}) st.Lock() defer st.Unlock() now := time.Now() pruneWait := 1 * time.Hour abortWait := 3 * time.Hour unset := time.Time{} t1 := st.NewTask("foo", "...") t2 := st.NewTask("foo", "...") t3 := st.NewTask("foo", "...") t4 := st.NewTask("foo", "...") chg1 := st.NewChange("abort", "...") chg1.AddTask(t1) state.MockChangeTimes(chg1, now.Add(-abortWait), unset) chg2 := st.NewChange("prune", "...") chg2.AddTask(t2) c.Assert(chg2.Status(), Equals, state.DoStatus) state.MockChangeTimes(chg2, now.Add(-pruneWait), now.Add(-pruneWait)) chg3 := st.NewChange("ready-but-recent", "...") chg3.AddTask(t3) state.MockChangeTimes(chg3, now.Add(-pruneWait), now.Add(-pruneWait/2)) chg4 := st.NewChange("old-but-not-ready", "...") chg4.AddTask(t4) state.MockChangeTimes(chg4, now.Add(-pruneWait/2), unset) // unlinked task t5 := st.NewTask("unliked", "...") c.Check(st.Task(t5.ID()), IsNil) state.MockTaskTimes(t5, now.Add(-pruneWait), now.Add(-pruneWait)) st.Prune(pruneWait, abortWait) c.Assert(st.Change(chg1.ID()), Equals, chg1) c.Assert(st.Change(chg2.ID()), IsNil) c.Assert(st.Change(chg3.ID()), Equals, chg3) c.Assert(st.Change(chg4.ID()), Equals, chg4) c.Assert(st.Task(t1.ID()), Equals, t1) c.Assert(st.Task(t2.ID()), IsNil) c.Assert(st.Task(t3.ID()), Equals, t3) c.Assert(st.Task(t4.ID()), Equals, t4) c.Assert(chg1.Status(), Equals, state.HoldStatus) c.Assert(chg3.Status(), Equals, state.DoStatus) c.Assert(chg4.Status(), Equals, state.DoStatus) c.Assert(t1.Status(), Equals, state.HoldStatus) c.Assert(t3.Status(), Equals, state.DoStatus) c.Assert(t4.Status(), Equals, state.DoStatus) c.Check(st.TaskCount(), Equals, 3) }
func (ss *stateSuite) TestPruneEmptyChange(c *C) { // Empty changes are a bit special because they start out on Hold // which is a Ready status, but the change itself is not considered Ready // explicitly because that's how every change that will have tasks added // to it starts their life. st := state.New(&fakeStateBackend{}) st.Lock() defer st.Unlock() now := time.Now() pruneWait := 1 * time.Hour abortWait := 3 * time.Hour chg := st.NewChange("abort", "...") state.MockChangeTimes(chg, now.Add(-pruneWait), time.Time{}) st.Prune(pruneWait, abortWait) c.Assert(st.Change(chg.ID()), IsNil) }