github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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  
    34  Summary:
    35  add metrics
    36  `[1:])
    37  	c.Assert(bufferString(ctx.Stderr), gc.Equals, "")
    38  }
    39  
    40  func (s *AddMetricSuite) TestAddMetric(c *gc.C) {
    41  	testCases := []struct {
    42  		about         string
    43  		cmd           []string
    44  		canAddMetrics bool
    45  		result        int
    46  		stdout        string
    47  		stderr        string
    48  		expect        []jujuc.Metric
    49  	}{
    50  		{
    51  			"add single metric",
    52  			[]string{"add-metric", "key=50"},
    53  			true,
    54  			0,
    55  			"",
    56  			"",
    57  			[]jujuc.Metric{{"key", "50", time.Now()}},
    58  		}, {
    59  			"no parameters error",
    60  			[]string{"add-metric"},
    61  			true,
    62  			2,
    63  			"",
    64  			"error: no metrics specified\n",
    65  			nil,
    66  		}, {
    67  			"invalid argument format",
    68  			[]string{"add-metric", "key"},
    69  			true,
    70  			2,
    71  			"",
    72  			"error: expected \"key=value\", got \"key\"\n",
    73  			nil,
    74  		}, {
    75  			"invalid argument format",
    76  			[]string{"add-metric", "=key"},
    77  			true,
    78  			2,
    79  			"",
    80  			"error: expected \"key=value\", got \"=key\"\n",
    81  			nil,
    82  		}, {
    83  			"invalid argument format, whitespace key",
    84  			[]string{"add-metric", " =value"},
    85  			true,
    86  			2,
    87  			"",
    88  			"error: expected \"key=value\", got \"=value\"\n",
    89  			nil,
    90  		}, {
    91  			"invalid argument format, whitespace key and value",
    92  			[]string{"add-metric", " \t =  \n"},
    93  			true,
    94  			2,
    95  			"",
    96  			"error: expected \"key=value\", got \"=\"\n",
    97  			nil,
    98  		}, {
    99  			"invalid argument format, whitespace value",
   100  			[]string{"add-metric", " key =  "},
   101  			true,
   102  			2,
   103  			"",
   104  			"error: expected \"key=value\", got \"key=\"\n",
   105  			nil,
   106  		}, {
   107  			"multiple metrics",
   108  			[]string{"add-metric", "key=60", "key2=50.4"},
   109  			true,
   110  			0,
   111  			"",
   112  			"",
   113  			[]jujuc.Metric{{"key", "60", time.Now()}, {"key2", "50.4", time.Now()}},
   114  		}, {
   115  			"multiple metrics, matching keys",
   116  			[]string{"add-metric", "key=60", "key=50.4"},
   117  			true,
   118  			2,
   119  			"",
   120  			"error: key \"key\" specified more than once\n",
   121  			nil,
   122  		}, {
   123  			"newline in metric value",
   124  			[]string{"add-metric", "key=60\n", "key2\t=\t30", "\tkey3 =\t15"},
   125  			true,
   126  			0,
   127  			"",
   128  			"",
   129  			[]jujuc.Metric{{"key", "60", time.Now()}, {"key2", "30", time.Now()}, {"key3", "15", time.Now()}},
   130  		}, {
   131  			"can't add metrics",
   132  			[]string{"add-metric", "key=60", "key2=50.4"},
   133  			false,
   134  			1,
   135  			"",
   136  			"error: cannot record metric: metrics disabled\n",
   137  			nil,
   138  		}, {
   139  			"cannot add builtin metric",
   140  			[]string{"add-metric", "juju-key=50"},
   141  			true,
   142  			1,
   143  			"",
   144  			"error: juju-key uses a reserved prefix\n",
   145  			nil,
   146  		}}
   147  	for i, t := range testCases {
   148  		c.Logf("test %d: %s", i, t.about)
   149  		hctx := s.GetHookContext(c, -1, "")
   150  		hctx.canAddMetrics = t.canAddMetrics
   151  		com, err := jujuc.NewCommand(hctx, cmdString(t.cmd[0]))
   152  		c.Assert(err, jc.ErrorIsNil)
   153  		ctx := testing.Context(c)
   154  		ret := cmd.Main(com, ctx, t.cmd[1:])
   155  		c.Check(ret, gc.Equals, t.result)
   156  		c.Check(bufferString(ctx.Stdout), gc.Equals, t.stdout)
   157  		c.Check(bufferString(ctx.Stderr), gc.Equals, t.stderr)
   158  		c.Check(hctx.metrics, gc.HasLen, len(t.expect))
   159  
   160  		sort.Sort(SortedMetrics(hctx.metrics))
   161  		sort.Sort(SortedMetrics(t.expect))
   162  
   163  		for i, expected := range t.expect {
   164  			c.Check(expected.Key, gc.Equals, hctx.metrics[i].Key)
   165  			c.Check(expected.Value, gc.Equals, hctx.metrics[i].Value)
   166  		}
   167  	}
   168  }
   169  
   170  type SortedMetrics []jujuc.Metric
   171  
   172  func (m SortedMetrics) Len() int           { return len(m) }
   173  func (m SortedMetrics) Swap(i, j int)      { m[i], m[j] = m[j], m[i] }
   174  func (m SortedMetrics) Less(i, j int) bool { return m[i].Key < m[j].Key }