1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
11
"github.com/juju/testing"
12
jc "github.com/juju/testing/checkers"
13
gc "gopkg.in/check.v1"
14
"gopkg.in/juju/names.v2"
16
"github.com/juju/httprequest"
17
"github.com/juju/juju/agent"
18
"github.com/juju/juju/api/base"
19
"github.com/juju/juju/api/metricsadder"
20
"github.com/juju/juju/worker"
21
"github.com/juju/juju/worker/dependency"
22
dt "github.com/juju/juju/worker/dependency/testing"
23
"github.com/juju/juju/worker/metrics/sender"
24
"github.com/juju/juju/worker/metrics/spool"
27
type ManifoldSuite struct {
28
testing.IsolationSuite
29
factory spool.MetricFactory
30
client metricsadder.MetricsAdderClient
31
manifold dependency.Manifold
32
resources dt.StubResources
35
var _ = gc.Suite(&ManifoldSuite{})
37
func (s *ManifoldSuite) SetUpTest(c *gc.C) {
39
s.IsolationSuite.SetUpTest(c)
40
s.factory = &stubMetricFactory{
45
testAPIClient := func(apiCaller base.APICaller) metricsadder.MetricsAdderClient {
46
return newTestAPIMetricSender()
48
s.PatchValue(&sender.NewMetricAdderClient, testAPIClient)
50
s.manifold = sender.Manifold(sender.ManifoldConfig{
52
APICallerName: "api-caller",
53
MetricSpoolName: "metric-spool",
57
// create unit agent base dir so that hooks can run.
58
err := os.MkdirAll(filepath.Join(dataDir, "agents", "unit-u-0"), 0777)
59
c.Assert(err, jc.ErrorIsNil)
61
s.resources = dt.StubResources{
62
"agent": dt.StubResource{Output: &dummyAgent{dataDir: dataDir}},
63
"api-caller": dt.StubResource{Output: &stubAPICaller{&testing.Stub{}}},
64
"metric-spool": dt.StubResource{Output: s.factory},
68
func (s *ManifoldSuite) TestInputs(c *gc.C) {
69
c.Check(s.manifold.Inputs, jc.DeepEquals, []string{"agent", "api-caller", "metric-spool"})
72
func (s *ManifoldSuite) TestStartMissingAPICaller(c *gc.C) {
73
context := dt.StubContext(nil, map[string]interface{}{
74
"api-caller": dependency.ErrMissing,
75
"metric-spool": s.factory,
77
worker, err := s.manifold.Start(context)
78
c.Check(worker, gc.IsNil)
79
c.Check(err, gc.ErrorMatches, dependency.ErrMissing.Error())
82
func (s *ManifoldSuite) TestStartMissingAgent(c *gc.C) {
83
context := dt.StubContext(nil, map[string]interface{}{
84
"agent": dependency.ErrMissing,
85
"api-caller": &stubAPICaller{&testing.Stub{}},
86
"metric-spool": s.factory,
88
worker, err := s.manifold.Start(context)
89
c.Check(worker, gc.IsNil)
90
c.Check(err, gc.ErrorMatches, dependency.ErrMissing.Error())
93
func (s *ManifoldSuite) TestStartSuccess(c *gc.C) {
97
func (s *ManifoldSuite) setupWorkerTest(c *gc.C) worker.Worker {
98
worker, err := s.manifold.Start(s.resources.Context())
99
c.Check(err, jc.ErrorIsNil)
100
s.AddCleanup(func(c *gc.C) {
103
c.Check(err, jc.ErrorIsNil)
108
var _ base.APICaller = (*stubAPICaller)(nil)
110
type stubAPICaller struct {
114
func (s *stubAPICaller) APICall(objType string, version int, id, request string, params, response interface{}) error {
115
s.MethodCall(s, "APICall", objType, version, id, request, params, response)
119
func (s *stubAPICaller) BestFacadeVersion(facade string) int {
120
s.MethodCall(s, "BestFacadeVersion", facade)
124
func (s *stubAPICaller) ModelTag() (names.ModelTag, error) {
125
s.MethodCall(s, "ModelTag")
126
return names.NewModelTag("foobar"), nil
129
func (s *stubAPICaller) ConnectStream(string, url.Values) (base.Stream, error) {
130
panic("should not be called")
133
func (s *stubAPICaller) HTTPClient() (*httprequest.Client, error) {
134
panic("should not be called")
137
type dummyAgent struct {
142
func (a dummyAgent) CurrentConfig() agent.Config {
143
return &dummyAgentConfig{dataDir: a.dataDir}
146
type dummyAgentConfig struct {
151
// Tag implements agent.AgentConfig.
152
func (ac dummyAgentConfig) Tag() names.Tag {
153
return names.NewUnitTag("u/0")
156
// DataDir implements agent.AgentConfig.
157
func (ac dummyAgentConfig) DataDir() string {