github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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, cmdString("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  			"invalid argument format, whitespace key",
    82  			[]string{"add-metric", " =value"},
    83  			true,
    84  			2,
    85  			"",
    86  			"error: expected \"key=value\", got \"=value\"\n",
    87  			nil,
    88  		}, {
    89  			"invalid argument format, whitespace key and value",
    90  			[]string{"add-metric", " \t =  \n"},
    91  			true,
    92  			2,
    93  			"",
    94  			"error: expected \"key=value\", got \"=\"\n",
    95  			nil,
    96  		}, {
    97  			"invalid argument format, whitespace value",
    98  			[]string{"add-metric", " key =  "},
    99  			true,
   100  			2,
   101  			"",
   102  			"error: expected \"key=value\", got \"key=\"\n",
   103  			nil,
   104  		}, {
   105  			"multiple metrics",
   106  			[]string{"add-metric", "key=60", "key2=50.4"},
   107  			true,
   108  			0,
   109  			"",
   110  			"",
   111  			[]jujuc.Metric{{"key", "60", time.Now()}, {"key2", "50.4", time.Now()}},
   112  		}, {
   113  			"multiple metrics, matching keys",
   114  			[]string{"add-metric", "key=60", "key=50.4"},
   115  			true,
   116  			2,
   117  			"",
   118  			"error: key \"key\" specified more than once\n",
   119  			nil,
   120  		}, {
   121  			"newline in metric value",
   122  			[]string{"add-metric", "key=60\n", "key2\t=\t30", "\tkey3 =\t15"},
   123  			true,
   124  			0,
   125  			"",
   126  			"",
   127  			[]jujuc.Metric{{"key", "60", time.Now()}, {"key2", "30", time.Now()}, {"key3", "15", time.Now()}},
   128  		}, {
   129  			"can't add metrics",
   130  			[]string{"add-metric", "key=60", "key2=50.4"},
   131  			false,
   132  			1,
   133  			"",
   134  			"error: cannot record metric: metrics disabled\n",
   135  			nil,
   136  		}, {
   137  			"cannot add builtin metric",
   138  			[]string{"add-metric", "juju-key=50"},
   139  			true,
   140  			1,
   141  			"",
   142  			"error: juju-key uses a reserved prefix\n",
   143  			nil,
   144  		}}
   145  	for i, t := range testCases {
   146  		c.Logf("test %d: %s", i, t.about)
   147  		hctx := s.GetHookContext(c, -1, "")
   148  		hctx.canAddMetrics = t.canAddMetrics
   149  		com, err := jujuc.NewCommand(hctx, cmdString(t.cmd[0]))
   150  		c.Assert(err, jc.ErrorIsNil)
   151  		ctx := testing.Context(c)
   152  		ret := cmd.Main(com, ctx, t.cmd[1:])
   153  		c.Check(ret, gc.Equals, t.result)
   154  		c.Check(bufferString(ctx.Stdout), gc.Equals, t.stdout)
   155  		c.Check(bufferString(ctx.Stderr), gc.Equals, t.stderr)
   156  		c.Check(hctx.metrics, gc.HasLen, len(t.expect))
   157  
   158  		sort.Sort(SortedMetrics(hctx.metrics))
   159  		sort.Sort(SortedMetrics(t.expect))
   160  
   161  		for i, expected := range t.expect {
   162  			c.Check(expected.Key, gc.Equals, hctx.metrics[i].Key)
   163  			c.Check(expected.Value, gc.Equals, hctx.metrics[i].Value)
   164  		}
   165  	}
   166  }
   167  
   168  type SortedMetrics []jujuc.Metric
   169  
   170  func (m SortedMetrics) Len() int           { return len(m) }
   171  func (m SortedMetrics) Swap(i, j int)      { m[i], m[j] = m[j], m[i] }
   172  func (m SortedMetrics) Less(i, j int) bool { return m[i].Key < m[j].Key }