// // aegis - project change supervisor // Copyright (C) 2000-2008, 2011, 2012, 2014 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or (at // your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include batch_result_list_ty * change_test_batch_fake(change::pointer cp, string_list_ty *wlp, user_ty::pointer up, bool baseline_flag, int current, int total, time_t time_limit, const nstring_list &variable_assignments, const long *remaining) { size_t j; string_ty *dir; int (*run_test_command)(change::pointer , user_ty::pointer , string_ty *, string_ty *, int, int, const nstring_list &vars); cstate_ty *cstate_data; batch_result_list_ty *result; int persevere; // // which command // trace(("change_test_batch_fake(cp = %p, wlp = %p, up = %p, " "baseline_flag = %d, current = %d, total = %d, time_limit = %ld, " "remaining = %p)\n{\n", cp.get(), wlp, up.get(), baseline_flag, current, total, (long)time_limit, remaining)); cstate_data = cp->cstate_get(); run_test_command = change_run_test_command; if (cstate_data->state != cstate_state_being_integrated) run_test_command = change_run_development_test_command; persevere = up->persevere_preference(true); // // directory depends on the state of the change // // During long tests the automounter can unmount the // directory referenced by the "dir" variable. // To minimize this, it is essential that they are // unresolved, and thus always trigger the automounter. // dir = cp->project_get()->baseline_path_get(); if (!baseline_flag && !cp->is_bogus()) { switch (cstate_data->state) { case cstate_state_awaiting_development: assert(0); case cstate_state_completed: break; case cstate_state_being_integrated: dir = cp->integration_directory_get(0); break; case cstate_state_being_developed: case cstate_state_awaiting_review: case cstate_state_being_reviewed: case cstate_state_awaiting_integration: dir = cp->development_directory_get(0); break; } } // // allocate a place to store the results // result = batch_result_list_new(); // // one command per file // for (j = 0; j < wlp->size(); ++j) { string_ty *fn; string_ty *fn_abs; fstate_src_ty *src_data; int inp; int exit_status; // // display progress message if requested // if (total > 0) { sub_context_ty sc; sc.var_set_long("Current", current + j + 1); sc.var_set_long("Total", total); trace(("remaining = %ld\n", remaining[j])); sc.var_set_string("REMaining", format_elapsed(remaining[j])); sc.var_optional("REMaining"); change_error(cp, &sc, i18n("test $current of $total")); } // // resolve the file name // fn = (*wlp)[j]; src_data = cp->file_find(nstring(fn), view_path_first); if (src_data) { fn_abs = cp->file_path(fn); } else { src_data = cp->project_get()->file_find(fn, view_path_simple); assert(src_data); fn_abs = project_file_path(cp->project_get(), fn); } assert(fn_abs); // // figure the command execution flags // inp = 0; switch (src_data->usage) { case file_usage_source: case file_usage_config: case file_usage_build: case file_usage_test: break; case file_usage_manual_test: inp = 1; break; } // // run the command // double t_begin = dtime(); exit_status = run_test_command ( cp, up, fn_abs, dir, inp, baseline_flag, variable_assignments ); trace(("exit_status = %d\n", exit_status)); double t_end = dtime(); double elapsed = t_end - t_begin; trace(("elapsed = %g\n", elapsed)); // // remember what happened // batch_result_list_append(result, fn, exit_status, 0, elapsed); // // verbose progress message // switch (exit_status) { case 1: if (baseline_flag) { sub_context_ty sc; sc.var_set_string("File_Name", fn); change_verbose(cp, &sc, i18n("$filename baseline fail, good")); result->pass_count++; } else { sub_context_ty sc; sc.var_set_string("File_Name", fn); change_verbose(cp, &sc, i18n("$filename fail")); result->fail_count++; } break; case 0: if (baseline_flag) { sub_context_ty sc; sc.var_set_string("File_Name", fn); change_verbose ( cp, &sc, i18n("$filename baseline pass, not good") ); result->fail_count++; } else { sub_context_ty sc; sc.var_set_string("File_Name", fn); change_verbose(cp, &sc, i18n("$filename pass")); result->pass_count++; } break; case 77: { // Note: the value 77 was chosen to be compatible with // other test systems. sub_context_ty sc; sc.var_set_string("File_Name", fn); change_verbose(cp, &sc, i18n("$filename skipped")); result->skip_count++; } break; default: { sub_context_ty sc; sc.var_set_string("File_Name", fn); change_verbose(cp, &sc, i18n("$filename no result")); result->no_result_count++; } break; } str_free(fn_abs); // // don't persevere if the user asked us not to // if (!persevere && (result->fail_count || result->no_result_count)) break; // // If we have been given a time limit, and that time has passed, // do not continue testing. // if (time_limit) { time_t curr_time; time(&curr_time); if (curr_time >= time_limit) break; } } // // all done // trace(("return %p;\n", result)); trace(("}\n")); return result; } // vim: set ts=8 sw=4 et :