github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/worker/metrics/spool/metrics_test.go (about)

     1  // Copyright 2012-2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package spool_test
     5  
     6  import (
     7  	"path/filepath"
     8  	"runtime"
     9  	"time"
    10  
    11  	"github.com/juju/names"
    12  	"github.com/juju/testing"
    13  	jc "github.com/juju/testing/checkers"
    14  	gc "gopkg.in/check.v1"
    15  	corecharm "gopkg.in/juju/charm.v6-unstable"
    16  
    17  	"github.com/juju/juju/worker/metrics/spool"
    18  	"github.com/juju/juju/worker/uniter/runner/jujuc"
    19  )
    20  
    21  type metricsBatchSuite struct {
    22  }
    23  
    24  var _ = gc.Suite(&metricsBatchSuite{})
    25  
    26  func (s *metricsBatchSuite) TestAPIMetricBatch(c *gc.C) {
    27  	batches := []spool.MetricBatch{{
    28  		CharmURL: "local:trusty/test-charm",
    29  		UUID:     "test-uuid",
    30  		Created:  time.Now(),
    31  		Metrics: []jujuc.Metric{
    32  			{
    33  				Key:   "test-key-1",
    34  				Value: "test-value-1",
    35  				Time:  time.Now(),
    36  			}, {
    37  				Key:   "test-key-2",
    38  				Value: "test-value-2",
    39  				Time:  time.Now(),
    40  			},
    41  		},
    42  	}, {
    43  		CharmURL: "local:trusty/test-charm",
    44  		UUID:     "test-uuid",
    45  		Created:  time.Now(),
    46  		Metrics:  []jujuc.Metric{},
    47  	},
    48  	}
    49  	for _, batch := range batches {
    50  		apiBatch := spool.APIMetricBatch(batch)
    51  		c.Assert(apiBatch.Batch.UUID, gc.DeepEquals, batch.UUID)
    52  		c.Assert(apiBatch.Batch.CharmURL, gc.DeepEquals, batch.CharmURL)
    53  		c.Assert(apiBatch.Batch.Created, gc.DeepEquals, batch.Created)
    54  		c.Assert(len(apiBatch.Batch.Metrics), gc.Equals, len(batch.Metrics))
    55  		for i, metric := range batch.Metrics {
    56  			c.Assert(metric.Key, gc.DeepEquals, apiBatch.Batch.Metrics[i].Key)
    57  			c.Assert(metric.Value, gc.DeepEquals, apiBatch.Batch.Metrics[i].Value)
    58  			c.Assert(metric.Time, gc.DeepEquals, apiBatch.Batch.Metrics[i].Time)
    59  		}
    60  	}
    61  }
    62  
    63  func osDependentSockPath(c *gc.C) string {
    64  	sockPath := filepath.Join(c.MkDir(), "test.sock")
    65  	if runtime.GOOS == "windows" {
    66  		return `\\.\pipe` + sockPath[2:]
    67  	}
    68  	return sockPath
    69  }
    70  
    71  // testPaths implements Paths for tests that do touch the filesystem.
    72  type testPaths struct {
    73  	tools        string
    74  	charm        string
    75  	socket       string
    76  	metricsspool string
    77  }
    78  
    79  func newTestPaths(c *gc.C) testPaths {
    80  	return testPaths{
    81  		tools:        c.MkDir(),
    82  		charm:        c.MkDir(),
    83  		socket:       osDependentSockPath(c),
    84  		metricsspool: c.MkDir(),
    85  	}
    86  }
    87  
    88  func (p testPaths) GetMetricsSpoolDir() string {
    89  	return p.metricsspool
    90  }
    91  
    92  func (p testPaths) GetToolsDir() string {
    93  	return p.tools
    94  }
    95  
    96  func (p testPaths) GetCharmDir() string {
    97  	return p.charm
    98  }
    99  
   100  func (p testPaths) GetJujucSocket() string {
   101  	return p.socket
   102  }
   103  
   104  type metricsRecorderSuite struct {
   105  	testing.IsolationSuite
   106  
   107  	paths   testPaths
   108  	unitTag string
   109  }
   110  
   111  var _ = gc.Suite(&metricsRecorderSuite{})
   112  
   113  func (s *metricsRecorderSuite) SetUpTest(c *gc.C) {
   114  	s.IsolationSuite.SetUpTest(c)
   115  	s.paths = newTestPaths(c)
   116  	s.unitTag = names.NewUnitTag("test-unit/0").String()
   117  }
   118  
   119  func (s *metricsRecorderSuite) TestInit(c *gc.C) {
   120  	w, err := spool.NewJSONMetricRecorder(
   121  		spool.MetricRecorderConfig{
   122  			SpoolDir: s.paths.GetMetricsSpoolDir(),
   123  			Metrics:  map[string]corecharm.Metric{"pings": corecharm.Metric{}},
   124  			CharmURL: "local:precise/wordpress",
   125  			UnitTag:  s.unitTag,
   126  		})
   127  	c.Assert(err, jc.ErrorIsNil)
   128  	c.Assert(w, gc.NotNil)
   129  	err = w.AddMetric("pings", "5", time.Now())
   130  	c.Assert(err, jc.ErrorIsNil)
   131  	err = w.Close()
   132  	c.Assert(err, jc.ErrorIsNil)
   133  
   134  	r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir())
   135  	c.Assert(err, jc.ErrorIsNil)
   136  	batches, err := r.Read()
   137  	c.Assert(err, jc.ErrorIsNil)
   138  	c.Assert(batches, gc.HasLen, 1)
   139  	batch := batches[0]
   140  	c.Assert(batch.CharmURL, gc.Equals, "local:precise/wordpress")
   141  	c.Assert(batch.UUID, gc.Not(gc.Equals), "")
   142  	c.Assert(batch.Metrics, gc.HasLen, 1)
   143  	c.Assert(batch.Metrics[0].Key, gc.Equals, "pings")
   144  	c.Assert(batch.Metrics[0].Value, gc.Equals, "5")
   145  	c.Assert(batch.UnitTag, gc.Equals, s.unitTag)
   146  
   147  	err = r.Close()
   148  	c.Assert(err, jc.ErrorIsNil)
   149  }
   150  
   151  func (s *metricsRecorderSuite) TestUnknownMetricKey(c *gc.C) {
   152  	w, err := spool.NewJSONMetricRecorder(
   153  		spool.MetricRecorderConfig{
   154  			SpoolDir: s.paths.GetMetricsSpoolDir(),
   155  			Metrics:  map[string]corecharm.Metric{},
   156  			CharmURL: "local:precise/wordpress",
   157  			UnitTag:  s.unitTag,
   158  		})
   159  	c.Assert(err, jc.ErrorIsNil)
   160  	c.Assert(w, gc.NotNil)
   161  	err = w.AddMetric("pings", "5", time.Now())
   162  	c.Assert(err, gc.ErrorMatches, `metric key "pings" not declared by the charm`)
   163  	err = w.Close()
   164  	c.Assert(err, jc.ErrorIsNil)
   165  
   166  	r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir())
   167  	c.Assert(err, jc.ErrorIsNil)
   168  	batches, err := r.Read()
   169  	c.Assert(err, jc.ErrorIsNil)
   170  	c.Assert(batches, gc.HasLen, 0)
   171  }
   172  
   173  type metricsReaderSuite struct {
   174  	paths   testPaths
   175  	unitTag string
   176  
   177  	w *spool.JSONMetricRecorder
   178  }
   179  
   180  var _ = gc.Suite(&metricsReaderSuite{})
   181  
   182  func (s *metricsReaderSuite) SetUpTest(c *gc.C) {
   183  	s.paths = newTestPaths(c)
   184  	s.unitTag = names.NewUnitTag("test-unit/0").String()
   185  
   186  	var err error
   187  	s.w, err = spool.NewJSONMetricRecorder(
   188  		spool.MetricRecorderConfig{
   189  			SpoolDir: s.paths.GetMetricsSpoolDir(),
   190  			Metrics:  map[string]corecharm.Metric{"pings": corecharm.Metric{}},
   191  			CharmURL: "local:precise/wordpress",
   192  			UnitTag:  s.unitTag,
   193  		})
   194  
   195  	c.Assert(err, jc.ErrorIsNil)
   196  	err = s.w.AddMetric("pings", "5", time.Now())
   197  	c.Assert(err, jc.ErrorIsNil)
   198  	err = s.w.Close()
   199  	c.Assert(err, jc.ErrorIsNil)
   200  }
   201  
   202  func (s *metricsReaderSuite) TestTwoSimultaneousReaders(c *gc.C) {
   203  	r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir())
   204  	c.Assert(err, jc.ErrorIsNil)
   205  
   206  	r2, err := spool.NewJSONMetricReader(c.MkDir())
   207  	c.Assert(err, jc.ErrorIsNil)
   208  	c.Assert(r2, gc.NotNil)
   209  	err = r2.Close()
   210  	c.Assert(err, jc.ErrorIsNil)
   211  	err = r.Close()
   212  	c.Assert(err, jc.ErrorIsNil)
   213  
   214  }
   215  
   216  func (s *metricsReaderSuite) TestUnblockedReaders(c *gc.C) {
   217  	r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir())
   218  	c.Assert(err, jc.ErrorIsNil)
   219  	err = r.Close()
   220  	c.Assert(err, jc.ErrorIsNil)
   221  
   222  	r2, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir())
   223  	c.Assert(err, jc.ErrorIsNil)
   224  	c.Assert(r2, gc.NotNil)
   225  	err = r2.Close()
   226  	c.Assert(err, jc.ErrorIsNil)
   227  }
   228  
   229  func (s *metricsReaderSuite) TestRemoval(c *gc.C) {
   230  	r, err := spool.NewJSONMetricReader(s.paths.GetMetricsSpoolDir())
   231  	c.Assert(err, jc.ErrorIsNil)
   232  
   233  	batches, err := r.Read()
   234  	c.Assert(err, jc.ErrorIsNil)
   235  	for _, batch := range batches {
   236  		err := r.Remove(batch.UUID)
   237  		c.Assert(err, jc.ErrorIsNil)
   238  	}
   239  	err = r.Close()
   240  	c.Assert(err, jc.ErrorIsNil)
   241  
   242  	batches, err = r.Read()
   243  	c.Assert(err, jc.ErrorIsNil)
   244  	c.Assert(batches, gc.HasLen, 0)
   245  	err = r.Close()
   246  	c.Assert(err, jc.ErrorIsNil)
   247  }