/** * Import XML file * * @param report_file_path The file path to import. * @param test_session_id The session's id. * @param configuration_id The configuration's id. */ public static function import_xml($report_file_path, $test_session_id, $configuration_id, $conn, $merge_flag) { $qa_generic = sfConfig::get("app_table_qa_generic"); // Retrieve table_name_id from table_name table $table_name_test_result = Doctrine_Core::getTable("TableName")->findOneByName("test_result"); $table_name_test_result_id = $table_name_test_result->getId(); // Initialize xml version variable $xml_version = 0; // Create XMLReader object $reader = new XMLReader(); if (!$reader->open($report_file_path)) { return 10; } // Detect structure type (v1 or v2) $xml_version = 0; while ($reader->read()) { if ($reader->nodeType == XMLReader::ELEMENT) { if ($reader->name == "testresults") { $xml_version = 1; break; } elseif ($reader->name == "test_definition" | $reader->name == "testcase") { if ($reader->name == "testcase") { $tag_eof = "suite"; } else { $tag_eof = "test_definition"; } $xml_version = 2; break; } } } if ($xml_version == 0) { return 1000; } // Close the file $reader->close(); // Re-open the file if (!$reader->open($report_file_path)) { return 10; } // Initialize flags $flag_eof = false; $flag_step_end = false; $flag_case_found = false; $test_result_exists_flag = false; $flag_test_environment_and_image_set = false; $measureObjectList = array(); $flag_series_node_found = false; // If structure type == v1 if ($xml_version == 1) { // While there are results while ($reader->read()) { $new_measure = false; // Parse the line so as to retrieve datas switch ($reader->nodeType) { case XMLREADER::ELEMENT: switch ($reader->name) { case "testresults": $testresults_version = $reader->getAttribute("version"); $testresults_environment = $reader->getAttribute("environment"); $testresults_hwproduct = $reader->getAttribute("hwproduct"); $testresults_hwbuild = $reader->getAttribute("hwbuild"); break; case "suite": $suite_name = $reader->getAttribute("name"); $suite_domain = $reader->getAttribute("domain"); break; case "set": $set_name = $reader->getAttribute("name"); $set_description = $reader->getAttribute("description"); $set_feature = $reader->getAttribute("feature"); $set_environment = $reader->getAttribute("environment"); break; case "case": $case_name = $reader->getAttribute("name"); $case_description = $reader->getAttribute("description"); $case_manual = $reader->getAttribute("manual"); $case_insignificant = $reader->getAttribute("insignificant"); $case_result = $reader->getAttribute("result"); $case_subfeature = $reader->getAttribute("subfeature"); $case_level = $reader->getAttribute("level"); $case_comment = $reader->getAttribute("comment"); $case_failure_info = $reader->getAttribute("failure_info"); break; case "step": $step_command = $reader->getAttribute("command"); $step_result = $reader->getAttribute("result"); $step_failure_info = $reader->getAttribute("failure_info"); break; case "expected_result": $reader->read(); $expected_result_text = $reader->value; break; case "return_code": $reader->read(); $return_code_text = $reader->value; break; case "start": $reader->read(); $start_text = $reader->value; break; case "end": $reader->read(); $end_text = $reader->value; break; case "stdout": $reader->read(); $stdout_text = $reader->value; break; case "stderr": $reader->read(); $stderr_text = $reader->value; break; case "series": $flag_series_node_found = true; $series_name = $reader->getAttribute("name"); $series_group = $reader->getAttribute("group"); $series_unit = $reader->getAttribute("unit"); $series_interval = $reader->getAttribute("interval"); $series_interval_unit = $reader->getAttribute("interval_unit"); break; case "measurement": $new_measure = true; $measurement_name = $reader->getAttribute("name"); $measurement_power = $reader->getAttribute("power"); $measurement_value = preg_replace('#(,)#', '.', $reader->getAttribute("value")); $measurement_failure = preg_replace('#(,)#', '.', $reader->getAttribute("failure")); $measurement_unit = $reader->getAttribute("unit"); $measurement_target = preg_replace('#(,)#', '.', $reader->getAttribute("target")); break; } break; case XMLReader::END_ELEMENT: switch ($reader->name) { case "series": $flag_series_node_found = false; break; case "case": $flag_step_end = true; $flag_case_found = true; break; case "testresults": $flag_eof = true; break; } break; } // Exit the loop if it has reached end of file if ($flag_eof) { if (!$flag_case_found) { return 1001; } break; } if ($flag_step_end) { // Write it into qa_generic database if (!$flag_test_environment_and_image_set) { if (!empty($suite_name)) { // Retrieve test_session_name from test_session_id $testSession = Doctrine_Core::getTable("TestSession")->findOneById($test_session_id); $name_buffer = $testSession->getName(); // If test_session_name is empty, replace it with suite_name if ($name_buffer == "Empty testsession") { Doctrine_Query::create()->update('TestSession')->set('name', '?', $suite_name)->where('id = ?', $test_session_id)->execute(); } } $flag_test_environment_and_image_set = true; } // Determine decision_criteria_id if (preg_match("#^PASS\$#i", $case_result)) { $decision_criteria_id = -1; } else { if (preg_match("#^FAIL\$#i", $case_result)) { $decision_criteria_id = -2; } else { if (preg_match("#^BLOCK\$#i", $case_result)) { $decision_criteria_id = -3; } else { if (preg_match("#^DEFER\$#i", $case_result) || preg_match("#^DEFERRED\$#i", $case_result)) { $decision_criteria_id = -4; } else { if (preg_match("#^NOT_RUN\$#i", $case_result) || preg_match("#^NOTRUN\$#i", $case_result)) { $decision_criteria_id = -5; } else { $decision_criteria_id = -3; } } } } } // Determine execution_time $datetime_start = new DateTime($start_text); $datetime_end = new DateTime($end_text); $interval = date_diff($datetime_start, $datetime_end); $execution_time = $interval->format('00%Y-%M-%D %H:%I:%S'); // Create name if (empty($case_name)) { return 1101; } else { $name = $case_name; } // Create label if (empty($set_feature)) { return 1102; } else { $label = $set_feature; } // Create complement $complement = empty($case_description) ? " " : $case_description; // Create comment $comment = empty($case_comment) ? " " : $case_comment; // Status hard coded $resultStatus = 0; if ($merge_flag) { // Retrieve test result id relying on test name and feature label, if it exists $query = "SELECT tr.id tr_id\n\t\t\t\t\t\t\t\tFROM " . $qa_generic . ".test_result tr\n\t\t\t\t\t\t\t\t\t\tJOIN " . $qa_generic . ".table_name tn ON tn.name = 'test_result'\n\t\t\t\t\t\t\t\t\t\t\t\tJOIN " . $qa_generic . ".complementary_tool_relation ctr ON ctr.table_name_id = tn.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAND ctr.table_entry_id = tr.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAND ctr.label = '" . addslashes($label) . "'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tWHERE tr.test_session_id = " . $test_session_id . "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAND tr.name = '" . addslashes($name) . "'"; $result = Doctrine_Manager::getInstance()->getCurrentConnection()->execute($query)->fetch(PDO::FETCH_ASSOC); if (!empty($result)) { $test_result_exists_flag = true; $testResultId = $result['tr_id']; } } // Write into test_result table if ($test_result_exists_flag) { $measures = Doctrine_Query::create()->select('*')->from('Measure')->where('test_result_id = ?', $testResultId)->execute(); foreach ($measures as $measure) { $measure->delete($conn); } $testResult = Doctrine_Core::getTable("TestResult")->findOneById($testResultId); } else { $testResult = new TestResult(); $testResult->setName($name); $testResult->setTestSessionId($test_session_id); } $testResult->setComplement($complement); $testResult->setDecisionCriteriaId($decision_criteria_id); $testResult->setComment($comment); $testResult->setStartedAt($start_text); $testResult->setExecutionTime($execution_time); $testResult->setStatus($resultStatus); $testResult->save($conn); // Retrieve test_result id created $test_result_id = $testResult->getId(); // Determine category if (preg_match("#^ ?Component ?\$#i", $case_level)) { $category = 0; } elseif (preg_match("#^ ?Feature ?\$#i", $case_level)) { $category = 1; } elseif (preg_match("#^ ?Test ?case ?\$#i", $case_level)) { $category = 2; } elseif (preg_match("#^ ?Bug ?\$#i", $case_level)) { $category = 3; } elseif (preg_match("#^ ?Testing ?tool ?\$#i", $case_level)) { $category = 4; } else { $category = 1; } $category = 1; // Write into complementary_tool_relation table if (!$test_result_exists_flag) { $complementaryToolRelation = new ComplementaryToolRelation(); $complementaryToolRelation->setLabel($label); $complementaryToolRelation->setTableNameId($table_name_test_result_id); $complementaryToolRelation->setTableEntryId($test_result_id); $complementaryToolRelation->setCategory($category); $complementaryToolRelation->save($conn); } // Save Measure objects foreach ($measureObjectList as $measureObject) { $measureObject->setTestResultId($test_result_id); $measureObject->save($conn); } // Pass flags to false $flag_step_end = false; $test_result_exists_flag = false; $measureObjectList = array(); $flag_series_node_found = false; } // Fill in Measure objects $measurement_unit = empty($measurement_unit) ? " " : $measurement_unit; if (!$flag_series_node_found) { if ($new_measure and !empty($measurement_name)) { if (!empty($measurement_value)) { $measureObject = new Measure(); $measureObject->setValue($measurement_value); $measureObject->setUnit($measurement_unit); $measureObject->setDescription($measurement_name); $measureObject->setCategory(1); $measureObject->setOperator(1); $measureObjectList[] = $measureObject; } if (!empty($measurement_target)) { $measureObject = new Measure(); $measureObject->setValue($measurement_target); $measureObject->setUnit($measurement_unit); $measureObject->setDescription($measurement_name); $measureObject->setCategory(2); $measureObject->setOperator(1); $measureObjectList[] = $measureObject; } if (!empty($measurement_failure)) { $measureObject = new Measure(); $measureObject->setValue($measurement_failure); $measureObject->setUnit($measurement_unit); $measureObject->setDescription($measurement_name); $measureObject->setCategory(3); $measureObject->setOperator(1); $measureObjectList[] = $measureObject; } } } } } elseif ($xml_version == 2) { // While there are results while ($reader->read()) { $new_measure = false; // Parse the line so as to retrieve datas switch ($reader->nodeType) { case XMLREADER::ELEMENT: switch ($reader->name) { case "environment": $environment_device_id = $reader->getAttribute("device_id"); $environment_device_model = $reader->getAttribute("device_model"); $environment_device_name = $reader->getAttribute("device_name"); $environment_firmware_version = $reader->getAttribute("firmware_version"); $environment_host = $reader->getAttribute("host"); $environment_os_version = $reader->getAttribute("os_version"); $environment_resolution = $reader->getAttribute("resolution"); $environment_screen_size = $reader->getAttribute("screen_size"); break; case "other": $reader->read(); $other_text = $reader->value; break; case "summary": $summary_test_plan_name = $reader->getAttribute("test_plan_name"); break; case "start_at": $reader->read(); $start_at_text = $reader->value; break; case "end_at": $reader->read(); $end_at_text = $reader->value; break; case "suite": $suite_name = $reader->getAttribute("name"); break; case "set": $set_name = $reader->getAttribute("name"); break; case "testcase": $testcase_component = $reader->getAttribute("component"); $testcase_execution_type = $reader->getAttribute("execution_type"); $testcase_id = $reader->getAttribute("id"); $testcase_priority = $reader->getAttribute("priority"); $testcase_purpose = $reader->getAttribute("purpose"); $testcase_result = $reader->getAttribute("result"); $testcase_status = $reader->getAttribute("status"); $testcase_type = $reader->getAttribute("type"); break; case "pre_condition": $reader->read(); $pre_condition_text = $reader->value; break; case "notes": $reader->read(); $notes_text = $reader->value; break; case "test_script_entry": $test_script_entry_test_script_expected_result = $reader->getAttribute("test_script_expected_result"); $test_script_entry_timeout = $reader->getAttribute("timeout"); $reader->read(); $test_script_entry_text = $reader->value; case "actual_result": $reader->read(); $actual_result_text = $reader->value; break; case "start": $reader->read(); $start_text = $reader->value; break; case "end": $reader->read(); $end_text = $reader->value; break; case "stdout": $reader->read(); $stdout_text = $reader->value; break; case "stderr": $reader->read(); $stderr_text = $reader->value; break; case "series": $flag_series_node_found = true; $series_name = $reader->getAttribute("name"); $series_group = $reader->getAttribute("group"); $series_unit = $reader->getAttribute("unit"); $series_interval = $reader->getAttribute("interval"); $series_interval_unit = $reader->getAttribute("interval_unit"); break; case "measurement": $new_measure = true; $measurement_name = $reader->getAttribute("name"); $measurement_power = $reader->getAttribute("power"); $measurement_value = preg_replace('#(,)#', '.', $reader->getAttribute("value")); $measurement_failure = preg_replace('#(,)#', '.', $reader->getAttribute("failure")); $measurement_unit = $reader->getAttribute("unit"); $measurement_target = preg_replace('#(,)#', '.', $reader->getAttribute("target")); break; } break; case XMLReader::END_ELEMENT: switch ($reader->name) { case "series": $flag_series_node_found = false; break; case "testcase": $flag_step_end = true; $flag_case_found = true; break; case $tag_eof: $flag_eof = true; break; } break; } // Exit the loop if it has reached end of file if ($flag_eof) { if (!$flag_case_found) { return 1002; } break; } if ($flag_step_end) { // Write it into qa_generic database if (!$flag_test_environment_and_image_set) { if (!empty($suite_name)) { // Retrieve test_session_name from test_session_id $testSession = Doctrine_Core::getTable("TestSession")->findOneById($test_session_id); $name_buffer = $testSession->getName(); // If test_session_name is empty, replace it with suite_name if ($name_buffer == "Empty testsession") { Doctrine_Query::create()->update('TestSession')->set('name', '?', $suite_name)->where('id = ?', $test_session_id)->execute(); } } $flag_test_environment_and_image_set = true; } // Determine decision_criteria_id if (preg_match("#^PASS\$#i", $testcase_result)) { $decision_criteria_id = -1; } elseif (preg_match("#^FAIL\$#i", $testcase_result)) { $decision_criteria_id = -2; } else { if (preg_match("#^BLOCK\$#i", $testcase_result)) { $decision_criteria_id = -3; } else { if (preg_match("#^DEFER\$#i", $testcase_result) || preg_match("#^DEFERRED\$#i", $testcase_result)) { $decision_criteria_id = -4; } else { if (preg_match("#^NOT_RUN\$#i", $testcase_result) || preg_match("#^NOTRUN\$#i", $testcase_result)) { $decision_criteria_id = -5; } else { $decision_criteria_id = -3; } } } } // Determine execution_time if (empty($start_text)) { $start_text = " "; $execution_time = " "; } elseif (empty($end_text)) { $execution_time = " "; } else { $start_text = preg_replace('#^([0-9]{4}-[0-9]{2}-[0-9]{2})_([0-9]{2})_([0-9]{2})_([0-9]{2})$#', '$1 $2:$3:$4', $start_text); $end_text = preg_replace('#^([0-9]{4}-[0-9]{2}-[0-9]{2})_([0-9]{2})_([0-9]{2})_([0-9]{2})$#', '$1 $2:$3:$4', $end_text); $datetime_start = new DateTime($start_text); $datetime_end = new DateTime($end_text); $interval = date_diff($datetime_start, $datetime_end); $execution_time = $interval->format('00%Y-%M-%D %H:%I:%S'); } // Create name if (empty($testcase_id)) { return 1201; } else { $name = $testcase_id; } // Create label if (empty($testcase_component)) { return 1202; } else { $label = $testcase_component; } // Create complement $complement = empty($testcase_purpose) ? " " : $testcase_purpose; // Create comment $comment = empty($notes_text) ? " " : $notes_text; // Status hard coded $resultStatus = 0; if ($merge_flag) { // Retrieve test result id relying on test name and feature label, if it exists $query = "SELECT tr.id tr_id\n\t\t\t\t\t\t\t\tFROM " . $qa_generic . ".test_result tr\n\t\t\t\t\t\t\t\t\t\tJOIN " . $qa_generic . ".table_name tn ON tn.name = 'test_result'\n\t\t\t\t\t\t\t\t\t\t\t\tJOIN " . $qa_generic . ".complementary_tool_relation ctr ON ctr.table_name_id = tn.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAND ctr.table_entry_id = tr.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAND ctr.label = '" . addslashes($label) . "'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tWHERE tr.test_session_id = " . $test_session_id . "\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAND tr.name = '" . addslashes($name) . "'"; $result = Doctrine_Manager::getInstance()->getCurrentConnection()->execute($query)->fetch(PDO::FETCH_ASSOC); if (!empty($result)) { $test_result_exists_flag = true; $testResultId = $result['tr_id']; } } // Write into test_result table if ($test_result_exists_flag) { $measures = Doctrine_Query::create()->select('*')->from('Measure')->where('test_result_id = ?', $testResultId)->execute(); foreach ($measures as $measure) { $measure->delete($conn); } $testResult = Doctrine_Core::getTable("TestResult")->findOneById($testResultId); } else { $testResult = new TestResult(); $testResult->setName($name); $testResult->setTestSessionId($test_session_id); } $testResult->setComplement($complement); $testResult->setDecisionCriteriaId($decision_criteria_id); $testResult->setComment($comment); $testResult->setStartedAt($start_text); $testResult->setExecutionTime($execution_time); $testResult->setStatus($resultStatus); $testResult->save($conn); // Retrieve test_result id created $test_result_id = $testResult->getId(); // Category = Feature = 1 $category = 1; // Write into complementary_tool_relation table if (!$test_result_exists_flag) { $complementaryToolRelation = new ComplementaryToolRelation(); $complementaryToolRelation->setLabel($label); $complementaryToolRelation->setTableNameId($table_name_test_result_id); $complementaryToolRelation->setTableEntryId($test_result_id); $complementaryToolRelation->setCategory($category); $complementaryToolRelation->save($conn); } // Save Measure objects foreach ($measureObjectList as $measureObject) { $measureObject->setTestResultId($test_result_id); $measureObject->save($conn); } // Pass flags to false $flag_step_end = false; $test_result_exists_flag = false; $measureObjectList = array(); $flag_series_node_found = false; } // Fill in Measure objects $measurement_unit = empty($measurement_unit) ? " " : $measurement_unit; if (!$flag_series_node_found) { if ($new_measure and !empty($measurement_name)) { if (!empty($measurement_value)) { $measureObject = new Measure(); $measureObject->setValue($measurement_value); $measureObject->setUnit($measurement_unit); $measureObject->setDescription($measurement_name); $measureObject->setCategory(1); $measureObject->setOperator(1); $measureObjectList[] = $measureObject; } if (!empty($measurement_target)) { $measureObject = new Measure(); $measureObject->setValue($measurement_target); $measureObject->setUnit($measurement_unit); $measureObject->setDescription($measurement_name); $measureObject->setCategory(2); $measureObject->setOperator(1); $measureObjectList[] = $measureObject; } if (!empty($measurement_failure)) { $measureObject = new Measure(); $measureObject->setValue($measurement_failure); $measureObject->setUnit($measurement_unit); $measureObject->setDescription($measurement_name); $measureObject->setCategory(3); $measureObject->setOperator(1); $measureObjectList[] = $measureObject; } } } } } // Close the file $reader->close(); return 0; }