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 }