#!/usr/local/bin/php -q
<?php {
    // $Id$

    // End to end test.  Tests make_work, feeder, scheduling server, client,
    // file_upload_handler, validator, assimilator, timeout_check, and
    // file_deleter on a large batch of workunits.  Confirms that credit
    // is correctly granted and that unneeded files are deleted

    include_once("test.inc");

    test_msg("backend");

    $project = new Project;
    $user = new User();
    $host = new Host($user);
    $app = new App("upper_case");
    $app_version = new App_Version($app);

    $work = new Work($app);
    $work->wu_template = "uc_wu";
    $work->result_template = "uc_result";
    $work->redundancy = 5;
    $work->delay_bound = 70;
    array_push($work->input_files, "input");

    $project->add_user($user);
    $project->add_app($app);
    $project->add_app_version($app_version);
    $project->install();      // must install projects before adding to hosts
    $project->install_make_work($work, 499, 5);

    $host->log_flags = "log_flags.xml";
    $host->add_user($user,$project);
    $host->install();

    $work->install($project);

    $project->start_servers();

    // Start by generating a batch of 500 results
    $n = 0;
    while($n < 500 ) {
        $n = $project->num_wus_left();
        verbose_echo(1, "Generating results [$n/500]");
        sleep(1);
    }
    verbose_echo(1, "Generating results... 500 done");

    // Stop the project, deinstall make_work, and install the normal backend components
    $project->stop();
    $project->deinstall_make_work();
    $project->install_assimilator($app);
    $project->install_file_delete();
    $project->install_validate($app, 5);
    $project->install_feeder();
    $project->install_timeout_check($app, 5, 5, 0);

    while (($pid=exec("pgrep -n make_work")) != null) sleep(1);

    // Restart the server
    $project->restart();
    $project->start_servers();

    // Run the client until there's no more work
    $host->run("-exit_when_idle -skip_cpu_benchmarks");

    // Give the server 30 seconds to finish assimilating/deleting
    sleep(30);

    // *** DO CHECKS HERE
    $result->server_state = RESULT_SERVER_STATE_OVER;
    $result->exit_status = 0;
    $project->check_results(500, $result);

    // Stop the server
    $project->stop();

    test_done();
} ?>