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 }