From e3506d057b398c3a23f84ccc218407de956834cc Mon Sep 17 00:00:00 2001 From: Milo Casagrande Date: Mon, 8 Dec 2014 10:53:52 +0100 Subject: Add from_json() to boot model. Change-Id: I4bac3a4b6d065d27f1cfb4e35713b042fd456259 --- app/models/boot.py | 40 ++++++++++- app/models/tests/test_boot_model.py | 137 ++++++++++++++++++++++++++---------- 2 files changed, 137 insertions(+), 40 deletions(-) diff --git a/app/models/boot.py b/app/models/boot.py index 92c3dfc..022699a 100644 --- a/app/models/boot.py +++ b/app/models/boot.py @@ -13,6 +13,9 @@ """The model that represents a boot document in the mongodb collection.""" +import copy +import types + import models import models.base as modb @@ -72,7 +75,7 @@ class BootDocument(modb.BaseDocument): self.dtb = None self.dtb_addr = None self.dtb_append = None - self.endianness = None + self.endian = None self.fastboot = False self.fastboot_cmd = None self.file_server_resource = None @@ -199,7 +202,7 @@ class BootDocument(modb.BaseDocument): models.DTB_ADDR_KEY: self.dtb_addr, models.DTB_APPEND_KEY: self.dtb_append, models.DTB_KEY: self.dtb, - models.ENDIANNESS_KEY: self.endianness, + models.ENDIANNESS_KEY: self.endian, models.FASTBOOT_CMD_KEY: self.fastboot_cmd, models.FASTBOOT_KEY: self.fastboot, models.FILE_SERVER_RESOURCE_KEY: self.file_server_resource, @@ -232,4 +235,35 @@ class BootDocument(modb.BaseDocument): @staticmethod def from_json(json_obj): - return None + boot_doc = None + if isinstance(json_obj, types.DictionaryType): + local_obj = copy.deepcopy(json_obj) + doc_pop = local_obj.pop + + boot_id = doc_pop(models.ID_KEY, None) + doc_pop(models.NAME_KEY, None) + + try: + board = doc_pop(models.BOARD_KEY) + job = doc_pop(models.JOB_KEY) + kernel = doc_pop(models.KERNEL_KEY) + defconfig = doc_pop(models.DEFCONFIG_KEY) + lab_name = doc_pop(models.LAB_NAME_KEY) + defconfig_full = doc_pop(models.DEFCONFIG_FULL_KEY, None) + arch = doc_pop( + models.ARCHITECTURE_KEY, models.ARM_ARCHITECTURE_KEY) + + boot_doc = BootDocument( + board, job, kernel, defconfig, lab_name, + defconfig_full=defconfig_full, + arch=arch) + + boot_doc.id = boot_id + + for key, val in local_obj.iteritems(): + setattr(boot_doc, key, val) + except KeyError: + # If a mandatory key is missing, just return None. + boot_doc = None + + return boot_doc diff --git a/app/models/tests/test_boot_model.py b/app/models/tests/test_boot_model.py index 90c12a2..7fbc9f5 100644 --- a/app/models/tests/test_boot_model.py +++ b/app/models/tests/test_boot_model.py @@ -13,26 +13,26 @@ import unittest -import models.base as modb -import models.boot as modbt +import models.base as mbase +import models.boot as mboot class TestBootModel(unittest.TestCase): def test_boot_document_valid_instance(self): - boot_doc = modbt.BootDocument( - 'board', 'job', 'kernel', 'defconfig', 'lab' + boot_doc = mboot.BootDocument( + "board", "job", "kernel", "defconfig", "lab" ) - self.assertIsInstance(boot_doc, modb.BaseDocument) + self.assertIsInstance(boot_doc, mbase.BaseDocument) def test_boot_document_to_dict(self): self.maxDiff = None - boot_doc = modbt.BootDocument( - 'board', 'job', 'kernel', 'defconfig', 'lab', arch='arm' + boot_doc = mboot.BootDocument( + "board", "job", "kernel", "defconfig", "lab", arch="arm" ) - boot_doc.id = 'id' - boot_doc.job_id = 'job-id' - boot_doc.created_on = 'now' + boot_doc.id = "id" + boot_doc.job_id = "job-id" + boot_doc.created_on = "now" boot_doc.defconfig_id = "defconfig_id" boot_doc.retries = 10 boot_doc.version = "1.0" @@ -52,33 +52,33 @@ class TestBootModel(unittest.TestCase): boot_doc.board_instance = "instance" expected = { - '_id': 'id', - 'board': 'board', - 'boot_log': "boot-log", - 'boot_log_html': "boot-log-html", - 'boot_result_description': None, - 'created_on': 'now', - 'defconfig': 'defconfig', - 'defconfig_id': "defconfig_id", - 'dtb': None, - 'dtb_addr': None, - 'dtb_append': False, - 'endian': None, - 'fastboot': False, - 'initrd_addr': None, - 'job': 'job', - 'job_id': 'job-id', - 'kernel': 'kernel', - 'kernel_image': None, - 'lab_name': 'lab', - 'load_addr': None, - 'metadata': {}, - 'name': 'board-job-kernel-defconfig-arm', - 'retries': 10, - 'status': None, - 'time': 0, - 'version': "1.0", - 'warnings': 2, + "_id": "id", + "board": "board", + "boot_log": "boot-log", + "boot_log_html": "boot-log-html", + "boot_result_description": None, + "created_on": "now", + "defconfig": "defconfig", + "defconfig_id": "defconfig_id", + "dtb": None, + "dtb_addr": None, + "dtb_append": False, + "endian": None, + "fastboot": False, + "initrd_addr": None, + "job": "job", + "job_id": "job-id", + "kernel": "kernel", + "kernel_image": None, + "lab_name": "lab", + "load_addr": None, + "metadata": {}, + "name": "board-job-kernel-defconfig-arm", + "retries": 10, + "status": None, + "time": 0, + "version": "1.0", + "warnings": 2, "git_commit": "git-commit", "git_branch": "git-branch", "git_describe": "git-describe", @@ -93,3 +93,66 @@ class TestBootModel(unittest.TestCase): } self.assertDictEqual(expected, boot_doc.to_dict()) + + def test_boot_doc_from_json_missing_key(self): + boot_json = { + "_id": "id", + "name": "boot-name", + "status": "PASS", + "warnings": 0 + } + + self.assertIsNone(mboot.BootDocument.from_json(boot_json)) + + def test_boot_doc_from_json_wrong_type(self): + self.assertIsNone(mboot.BootDocument.from_json([])) + self.assertIsNone(mboot.BootDocument.from_json(())) + self.assertIsNone(mboot.BootDocument.from_json("")) + + def test_boot_doc_from_json(self): + self.maxDiff = None + boot_json = { + "_id": "id", + "arch": "arm", + "board": "board", + "board_instance": "instance", + "boot_log": "boot-log", + "boot_log_html": "boot-log-html", + "boot_result_description": "desc", + "created_on": "now", + "defconfig": "defconfig", + "defconfig_full": "defconfig_full", + "defconfig_id": "defconfig_id", + "dtb": "dtb_val", + "dtb_addr": "1234", + "dtb_append": False, + "endian": "little", + "fastboot": False, + "fastboot_cmd": "fastboot", + "file_server_resource": "file-resource", + "file_server_url": "file-server", + "git_branch": "git-branch", + "git_commit": "git-commit", + "git_describe": "git-describe", + "git_url": "git-url", + "initrd": "initrd", + "initrd_addr": "1234", + "job": "job", + "job_id": "job-id", + "kernel": "kernel", + "kernel_image": "kernel_image", + "lab_name": "lab", + "load_addr": "12345", + "metadata": {"foo": "bar"}, + "name": "board-job-kernel-defconfig_full-arm", + "retries": 10, + "status": "PASS", + "time": 0, + "version": "1.0", + "warnings": 2 + } + + boot_doc = mboot.BootDocument.from_json(boot_json) + + self.assertIsInstance(boot_doc, mboot.BootDocument) + self.assertDictEqual(boot_json, boot_doc.to_dict()) -- cgit v1.2.3