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 }