LEFT | RIGHT |
1 package server_test | 1 package server_test |
2 | 2 |
3 import ( | 3 import ( |
4 "fmt" | 4 "fmt" |
5 . "launchpad.net/gocheck" | 5 . "launchpad.net/gocheck" |
6 "launchpad.net/juju-core/cmd" | 6 "launchpad.net/juju-core/cmd" |
7 "launchpad.net/juju-core/cmd/jujuc/server" | 7 "launchpad.net/juju-core/cmd/jujuc/server" |
8 "launchpad.net/juju-core/state" | 8 "launchpad.net/juju-core/state" |
9 ) | 9 ) |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 func (s *RelationSetSuite) TestHelp(c *C) { | 22 func (s *RelationSetSuite) TestHelp(c *C) { |
23 for i, t := range helpTests { | 23 for i, t := range helpTests { |
24 c.Logf("test %d", i) | 24 c.Logf("test %d", i) |
25 hctx := s.GetHookContext(c, t.relid, "") | 25 hctx := s.GetHookContext(c, t.relid, "") |
26 com, err := hctx.NewCommand("relation-set") | 26 com, err := hctx.NewCommand("relation-set") |
27 c.Assert(err, IsNil) | 27 c.Assert(err, IsNil) |
28 ctx := dummyContext(c) | 28 ctx := dummyContext(c) |
29 code := cmd.Main(com, ctx, []string{"--help"}) | 29 code := cmd.Main(com, ctx, []string{"--help"}) |
30 c.Assert(code, Equals, 0) | 30 c.Assert(code, Equals, 0) |
31 c.Assert(bufferString(ctx.Stdout), Equals, "") | 31 c.Assert(bufferString(ctx.Stdout), Equals, "") |
32 » » c.Assert(bufferString(ctx.Stderr), Equals, fmt.Sprintf(`usage: r
elation-set [options] <key=value> [, ...] | 32 » » c.Assert(bufferString(ctx.Stderr), Equals, fmt.Sprintf(` |
| 33 usage: relation-set [options] key=value [key=value ...] |
33 purpose: set relation settings | 34 purpose: set relation settings |
34 | 35 |
35 options: | 36 options: |
36 -r (= "%s") | 37 -r (= "%s") |
37 relation id | 38 relation id |
38 `, t.expect)) | 39 `[1:], t.expect)) |
39 } | 40 } |
40 } | 41 } |
41 | 42 |
42 var relationSetInitTests = []struct { | 43 var relationSetInitTests = []struct { |
43 ctxrelid int | 44 ctxrelid int |
44 args []string | 45 args []string |
45 err string | 46 err string |
46 relid int | 47 relid int |
47 » settings map[string]interface{} | 48 » settings map[string]string |
48 }{ | 49 }{ |
49 » {-1, nil, `no relation specified`, 0, nil}, | 50 » { |
50 » {1, nil, `no settings specified`, 0, nil}, | 51 » » ctxrelid: -1, |
51 » {-1, []string{"-r", "one"}, `invalid relation id "one"`, 0, nil}, | 52 » » err: `no relation specified`, |
52 » {1, []string{"-r", "one"}, `invalid relation id "one"`, 0, nil}, | 53 » }, { |
53 » {-1, []string{"-r", "ignored:one"}, `invalid relation id "ignored:one"`,
0, nil}, | 54 » » ctxrelid: 1, |
54 » {1, []string{"-r", "ignored:one"}, `invalid relation id "ignored:one"`,
0, nil}, | 55 » » err: `expected "key=value" parameters, got nothing`, |
55 » {-1, []string{"-r", "2"}, `unknown relation id "2"`, 0, nil}, | 56 » }, { |
56 » {1, []string{"-r", "ignored:2"}, `unknown relation id "ignored:2"`, 0, n
il}, | 57 » » ctxrelid: -1, |
57 » {-1, []string{"-r", "ignored:0"}, `no settings specified`, 0, nil}, | 58 » » args: []string{"-r", "one"}, |
58 » {1, []string{"-r", "ignored:0"}, `no settings specified`, 0, nil}, | 59 » » err: `invalid relation id "one"`, |
59 » {-1, []string{"-r", "0"}, `no settings specified`, 0, nil}, | 60 » }, { |
60 » {1, []string{"-r", "0"}, `no settings specified`, 0, nil}, | 61 » » ctxrelid: 1, |
61 » {-1, []string{"-r", "1"}, `no settings specified`, 0, nil}, | 62 » » args: []string{"-r", "one"}, |
62 » {0, []string{"-r", "1"}, `no settings specified`, 0, nil}, | 63 » » err: `invalid relation id "one"`, |
63 » {1, []string{"foo='"}, `cannot parse "foo='": YAML error: .*`, 0, nil}, | 64 » }, |
64 » {1, []string{"=haha"}, `cannot parse "=haha": no key specified`, 0, nil}
, | 65 » { |
65 » {1, []string{"foo=bar"}, ``, 1, map[string]interface{}{"foo": "bar"}}, | 66 » » ctxrelid: -1, |
66 » {0, []string{"-r", "1", "foo=bar"}, ``, 1, map[string]interface{}{"foo":
"bar"}}, | 67 » » args: []string{"-r", "ignored:one"}, |
67 » {1, []string{"foo=123", "bar=true", "baz=4.5", "qux="}, ``, 1, map[strin
g]interface{}{ | 68 » » err: `invalid relation id "ignored:one"`, |
68 » » "foo": 123, "bar": true, "baz": 4.5, "qux": nil, | 69 » }, { |
69 » }}, | 70 » » ctxrelid: 1, |
| 71 » » args: []string{"-r", "ignored:one"}, err: `invalid relation
id "ignored:one"`, |
| 72 » }, { |
| 73 » » ctxrelid: -1, |
| 74 » » args: []string{"-r", "2"}, |
| 75 » » err: `unknown relation id "2"`, |
| 76 » }, { |
| 77 » » ctxrelid: 1, |
| 78 » » args: []string{"-r", "ignored:2"}, |
| 79 » » err: `unknown relation id "ignored:2"`, |
| 80 » }, |
| 81 » { |
| 82 » » ctxrelid: -1, |
| 83 » » args: []string{"-r", "ignored:0"}, |
| 84 » » err: `expected "key=value" parameters, got nothing`, |
| 85 » }, { |
| 86 » » ctxrelid: 1, |
| 87 » » args: []string{"-r", "ignored:0"}, |
| 88 » » err: `expected "key=value" parameters, got nothing`, |
| 89 » }, { |
| 90 » » ctxrelid: -1, |
| 91 » » args: []string{"-r", "0"}, |
| 92 » » err: `expected "key=value" parameters, got nothing`, |
| 93 » }, { |
| 94 » » ctxrelid: 1, |
| 95 » » args: []string{"-r", "0"}, |
| 96 » » err: `expected "key=value" parameters, got nothing`, |
| 97 » }, { |
| 98 » » ctxrelid: -1, |
| 99 » » args: []string{"-r", "1"}, |
| 100 » » err: `expected "key=value" parameters, got nothing`, |
| 101 » }, { |
| 102 » » ctxrelid: 0, |
| 103 » » args: []string{"-r", "1"}, |
| 104 » » err: `expected "key=value" parameters, got nothing`, |
| 105 » }, { |
| 106 » » ctxrelid: 1, |
| 107 » » args: []string{"haha"}, |
| 108 » » err: `expected "key=value", got "haha"`, |
| 109 » }, { |
| 110 » » ctxrelid: 1, |
| 111 » » args: []string{"=haha"}, |
| 112 » » err: `expected "key=value", got "=haha"`, |
| 113 » }, { |
| 114 » » ctxrelid: 1, |
| 115 » » args: []string{"foo="}, |
| 116 » » relid: 1, |
| 117 » » settings: map[string]string{"foo": ""}, |
| 118 » }, { |
| 119 » » ctxrelid: 1, |
| 120 » » args: []string{"foo='"}, |
| 121 » » relid: 1, |
| 122 » » settings: map[string]string{"foo": "'"}, |
| 123 » }, { |
| 124 » » ctxrelid: 1, |
| 125 » » args: []string{"foo=bar"}, |
| 126 » » relid: 1, |
| 127 » » settings: map[string]string{"foo": "bar"}, |
| 128 » }, { |
| 129 » » ctxrelid: 1, |
| 130 » » args: []string{"foo=bar=baz=qux"}, |
| 131 » » relid: 1, |
| 132 » » settings: map[string]string{"foo": "bar=baz=qux"}, |
| 133 » }, { |
| 134 » » ctxrelid: 1, |
| 135 » » args: []string{"foo=foo: bar"}, |
| 136 » » relid: 1, |
| 137 » » settings: map[string]string{"foo": "foo: bar"}, |
| 138 » }, { |
| 139 » » ctxrelid: 0, |
| 140 » » args: []string{"-r", "1", "foo=bar"}, |
| 141 » » relid: 1, |
| 142 » » settings: map[string]string{"foo": "bar"}, |
| 143 » }, { |
| 144 » » ctxrelid: 1, |
| 145 » » args: []string{"foo=123", "bar=true", "baz=4.5", "qux="}, |
| 146 » » relid: 1, |
| 147 » » settings: map[string]string{"foo": "123", "bar": "true", "baz":
"4.5", "qux": ""}, |
| 148 » }, |
70 } | 149 } |
71 | 150 |
72 func (s *RelationSetSuite) TestInit(c *C) { | 151 func (s *RelationSetSuite) TestInit(c *C) { |
73 for i, t := range relationSetInitTests { | 152 for i, t := range relationSetInitTests { |
74 c.Logf("test %d", i) | 153 c.Logf("test %d", i) |
75 hctx := s.GetHookContext(c, t.ctxrelid, "") | 154 hctx := s.GetHookContext(c, t.ctxrelid, "") |
76 com, err := hctx.NewCommand("relation-set") | 155 com, err := hctx.NewCommand("relation-set") |
77 c.Assert(err, IsNil) | 156 c.Assert(err, IsNil) |
78 err = com.Init(dummyFlagSet(), t.args) | 157 err = com.Init(dummyFlagSet(), t.args) |
79 if t.err == "" { | 158 if t.err == "" { |
80 c.Assert(err, IsNil) | 159 c.Assert(err, IsNil) |
81 rset := com.(*server.RelationSetCommand) | 160 rset := com.(*server.RelationSetCommand) |
82 c.Assert(rset.RelationId, Equals, t.relid) | 161 c.Assert(rset.RelationId, Equals, t.relid) |
83 c.Assert(rset.Settings, DeepEquals, t.settings) | 162 c.Assert(rset.Settings, DeepEquals, t.settings) |
84 } else { | 163 } else { |
85 c.Assert(err, ErrorMatches, t.err) | 164 c.Assert(err, ErrorMatches, t.err) |
86 } | 165 } |
87 } | 166 } |
88 } | 167 } |
89 | 168 |
| 169 // Tests start with a relation with the settings {"base": "value"} |
90 var relationSetRunTests = []struct { | 170 var relationSetRunTests = []struct { |
91 » settings map[string]interface{} | 171 » change map[string]string |
92 » expect map[string]interface{} | 172 » expect map[string]interface{} |
93 }{ | 173 }{ |
94 » {map[string]interface{}{ | 174 » { |
95 » » "base": nil, | 175 » » map[string]string{"base": ""}, |
96 » }, map[string]interface{}{}}, | 176 » » map[string]interface{}{}, |
97 » {map[string]interface{}{ | 177 » }, { |
98 » » "foo": "bar", | 178 » » map[string]string{"foo": "bar"}, |
99 » }, map[string]interface{}{ | 179 » » map[string]interface{}{"base": "value", "foo": "bar"}, |
100 » » "base": "value", | 180 » }, { |
101 » » "foo": "bar", | 181 » » map[string]string{"base": "changed"}, |
102 » }}, | 182 » » map[string]interface{}{"base": "changed"}, |
103 » {map[string]interface{}{ | 183 » }, |
104 » » "base": "changed", | |
105 » }, map[string]interface{}{ | |
106 » » "base": "changed", | |
107 » }}, | |
108 } | 184 } |
109 | 185 |
110 func (s *RelationSetSuite) TestRun(c *C) { | 186 func (s *RelationSetSuite) TestRun(c *C) { |
111 hctx := s.GetHookContext(c, 0, "") | 187 hctx := s.GetHookContext(c, 0, "") |
112 for i, t := range relationSetRunTests { | 188 for i, t := range relationSetRunTests { |
113 c.Logf("test %d", i) | 189 c.Logf("test %d", i) |
114 | 190 |
115 // Set base settings for this test's relations. | 191 // Set base settings for this test's relations. |
116 » » err := hctx.Relations[1].Flush(false) | 192 » » hctx.Relations[1].ClearCache() |
117 pristine := map[string]interface{}{"pristine": "untouched"} | 193 pristine := map[string]interface{}{"pristine": "untouched"} |
118 setSettings(c, s.relunits[0], pristine) | 194 setSettings(c, s.relunits[0], pristine) |
119 basic := map[string]interface{}{"base": "value"} | 195 basic := map[string]interface{}{"base": "value"} |
120 setSettings(c, s.relunits[1], basic) | 196 setSettings(c, s.relunits[1], basic) |
121 settings, err := s.relunits[1].ReadSettings("u/0") | 197 settings, err := s.relunits[1].ReadSettings("u/0") |
122 | 198 |
123 // Run the command. | 199 // Run the command. |
124 c.Assert(err, IsNil) | 200 c.Assert(err, IsNil) |
125 com, err := hctx.NewCommand("relation-set") | 201 com, err := hctx.NewCommand("relation-set") |
126 c.Assert(err, IsNil) | 202 c.Assert(err, IsNil) |
127 rset := com.(*server.RelationSetCommand) | 203 rset := com.(*server.RelationSetCommand) |
128 rset.RelationId = 1 | 204 rset.RelationId = 1 |
129 » » rset.Settings = t.settings | 205 » » rset.Settings = t.change |
130 ctx := dummyContext(c) | 206 ctx := dummyContext(c) |
131 err = com.Run(ctx) | 207 err = com.Run(ctx) |
132 c.Assert(err, IsNil) | 208 c.Assert(err, IsNil) |
133 | 209 |
134 // Check that the changes are present in the RelationContext's | 210 // Check that the changes are present in the RelationContext's |
135 // settings... | 211 // settings... |
136 node, err := hctx.Relations[1].Settings() | 212 node, err := hctx.Relations[1].Settings() |
137 c.Assert(err, IsNil) | 213 c.Assert(err, IsNil) |
138 c.Assert(node.Map(), DeepEquals, t.expect) | 214 c.Assert(node.Map(), DeepEquals, t.expect) |
139 | 215 |
140 // ...but are not persisted to state... | 216 // ...but are not persisted to state... |
141 settings, err = s.relunits[1].ReadSettings("u/0") | 217 settings, err = s.relunits[1].ReadSettings("u/0") |
142 c.Assert(err, IsNil) | 218 c.Assert(err, IsNil) |
143 c.Assert(settings, DeepEquals, basic) | 219 c.Assert(settings, DeepEquals, basic) |
144 | 220 |
145 » » // ...until the relation context is flushed. | 221 » » // ...until we ask for it. |
146 » » err = hctx.Relations[1].Flush(true) | 222 » » err = hctx.Relations[1].WriteSettings() |
147 c.Assert(err, IsNil) | 223 c.Assert(err, IsNil) |
148 settings, err = s.relunits[1].ReadSettings("u/0") | 224 settings, err = s.relunits[1].ReadSettings("u/0") |
149 c.Assert(settings, DeepEquals, t.expect) | 225 c.Assert(settings, DeepEquals, t.expect) |
150 | 226 |
151 // For paranoia's sake, check that the other relation's settings
have | 227 // For paranoia's sake, check that the other relation's settings
have |
152 // not been touched... | 228 // not been touched... |
153 settings, err = s.relunits[0].ReadSettings("u/0") | 229 settings, err = s.relunits[0].ReadSettings("u/0") |
154 c.Assert(err, IsNil) | 230 c.Assert(err, IsNil) |
155 c.Assert(settings, DeepEquals, pristine) | 231 c.Assert(settings, DeepEquals, pristine) |
156 | 232 |
157 // ...even when flushed. | 233 // ...even when flushed. |
158 » » err = hctx.Relations[0].Flush(true) | 234 » » err = hctx.Relations[0].WriteSettings() |
159 c.Assert(err, IsNil) | 235 c.Assert(err, IsNil) |
160 settings, err = s.relunits[0].ReadSettings("u/0") | 236 settings, err = s.relunits[0].ReadSettings("u/0") |
161 c.Assert(err, IsNil) | 237 c.Assert(err, IsNil) |
162 c.Assert(settings, DeepEquals, pristine) | 238 c.Assert(settings, DeepEquals, pristine) |
163 } | 239 } |
164 } | 240 } |
165 | 241 |
166 func setSettings(c *C, ru *state.RelationUnit, settings map[string]interface{})
{ | 242 func setSettings(c *C, ru *state.RelationUnit, settings map[string]interface{})
{ |
167 node, err := ru.Settings() | 243 node, err := ru.Settings() |
168 c.Assert(err, IsNil) | 244 c.Assert(err, IsNil) |
169 for _, k := range node.Keys() { | 245 for _, k := range node.Keys() { |
170 node.Delete(k) | 246 node.Delete(k) |
171 } | 247 } |
172 node.Update(settings) | 248 node.Update(settings) |
173 _, err = node.Write() | 249 _, err = node.Write() |
174 c.Assert(err, IsNil) | 250 c.Assert(err, IsNil) |
175 } | 251 } |
LEFT | RIGHT |