1
// Copyright 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
10
"github.com/juju/testing"
11
jc "github.com/juju/testing/checkers"
12
gc "gopkg.in/check.v1"
14
coretesting "github.com/juju/juju/testing"
15
"github.com/juju/juju/worker/resumer"
16
"github.com/juju/juju/worker/workertest"
19
type ResumerSuite struct {
20
testing.IsolationSuite
23
var _ = gc.Suite(&ResumerSuite{})
25
func (*ResumerSuite) TestImmediateFailure(c *gc.C) {
26
fix := newFixture(errors.New("zap"))
27
stub := fix.Run(c, func(_ *coretesting.Clock, worker *resumer.Resumer) {
28
err := workertest.CheckKilled(c, worker)
29
c.Check(err, gc.ErrorMatches, "cannot resume transactions: zap")
31
stub.CheckCallNames(c, "ResumeTransactions")
34
func (*ResumerSuite) TestWaitsToResume(c *gc.C) {
35
fix := newFixture(nil, errors.New("unexpected"))
36
stub := fix.Run(c, func(clock *coretesting.Clock, worker *resumer.Resumer) {
37
waitAlarms(c, clock, 2)
38
clock.Advance(time.Hour - time.Nanosecond)
39
workertest.CheckAlive(c, worker)
40
workertest.CleanKill(c, worker)
42
stub.CheckCallNames(c, "ResumeTransactions")
45
func (*ResumerSuite) TestResumesAfterWait(c *gc.C) {
46
fix := newFixture(nil, nil, errors.New("unexpected"))
47
stub := fix.Run(c, func(clock *coretesting.Clock, worker *resumer.Resumer) {
48
waitAlarms(c, clock, 2)
49
clock.Advance(time.Hour)
50
waitAlarms(c, clock, 1)
51
workertest.CleanKill(c, worker)
53
stub.CheckCallNames(c, "ResumeTransactions", "ResumeTransactions")
56
func (*ResumerSuite) TestSeveralResumes(c *gc.C) {
57
fix := newFixture(nil, nil, nil, errors.New("unexpected"))
58
stub := fix.Run(c, func(clock *coretesting.Clock, worker *resumer.Resumer) {
59
waitAlarms(c, clock, 2)
60
clock.Advance(time.Hour)
61
waitAlarms(c, clock, 1)
62
clock.Advance(time.Hour)
63
waitAlarms(c, clock, 1)
64
workertest.CleanKill(c, worker)
66
stub.CheckCallNames(c, "ResumeTransactions", "ResumeTransactions", "ResumeTransactions")
69
func newFixture(errs ...error) *fixture {
70
return &fixture{errors: errs}
77
type TestFunc func(*coretesting.Clock, *resumer.Resumer)
79
func (fix fixture) Run(c *gc.C, test TestFunc) *testing.Stub {
81
stub := &testing.Stub{}
82
stub.SetErrors(fix.errors...)
83
clock := coretesting.NewClock(time.Now())
84
facade := newMockFacade(stub)
86
worker, err := resumer.NewResumer(resumer.Config{
91
c.Assert(err, jc.ErrorIsNil)
92
defer workertest.DirtyKill(c, worker)
98
func newMockFacade(stub *testing.Stub) *mockFacade {
99
return &mockFacade{stub: stub}
102
type mockFacade struct {
106
func (mock *mockFacade) ResumeTransactions() error {
107
mock.stub.AddCall("ResumeTransactions")
108
return mock.stub.NextErr()
111
func waitAlarms(c *gc.C, clock *coretesting.Clock, count int) {
112
timeout := time.After(coretesting.LongWait)
113
for i := 0; i < count; i++ {
115
case <-clock.Alarms():
117
c.Fatalf("timed out waiting for alarm %d", i)