Пример #1
0
 /**
  * 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;
 }