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 }