func (s *MachineSuite) TestMachineAgentDoesNotStartAddresser(c *gc.C) {
// Patch addresser worker constructor.
started := make(chan struct{})
newTestAddresser := func(api *apiaddresser.API) (worker.Worker, error) {
close(started)
return worker.NewNoOpWorker(), nil
}
s.PatchValue(&newAddresser, newTestAddresser)
// Patch environment to use mock.
config := mockTestingEnvConfig(c)
// Start the machine agent.
m, _, _ := s.primeAgent(c, version.Current, state.JobHostUnits)
a := s.newAgent(c, m)
go func() { c.Check(a.Run(nil), jc.ErrorIsNil) }()
defer func() { c.Check(a.Stop(), jc.ErrorIsNil) }()
// Ensure the worker is not started.
select {
case <-started:
c.Fatalf("addresser worker unexpectedly started")
case <-time.After(coretesting.ShortWait):
}
}
// mockTestingEnvConfig prepares an environment configuration using
// the mock provider which does not support networking.
func mockTestingEnvConfig(c *gc.C) *config.Config {
environs.RegisterProvider("mock", mockEnvironProvider{})
cfg, err := config.New(config.NoDefaults, mockConfig())
c.Assert(err, jc.ErrorIsNil)
env, err := environs.Prepare(cfg, envcmd.BootstrapContext(coretesting.Context(c)), configstore.NewMem())
c.Assert(err, jc.ErrorIsNil)
return env.Config()
}
// mockConfig returns a configuration for the usage of the
// mock provider below.
func mockConfig() coretesting.Attrs {
return dummy.SampleConfig().Merge(coretesting.Attrs{
"type": "mock",
})
}
// mockEnviron is an environment without networking support.
type mockEnviron struct {
environs.Environ
}
func (e mockEnviron) Config() *config.Config {
cfg, err := config.New(config.NoDefaults, mockConfig())
if err != nil {
panic("invalid configuration for testing")
}
return cfg
}
// mockEnvironProvider is the smallest possible provider to
// test the addresses without networking support.
type mockEnvironProvider struct {
environs.EnvironProvider
}
func (p mockEnvironProvider) PrepareForBootstrap(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
return &mockEnviron{}, nil
}
func (p mockEnvironProvider) Open(*config.Config) (environs.Environ, error) {
return &mockEnviron{}, nil
}