protected static function download_test_files(&$test_install_request, $download_location = false, $no_prompts = false) { // Download needed files for a test if ($test_install_request->get_download_object_count() == 0) { return true; } $identifier = $test_install_request->test_profile->get_identifier(); pts_client::$display->test_install_downloads($test_install_request); if ($download_location == false) { $download_location = $test_install_request->test_profile->get_install_dir(); } pts_file_io::mkdir($download_location); $module_pass = array($identifier, $test_install_request->get_download_objects()); pts_module_manager::module_process('__pre_test_download', $module_pass); foreach ($test_install_request->get_download_objects() as $download_package) { $package_filename = $download_package->get_filename(); $download_destination = $download_location . $package_filename; $download_destination_temp = $download_destination . '.pts'; if ($download_package->get_download_location_type() == null) { // Attempt a possible last-minute look-aside copy cache in case a previous test in the install queue downloaded this file already $lookaside_copy = pts_test_install_manager::file_lookaside_test_installations($download_package); if ($lookaside_copy) { if ($download_package->get_filesize() == 0) { $download_package->set_filesize(filesize($lookaside_copy)); } $download_package->set_download_location('LOOKASIDE_DOWNLOAD_CACHE', array($lookaside_copy)); } } switch ($download_package->get_download_location_type()) { case 'IN_DESTINATION_DIR': pts_client::$display->test_install_download_file('FILE_FOUND', $download_package); continue; case 'REMOTE_DOWNLOAD_CACHE': $download_tries = 0; do { foreach ($download_package->get_download_location_path() as $remote_download_cache_file) { pts_client::$display->test_install_download_file('DOWNLOAD_FROM_CACHE', $download_package); pts_network::download_file($remote_download_cache_file, $download_destination_temp); if (!is_file($download_destination_temp) || filesize($download_destination_temp) == 0) { self::test_install_error(null, $test_install_request, 'The file failed to download from the cache.'); pts_file_io::unlink($download_destination_temp); break; } else { if ($download_package->check_file_hash($download_destination_temp)) { rename($download_destination_temp, $download_destination); break; } else { self::test_install_error(null, $test_install_request, 'The check-sum of the downloaded file failed.'); pts_file_io::unlink($download_destination_temp); } } } $download_tries++; } while (!is_file($download_destination) && $download_tries < 2); if (is_file($download_destination)) { continue; } case 'MAIN_DOWNLOAD_CACHE': case 'LOCAL_DOWNLOAD_CACHE': case 'LOOKASIDE_DOWNLOAD_CACHE': $download_cache_file = pts_arrays::last_element($download_package->get_download_location_path()); if (is_file($download_cache_file)) { if (pts_config::read_bool_config('PhoronixTestSuite/Options/Installation/SymLinkFilesFromCache', 'FALSE') && $download_package->get_download_location_type() != 'LOOKASIDE_DOWNLOAD_CACHE') { // For look-aside copies never symlink (unless a pre-packaged LiveCD) in case the other test ends up being un-installed // SymLinkFilesFromCache is disabled by default pts_client::$display->test_install_download_file('LINK_FROM_CACHE', $download_package); symlink($download_cache_file, $download_destination); } else { // File is to be copied // Try up to two times to copy a file $attempted_copies = 0; do { pts_client::$display->test_install_download_file('COPY_FROM_CACHE', $download_package); // $context = stream_context_create(); // stream_context_set_params($context, array('notification' => array('pts_network', 'stream_status_callback'))); // TODO: get the context working correctly for this copy() copy($download_cache_file, $download_destination_temp); pts_client::$display->test_install_progress_completed(); // Verify that the file was copied fine if ($download_package->check_file_hash($download_destination_temp)) { rename($download_destination_temp, $download_destination); break; } else { self::test_install_error(null, $test_install_request, 'The check-sum of the copied file failed.'); pts_file_io::unlink($download_destination_temp); } $attempted_copies++; } while ($attempted_copies < 2); } if (is_file($download_destination)) { continue; } } default: $package_urls = $download_package->get_download_url_array(); // Download the file if (!is_file($download_destination) && count($package_urls) > 0 && $package_urls[0] != null) { $fail_count = 0; do { if (pts_network::internet_support_available()) { if (!$no_prompts && pts_config::read_bool_config('PhoronixTestSuite/Options/Installation/PromptForDownloadMirror', 'FALSE') && count($package_urls) > 1) { // Prompt user to select mirror do { echo PHP_EOL . 'Available Download Mirrors:' . PHP_EOL . PHP_EOL; $url = pts_user_io::prompt_text_menu('Select Preferred Mirror', $package_urls, false); } while (pts_strings::is_url($url) == false); } else { // Auto-select mirror shuffle($package_urls); do { $url = array_pop($package_urls); } while (pts_strings::is_url($url) == false && !empty($package_urls)); } pts_client::$display->test_install_download_file('DOWNLOAD', $download_package); $download_start = time(); pts_network::download_file($url, $download_destination_temp); $download_end = time(); } else { self::test_install_error(null, $test_install_request, 'Internet support is needed and it\'s disabled or not available.'); return false; } if ($download_package->check_file_hash($download_destination_temp)) { // Download worked if (is_file($download_destination_temp)) { rename($download_destination_temp, $download_destination); } if ($download_package->get_filesize() > 0 && $download_end != $download_start) { pts_download_speed_manager::update_download_speed_average($download_package->get_filesize(), $download_end - $download_start); } } else { // Download failed if (is_file($download_destination_temp) && filesize($download_destination_temp) < 500 && (stripos(file_get_contents($download_destination_temp), 'not found') !== false || strpos(file_get_contents($download_destination_temp), 404) !== false)) { self::test_install_error(null, $test_install_request, 'File Not Found: ' . $url); $md5_failed = false; } else { if (is_file($download_destination_temp) && filesize($download_destination_temp) > 0) { self::test_install_error(null, $test_install_request, 'Checksum Failed: ' . $url); $md5_failed = true; } else { self::test_install_error(null, $test_install_request, 'Download Failed: ' . $url); $md5_failed = false; } } pts_file_io::unlink($download_destination_temp); $fail_count++; if ($fail_count > 3) { $try_again = false; } else { if (count($package_urls) > 0 && $package_urls[0] != null) { self::test_install_error(null, $test_install_request, 'Attempting to download from alternate mirror.'); $try_again = true; } else { if ($no_prompts) { $try_again = false; } else { if ($md5_failed) { $try_again = pts_user_io::prompt_bool_input('Try downloading the file again', true, 'TRY_DOWNLOAD_AGAIN'); } else { $try_again = false; } } if ($try_again) { $package_urls[] = $url; } } } if (!$try_again) { //self::test_install_error(null, $test_install_request, 'Download of Needed Test Dependencies Failed!'); return false; } } } while (!is_file($download_destination)); } pts_module_manager::module_process('__interim_test_download', $module_pass); } } pts_module_manager::module_process('__post_test_download', $identifier); return true; }
public static function run($r) { $render_dir = pts_client::temporary_directory() . '/pts-render-test-310815/'; if (!is_file($render_dir . 'mega-render-test.tar.bz2')) { pts_file_io::mkdir($render_dir); pts_network::download_file('http://linuxbenchmarking.com/misc/mega-render-test-310815.tar.bz2', $render_dir . 'mega-render-test.tar.bz2'); pts_compression::archive_extract($render_dir . 'mega-render-test.tar.bz2'); } define('PATH_TO_EXPORTED_PHOROMATIC_DATA', $render_dir . 'mega-render-test-310815/'); error_reporting(E_ALL); ini_set('memory_limit', '2048M'); $export_index_json = file_get_contents(PATH_TO_EXPORTED_PHOROMATIC_DATA . 'export-index.json'); $export_index_json = json_decode($export_index_json, true); $dump_size = 0; $start = microtime(true); foreach (array_keys($export_index_json['phoromatic']) as $REQUESTED) { $this_render_test = time(); $tracker =& $export_index_json['phoromatic'][$REQUESTED]; $triggers = $tracker['triggers']; echo PHP_EOL . 'STARTING RENDER TEST ON: ' . $REQUESTED . ' (' . count($triggers) . ' Triggers)' . PHP_EOL; $length = count($tracker['triggers']); $result_files = array(); foreach ($triggers as $trigger) { $results_for_trigger = glob(PATH_TO_EXPORTED_PHOROMATIC_DATA . '/' . $REQUESTED . '/' . $trigger . '/*/composite.xml'); echo '.'; if ($results_for_trigger == false) { continue; } foreach ($results_for_trigger as $composite_xml) { // Add to result file $system_name = basename(dirname($composite_xml)) . ': ' . $trigger; array_push($result_files, new pts_result_merge_select($composite_xml, null, $system_name)); } } echo 'STARTING MERGE; '; $result_file = new pts_result_file(null, true); $result_file->merge($result_files); echo 'MAKING NEW RESULT FILE; '; $extra_attributes = array('reverse_result_buffer' => true, 'force_simple_keys' => true, 'force_line_graph_compact' => true, 'force_tracking_line_graph' => true); //$extra_attributes['normalize_result_buffer'] = true; $intent = null; //$table = new pts_ResultFileTable($result_file, $intent); //echo '<p style="text-align: center; overflow: auto;" class="result_object">' . pts_render::render_graph_inline_embed($table, $result_file, $extra_attributes) . '</p>'; echo 'STARTING RESULT LOOP; '; $html_dump = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body>'; foreach ($result_file->get_result_objects(isset($_POST['show_only_changed_results']) ? 'ONLY_CHANGED_RESULTS' : -1) as $i => $result_object) { echo $result_object->test_profile->get_title() . ' '; $html_dump .= '<h3>' . $result_object->get_arguments_description() . '</h3>'; $html_dump .= pts_render::render_graph_inline_embed($result_object, $result_file, $extra_attributes); unset($result_object); } $table = new pts_ResultFileSystemsTable($result_file); $html_dump .= pts_render::render_graph_inline_embed($table, $result_file, $extra_attributes); echo PHP_EOL . PHP_EOL . 'RENDER TEST ON: ' . $REQUESTED . ' TOOK ' . (time() - $this_render_test) . PHP_EOL; $dump_size += strlen($html_dump); file_put_contents(PATH_TO_EXPORTED_PHOROMATIC_DATA . $REQUESTED . '.html', $html_dump . '</body></html>'); } echo PHP_EOL . 'RENDER TEST TOOK: ' . (time() - $start) . PHP_EOL . PHP_EOL; echo PHP_EOL . 'PEAK MEMORY USAGE: ' . round(memory_get_peak_usage(true) / 1048576, 3) . ' MB'; echo PHP_EOL . 'PEAK MEMORY USAGE (emalloc): ' . round(memory_get_peak_usage() / 1048576, 3) . ' MB'; echo PHP_EOL . 'TOTAL FILE SIZE: ' . ceil($dump_size / 1000) . ' KB'; echo PHP_EOL; }