github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/metrics/sender/manifold_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package sender_test 5 6 import ( 7 "net/url" 8 "os" 9 "path/filepath" 10 11 "github.com/juju/testing" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 "gopkg.in/juju/names.v2" 15 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" 25 ) 26 27 type ManifoldSuite struct { 28 testing.IsolationSuite 29 factory spool.MetricFactory 30 client metricsadder.MetricsAdderClient 31 manifold dependency.Manifold 32 resources dt.StubResources 33 } 34 35 var _ = gc.Suite(&ManifoldSuite{}) 36 37 func (s *ManifoldSuite) SetUpTest(c *gc.C) { 38 spoolDir := c.MkDir() 39 s.IsolationSuite.SetUpTest(c) 40 s.factory = &stubMetricFactory{ 41 &testing.Stub{}, 42 spoolDir, 43 } 44 45 testAPIClient := func(apiCaller base.APICaller) metricsadder.MetricsAdderClient { 46 return newTestAPIMetricSender() 47 } 48 s.PatchValue(&sender.NewMetricAdderClient, testAPIClient) 49 50 s.manifold = sender.Manifold(sender.ManifoldConfig{ 51 AgentName: "agent", 52 APICallerName: "api-caller", 53 MetricSpoolName: "metric-spool", 54 }) 55 56 dataDir := c.MkDir() 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) 60 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}, 65 } 66 } 67 68 func (s *ManifoldSuite) TestInputs(c *gc.C) { 69 c.Check(s.manifold.Inputs, jc.DeepEquals, []string{"agent", "api-caller", "metric-spool"}) 70 } 71 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, 76 }) 77 worker, err := s.manifold.Start(context) 78 c.Check(worker, gc.IsNil) 79 c.Check(err, gc.ErrorMatches, dependency.ErrMissing.Error()) 80 } 81 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, 87 }) 88 worker, err := s.manifold.Start(context) 89 c.Check(worker, gc.IsNil) 90 c.Check(err, gc.ErrorMatches, dependency.ErrMissing.Error()) 91 } 92 93 func (s *ManifoldSuite) TestStartSuccess(c *gc.C) { 94 s.setupWorkerTest(c) 95 } 96 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) { 101 worker.Kill() 102 err := worker.Wait() 103 c.Check(err, jc.ErrorIsNil) 104 }) 105 return worker 106 } 107 108 var _ base.APICaller = (*stubAPICaller)(nil) 109 110 type stubAPICaller struct { 111 *testing.Stub 112 } 113 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) 116 return nil 117 } 118 119 func (s *stubAPICaller) BestFacadeVersion(facade string) int { 120 s.MethodCall(s, "BestFacadeVersion", facade) 121 return 42 122 } 123 124 func (s *stubAPICaller) ModelTag() (names.ModelTag, bool) { 125 s.MethodCall(s, "ModelTag") 126 return names.NewModelTag("foobar"), true 127 } 128 129 func (s *stubAPICaller) ConnectStream(string, url.Values) (base.Stream, error) { 130 panic("should not be called") 131 } 132 133 func (s *stubAPICaller) HTTPClient() (*httprequest.Client, error) { 134 panic("should not be called") 135 } 136 137 type dummyAgent struct { 138 agent.Agent 139 dataDir string 140 } 141 142 func (a dummyAgent) CurrentConfig() agent.Config { 143 return &dummyAgentConfig{dataDir: a.dataDir} 144 } 145 146 type dummyAgentConfig struct { 147 agent.Config 148 dataDir string 149 } 150 151 // Tag implements agent.AgentConfig. 152 func (ac dummyAgentConfig) Tag() names.Tag { 153 return names.NewUnitTag("u/0") 154 } 155 156 // DataDir implements agent.AgentConfig. 157 func (ac dummyAgentConfig) DataDir() string { 158 return ac.dataDir 159 }