github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/cmd/juju/metricsdebug/metrics_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package metricsdebug_test 5 6 import ( 7 stdtesting "testing" 8 "time" 9 10 "github.com/juju/cmd/cmdtesting" 11 "github.com/juju/errors" 12 "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/apiserver/params" 17 "github.com/juju/juju/cmd/juju/metricsdebug" 18 "github.com/juju/juju/cmd/modelcmd" 19 coretesting "github.com/juju/juju/testing" 20 ) 21 22 func TestPackage(t *stdtesting.T) { 23 gc.TestingT(t) 24 } 25 26 type mockGetMetricsClient struct { 27 testing.Stub 28 metrics []params.MetricResult 29 } 30 31 func (m *mockGetMetricsClient) GetMetrics(tags ...string) ([]params.MetricResult, error) { 32 m.AddCall("GetMetrics", tags) 33 return m.metrics, m.NextErr() 34 } 35 36 func (m *mockGetMetricsClient) Close() error { 37 m.AddCall("Close") 38 return m.NextErr() 39 } 40 41 type metricsSuite struct { 42 coretesting.FakeJujuXDGDataHomeSuite 43 44 client *mockGetMetricsClient 45 } 46 47 var _ = gc.Suite(&metricsSuite{}) 48 49 func (s *metricsSuite) SetUpTest(c *gc.C) { 50 s.FakeJujuXDGDataHomeSuite.SetUpTest(c) 51 s.client = &mockGetMetricsClient{Stub: testing.Stub{}} 52 s.PatchValue(metricsdebug.NewClient, func(_ modelcmd.ModelCommandBase) (metricsdebug.GetMetricsClient, error) { 53 return s.client, nil 54 }) 55 } 56 57 func (s *metricsSuite) TestDefaultTabulatFormat(c *gc.C) { 58 s.client.metrics = []params.MetricResult{{ 59 Unit: "unit-metered-0", 60 Key: "pings", 61 Value: "5.0", 62 Time: time.Date(2016, 8, 22, 12, 02, 03, 0, time.UTC), 63 }, { 64 Unit: "unit-metered-0", 65 Key: "pongs", 66 Value: "15.0", 67 Time: time.Date(2016, 8, 22, 12, 02, 04, 0, time.UTC), 68 }} 69 ctx, err := coretesting.RunCommand(c, metricsdebug.New(), "metered/0") 70 c.Assert(err, jc.ErrorIsNil) 71 s.client.CheckCall(c, 0, "GetMetrics", []string{"unit-metered-0"}) 72 c.Assert(cmdtesting.Stdout(ctx), gc.Equals, `UNIT TIMESTAMP METRIC VALUE 73 unit-metered-0 2016-08-22T12:02:03Z pings 5.0 74 unit-metered-0 2016-08-22T12:02:04Z pongs 15.0 75 `) 76 } 77 78 func (s *metricsSuite) TestJSONFormat(c *gc.C) { 79 s.client.metrics = []params.MetricResult{{ 80 Unit: "unit-metered-0", 81 Key: "pings", 82 Value: "5.0", 83 Time: time.Date(2016, 8, 22, 12, 02, 03, 0, time.UTC), 84 }, { 85 Unit: "unit-metered-0", 86 Key: "pongs", 87 Value: "15.0", 88 Time: time.Date(2016, 8, 22, 12, 02, 04, 0, time.UTC), 89 }} 90 ctx, err := coretesting.RunCommand(c, metricsdebug.New(), "metered", "--format", "json") 91 c.Assert(err, jc.ErrorIsNil) 92 s.client.CheckCall(c, 0, "GetMetrics", []string{"application-metered"}) 93 c.Assert(cmdtesting.Stdout(ctx), gc.Equals, `[{"unit":"unit-metered-0","timestamp":"2016-08-22T12:02:03Z","metric":"pings","value":"5.0"},{"unit":"unit-metered-0","timestamp":"2016-08-22T12:02:04Z","metric":"pongs","value":"15.0"}] 94 `) 95 } 96 97 func (s *metricsSuite) TestYAMLFormat(c *gc.C) { 98 s.client.metrics = []params.MetricResult{{ 99 Unit: "unit-metered-0", 100 Key: "pings", 101 Value: "5.0", 102 Time: time.Date(2016, 8, 22, 12, 02, 03, 0, time.UTC), 103 }, { 104 Unit: "unit-metered-0", 105 Key: "pongs", 106 Value: "15.0", 107 Time: time.Date(2016, 8, 22, 12, 02, 04, 0, time.UTC), 108 }} 109 ctx, err := coretesting.RunCommand(c, metricsdebug.New(), "metered", "--format", "yaml") 110 c.Assert(err, jc.ErrorIsNil) 111 s.client.CheckCall(c, 0, "GetMetrics", []string{"application-metered"}) 112 c.Assert(cmdtesting.Stdout(ctx), gc.Equals, `- unit: unit-metered-0 113 timestamp: 2016-08-22T12:02:03Z 114 metric: pings 115 value: "5.0" 116 - unit: unit-metered-0 117 timestamp: 2016-08-22T12:02:04Z 118 metric: pongs 119 value: "15.0" 120 `) 121 } 122 123 func (s *metricsSuite) TestAll(c *gc.C) { 124 _, err := coretesting.RunCommand(c, metricsdebug.New(), "--all") 125 c.Assert(err, jc.ErrorIsNil) 126 s.client.CheckCall(c, 0, "GetMetrics", []string(nil)) 127 } 128 129 func (s *metricsSuite) TestAllWithExtraArgs(c *gc.C) { 130 _, err := coretesting.RunCommand(c, metricsdebug.New(), "--all", "metered") 131 c.Assert(err, gc.ErrorMatches, "cannot use --all with additional entities") 132 } 133 134 func (s *metricsSuite) TestInvalidUnitName(c *gc.C) { 135 _, err := coretesting.RunCommand(c, metricsdebug.New(), "metered-/0") 136 c.Assert(err, gc.ErrorMatches, `"metered-/0" is not a valid unit or application`) 137 } 138 139 func (s *metricsSuite) TestAPIClientError(c *gc.C) { 140 s.client.SetErrors(errors.New("a silly error")) 141 _, err := coretesting.RunCommand(c, metricsdebug.New(), "metered/0") 142 c.Assert(err, gc.ErrorMatches, `a silly error`) 143 } 144 145 func (s *metricsSuite) TestNoArgs(c *gc.C) { 146 _, err := coretesting.RunCommand(c, metricsdebug.New()) 147 c.Assert(err, gc.ErrorMatches, "you need to specify at least one unit or application") 148 }