github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/apiserver/worker_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package apiserver_test 5 6 import ( 7 "net/http" 8 "time" 9 10 "github.com/juju/clock/testclock" 11 "github.com/juju/pubsub" 12 "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 "gopkg.in/juju/worker.v1" 16 "gopkg.in/juju/worker.v1/workertest" 17 18 "github.com/juju/juju/agent" 19 coreapiserver "github.com/juju/juju/apiserver" 20 "github.com/juju/juju/apiserver/apiserverhttp" 21 "github.com/juju/juju/apiserver/params" 22 "github.com/juju/juju/core/cache" 23 "github.com/juju/juju/core/lease" 24 "github.com/juju/juju/core/presence" 25 "github.com/juju/juju/state" 26 "github.com/juju/juju/worker/apiserver" 27 ) 28 29 type workerFixture struct { 30 testing.IsolationSuite 31 agentConfig mockAgentConfig 32 authenticator *mockAuthenticator 33 clock *testclock.Clock 34 controller *cache.Controller 35 hub pubsub.StructuredHub 36 mux *apiserverhttp.Mux 37 prometheusRegisterer stubPrometheusRegisterer 38 leaseManager lease.Manager 39 config apiserver.Config 40 stub testing.Stub 41 metricsCollector *coreapiserver.Collector 42 } 43 44 func (s *workerFixture) SetUpTest(c *gc.C) { 45 s.IsolationSuite.SetUpTest(c) 46 47 s.agentConfig = mockAgentConfig{ 48 dataDir: c.MkDir(), 49 logDir: c.MkDir(), 50 info: ¶ms.StateServingInfo{ 51 APIPort: 0, // listen on any port 52 }, 53 } 54 s.authenticator = &mockAuthenticator{} 55 s.clock = testclock.NewClock(time.Time{}) 56 controller, err := cache.NewController(cache.ControllerConfig{ 57 Changes: make(chan interface{}), 58 }) 59 c.Assert(err, jc.ErrorIsNil) 60 s.controller = controller 61 s.mux = apiserverhttp.NewMux() 62 s.prometheusRegisterer = stubPrometheusRegisterer{} 63 s.leaseManager = &struct{ lease.Manager }{} 64 s.metricsCollector = coreapiserver.NewMetricsCollector() 65 s.stub.ResetCalls() 66 67 s.config = apiserver.Config{ 68 AgentConfig: &s.agentConfig, 69 Authenticator: s.authenticator, 70 Clock: s.clock, 71 Controller: s.controller, 72 Hub: &s.hub, 73 Presence: presence.New(s.clock), 74 Mux: s.mux, 75 StatePool: &state.StatePool{}, 76 LeaseManager: s.leaseManager, 77 RegisterIntrospectionHTTPHandlers: func(func(string, http.Handler)) {}, 78 UpgradeComplete: func() bool { return true }, 79 RestoreStatus: func() state.RestoreStatus { return "" }, 80 NewServer: s.newServer, 81 MetricsCollector: s.metricsCollector, 82 } 83 } 84 85 func (s *workerFixture) newServer(config coreapiserver.ServerConfig) (worker.Worker, error) { 86 s.stub.MethodCall(s, "NewServer", config) 87 if err := s.stub.NextErr(); err != nil { 88 return nil, err 89 } 90 w := worker.NewRunner(worker.RunnerParams{}) 91 s.AddCleanup(func(c *gc.C) { workertest.DirtyKill(c, w) }) 92 return w, nil 93 } 94 95 type WorkerValidationSuite struct { 96 workerFixture 97 } 98 99 var _ = gc.Suite(&WorkerValidationSuite{}) 100 101 func (s *WorkerValidationSuite) TestValidateErrors(c *gc.C) { 102 type test struct { 103 f func(*apiserver.Config) 104 expect string 105 } 106 tests := []test{{ 107 func(cfg *apiserver.Config) { cfg.AgentConfig = nil }, 108 "nil AgentConfig not valid", 109 }, { 110 func(cfg *apiserver.Config) { cfg.Authenticator = nil }, 111 "nil Authenticator not valid", 112 }, { 113 func(cfg *apiserver.Config) { cfg.Clock = nil }, 114 "nil Clock not valid", 115 }, { 116 func(cfg *apiserver.Config) { cfg.Hub = nil }, 117 "nil Hub not valid", 118 }, { 119 func(cfg *apiserver.Config) { cfg.Mux = nil }, 120 "nil Mux not valid", 121 }, { 122 func(cfg *apiserver.Config) { cfg.StatePool = nil }, 123 "nil StatePool not valid", 124 }, { 125 func(cfg *apiserver.Config) { cfg.MetricsCollector = nil }, 126 "nil MetricsCollector not valid", 127 }, { 128 func(cfg *apiserver.Config) { cfg.LeaseManager = nil }, 129 "nil LeaseManager not valid", 130 }, { 131 func(cfg *apiserver.Config) { cfg.RegisterIntrospectionHTTPHandlers = nil }, 132 "nil RegisterIntrospectionHTTPHandlers not valid", 133 }, { 134 func(cfg *apiserver.Config) { cfg.UpgradeComplete = nil }, 135 "nil UpgradeComplete not valid", 136 }, { 137 func(cfg *apiserver.Config) { cfg.RestoreStatus = nil }, 138 "nil RestoreStatus not valid", 139 }, { 140 func(cfg *apiserver.Config) { cfg.NewServer = nil }, 141 "nil NewServer not valid", 142 }} 143 for i, test := range tests { 144 c.Logf("test #%d (%s)", i, test.expect) 145 s.testValidateError(c, test.f, test.expect) 146 } 147 } 148 149 func (s *WorkerValidationSuite) testValidateError(c *gc.C, f func(*apiserver.Config), expect string) { 150 config := s.config 151 f(&config) 152 w, err := apiserver.NewWorker(config) 153 if !c.Check(err, gc.NotNil) { 154 workertest.DirtyKill(c, w) 155 return 156 } 157 c.Check(w, gc.IsNil) 158 c.Check(err, gc.ErrorMatches, expect) 159 } 160 161 func (s *WorkerValidationSuite) TestValidateRateLimitConfig(c *gc.C) { 162 s.testValidateRateLimitConfig(c, agent.AgentLoginRateLimit, "foo", "parsing AGENT_LOGIN_RATE_LIMIT: .*") 163 s.testValidateRateLimitConfig(c, agent.AgentLoginMinPause, "foo", "parsing AGENT_LOGIN_MIN_PAUSE: .*") 164 s.testValidateRateLimitConfig(c, agent.AgentLoginMaxPause, "foo", "parsing AGENT_LOGIN_MAX_PAUSE: .*") 165 s.testValidateRateLimitConfig(c, agent.AgentLoginRetryPause, "foo", "parsing AGENT_LOGIN_RETRY_PAUSE: .*") 166 s.testValidateRateLimitConfig(c, agent.AgentConnMinPause, "foo", "parsing AGENT_CONN_MIN_PAUSE: .*") 167 s.testValidateRateLimitConfig(c, agent.AgentConnMaxPause, "foo", "parsing AGENT_CONN_MAX_PAUSE: .*") 168 s.testValidateRateLimitConfig(c, agent.AgentConnLookbackWindow, "foo", "parsing AGENT_CONN_LOOKBACK_WINDOW: .*") 169 s.testValidateRateLimitConfig(c, agent.AgentConnLowerThreshold, "foo", "parsing AGENT_CONN_LOWER_THRESHOLD: .*") 170 s.testValidateRateLimitConfig(c, agent.AgentConnUpperThreshold, "foo", "parsing AGENT_CONN_UPPER_THRESHOLD: .*") 171 } 172 173 func (s *WorkerValidationSuite) testValidateRateLimitConfig(c *gc.C, key, value, expect string) { 174 s.agentConfig.values = map[string]string{key: value} 175 _, err := apiserver.NewWorker(s.config) 176 c.Check(err, gc.ErrorMatches, "getting rate limit config: "+expect) 177 } 178 179 func (s *WorkerValidationSuite) TestValidateLogSinkConfig(c *gc.C) { 180 s.testValidateLogSinkConfig(c, agent.LogSinkDBLoggerBufferSize, "foo", "parsing LOGSINK_DBLOGGER_BUFFER_SIZE: .*") 181 s.testValidateLogSinkConfig(c, agent.LogSinkDBLoggerFlushInterval, "foo", "parsing LOGSINK_DBLOGGER_FLUSH_INTERVAL: .*") 182 s.testValidateLogSinkConfig(c, agent.LogSinkRateLimitBurst, "foo", "parsing LOGSINK_RATELIMIT_BURST: .*") 183 s.testValidateLogSinkConfig(c, agent.LogSinkRateLimitRefill, "foo", "parsing LOGSINK_RATELIMIT_REFILL: .*") 184 } 185 186 func (s *WorkerValidationSuite) testValidateLogSinkConfig(c *gc.C, key, value, expect string) { 187 s.agentConfig.values = map[string]string{key: value} 188 _, err := apiserver.NewWorker(s.config) 189 c.Check(err, gc.ErrorMatches, "getting log sink config: "+expect) 190 }