def test_defconfig_set_metadata_wrong(self): build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch", "build_environment") self.assertRaises(TypeError, setattr, build_doc, "metadata", ()) self.assertRaises(TypeError, setattr, build_doc, "metadata", []) self.assertRaises(TypeError, setattr, build_doc, "metadata", "")
def test_defconfig_set_build_platform_wrong(self): build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch", "build_environment") self.assertRaises(TypeError, setattr, build_doc, "build_platform", ()) self.assertRaises(TypeError, setattr, build_doc, "build_platform", {}) self.assertRaises(TypeError, setattr, build_doc, "build_platform", "")
def test_import_single_build(self, mock_dir, mock_find, mock_tr, mock_up, mock_save, mock_db): mock_db = self.db mock_dir.return_value = True job_doc = { "job": "ajob", "kernel": "kernel", "_id": "job_id", "git_branch": "branch" } build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch") build_doc.git_branch = "branch" mock_tr.return_value = build_doc mock_find.return_value = job_doc mock_up.return_value = 201 mock_save.return_value = (201, "build_id") json_obj = { "job": "ajob", "kernel": "akernel", "defconfig": "defconfig", "git_branch": "branch", "arch": "arch" } build_id, job_id, errors = utils.build.import_single_build( json_obj, {}) self.assertDictEqual({}, errors) self.assertIsNotNone(build_id) self.assertIsNotNone(job_id) self.assertEqual("build_id", build_id) self.assertEqual("job_id", job_id)
def test_parse_build_log_no_file(self): build_dir = None errors = {} try: build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch") build_dir = tempfile.mkdtemp() log_file = os.path.join(build_dir, utils.BUILD_LOG_FILE) status, e_l, w_l, m_l = lparser._parse_log(build_doc, log_file, build_dir, errors) self.assertEqual(500, status) self.assertIsInstance(errors, types.DictionaryType) self.assertIsInstance(e_l, types.ListType) self.assertIsInstance(w_l, types.ListType) self.assertIsInstance(m_l, types.ListType) self.assertDictEqual({}, errors) self.assertEqual(0, len(e_l)) self.assertEqual(0, len(w_l)) self.assertEqual(0, len(m_l)) finally: shutil.rmtree(build_dir, ignore_errors=True)
def test_parse_build_log(self): build_dir = None errors = {} try: build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch") build_dir = tempfile.mkdtemp() log_file = os.path.join(os.path.abspath(os.path.dirname(__file__)), "assets", "build_log_0.log") status, e_l, w_l, m_l = lparser._parse_log(build_doc, log_file, build_dir, errors) self.assertEqual(200, status) self.assertIsInstance(errors, types.DictionaryType) self.assertIsInstance(e_l, types.ListType) self.assertIsInstance(w_l, types.ListType) self.assertIsInstance(m_l, types.ListType) self.assertEqual(0, len(errors.keys())) self.assertEqual(22, len(e_l)) self.assertEqual(2, len(w_l)) self.assertEqual(0, len(m_l)) finally: shutil.rmtree(build_dir, ignore_errors=True)
def test_deconfig_set_status_wrong_and_right(self): build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch", "build_environment") self.assertRaises(ValueError, setattr, build_doc, "status", "foo") self.assertRaises(ValueError, setattr, build_doc, "status", []) self.assertRaises(ValueError, setattr, build_doc, "status", {}) self.assertRaises(ValueError, setattr, build_doc, "status", ()) build_doc.status = "FAIL" self.assertEqual(build_doc.status, "FAIL") build_doc.status = "PASS" self.assertEqual(build_doc.status, "PASS") build_doc.status = "UNKNOWN" self.assertEqual(build_doc.status, "UNKNOWN") build_doc.status = "BUILD" self.assertEqual(build_doc.status, "BUILD")
def test_update_job_doc(self): job_doc = mjob.JobDocument("job", "kernel", "branch") build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch") build_doc.git_branch = "branch" build_doc.git_commit = "1234567890" build_doc.git_describe = "kernel.version" build_doc.git_url = "git://url.git" utils.build._update_job_doc(job_doc, "job_id", "PASS", build_doc, self.db) self.assertIsInstance(job_doc, mjob.JobDocument) self.assertIsNotNone(job_doc.id) self.assertIsNotNone(job_doc.git_branch) self.assertIsNotNone(job_doc.git_commit) self.assertIsNotNone(job_doc.git_describe) self.assertIsNotNone(job_doc.git_url) self.assertEqual("job_id", job_doc.id) self.assertEqual("1234567890", job_doc.git_commit) self.assertEqual("kernel.version", job_doc.git_describe) self.assertEqual("git://url.git", job_doc.git_url)
def parse_build_data(build_data, job, kernel, build_dir): """Parse the json build data and craete the corresponding document. :param build_data: The json build data. :type build_data: dictionary :param job: The name of the job. :type job: string :param kernel: The name of the kernel. :type kernel: string :param errors: The errors data structure. :type errors: dictionary :param build_dir: Full path to the build directory. :type build_dir: string :return A 2-tuple: (BuildDocument, a "artifact type": "artifact name" dictionary) """ if not isinstance(build_data, types.DictionaryType): raise BuildError(500, "JSON data is not a dictionary") try: defconfig = build_data[models.DEFCONFIG_KEY] d_job = build_data.get(models.JOB_KEY, job) d_kernel = build_data.get(models.KERNEL_KEY, kernel) d_branch = build_data[models.GIT_BRANCH_KEY] d_build_environment = build_data[models.BUILD_ENVIRONMENT_KEY] defconfig_full = build_data.get(models.DEFCONFIG_FULL_KEY) kconfig_fragments = build_data.get(models.KCONFIG_FRAGMENTS_KEY) defconfig_full = utils.get_defconfig_full(build_dir, defconfig, defconfig_full, kconfig_fragments) build_doc = mbuild.BuildDocument(d_job, d_kernel, defconfig, d_branch, d_build_environment, defconfig_full=defconfig_full) build_doc.arch = build_data.get(models.ARCHITECTURE_KEY, None) build_doc.build_log = build_data.get(models.BUILD_LOG_KEY, None) build_doc.build_platform = build_data.get(models.BUILD_PLATFORM_KEY, []) build_doc.build_time = build_data.get(models.BUILD_TIME_KEY, 0) build_doc.build_type = build_data.get(models.BUILD_TYPE_KEY, models.KERNEL_BUILD_TYPE) build_doc.dtb_dir = build_data.get(models.DTB_DIR_KEY, None) build_doc.errors = build_data.get(models.BUILD_ERRORS_KEY, 0) build_doc.file_server_resource = build_data.get( models.FILE_SERVER_RESOURCE_KEY, None) build_doc.file_server_url = build_data.get(models.FILE_SERVER_URL_KEY, None) build_doc.git_commit = build_data.get(models.GIT_COMMIT_KEY, None) build_doc.git_describe = build_data.get(models.GIT_DESCRIBE_KEY, None) build_doc.git_url = build_data.get(models.GIT_URL_KEY, None) build_doc.kconfig_fragments = kconfig_fragments build_doc.kernel_config = build_data.get(models.KERNEL_CONFIG_KEY, None) build_doc.kernel_image = build_data.get(models.KERNEL_IMAGE_KEY, None) build_doc.modules = build_data.get(models.MODULES_KEY, None) build_doc.modules_dir = build_data.get(models.MODULES_DIR_KEY, None) build_doc.status = build_data.get(models.STATUS_KEY, models.UNKNOWN_STATUS) build_doc.system_map = build_data.get(models.SYSTEM_MAP_KEY, None) build_doc.text_offset = build_data.get(models.TEXT_OFFSET_KEY, None) build_doc.version = build_data.get(models.VERSION_KEY, "1.1") build_doc.warnings = build_data.get(models.BUILD_WARNINGS_KEY, 0) build_doc.kernel_image_size = build_data.get( models.KERNEL_IMAGE_SIZE_KEY, None) build_doc.modules_size = build_data.get(models.MODULES_SIZE_KEY, None) build_doc.cross_compile = build_data.get(models.CROSS_COMPILE_KEY, None) # ELF file data. build_doc.vmlinux_bss_size = build_data.get( models.VMLINUX_BSS_SIZE_KEY, None) build_doc.vmlinux_data_size = build_data.get( models.VMLINUX_DATA_SIZE_KEY, None) build_doc.vmlinux_file_size = build_data.get( models.VMLINUX_FILE_SIZE_KEY, None) build_doc.vmlinux_text_size = build_data.get( models.VMLINUX_TEXT_SIZE_KEY, None) build_doc.git_describe_v = build_data.get(models.GIT_DESCRIBE_V_KEY, None) build_doc.kernel_version = _extract_kernel_version( build_doc.git_describe_v, build_doc.git_describe) build_doc.compiler = build_data.get(models.COMPILER_KEY) build_doc.compiler_version = build_data.get( models.COMPILER_VERSION_KEY) build_doc.compiler_version_full = build_data.get( models.COMPILER_VERSION_FULL_KEY) # ToDo: deprecate in the API and only keep compiler_version_full build_doc.compiler_version_ext = build_doc.compiler_version_full artifacts = { models.BUILD_LOG_SIZE_KEY: build_doc.build_log, models.KERNEL_CONFIG_SIZE_KEY: build_doc.kernel_config, models.KERNEL_IMAGE_SIZE_KEY: build_doc.kernel_image, models.MODULES_SIZE_KEY: build_doc.modules, models.SYSTEM_MAP_SIZE_KEY: build_doc.system_map, } except KeyError, ex: msg = "Missing mandatory key '%s' in build data (job: %s, kernel: %s)" raise BuildError(500, msg % (ex.args[0], job, kernel), from_exc=ex)
def test_build_document_to_dict(self): build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch", "build_environment") build_doc.id = "build_id" build_doc.job_id = "job_id" build_doc.created_on = "now" build_doc.metadata = {} build_doc.status = "FAIL" build_doc.dirname = "defconfig" build_doc.boot_resul_description = [] build_doc.errors = 1 build_doc.warnings = 1 build_doc.build_time = 1 build_doc.arch = "foo" build_doc.git_url = "git_url" build_doc.git_commit = "git_commit" build_doc.git_describe = "git_describe" build_doc.git_describe_v = "git_describe_v" build_doc.version = "1.0" build_doc.modules = "modules-file" build_doc.dtb_dir = "dtb-dir" build_doc.dtb_dir_data = ["a-file"] build_doc.kernel_config = "kernel-config" build_doc.system_map = "system-map" build_doc.text_offset = "offset" build_doc.kernel_image = "kernel-image" build_doc.modules_dir = "modules-dir" build_doc.build_log = "build.log" build_doc.kconfig_fragments = "config-frag" build_doc.file_server_resource = "file-resource" build_doc.file_server_url = "server-url" build_doc.build_type = "foo" build_doc.defconfig_full = "defconfig_full" build_doc.kernel_image_size = 1024 build_doc.modules_size = 1024 build_doc.kernel_config_size = 1024 build_doc.system_map_size = 1024 build_doc.build_log_size = 1024 build_doc.kernel_version = "kernel_version" build_doc.compiler = "gcc" build_doc.compiler_version = "4.7.8" build_doc.compiler_version_ext = "gcc 4.7.8" build_doc.compiler_version_full = "gcc 4.7.8 full" build_doc.cross_compile = "arm" build_doc.vmlinux_file_size = 1024 build_doc.vmlinux_text_size = 1024 build_doc.vmlinux_bss_size = 1024 build_doc.vmlinux_data_size = 1024 expected = { "_id": "build_id", "job": "job", "kernel": "kernel", "defconfig": "defconfig", "job_id": "job_id", "created_on": "now", "metadata": {}, "status": "FAIL", "defconfig": "defconfig", "errors": 1, "warnings": 1, "build_time": 1, "arch": "foo", "dirname": "defconfig", "git_url": "git_url", "git_describe": "git_describe", "git_branch": "branch", "git_commit": "git_commit", "build_platform": [], "version": "1.0", "dtb_dir": "dtb-dir", "dtb_dir_data": ["a-file"], "kernel_config": "kernel-config", "kernel_image": "kernel-image", "system_map": "system-map", "text_offset": "offset", "modules": "modules-file", "modules_dir": "modules-dir", "build_log": "build.log", "kconfig_fragments": "config-frag", "defconfig_full": "defconfig_full", "file_server_resource": "file-resource", "file_server_url": "server-url", "build_type": "foo", "kernel_image_size": 1024, "modules_size": 1024, "kernel_config_size": 1024, "system_map_size": 1024, "build_log_size": 1024, "kernel_version": "kernel_version", "git_describe_v": "git_describe_v", "compiler": "gcc", "compiler_version": "4.7.8", "compiler_version_full": "gcc 4.7.8 full", "cross_compile": "arm", "compiler_version_ext": "gcc 4.7.8", "vmlinux_file_size": 1024, "vmlinux_text_size": 1024, "vmlinux_bss_size": 1024, "vmlinux_data_size": 1024, "build_environment": "build_environment" } self.assertDictEqual(expected, build_doc.to_dict())
def test_build_document_collection(self): build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch", "build_environment") self.assertEqual(build_doc.collection, "build")
def test_build_document_valid_instance(self): build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch", "build_environment") self.assertIsInstance(build_doc, modb.BaseDocument) self.assertIsInstance(build_doc, mbuild.BuildDocument)
def test_defconfig_set_build_platform(self): build_doc = mbuild.BuildDocument("job", "kernel", "defconfig", "branch", "build_environment") build_doc.build_platform = ["a", "b"] self.assertListEqual(build_doc.build_platform, ["a", "b"])