github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/metrics/spool/manifold_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package spool_test 5 6 import ( 7 "io/ioutil" 8 "path/filepath" 9 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 "gopkg.in/juju/worker.v1" 14 "gopkg.in/juju/worker.v1/dependency" 15 dt "gopkg.in/juju/worker.v1/dependency/testing" 16 17 "github.com/juju/juju/agent" 18 "github.com/juju/juju/worker/metrics/spool" 19 ) 20 21 type ManifoldSuite struct { 22 testing.IsolationSuite 23 factory *stubFactory 24 manifold dependency.Manifold 25 spoolDir string 26 } 27 28 var _ = gc.Suite(&ManifoldSuite{}) 29 30 func (s *ManifoldSuite) SetUpTest(c *gc.C) { 31 s.IsolationSuite.SetUpTest(c) 32 s.factory = &stubFactory{} 33 s.PatchValue(spool.NewFactory, s.factory.newFactory) 34 s.manifold = spool.Manifold(spool.ManifoldConfig{ 35 AgentName: "agent-name", 36 }) 37 s.spoolDir = c.MkDir() 38 } 39 40 func (s *ManifoldSuite) TestInputs(c *gc.C) { 41 c.Check(s.manifold.Inputs, jc.DeepEquals, []string{"agent-name"}) 42 } 43 44 func (s *ManifoldSuite) TestStartMissingAgent(c *gc.C) { 45 context := dt.StubContext(nil, map[string]interface{}{ 46 "agent-name": dependency.ErrMissing, 47 }) 48 worker, err := s.manifold.Start(context) 49 c.Check(worker, gc.IsNil) 50 c.Check(err, gc.Equals, dependency.ErrMissing) 51 } 52 53 func (s *ManifoldSuite) TestStartSuccess(c *gc.C) { 54 s.setupWorkerTest(c) 55 } 56 57 func (s *ManifoldSuite) TestOutputSuccess(c *gc.C) { 58 worker := s.setupWorkerTest(c) 59 var factory spool.MetricFactory 60 err := s.manifold.Output(worker, &factory) 61 c.Check(err, jc.ErrorIsNil) 62 s.factory.CheckCall(c, 0, "newFactory", s.spoolDir) 63 } 64 65 func (s *ManifoldSuite) setupWorkerTest(c *gc.C) worker.Worker { 66 context := dt.StubContext(nil, map[string]interface{}{ 67 "agent-name": &dummyAgent{spoolDir: s.spoolDir}, 68 }) 69 worker, err := s.manifold.Start(context) 70 c.Check(err, jc.ErrorIsNil) 71 s.AddCleanup(func(c *gc.C) { 72 worker.Kill() 73 err := worker.Wait() 74 c.Check(err, jc.ErrorIsNil) 75 }) 76 return worker 77 } 78 79 func (s *ManifoldSuite) TestOutputBadTarget(c *gc.C) { 80 worker := s.setupWorkerTest(c) 81 var spoolDirPlaceholder interface{} 82 err := s.manifold.Output(worker, &spoolDirPlaceholder) 83 c.Check(err.Error(), gc.Equals, "expected *spool.spoolWorker->*spool.MetricFactory; got *spool.spoolWorker->*interface {}") 84 c.Check(spoolDirPlaceholder, gc.IsNil) 85 } 86 87 func (s *ManifoldSuite) TestCannotCreateSpoolDir(c *gc.C) { 88 c.Assert(ioutil.WriteFile(filepath.Join(s.spoolDir, "x"), nil, 0666), jc.ErrorIsNil) 89 spoolDir := filepath.Join(s.spoolDir, "x", "y") 90 context := dt.StubContext(nil, map[string]interface{}{ 91 "agent-name": &dummyAgent{spoolDir: spoolDir}, 92 }) 93 w, err := s.manifold.Start(context) 94 c.Check(err, gc.ErrorMatches, ".*error checking spool directory.*") 95 96 var factory spool.MetricFactory 97 err = s.manifold.Output(w, &factory) 98 c.Check(err.Error(), gc.Equals, "expected *spool.spoolWorker->*spool.MetricFactory; got <nil>->*spool.MetricFactory") 99 } 100 101 type dummyAgent struct { 102 agent.Agent 103 spoolDir string 104 } 105 106 func (a dummyAgent) CurrentConfig() agent.Config { 107 return &dummyAgentConfig{spoolDir: a.spoolDir} 108 } 109 110 type dummyAgentConfig struct { 111 agent.Config 112 spoolDir string 113 } 114 115 func (ac dummyAgentConfig) MetricsSpoolDir() string { 116 return ac.spoolDir 117 } 118 119 type dummyFactory struct { 120 spool.MetricFactory 121 } 122 123 type stubFactory struct { 124 testing.Stub 125 } 126 127 func (s *stubFactory) newFactory(spoolDir string) spool.MetricFactory { 128 s.AddCall("newFactory", spoolDir) 129 return &dummyFactory{} 130 }