diff --git a/server/pifr_server.environment.inc b/server/pifr_server.environment.inc index 4f371f4..905e9aa 100644 --- a/server/pifr_server.environment.inc +++ b/server/pifr_server.environment.inc @@ -593,3 +593,21 @@ function pifr_server_environment_save(array $environment) { } return $environment; } + +/** + * Determine whether environment tests should be considered 'advisory'. + * + * Advisory tests are tests which may fail and return their results, but which + * should not cause the overall branch/patch test to be considered a failure. + * Environments are considered 'advisory' if the environment plugin_arguments + * array contains an 'advisory' key with non-empty value. + * + * @param $environment A pre-loaded environment array. + * @return boolean TRUE if considered 'advisory', otherwise FALSE + */ +function pifr_server_environment_is_advisory($environment) { + if (!empty($environment['plugin_argument']['advisory'])) { + return TRUE; + } + return FALSE; +} diff --git a/server/pifr_server.result.inc b/server/pifr_server.result.inc index d30ea9a..50b5297 100644 --- a/server/pifr_server.result.inc +++ b/server/pifr_server.result.inc @@ -84,8 +84,18 @@ function pifr_server_result_get_all($test_id) { function pifr_server_result_summary_status($test_id) { $pass = TRUE; $results = pifr_server_result_get_all($test_id); + $environments = pifr_server_environment_test_get_all($test_id); + $test = pifr_server_test_get($test_id); foreach ($results as $result) { - $pass = $pass && pifr_server_review_check($result); + // Check if an 'advisory' environment result. If so, and there are + // multiple environment results, then ignore the result when calculating + // the overall test result. Also ignore for client tests. + if ((count($results) < 2) + || (!pifr_server_environment_is_advisory($environments[$result['environment_id']])) + || ($test['type'] == 1) + ) { + $pass = $pass && pifr_server_review_check($result); + } } return $pass; } @@ -104,13 +114,16 @@ function pifr_server_result_summary_message($test_id) { $results = pifr_server_result_get_all($test_id); $environments = pifr_server_environment_test_get_all($test_id); foreach ($results as $result) { - $pass = $pass && pifr_server_review_check($result); - $summary_message = pifr_server_review_summary($result); $details = pifr_server_review_summary_format($result); $environment = $environments[$result['environment_id']]; $summary[$environment['plugin']][] = '[' . $environment['title'] . '] ' . t($summary_message, $details); + + // Determine overall test status + if (!pifr_server_environment_is_advisory($environment)) { + $pass = $pass && pifr_server_review_check($result); + } } // Condense the two level array into a summary string. diff --git a/server/pifr_server.test.inc b/server/pifr_server.test.inc index 454fefe..ffde9e2 100644 --- a/server/pifr_server.test.inc +++ b/server/pifr_server.test.inc @@ -905,16 +905,32 @@ abstract class PIFRTest { // Insert a row and status for each relevant environment. $environments = pifr_server_environment_test_get_all($this->test['test_id']); + // Set flag for 'Overall Test Status' + $advisorypass = TRUE; foreach ($environments as $environment) { $status = pifr_server_environment_status_get($environment['environment_id'], $this->test['test_id']); $message = t($status['status']); if ($status['status'] == 'result') { $message = pifr_server_review_check_code($environment, $status['code']) ? 'pass' : 'fail'; + if ($message == 'fail') { + // Check if this is an advisory test + if (!pifr_server_environment_is_advisory($environment)) { + $advisorypass = FALSE; + } + } } - $rows[] = array($environment['title'], $message); } + // If multiple environments tested, provide an 'overall' result (taking + // advisory environments into account) + if (count($rows) > 1) { + // Add blank line between environment results and 'overall' result + $rows[] = array(" ", " "); + // Add 'overall' result + $rows[] = array(t("Overall Result"), ($advisorypass ? 'pass' : 'fail')); + } + $rows = $this->formatTable($rows); // Color environment rows based on result status, if present.