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  }