blob: 78fd80d623c34b4722cb844234249842d141038f [file] [log] [blame]
Marc Kodererfafcc4f2014-03-17 13:20:40 +01001# Copyright 2014 Deutsche Telekom AG
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Marc Kodererf07f5d12014-09-01 09:47:23 +020016import copy
17
Marc Kodererfafcc4f2014-03-17 13:20:40 +010018import jsonschema
19import mock
Matthew Treinish71426682015-04-23 11:19:38 -040020import six
Marc Kodererfafcc4f2014-03-17 13:20:40 +010021
Marc Kodererf39fbed2014-04-01 13:31:23 +020022from tempest.common.generator import base_generator
23from tempest.common.generator import negative_generator
24from tempest.common.generator import valid_generator
Matthew Treinishffad78a2016-04-16 14:39:52 -040025from tempest.tests import base
Marc Kodererfafcc4f2014-03-17 13:20:40 +010026
27
28class TestNegativeBasicGenerator(base.TestCase):
29 valid_desc = {
30 "name": "list-flavors-with-detail",
31 "http-method": "GET",
32 "url": "flavors/detail",
33 "json-schema": {
34 "type": "object",
35 "properties": {
36 "minRam": {"type": "integer"},
37 "minDisk": {"type": "integer"}
38 }
39 },
40 "resources": ["flavor", "volume", "image"]
41 }
42
43 minimal_desc = {
44 "name": "list-flavors-with-detail",
45 "http-method": "GET",
46 "url": "flavors/detail",
47 }
48
49 add_prop_desc = {
50 "name": "list-flavors-with-detail",
51 "http-method": "GET",
52 "url": "flavors/detail",
53 "unknown_field": [12]
54 }
55
56 invalid_json_schema_desc = {
57 "name": "list-flavors-with-detail",
58 "http-method": "GET",
59 "url": "flavors/detail",
60 "json-schema": {"type": "NotExistingType"}
61 }
62
63 def setUp(self):
64 super(TestNegativeBasicGenerator, self).setUp()
65 self.generator = base_generator.BasicGeneratorSet()
66
67 def _assert_valid_jsonschema_call(self, jsonschema_mock, desc):
68 self.assertEqual(jsonschema_mock.call_count, 1)
69 jsonschema_mock.assert_called_with(desc, self.generator.schema)
70
71 @mock.patch('jsonschema.validate', wraps=jsonschema.validate)
72 def test_validate_schema_with_valid_input(self, jsonschema_mock):
73 self.generator.validate_schema(self.valid_desc)
74 self._assert_valid_jsonschema_call(jsonschema_mock, self.valid_desc)
75
76 @mock.patch('jsonschema.validate', wraps=jsonschema.validate)
77 def test_validate_schema_with_minimal_input(self, jsonschema_mock):
78 self.generator.validate_schema(self.minimal_desc)
79 self._assert_valid_jsonschema_call(jsonschema_mock, self.minimal_desc)
80
81 def test_validate_schema_with_invalid_input(self):
82 self.assertRaises(jsonschema.ValidationError,
83 self.generator.validate_schema, self.add_prop_desc)
84 self.assertRaises(jsonschema.SchemaError,
85 self.generator.validate_schema,
86 self.invalid_json_schema_desc)
Marc Kodererf39fbed2014-04-01 13:31:23 +020087
88
89class BaseNegativeGenerator(object):
90 types = ['string', 'integer', 'object']
91
Marc Kodererf39fbed2014-04-01 13:31:23 +020092 fake_input_obj = {"type": "object",
93 "properties": {"minRam": {"type": "integer"},
94 "diskName": {"type": "string"},
95 "maxRam": {"type": "integer", }
96 }
97 }
98
Robert Mizielskie1d88992014-07-15 15:28:09 +020099 unknown_type_schema = {
Marc Kodererf39fbed2014-04-01 13:31:23 +0200100 "type": "not_defined"
101 }
102
Marc Kodererf07f5d12014-09-01 09:47:23 +0200103 class fake_test_class(object):
104 def __init__(self, scenario):
Matthew Treinish71426682015-04-23 11:19:38 -0400105 for k, v in six.iteritems(scenario):
Marc Kodererf07f5d12014-09-01 09:47:23 +0200106 setattr(self, k, v)
Marc Kodererf39fbed2014-04-01 13:31:23 +0200107
Marc Kodererf07f5d12014-09-01 09:47:23 +0200108 def _validate_result(self, valid_schema, invalid_schema):
Matthew Treinish71426682015-04-23 11:19:38 -0400109 for k, v in six.iteritems(valid_schema):
Marc Kodererf07f5d12014-09-01 09:47:23 +0200110 self.assertTrue(k in invalid_schema)
Marc Kodererf39fbed2014-04-01 13:31:23 +0200111
112 def test_generator_mandatory_functions(self):
113 for data_type in self.types:
114 self.assertIn(data_type, self.generator.types_dict)
115
116 def test_generate_with_unknown_type(self):
Marc Kodererf07f5d12014-09-01 09:47:23 +0200117 self.assertRaises(TypeError, self.generator.generate_payload,
Robert Mizielskie1d88992014-07-15 15:28:09 +0200118 self.unknown_type_schema)
Marc Kodererf39fbed2014-04-01 13:31:23 +0200119
120
121class TestNegativeValidGenerator(base.TestCase, BaseNegativeGenerator):
122 def setUp(self):
123 super(TestNegativeValidGenerator, self).setUp()
124 self.generator = valid_generator.ValidTestGenerator()
125
126 def test_generate_valid(self):
127 result = self.generator.generate_valid(self.fake_input_obj)
128 self.assertIn("minRam", result)
129 self.assertIsInstance(result["minRam"], int)
130 self.assertIn("diskName", result)
131 self.assertIsInstance(result["diskName"], str)
132
133
134class TestNegativeNegativeGenerator(base.TestCase, BaseNegativeGenerator):
135 def setUp(self):
136 super(TestNegativeNegativeGenerator, self).setUp()
137 self.generator = negative_generator.NegativeTestGenerator()
Marc Kodererf07f5d12014-09-01 09:47:23 +0200138
139 def test_generate_obj(self):
140 schema = self.fake_input_obj
141 scenarios = self.generator.generate_scenarios(schema)
142 for scenario in scenarios:
143 test = self.fake_test_class(scenario)
144 valid_schema = \
145 valid_generator.ValidTestGenerator().generate_valid(schema)
146 schema_under_test = copy.copy(valid_schema)
147 expected_result = \
148 self.generator.generate_payload(test, schema_under_test)
149 self.assertEqual(expected_result, None)
150 self._validate_result(valid_schema, schema_under_test)