github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/metricsender/metricsender_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package metricsender_test
     5  
     6  import (
     7  	"errors"
     8  	"time"
     9  
    10  	wireformat "github.com/juju/romulus/wireformat/metrics"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/apiserver/metricsender"
    15  	"github.com/juju/juju/apiserver/metricsender/testing"
    16  	jujutesting "github.com/juju/juju/juju/testing"
    17  	"github.com/juju/juju/state"
    18  	"github.com/juju/juju/testing/factory"
    19  )
    20  
    21  type MetricSenderSuite struct {
    22  	jujutesting.JujuConnSuite
    23  	unit *state.Unit
    24  }
    25  
    26  var _ = gc.Suite(&MetricSenderSuite{})
    27  
    28  var _ metricsender.MetricSender = (*testing.MockSender)(nil)
    29  
    30  var _ metricsender.MetricSender = (*metricsender.NopSender)(nil)
    31  
    32  func (s *MetricSenderSuite) SetUpTest(c *gc.C) {
    33  	s.JujuConnSuite.SetUpTest(c)
    34  	meteredCharm := s.Factory.MakeCharm(c, &factory.CharmParams{Name: "metered", URL: "cs:quantal/metered"})
    35  	meteredService := s.Factory.MakeService(c, &factory.ServiceParams{Charm: meteredCharm})
    36  	s.unit = s.Factory.MakeUnit(c, &factory.UnitParams{Service: meteredService, SetCharmURL: true})
    37  }
    38  
    39  func (s *MetricSenderSuite) TestToWire(c *gc.C) {
    40  	now := time.Now().Round(time.Second)
    41  	metric := s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Sent: false, Time: &now})
    42  	result := metricsender.ToWire(metric)
    43  	m := metric.Metrics()[0]
    44  	metrics := []wireformat.Metric{
    45  		{
    46  			Key:   m.Key,
    47  			Value: m.Value,
    48  			Time:  m.Time.UTC(),
    49  		},
    50  	}
    51  	expected := &wireformat.MetricBatch{
    52  		UUID:        metric.UUID(),
    53  		ModelUUID:   metric.ModelUUID(),
    54  		UnitName:    metric.Unit(),
    55  		CharmUrl:    metric.CharmURL(),
    56  		Created:     metric.Created().UTC(),
    57  		Metrics:     metrics,
    58  		Credentials: metric.Credentials(),
    59  	}
    60  	c.Assert(result, gc.DeepEquals, expected)
    61  }
    62  
    63  // TestSendMetrics creates 2 unsent metrics and a sent metric
    64  // and checks that the 2 unsent metrics get sent and have their
    65  // sent field set to true.
    66  func (s *MetricSenderSuite) TestSendMetrics(c *gc.C) {
    67  	var sender testing.MockSender
    68  	now := time.Now()
    69  	unsent1 := s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Time: &now})
    70  	unsent2 := s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Time: &now})
    71  	s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Sent: true, Time: &now})
    72  	err := metricsender.SendMetrics(s.State, &sender, 10)
    73  	c.Assert(err, jc.ErrorIsNil)
    74  	c.Assert(sender.Data, gc.HasLen, 1)
    75  	c.Assert(sender.Data[0], gc.HasLen, 2)
    76  
    77  	sent1, err := s.State.MetricBatch(unsent1.UUID())
    78  	c.Assert(err, jc.ErrorIsNil)
    79  	c.Assert(sent1.Sent(), jc.IsTrue)
    80  
    81  	sent2, err := s.State.MetricBatch(unsent2.UUID())
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	c.Assert(sent2.Sent(), jc.IsTrue)
    84  }
    85  
    86  // TestSendBulkMetrics tests the logic of splitting sends
    87  // into batches is done correctly. The batch size is changed
    88  // to send batches of 10 metrics. If we create 100 metrics 10 calls
    89  // will be made to the sender
    90  func (s *MetricSenderSuite) TestSendBulkMetrics(c *gc.C) {
    91  	var sender testing.MockSender
    92  	now := time.Now()
    93  	for i := 0; i < 100; i++ {
    94  		s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Time: &now})
    95  	}
    96  	err := metricsender.SendMetrics(s.State, &sender, 10)
    97  	c.Assert(err, jc.ErrorIsNil)
    98  
    99  	c.Assert(sender.Data, gc.HasLen, 10)
   100  	for i := 0; i < 10; i++ {
   101  		c.Assert(sender.Data, gc.HasLen, 10)
   102  	}
   103  }
   104  
   105  // TestDontSendWithNopSender check that if the default sender
   106  // is nil we don't send anything, but still mark the items as sent
   107  func (s *MetricSenderSuite) TestDontSendWithNopSender(c *gc.C) {
   108  	now := time.Now()
   109  	for i := 0; i < 3; i++ {
   110  		s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Sent: false, Time: &now})
   111  	}
   112  	err := metricsender.SendMetrics(s.State, metricsender.NopSender{}, 10)
   113  	c.Assert(err, jc.ErrorIsNil)
   114  	sent, err := s.State.CountOfSentMetrics()
   115  	c.Assert(err, jc.ErrorIsNil)
   116  	c.Assert(sent, gc.Equals, 3)
   117  }
   118  
   119  func (s *MetricSenderSuite) TestFailureIncrementsConsecutiveFailures(c *gc.C) {
   120  	sender := &testing.ErrorSender{Err: errors.New("something went wrong")}
   121  	now := time.Now()
   122  	for i := 0; i < 3; i++ {
   123  		s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Sent: false, Time: &now})
   124  	}
   125  	err := metricsender.SendMetrics(s.State, sender, 1)
   126  	c.Assert(err, gc.ErrorMatches, "something went wrong")
   127  	mm, err := s.State.MetricsManager()
   128  	c.Assert(err, jc.ErrorIsNil)
   129  	c.Assert(mm.ConsecutiveErrors(), gc.Equals, 1)
   130  }
   131  
   132  func (s *MetricSenderSuite) TestFailuresResetOnSuccessfulSend(c *gc.C) {
   133  	mm, err := s.State.MetricsManager()
   134  	c.Assert(err, jc.ErrorIsNil)
   135  	err = mm.IncrementConsecutiveErrors()
   136  	c.Assert(err, jc.ErrorIsNil)
   137  	now := time.Now()
   138  	for i := 0; i < 3; i++ {
   139  		s.Factory.MakeMetric(c, &factory.MetricParams{Unit: s.unit, Sent: false, Time: &now})
   140  	}
   141  	err = metricsender.SendMetrics(s.State, metricsender.NopSender{}, 10)
   142  	c.Assert(err, jc.ErrorIsNil)
   143  	mm, err = s.State.MetricsManager()
   144  	c.Assert(err, jc.ErrorIsNil)
   145  	c.Assert(mm.ConsecutiveErrors(), gc.Equals, 0)
   146  }