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 }