github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/worker/uniter/runner/jujuc/add-metric_test.go (about)

     1  // Copyright 2012-2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package jujuc_test
     5  
     6  import (
     7  	"sort"
     8  	"time"
     9  
    10  	"github.com/juju/cmd"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/testing"
    15  	"github.com/juju/juju/worker/uniter/runner/jujuc"
    16  )
    17  
    18  type AddMetricSuite struct {
    19  	ContextSuite
    20  }
    21  
    22  var _ = gc.Suite(&AddMetricSuite{})
    23  
    24  func (s *AddMetricSuite) TestHelp(c *gc.C) {
    25  	hctx := s.GetHookContext(c, -1, "")
    26  	com, err := jujuc.NewCommand(hctx, "add-metric")
    27  	c.Assert(err, jc.ErrorIsNil)
    28  	ctx := testing.Context(c)
    29  	code := cmd.Main(com, ctx, []string{"--help"})
    30  	c.Assert(code, gc.Equals, 0)
    31  	c.Assert(bufferString(ctx.Stdout), gc.Equals, `
    32  usage: add-metric key1=value1 [key2=value2 ...]
    33  purpose: send metrics
    34  `[1:])
    35  	c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
    36  }
    37  
    38  func (s *AddMetricSuite) TestAddMetric(c *gc.C) {
    39  	testCases := []struct {
    40  		about         string
    41  		cmd           []string
    42  		canAddMetrics bool
    43  		result        int
    44  		stdout        string
    45  		stderr        string
    46  		expect        []jujuc.Metric
    47  	}{
    48  		{
    49  			"add single metric",
    50  			[]string{"add-metric", "key=50"},
    51  			true,
    52  			0,
    53  			"",
    54  			"",
    55  			[]jujuc.Metric{{"key", "50", time.Now()}},
    56  		}, {
    57  			"no parameters error",
    58  			[]string{"add-metric"},
    59  			true,
    60  			2,
    61  			"",
    62  			"error: no metrics specified\n",
    63  			nil,
    64  		}, {
    65  			"invalid argument format",
    66  			[]string{"add-metric", "key"},
    67  			true,
    68  			2,
    69  			"",
    70  			"error: expected \"key=value\", got \"key\"\n",
    71  			nil,
    72  		}, {
    73  			"invalid argument format",
    74  			[]string{"add-metric", "=key"},
    75  			true,
    76  			2,
    77  			"",
    78  			"error: expected \"key=value\", got \"=key\"\n",
    79  			nil,
    80  		}, {
    81  			"multiple metrics",
    82  			[]string{"add-metric", "key=60", "key2=50.4"},
    83  			true,
    84  			0,
    85  			"",
    86  			"",
    87  			[]jujuc.Metric{{"key", "60", time.Now()}, {"key2", "50.4", time.Now()}},
    88  		}, {
    89  			"multiple metrics, matching keys",
    90  			[]string{"add-metric", "key=60", "key=50.4"},
    91  			true,
    92  			2,
    93  			"",
    94  			"error: key \"key\" specified more than once\n",
    95  			nil,
    96  		}, {
    97  			"can't add metrics",
    98  			[]string{"add-metric", "key=60", "key2=50.4"},
    99  			false,
   100  			1,
   101  			"",
   102  			"error: cannot record metric: metrics disabled\n",
   103  			nil,
   104  		}}
   105  	for i, t := range testCases {
   106  		c.Logf("test %d: %s", i, t.about)
   107  		hctx := s.GetHookContext(c, -1, "")
   108  		hctx.canAddMetrics = t.canAddMetrics
   109  		com, err := jujuc.NewCommand(hctx, t.cmd[0])
   110  		c.Assert(err, jc.ErrorIsNil)
   111  		ctx := testing.Context(c)
   112  		ret := cmd.Main(com, ctx, t.cmd[1:])
   113  		c.Check(ret, gc.Equals, t.result)
   114  		c.Check(bufferString(ctx.Stdout), gc.Equals, t.stdout)
   115  		c.Check(bufferString(ctx.Stderr), gc.Equals, t.stderr)
   116  		c.Check(hctx.metrics, gc.HasLen, len(t.expect))
   117  
   118  		sort.Sort(SortedMetrics(hctx.metrics))
   119  		sort.Sort(SortedMetrics(t.expect))
   120  
   121  		for i, expected := range t.expect {
   122  			c.Check(expected.Key, gc.Equals, hctx.metrics[i].Key)
   123  			c.Check(expected.Value, gc.Equals, hctx.metrics[i].Value)
   124  		}
   125  	}
   126  }
   127  
   128  type SortedMetrics []jujuc.Metric
   129  
   130  func (m SortedMetrics) Len() int           { return len(m) }
   131  func (m SortedMetrics) Swap(i, j int)      { m[i], m[j] = m[j], m[i] }
   132  func (m SortedMetrics) Less(i, j int) bool { return m[i].Key < m[j].Key }