From ffc115afa26a1e44e1924017784ebcb1be394f9d Mon Sep 17 00:00:00 2001 From: Hamid Aghdaee Date: Sat, 16 Nov 2002 00:35:53 +0000 Subject: [PATCH] Added a few functions to test.inc. One now has the ability to remove and reinstall parts of a project. These functions can be used while running the client asynchronously and can be used to test the expononetial backoff and recovery mechanism of the client. Added two files: test_sched_failure.php which can be used to test recovery on scheduler failures test_masterurl_failure.php which can be used to test recovery on masterurl failures Fixed a couple of bugs in cs_scheduler.C and scheduler_op.C svn path=/trunk/boinc/; revision=624 --- test/test.inc | 75 ++++++++++++++++++++++++++++++++- test/test_masterurl_failure.php | 55 ++++++++++++++++++++++++ test/test_sched_failure.php | 57 +++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 test/test_masterurl_failure.php create mode 100644 test/test_sched_failure.php diff --git a/test/test.inc b/test/test.inc index aad876a50b..23abcc9f7d 100644 --- a/test/test.inc +++ b/test/test.inc @@ -172,7 +172,7 @@ class Project { run_db_script("constraints.sql", $this->db_name); db_open($this->db_name); - db_query("insert into project(name) values('$this->name')"); + db_query("insert into project(name) values('$this->name')"); for ($i=0; $iusers); $i++) { $user = $this->users[$i]; @@ -271,7 +271,77 @@ class Project { $admin_url = $html_url."/".$this->name."/html_ops/index.html"; echo "The admin URL for project $this->name is $admin_url\n"; } + + //moves the masterindex file to temp after $time seconds (if not null).This is used to test exponential backoff on the client side. + function delete_masterindex($time) + { + if($time != null) + { + echo "\nsleeping for $time seconds"; + PassThru("sleep $time"); + } + PassThru("mv $this->project_dir/html_user/index.php $this->project_dir/html_user/temp"); + } + + //moves temp back to the masterindex after $time seconds(if not null). This is used to test exponential backoff on the client side. + + function reestablish_masterindex($time) + { + if($time != null) + { + echo "\nsleeping for $time seconds"; + PassThru("sleep $time"); + } + PassThru("mv $this->project_dir/html_user/temp $this->project_dir/html_user/index.php"); + + } + + //delete the cgi file for this project after $time if not null. This is used to test exponential backoff on the client side. + function delete_scheduler($time) + { + if($time != null) + { + echo "\nsleeping for $time seconds"; + PassThru("sleep $time"); + } + PassThru("rm $this->project_dir/cgi/cgi"); + } + + //copies the cgi file back into the cgi directory.This is used to test exponential backoff on the client side. + function reinstall_scheduler($time) + { + $source_dir = get_env_var("BOINC_SRC_DIR"); + if($time != null) + { + echo "\nsleeping for $time seconds"; + PassThru("sleep $time"); + } + PassThru("cp $source_dir/sched/cgi $this->project_dir/cgi/"); + } + + //moves the download directory to temp. This is used to test exponential backoff on the client side. + function delete_downloaddir($time) + { + if($time != null) + { + echo "\nsleeping for $time seconds"; + PassThru("sleep $time"); + } + PassThru("mv $this->project_dir/download/ $this->project_dir/temp/"); + } + + //reinstalls the download directory. This is used to test exponential backoff on the client side. + function reinstall_downloaddir($time) + { + if($time != null) + { + echo "\nsleeping for $time seconds"; + PassThru("sleep $time"); + } + PassThru("mv $this->project_dir/temp/ $this->project_dir/download/"); + } + function start_feeder(){ PassThru("cd $this->project_dir/cgi; ./feeder -asynch > feeder_out"); } @@ -291,6 +361,9 @@ class Project { fclose($f); } + + + function check_results($ntarget, $result) { $n = 0; db_open($this->db_name); diff --git a/test/test_masterurl_failure.php b/test/test_masterurl_failure.php new file mode 100644 index 0000000000..8a33f4af87 --- /dev/null +++ b/test/test_masterurl_failure.php @@ -0,0 +1,55 @@ +#! /usr/local/bin/php +add_app($core_app); + $project->add_app_version($core_app_version); + + $project->add_user($user); + $project->add_app($app); + $project->add_app_version($app_version); + + $project->install(); // must install projects before adding to hosts + + $host->log_flags = "log_flags.xml"; + $host->add_project($project); + $host->install(); + + echo "adding work\n"; + + $work = new Work($app); + $work->wu_template = "uc_wu"; + $work->result_template = "uc_result"; + $work->nresults = 2; + $work->delay_bound = 10; + array_push($work->input_files, "input"); + $work->install($project); + + $project->start_feeder(); + $project->delete_masterindex(null); + $pid = $host->run_asynch("-exit_when_idle"); + $project->reestablish_masterindex(100); + $status = 0; + pcntl_waitpid($pid,$status,0); + $project->stop(); + + $result->state = RESULT_STATE_DONE; + $result->stderr_out = "APP: upper_case: starting, argc 1"; + $result->exit_status = 0; + $project->check_results(2, $result); + $project->compare_file("uc_wu_0_0", "uc_correct_output"); + $project->compare_file("uc_wu_1_0", "uc_correct_output"); +?> diff --git a/test/test_sched_failure.php b/test/test_sched_failure.php new file mode 100644 index 0000000000..a7104b196b --- /dev/null +++ b/test/test_sched_failure.php @@ -0,0 +1,57 @@ +#! /usr/local/bin/php +add_app($core_app); + $project->add_app_version($core_app_version); + + $project->add_user($user); + $project->add_app($app); + $project->add_app_version($app_version); + + $project->install(); // must install projects before adding to hosts + + $host->log_flags = "log_flags.xml"; + $host->add_project($project); + $host->install(); + + echo "adding work\n"; + + $work = new Work($app); + $work->wu_template = "uc_wu"; + $work->result_template = "uc_result"; + $work->nresults = 2; + $work->delay_bound = 10; + array_push($work->input_files, "input"); + $work->install($project); + + $project->start_feeder(); + //delete the scheduler immediately + $project->delete_scheduler(null); + $pid = $host->run_asynch("-exit_when_idle"); + //reinstall scheduler after 500 seconds + $project->reinstall_scheduler(500); + $status = 0; + //wait until the host has stopped running + pcntl_waitpid($pid,$status,0); + $project->stop(); + + $result->state = RESULT_STATE_DONE; + $result->stderr_out = "APP: upper_case: starting, argc 1"; + $result->exit_status = 0; + $project->check_results(2, $result); + $project->compare_file("uc_wu_0_0", "uc_correct_output"); + $project->compare_file("uc_wu_1_0", "uc_correct_output"); +?>