19
19
from heat.common import exception
20
20
from heat.engine import parameters
21
from heat.engine import template
23
24
class ParameterTest(testtools.TestCase):
26
def new_parameter(self, name, schema, value=None,
28
tmpl = template.Template({template.PARAMETERS: {name:
30
schema = tmpl.param_schemata()[name]
31
return parameters.Parameter(name, schema, value,
24
34
def test_new_string(self):
25
p = parameters.Parameter('p', {'Type': 'String'}, validate_value=False)
35
p = self.new_parameter('p', {'Type': 'String'}, validate_value=False)
26
36
self.assertTrue(isinstance(p, parameters.StringParam))
28
38
def test_new_number(self):
29
p = parameters.Parameter('p', {'Type': 'Number'}, validate_value=False)
39
p = self.new_parameter('p', {'Type': 'Number'}, validate_value=False)
30
40
self.assertTrue(isinstance(p, parameters.NumberParam))
32
42
def test_new_list(self):
33
p = parameters.Parameter('p', {'Type': 'CommaDelimitedList'},
43
p = self.new_parameter('p', {'Type': 'CommaDelimitedList'},
35
45
self.assertTrue(isinstance(p, parameters.CommaDelimitedListParam))
37
47
def test_new_json(self):
38
p = parameters.Parameter('p', {'Type': 'Json'}, validate_value=False)
48
p = self.new_parameter('p', {'Type': 'Json'}, validate_value=False)
39
49
self.assertTrue(isinstance(p, parameters.JsonParam))
41
51
def test_new_bad_type(self):
42
self.assertRaises(ValueError, parameters.Parameter,
43
'p', {'Type': 'List'})
52
self.assertRaises(ValueError, self.new_parameter, 'p',
45
55
def test_new_no_type(self):
46
self.assertRaises(KeyError, parameters.Parameter,
56
self.assertRaises(KeyError, self.new_parameter,
47
57
'p', {'Default': 'blarg'})
49
59
def test_default_no_override(self):
50
p = parameters.Parameter('defaulted', {'Type': 'String',
60
p = self.new_parameter('defaulted', {'Type': 'String',
52
62
self.assertTrue(p.has_default())
53
63
self.assertEqual(p.default(), 'blarg')
54
64
self.assertEqual(p.value(), 'blarg')
56
66
def test_default_override(self):
57
p = parameters.Parameter('defaulted',
67
p = self.new_parameter('defaulted',
61
71
self.assertTrue(p.has_default())
62
72
self.assertEqual(p.default(), 'blarg')
63
73
self.assertEqual(p.value(), 'wibble')
76
86
self.fail('ValueError not raised')
78
88
def test_no_echo_true(self):
79
p = parameters.Parameter('anechoic',
89
p = self.new_parameter('anechoic',
83
93
self.assertTrue(p.no_echo())
84
94
self.assertNotEqual(str(p), 'wibble')
86
96
def test_no_echo_true_caps(self):
87
p = parameters.Parameter('anechoic',
97
p = self.new_parameter('anechoic',
91
101
self.assertTrue(p.no_echo())
92
102
self.assertNotEqual(str(p), 'wibble')
94
104
def test_no_echo_false(self):
95
p = parameters.Parameter('echoic',
105
p = self.new_parameter('echoic',
99
109
self.assertFalse(p.no_echo())
100
110
self.assertEqual(str(p), 'wibble')
102
112
def test_description(self):
103
113
description = 'Description of the parameter'
104
p = parameters.Parameter('p', {'Type': 'String',
105
'Description': description},
106
validate_value=False)
114
p = self.new_parameter('p', {'Type': 'String',
115
'Description': description},
116
validate_value=False)
107
117
self.assertEqual(p.description(), description)
109
119
def test_no_description(self):
110
p = parameters.Parameter('p', {'Type': 'String'}, validate_value=False)
120
p = self.new_parameter('p', {'Type': 'String'}, validate_value=False)
111
121
self.assertEqual(p.description(), '')
113
123
def test_string_len_good(self):
114
124
schema = {'Type': 'String',
115
125
'MinLength': '3',
116
126
'MaxLength': '3'}
117
p = parameters.Parameter('p', schema, 'foo')
127
p = self.new_parameter('p', schema, 'foo')
118
128
self.assertEqual(p.value(), 'foo')
120
130
def test_string_underflow(self):
144
154
def test_string_pattern_good(self):
145
155
schema = {'Type': 'String',
146
156
'AllowedPattern': '[a-z]*'}
147
p = parameters.Parameter('p', schema, 'foo')
157
p = self.new_parameter('p', schema, 'foo')
148
158
self.assertEqual(p.value(), 'foo')
150
160
def test_string_pattern_bad_prefix(self):
174
184
def test_string_value_list_good(self):
175
185
schema = {'Type': 'String',
176
186
'AllowedValues': ['foo', 'bar', 'baz']}
177
p = parameters.Parameter('p', schema, 'bar')
187
p = self.new_parameter('p', schema, 'bar')
178
188
self.assertEqual(p.value(), 'bar')
180
190
def test_string_value_list_bad(self):
193
203
schema = {'Type': 'Number',
196
p = parameters.Parameter('p', schema, '3')
206
p = self.new_parameter('p', schema, '3')
197
207
self.assertEqual(p.value(), '3')
199
209
def test_number_float_good(self):
200
210
schema = {'Type': 'Number',
201
211
'MinValue': '3.0',
202
212
'MaxValue': '3.0'}
203
p = parameters.Parameter('p', schema, '3.0')
213
p = self.new_parameter('p', schema, '3.0')
204
214
self.assertEqual(p.value(), '3.0')
206
216
def test_number_low(self):
230
240
def test_number_value_list_good(self):
231
241
schema = {'Type': 'Number',
232
242
'AllowedValues': ['1', '3', '5']}
233
p = parameters.Parameter('p', schema, '5')
243
p = self.new_parameter('p', schema, '5')
234
244
self.assertEqual(p.value(), '5')
236
246
def test_number_value_list_bad(self):
248
258
def test_list_value_list_good(self):
249
259
schema = {'Type': 'CommaDelimitedList',
250
260
'AllowedValues': ['foo', 'bar', 'baz']}
251
p = parameters.Parameter('p', schema, 'baz,foo,bar')
261
p = self.new_parameter('p', schema, 'baz,foo,bar')
252
262
self.assertEqual(p.value(), 'baz,foo,bar')
254
264
def test_list_value_list_bad(self):
256
266
'ConstraintDescription': 'wibble',
257
267
'AllowedValues': ['foo', 'bar', 'baz']}
259
parameters.Parameter('p', schema, 'foo,baz,blarg')
269
self.new_parameter('p', schema, 'foo,baz,blarg')
260
270
except ValueError as ve:
262
272
self.assertNotEqual(msg.find('wibble'), -1)
268
278
schema = {'Type': 'Json'}
269
279
val = {"foo": "bar", "items": [1, 2, 3]}
270
280
val_s = json.dumps(val)
271
p = parameters.Parameter('p', schema, val)
281
p = self.new_parameter('p', schema, val)
272
282
self.assertEqual(val_s, p.value())
273
283
self.assertEqual(val, p.parsed)
289
299
schema = {'Type': 'Json'}
290
300
val = {"foo": "bar", "items": [1, 2, 3]}
291
301
val_s = json.dumps(val)
292
p = parameters.Parameter('p', schema, val_s)
302
p = self.new_parameter('p', schema, val_s)
293
303
self.assertEqual(val_s, p.value())
294
304
self.assertEqual(val, p.parsed)
311
321
'AllowedValues': ["foo", "bar", "baz"]}
312
322
val = {"foo": "bar", "baz": [1, 2, 3]}
313
323
val_s = json.dumps(val)
314
p = parameters.Parameter('p', schema, val_s)
324
p = self.new_parameter('p', schema, val_s)
315
325
self.assertEqual(val_s, p.value())
316
326
self.assertEqual(val, p.parsed)
321
331
'AllowedValues': ["foo", "bar", "baz"]}
322
332
val = {"foo": "bar", "items": [1, 2, 3]}
324
parameters.Parameter('p', schema, val)
334
self.new_parameter('p', schema, val)
325
335
except ValueError as verr:
326
336
self.assertIn("items", str(verr))
372
382
class ParametersTest(testtools.TestCase):
383
def new_parameters(self, stack_name, tmpl, user_params={}, stack_id=None,
384
validate_value=True):
385
tmpl = template.Template(tmpl)
386
return parameters.Parameters(stack_name, tmpl, user_params, stack_id,
373
389
def test_pseudo_params(self):
374
params = parameters.Parameters('test_stack', {"Parameters": {}})
390
params = self.new_parameters('test_stack', {"Parameters": {}})
376
392
self.assertEqual(params['AWS::StackName'], 'test_stack')
377
393
self.assertEqual(params['AWS::StackId'], 'None')
378
394
self.assertTrue('AWS::Region' in params)
380
396
def test_pseudo_param_stackid(self):
381
params = parameters.Parameters('test_stack', {'Parameters': {}},
397
params = self.new_parameters('test_stack', {'Parameters': {}},
384
400
self.assertEqual(params['AWS::StackId'], '123::foo')
385
401
params.set_stack_id('456::bar')
386
402
self.assertEqual(params['AWS::StackId'], '456::bar')
388
404
def test_schema_invariance(self):
389
params1 = parameters.Parameters('test', params_schema,
391
'Defaulted': 'wibble'})
405
params1 = self.new_parameters('test', params_schema,
407
'Defaulted': 'wibble'})
392
408
self.assertEqual(params1['Defaulted'], 'wibble')
394
params2 = parameters.Parameters('test', params_schema,
410
params2 = self.new_parameters('test', params_schema, {'User': 'foo'})
396
411
self.assertEqual(params2['Defaulted'], 'foobar')
398
413
def test_to_dict(self):
399
414
template = {'Parameters': {'Foo': {'Type': 'String'},
400
415
'Bar': {'Type': 'Number', 'Default': '42'}}}
401
params = parameters.Parameters('test_params', template, {'Foo': 'foo'})
416
params = self.new_parameters('test_params', template, {'Foo': 'foo'})
403
418
as_dict = dict(params)
404
419
self.assertEqual(as_dict['Foo'], 'foo')
422
437
def test_map_str(self):
423
438
template = {'Parameters': {'Foo': {'Type': 'String'},
424
439
'Bar': {'Type': 'Number'}}}
425
params = parameters.Parameters('test_params', template, {
426
'Foo': 'foo', 'Bar': 42})
440
params = self.new_parameters('test_params', template,
441
{'Foo': 'foo', 'Bar': 42})
428
443
expected = {'Foo': 'foo',