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  }