func (s *senderSuite) TestHandler(c *gc.C) { apiSender := newTestAPIMetricSender() tmpDir := c.MkDir() metricFactory := &stubMetricFactory{ &testing.Stub{}, tmpDir, } declaredMetrics := map[string]corecharm.Metric{ "pings": corecharm.Metric{Description: "test pings", Type: corecharm.MetricTypeAbsolute}, } recorder, err := metricFactory.Recorder(declaredMetrics, "local:trusty/testcharm", "testcharm/0") c.Assert(err, jc.ErrorIsNil) err = recorder.AddMetric("pings", "50", time.Now()) c.Assert(err, jc.ErrorIsNil) err = recorder.Close() c.Assert(err, jc.ErrorIsNil) metricSender, err := sender.NewSender(apiSender, s.metricfactory, s.socketDir, "") c.Assert(err, jc.ErrorIsNil) conn := &mockConnection{data: []byte(fmt.Sprintf("%v\n", tmpDir))} err = metricSender.Handle(conn) c.Assert(err, jc.ErrorIsNil) c.Assert(apiSender.batches, gc.HasLen, 1) c.Assert(apiSender.batches[0].Tag, gc.Equals, "testcharm/0") c.Assert(apiSender.batches[0].Batch.CharmURL, gc.Equals, "local:trusty/testcharm") c.Assert(apiSender.batches[0].Batch.Metrics, gc.HasLen, 1) c.Assert(apiSender.batches[0].Batch.Metrics[0].Key, gc.Equals, "pings") c.Assert(apiSender.batches[0].Batch.Metrics[0].Value, gc.Equals, "50") }
func (s *senderSuite) TestNoSpoolDirectory(c *gc.C) { apiSender := newTestAPIMetricSender() metricfactory := &stubMetricFactory{ &testing.Stub{}, "/some/random/spool/dir", } metricSender := sender.NewSender(apiSender, metricfactory) stopCh := make(chan struct{}) err := metricSender.Do(stopCh) c.Assert(err, gc.ErrorMatches, `failed to open spool directory "/some/random/spool/dir": .*`) c.Assert(apiSender.batches, gc.HasLen, 0) }
func (s *senderSuite) TestMetricSendingSuccess(c *gc.C) { apiSender := newTestAPIMetricSender() metricSender := sender.NewSender(apiSender, s.metricfactory) stopCh := make(chan struct{}) err := metricSender.Do(stopCh) c.Assert(err, jc.ErrorIsNil) c.Assert(apiSender.batches, gc.HasLen, 1) reader, err := spool.NewJSONMetricReader(s.spoolDir) c.Assert(err, jc.ErrorIsNil) batches, err := reader.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 0) }
func (s *senderSuite) TestNoMetricsToSend(c *gc.C) { apiSender := newTestAPIMetricSender() newTmpSpoolDir := c.MkDir() metricfactory := &stubMetricFactory{ &testing.Stub{}, newTmpSpoolDir, } metricSender := sender.NewSender(apiSender, metricfactory) stopCh := make(chan struct{}) err := metricSender.Do(stopCh) c.Assert(err, jc.ErrorIsNil) c.Assert(apiSender.batches, gc.HasLen, 0) }
func (s *senderSuite) TestSendingFails(c *gc.C) { apiSender := newTestAPIMetricSender() select { case apiSender.sendError <- errors.New("something went wrong"): default: c.Fatalf("blocked error channel") } metricSender := sender.NewSender(apiSender, s.metricfactory) stopCh := make(chan struct{}) err := metricSender.Do(stopCh) c.Assert(err, gc.ErrorMatches, "something went wrong") c.Assert(apiSender.batches, gc.HasLen, 1) reader, err := spool.NewJSONMetricReader(s.spoolDir) c.Assert(err, jc.ErrorIsNil) batches, err := reader.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 1) }
func (s *senderSuite) TestSendingGetDuplicate(c *gc.C) { apiSender := newTestAPIMetricSender() apiErr := ¶ms.Error{Message: "already exists", Code: params.CodeAlreadyExists} select { case apiSender.errors <- apiErr: default: c.Fatalf("blocked error channel") } metricSender := sender.NewSender(apiSender, s.metricfactory) stopCh := make(chan struct{}) err := metricSender.Do(stopCh) c.Assert(err, jc.ErrorIsNil) c.Assert(apiSender.batches, gc.HasLen, 1) reader, err := spool.NewJSONMetricReader(s.spoolDir) c.Assert(err, jc.ErrorIsNil) batches, err := reader.Read() c.Assert(err, jc.ErrorIsNil) c.Assert(batches, gc.HasLen, 0) }