aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilo Casagrande <milo.casagrande@linaro.org>2015-03-09 11:29:40 +0100
committerMilo Casagrande <milo.casagrande@linaro.org>2015-03-09 11:29:40 +0100
commit5f146744f9de73aa43c5a77af41e805189bd7c6f (patch)
treec2c106516291f598aea28a6e184e75fbb4bd9882
parent3d8c9c28463b93213e6e284412e0e7bcdda824d0 (diff)
Add test set model and its tests.
-rw-r--r--app/models/__init__.py3
-rw-r--r--app/models/test_set.py186
-rw-r--r--app/models/tests/test_test_set_model.py152
-rw-r--r--app/tests/__init__.py1
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",