github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/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  	for i, t := range testCases {
   138  		c.Logf("test %d: %s", i, t.about)
   139  		hctx := s.GetHookContext(c, -1, "")
   140  		hctx.canAddMetrics = t.canAddMetrics
   141  		com, err := jujuc.NewCommand(hctx, cmdString(t.cmd[0]))
   142  		c.Assert(err, jc.ErrorIsNil)
   143  		ctx := testing.Context(c)
   144  		ret := cmd.Main(com, ctx, t.cmd[1:])
   145  		c.Check(ret, gc.Equals, t.result)
   146  		c.Check(bufferString(ctx.Stdout), gc.Equals, t.stdout)
   147  		c.Check(bufferString(ctx.Stderr), gc.Equals, t.stderr)
   148  		c.Check(hctx.metrics, gc.HasLen, len(t.expect))
   149  
   150  		sort.Sort(SortedMetrics(hctx.metrics))
   151  		sort.Sort(SortedMetrics(t.expect))
   152  
   153  		for i, expected := range t.expect {
   154  			c.Check(expected.Key, gc.Equals, hctx.metrics[i].Key)
   155  			c.Check(expected.Value, gc.Equals, hctx.metrics[i].Value)
   156  		}
   157  	}
   158  }
   159  
   160  type SortedMetrics []jujuc.Metric
   161  
   162  func (m SortedMetrics) Len() int           { return len(m) }
   163  func (m SortedMetrics) Swap(i, j int)      { m[i], m[j] = m[j], m[i] }
   164  func (m SortedMetrics) Less(i, j int) bool { return m[i].Key < m[j].Key }