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  }