github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/worker/uniter/metrics/metrics_test.go (about)

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