diff options
author | Milo Casagrande <milo.casagrande@linaro.org> | 2015-03-09 11:29:40 +0100 |
---|---|---|
committer | Milo Casagrande <milo.casagrande@linaro.org> | 2015-03-09 11:29:40 +0100 |
commit | 5f146744f9de73aa43c5a77af41e805189bd7c6f (patch) | |
tree | c2c106516291f598aea28a6e184e75fbb4bd9882 | |
parent | 3d8c9c28463b93213e6e284412e0e7bcdda824d0 (diff) |
Add test set model and its tests.
-rw-r--r-- | app/models/__init__.py | 3 | ||||
-rw-r--r-- | app/models/test_set.py | 186 | ||||
-rw-r--r-- | app/models/tests/test_test_set_model.py | 152 | ||||
-rw-r--r-- | app/tests/__init__.py | 1 |
4 files changed, 342 insertions, 0 deletions
diff --git a/app/models/__init__.py b/app/models/__init__.py index 272b67d..1b31cbf 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -53,6 +53,7 @@ DATE_RANGE_KEY = "date_range" DEFCONFIG_FULL_KEY = "defconfig_full" DEFCONFIG_ID_KEY = "defconfig_id" DEFCONFIG_KEY = "defconfig" +DEFINITION_URI_KEY = "definition_uri" DIRNAME_KEY = "dirname" DOC_ID_KEY = "doc_id" DTB_ADDR_KEY = "dtb_addr" @@ -97,6 +98,7 @@ MODULES_DIR_KEY = "modules_dir" MODULES_KEY = "modules" NAME_KEY = "name" NOT_FIELD_KEY = "nfield" +PARAMETERS_KEY = "parameters" PRIVATE_KEY = "private" PROPERTIES_KEY = "properties" QEMU_COMMAND_KEY = "qemu_command" @@ -122,6 +124,7 @@ UIMAGE_ADDR_KEY = "uimage_addr" UIMAGE_KEY = "uimage" UPDATED_KEY = "updated_on" USERNAME_KEY = "username" +VCS_COMMIT_KEY = "vcs_commit" VERSION_FULL_KEY = "full_version" VERSION_KEY = "version" WARNINGS_KEY = "warnings" diff --git a/app/models/test_set.py b/app/models/test_set.py new file mode 100644 index 0000000..5e7a99b --- /dev/null +++ b/app/models/test_set.py @@ -0,0 +1,186 @@ +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +"""The model that represent a test set document in the database.""" + +import copy +import types + +import models +import models.base as mbase + + +# pylint: disable=invalid-name +# pylint: disable=too-many-instance-attributes +class TestSetDocument(mbase.BaseDocument): + """Model for a test set document. + + A test set is a container of test cases. + """ + + def __init__(self, name, test_suite_id, version): + """ + + :param name: The name given to this test suite. + :type name: string + :param test_suite_id: The ID of the test suite this test set + belongs to. + :type test_suite_id: string + :param version: The version of the JSON schema of this test suite. + :type version: string + """ + self._created_on = None + self._id = None + self._name = name + self._version = version + + self._test_suite_id = test_suite_id + + self._test_case = [] + self._parameters = {} + + self.definition_uri = None + self.metadata = {} + self.time = -1 + self.vcs_commit = None + + @property + def collection(self): + return models.TEST_SET_COLLECTION + + @property + def name(self): + """The name of the test set.""" + return self._name + + @property + def id(self): + """The ID of the test set as registered in the database.""" + return self._id + + @id.setter + def id(self, value): + """Set the test set ID.""" + self._id = value + + @property + def version(self): + """The schema version of this test set.""" + return self._version + + @version.setter + def version(self, value): + """Set the schema version of this test set.""" + self._version = value + + @property + def created_on(self): + """The creation date of this test set.""" + return self._created_on + + @created_on.setter + def created_on(self, value): + """Set the creation date of this test set.""" + self._created_on = value + + @property + def test_case(self): + """The list of test cases performed by this test set.""" + return self._test_case + + @test_case.setter + def test_case(self, value): + """Set the list of test cases for this test set.""" + if not value: + value = [] + if not isinstance(value, types.ListType): + raise ValueError( + "The associated test cases need to be passed as a list") + self._test_case = value + + @property + def parameters(self): + """The parameters that this test set ran with.""" + return self._parameters + + @parameters.setter + def parameters(self, value): + """Set the parameters this test set ran with. + + :param value: The parameters data structure. + :type value: dict + """ + if not value: + value = {} + if not isinstance(value, types.DictionaryType): + raise ValueError( + "The parameters need to be passed as a dictionary") + self._parameters = value + + @property + def test_suite_id(self): + """The ID of the associated test suite.""" + return self._test_suite_id + + @test_suite_id.setter + def test_suite_id(self, value): + """Set the associated test suite ID. + + :param value: The test suite ID. + :type value: string + """ + self._test_suite_id = value + + def to_dict(self): + test_set = { + models.CREATED_KEY: self.created_on, + models.DEFINITION_URI_KEY: self.definition_uri, + models.METADATA_KEY: self.metadata, + models.NAME_KEY: self.name, + models.PARAMETERS_KEY: self.parameters, + models.TEST_CASE_KEY: self.test_case, + models.TEST_SUITE_ID_KEY: self.test_suite_id, + models.TIME_KEY: self.time, + models.VCS_COMMIT_KEY: self.vcs_commit, + models.VERSION_KEY: self.version + } + + if self.id: + test_set[models.ID_KEY] = self.id + + return test_set + + @staticmethod + def from_json(json_obj): + test_set = None + if isinstance(json_obj, types.DictionaryType): + local_obj = copy.deepcopy(json_obj) + doc_pop = local_obj.pop + + set_id = doc_pop(models.ID_KEY, None) + + try: + name = doc_pop(models.NAME_KEY) + test_suite_id = doc_pop(models.TEST_SUITE_ID_KEY) + version = doc_pop(models.VERSION_KEY) + + test_set = TestSetDocument(name, test_suite_id, version) + test_set.id = set_id + + for key, val in local_obj.iteritems(): + setattr(test_set, key, val) + except KeyError: + # Missing mandatory key? Return None. + test_set = None + + return test_set diff --git a/app/models/tests/test_test_set_model.py b/app/models/tests/test_test_set_model.py new file mode 100644 index 0000000..9bdc04e --- /dev/null +++ b/app/models/tests/test_test_set_model.py @@ -0,0 +1,152 @@ +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import unittest + +import models.base as mbase +import models.test_set as mtset + + +class TestTestSetModel(unittest.TestCase): + + def test_set_doc_valid_instance(self): + test_set = mtset.TestSetDocument("name", "test_suite_id", "1.0") + self.assertIsInstance(test_set, mbase.BaseDocument) + self.assertEqual(test_set.collection, "test_set") + + def test_set_doc_to_dict(self): + test_set = mtset.TestSetDocument("name", "test_suite_id", "1.0") + + test_set.created_on = "now" + test_set.definition_uri = "scheme://authority/path" + test_set.id = "id" + test_set.metadata = {"foo": "bar"} + test_set.parameters = {"param": "value"} + test_set.test_case = [{"foo": "bar"}] + test_set.time = 10 + test_set.vcs_commit = "commit_sha" + test_set.version = "1.1" + test_set.test_suite_id = "another_id" + + expected = { + "_id": "id", + "created_on": "now", + "definition_uri": "scheme://authority/path", + "metadata": {"foo": "bar"}, + "name": "name", + "parameters": {"param": "value"}, + "test_case": [{"foo": "bar"}], + "test_suite_id": "another_id", + "time": 10, + "vcs_commit": "commit_sha", + "version": "1.1" + } + + self.assertDictEqual(expected, test_set.to_dict()) + + def test_set_doc_to_dict_no_id(self): + test_set = mtset.TestSetDocument("name", "test_suite_id", "1.0") + + test_set.created_on = "now" + test_set.definition_uri = "scheme://authority/path" + test_set.metadata = {"foo": "bar"} + test_set.parameters = {"param": "value"} + test_set.test_case = [{"foo": "bar"}] + test_set.time = 10 + test_set.vcs_commit = "commit_sha" + + expected = { + "created_on": "now", + "definition_uri": "scheme://authority/path", + "metadata": {"foo": "bar"}, + "name": "name", + "parameters": {"param": "value"}, + "test_case": [{"foo": "bar"}], + "test_suite_id": "test_suite_id", + "time": 10, + "vcs_commit": "commit_sha", + "version": "1.0" + } + + self.assertDictEqual(expected, test_set.to_dict()) + + def test_set_doc_from_json_missing_key(self): + test_set = { + "_id": "id", + "version": "1.0", + "test_suite_id": "test_suite_id" + } + + self.assertIsNone(mtset.TestSetDocument.from_json(test_set)) + + def test_set_doc_from_json_wrong_type(self): + self.assertIsNone(mtset.TestSetDocument.from_json([])) + self.assertIsNone(mtset.TestSetDocument.from_json(())) + self.assertIsNone(mtset.TestSetDocument.from_json("")) + + def test_set_doc_from_json(self): + set_json = { + "_id": "id", + "created_on": "now", + "definition_uri": "scheme://authority/path", + "metadata": {"foo": "bar"}, + "name": "name", + "parameters": {"param": "value"}, + "test_case": [{"foo": "bar"}], + "test_suite_id": "test_suite_id", + "time": 10, + "vcs_commit": "commit_sha", + "version": "1.0", + } + + test_suite = mtset.TestSetDocument.from_json(set_json) + + self.assertIsInstance(test_suite, mtset.TestSetDocument) + self.assertDictEqual(set_json, test_suite.to_dict()) + + def test_set_doc_parameters_setter(self): + test_set = mtset.TestSetDocument("name", "test_suite_id", "1.0") + + def parameters_setter(value): + test_set.parameters = value + + self.assertRaises(ValueError, parameters_setter, ["foo"]) + self.assertRaises(ValueError, parameters_setter, ("foo")) + self.assertRaises(ValueError, parameters_setter, "foo") + + parameters_setter([]) + self.assertDictEqual({}, test_set.parameters) + parameters_setter(()) + self.assertDictEqual({}, test_set.parameters) + parameters_setter(None) + self.assertDictEqual({}, test_set.parameters) + parameters_setter("") + self.assertDictEqual({}, test_set.parameters) + + def test_set_doc_test_case_setter(self): + test_set = mtset.TestSetDocument("name", "test_suite_id", "1.0") + + def test_case_setter(value): + test_set.test_case = value + + self.assertRaises(ValueError, test_case_setter, {"foo": "bar"}) + self.assertRaises(ValueError, test_case_setter, "foo") + + test_case_setter([]) + self.assertListEqual([], test_set.test_case) + test_case_setter(()) + self.assertListEqual([], test_set.test_case) + test_case_setter(None) + self.assertListEqual([], test_set.test_case) + test_case_setter("") + self.assertListEqual([], test_set.test_case) diff --git a/app/tests/__init__.py b/app/tests/__init__.py index a47fb03..6a08ada 100644 --- a/app/tests/__init__.py +++ b/app/tests/__init__.py @@ -42,6 +42,7 @@ def test_modules(): "models.tests.test_lab_model", "models.tests.test_report_model", "models.tests.test_test_suite_model", + "models.tests.test_test_set_model", "models.tests.test_token_model", "utils.batch.tests.test_batch_common", "utils.bisect.tests.test_bisect", |