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: &params.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  }