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 }