1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
#include "tut.h"
#include "tut_reporter.h"
#include <string>
#include <apr_general.h>
#include <signal.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include "Utils.h"
using namespace std;
namespace tut {
test_runner_singleton runner;
}
typedef tut::groupnames::const_iterator groupnames_iterator;
/** All available groups. */
static tut::groupnames allGroups;
/** Whether the user wants to run all test groups, or only the specified test groups. */
static enum { RUN_ALL_GROUPS, RUN_SPECIFIED_GROUPS } runMode = RUN_ALL_GROUPS;
/** The test groups the user wants to run. Only meaningful if runMode == RUN_SPECIFIED_GROUPS. */
static tut::groupnames groupsToRun;
static void
usage(int exitCode) {
printf("Usage: ./Apache2ModuleTests [options]\n");
printf("Runs the unit tests for the Apache 2 module.\n\n");
printf("Options:\n");
printf(" -g GROUP_NAME Instead of running all unit tests, only run the test group\n");
printf(" named GROUP_NAME. You can specify -g multiple times, which\n");
printf(" will result in only the specified test groups being run.\n\n");
printf(" Available test groups:\n\n");
for (groupnames_iterator it = allGroups.begin(); it != allGroups.end(); it++) {
printf(" %s\n", it->c_str());
}
printf("\n");
printf(" -h Print this usage information.\n");
exit(exitCode);
}
static bool
groupExists(const string &name) {
for (groupnames_iterator it = allGroups.begin(); it != allGroups.end(); it++) {
if (name == *it) {
return true;
}
}
return false;
}
static void
parseOptions(int argc, char *argv[]) {
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "-h") == 0) {
usage(0);
} else if (strcmp(argv[i], "-g") == 0) {
if (argv[i + 1] == NULL) {
fprintf(stderr, "*** ERROR: A -g option must be followed by a test group name.\n");
exit(1);
} else if (!groupExists(argv[i + 1])) {
fprintf(stderr,
"*** ERROR: Invalid test group '%s'. Available test groups are:\n\n",
argv[i + 1]);
for (groupnames_iterator it = allGroups.begin(); it != allGroups.end(); it++) {
printf("%s\n", it->c_str());
}
exit(1);
} else {
runMode = RUN_SPECIFIED_GROUPS;
groupsToRun.push_back(argv[i + 1]);
i++;
}
} else {
fprintf(stderr, "*** ERROR: Unknown option: %s\n", argv[i]);
fprintf(stderr, "Please pass -h for a list of valid options.\n");
exit(1);
}
}
}
/**
* Creates a Phusion Passenger temp dir at the beginning, and deletes it
* at program exit.
*/
struct TempDirSetup {
TempDirSetup() {
char command[1024];
Passenger::createPassengerTempDir("", geteuid() == 0,
"nobody", geteuid(), getgid());
snprintf(command, sizeof(command), "chmod -R u=rwx,g=rwx,o=rwx \"%s\"",
Passenger::getPassengerTempDir().c_str());
system(command);
}
~TempDirSetup() {
Passenger::removeDirTree(Passenger::getPassengerTempDir());
}
};
int
main(int argc, char *argv[]) {
apr_initialize();
signal(SIGPIPE, SIG_IGN);
setenv("RAILS_ENV", "production", 1);
setenv("TESTING_PASSENGER", "1", 1);
tut::reporter reporter;
tut::runner.get().set_callback(&reporter);
allGroups = tut::runner.get().list_groups();
parseOptions(argc, argv);
TempDirSetup ts;
try {
bool all_ok = true;
if (runMode == RUN_ALL_GROUPS) {
tut::runner.get().run_tests();
all_ok = reporter.all_ok();
} else {
all_ok = true;
for (groupnames_iterator it = groupsToRun.begin(); it != groupsToRun.end(); it++) {
tut::runner.get().run_tests(*it);
all_ok = all_ok && reporter.all_ok();
}
}
if (all_ok) {
return 0;
} else {
return 1;
}
} catch (const std::exception &ex) {
cerr << "*** Exception raised: " << ex.what() << endl;
return 2;
}
}
|