1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
10
"github.com/juju/errors"
11
"github.com/juju/testing"
12
jc "github.com/juju/testing/checkers"
13
"github.com/juju/utils/clock"
14
gc "gopkg.in/check.v1"
15
"gopkg.in/juju/names.v2"
17
"github.com/juju/juju/agent"
18
"github.com/juju/juju/api/base"
19
"github.com/juju/juju/core/lease"
20
coretesting "github.com/juju/juju/testing"
21
"github.com/juju/juju/worker"
22
"github.com/juju/juju/worker/singular"
29
func newFixture(c *gc.C, errs ...error) *fixture {
31
fix.Stub.SetErrors(errs...)
35
type testFunc func(*singular.FlagWorker, *coretesting.Clock, func())
37
func (fix *fixture) Run(c *gc.C, test testFunc) {
38
facade := newStubFacade(&fix.Stub)
39
clock := coretesting.NewClock(time.Now())
40
flagWorker, err := singular.NewFlagWorker(singular.FlagConfig{
43
Duration: time.Minute,
45
c.Assert(err, jc.ErrorIsNil)
47
done := make(chan struct{})
50
defer worker.Stop(flagWorker)
51
defer facade.unblock()
52
test(flagWorker, clock, facade.unblock)
56
case <-time.After(coretesting.LongWait):
57
c.Fatalf("test timed out")
61
func (fix *fixture) CheckClaimWait(c *gc.C) {
62
fix.CheckCalls(c, []testing.StubCall{{
64
Args: []interface{}{time.Minute},
70
func (fix *fixture) CheckClaims(c *gc.C, count int) {
71
expect := make([]testing.StubCall, count)
72
for i := 0; i < count; i++ {
73
expect[i] = testing.StubCall{
75
Args: []interface{}{time.Minute},
78
fix.CheckCalls(c, expect)
81
type stubFacade struct {
87
func newStubFacade(stub *testing.Stub) *stubFacade {
90
block: make(chan struct{}),
94
func (facade *stubFacade) unblock() {
96
defer facade.mu.Unlock()
104
func (facade *stubFacade) Claim(duration time.Duration) error {
105
facade.stub.AddCall("Claim", duration)
106
return facade.stub.NextErr()
109
func (facade *stubFacade) Wait() error {
110
facade.stub.AddCall("Wait")
112
return facade.stub.NextErr()
115
var errClaimDenied = errors.Trace(lease.ErrClaimDenied)
117
type mockAgent struct {
122
func (mock *mockAgent) CurrentConfig() agent.Config {
123
return &mockAgentConfig{wrongKind: mock.wrongKind}
126
type mockAgentConfig struct {
131
func (mock *mockAgentConfig) Tag() names.Tag {
133
return names.NewUnitTag("foo/1")
135
return names.NewMachineTag("123")
138
type fakeClock struct {
142
type fakeFacade struct {
146
type fakeWorker struct {
150
type fakeAPICaller struct {