github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/cmd/jujud/agent/common_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package agent 5 6 import ( 7 "fmt" 8 "path/filepath" 9 "time" 10 11 "github.com/juju/cmd" 12 "github.com/juju/names" 13 "github.com/juju/testing" 14 15 "github.com/juju/juju/agent" 16 "github.com/juju/juju/state" 17 coretesting "github.com/juju/juju/testing" 18 "github.com/juju/juju/worker" 19 workertest "github.com/juju/juju/worker/testing" 20 ) 21 22 // This file contains bits of test infrastructure that are shared by 23 // the unit and machine agent tests. 24 25 type runner interface { 26 Run(*cmd.Context) error 27 Stop() error 28 } 29 30 // runWithTimeout runs an agent and waits 31 // for it to complete within a reasonable time. 32 func runWithTimeout(r runner) error { 33 done := make(chan error) 34 go func() { 35 done <- r.Run(nil) 36 }() 37 select { 38 case err := <-done: 39 return err 40 case <-time.After(coretesting.LongWait): 41 } 42 err := r.Stop() 43 return fmt.Errorf("timed out waiting for agent to finish; stop error: %v", err) 44 } 45 46 func newDummyWorker() worker.Worker { 47 return worker.NewSimpleWorker(func(stop <-chan struct{}) error { 48 <-stop 49 return nil 50 }) 51 } 52 53 type FakeConfig struct { 54 agent.ConfigSetter 55 } 56 57 func (FakeConfig) LogDir() string { 58 return filepath.FromSlash("/var/log/juju/") 59 } 60 61 func (FakeConfig) Tag() names.Tag { 62 return names.NewMachineTag("42") 63 } 64 65 type FakeAgentConfig struct { 66 AgentConf 67 } 68 69 func (FakeAgentConfig) ReadConfig(string) error { return nil } 70 71 func (FakeAgentConfig) CurrentConfig() agent.Config { 72 return FakeConfig{} 73 } 74 75 func (FakeAgentConfig) ChangeConfig(mutate agent.ConfigMutator) error { 76 return mutate(FakeConfig{}) 77 } 78 79 func (FakeAgentConfig) CheckArgs([]string) error { return nil } 80 81 type stubWorkerFactory struct { 82 *testing.Stub 83 84 ReturnNewModelWorker func() (worker.Worker, error) 85 ReturnNewWorker worker.Worker 86 } 87 88 func newStubWorkerFactory(stub *testing.Stub) *stubWorkerFactory { 89 factory := &stubWorkerFactory{Stub: stub} 90 factory.ReturnNewWorker = &workertest.StubWorker{Stub: stub} 91 factory.ReturnNewModelWorker = factory.newWorker 92 return factory 93 } 94 95 func (s *stubWorkerFactory) NewModelWorker(st *state.State) func() (worker.Worker, error) { 96 s.AddCall("NewModelWorker", st) 97 s.NextErr() // Pop one off. 98 99 return s.ReturnNewModelWorker 100 } 101 102 func (s *stubWorkerFactory) newWorker() (worker.Worker, error) { 103 s.AddCall("newWorker") 104 if err := s.NextErr(); err != nil { 105 return nil, err 106 } 107 108 return s.ReturnNewWorker, nil 109 }