00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <config.h>
00024
00025 #include "testrunner.h"
00026
00027 #include "testsuite.h"
00028 #include "backendmanager.h"
00029 #include "backendmanager_brass.h"
00030 #include "backendmanager_chert.h"
00031 #include "backendmanager_flint.h"
00032 #include "backendmanager_inmemory.h"
00033 #include "backendmanager_multi.h"
00034 #include "backendmanager_remoteprog.h"
00035 #include "backendmanager_remotetcp.h"
00036
00037 #include "stringutils.h"
00038 #include <iostream>
00039
00040 using namespace std;
00041
00042 BackendManager * backendmanager;
00043
00046 struct BackendProperties {
00047 const char * name;
00048 const char * properties;
00049 };
00050
00053 static BackendProperties backend_properties[] = {
00054 { "none", "" },
00055 { "inmemory", "backend,positional,writable,metadata,valuestats,inmemory" },
00056 { "brass", "backend,transactions,positional,writable,spelling,metadata,"
00057 "synonyms,replicas,valuestats,generated,brass" },
00058 { "chert", "backend,transactions,positional,writable,spelling,metadata,"
00059 "synonyms,replicas,valuestats,generated,chert" },
00060 { "flint", "backend,transactions,positional,writable,spelling,metadata,"
00061 "synonyms,replicas,generated,flint" },
00062 { "multi_brass", "backend,positional,valuestats,multi" },
00063 { "multi_chert", "backend,positional,valuestats,multi" },
00064 { "multi_flint", "backend,positional,multi" },
00065 { "remoteprog_brass", "backend,remote,transactions,positional,valuestats,writable,metadata" },
00066 { "remotetcp_brass", "backend,remote,transactions,positional,valuestats,writable,metadata" },
00067 { "remoteprog_chert", "backend,remote,transactions,positional,valuestats,writable,metadata" },
00068 { "remotetcp_chert", "backend,remote,transactions,positional,valuestats,writable,metadata" },
00069 { "remoteprog_flint", "backend,remote,transactions,positional,writable,metadata" },
00070 { "remotetcp_flint", "backend,remote,transactions,positional,writable,metadata" },
00071 { NULL, NULL }
00072 };
00073
00074 TestRunner::~TestRunner() { }
00075
00076 void
00077 TestRunner::set_properties(const string & properties)
00078 {
00079
00080 backend = false;
00081 remote = false;
00082 transactions = false;
00083 positional = false;
00084 writable = false;
00085 multi = false;
00086 spelling = false;
00087 synonyms = false;
00088 metadata = false;
00089 replicas = false;
00090 valuestats = false;
00091 generated = false;
00092 inmemory = false;
00093 brass = false;
00094 chert = false;
00095 flint = false;
00096
00097
00098 string::size_type pos = 0;
00099 string::size_type comma = 0;
00100 while (pos != string::npos) {
00101 comma = properties.find(',', pos + 1);
00102 string propname = properties.substr(pos, comma - pos);
00103
00104
00105 if (propname.empty()) {}
00106 else if (propname == "backend")
00107 backend = true;
00108 else if (propname == "remote")
00109 remote = true;
00110 else if (propname == "transactions")
00111 transactions = true;
00112 else if (propname == "positional")
00113 positional = true;
00114 else if (propname == "writable")
00115 writable = true;
00116 else if (propname == "multi")
00117 multi = true;
00118 else if (propname == "spelling")
00119 spelling = true;
00120 else if (propname == "synonyms")
00121 synonyms = true;
00122 else if (propname == "metadata")
00123 metadata = true;
00124 else if (propname == "replicas")
00125 replicas = true;
00126 else if (propname == "valuestats")
00127 valuestats = true;
00128 else if (propname == "generated")
00129 generated = true;
00130 else if (propname == "inmemory")
00131 inmemory = true;
00132 else if (propname == "brass")
00133 brass = true;
00134 else if (propname == "chert")
00135 chert = true;
00136 else if (propname == "flint")
00137 flint = true;
00138 else
00139 throw Xapian::InvalidArgumentError("Unknown property '" + propname + "' found in proplist");
00140
00141 if (comma == string::npos)
00142 break;
00143 pos = comma + 1;
00144 }
00145 }
00146
00147 bool
00148 TestRunner::use_backend(const string & backend_name)
00149 {
00150 if (user_backend.empty())
00151 return true;
00152 if (backend_name == user_backend)
00153 return true;
00154 if (startswith(backend_name, user_backend + "_"))
00155 return true;
00156 return false;
00157 }
00158
00159 void
00160 TestRunner::set_properties_for_backend(const string & backend_name)
00161 {
00162 const char * propstring = NULL;
00163 for (const BackendProperties * i = backend_properties; i->name; ++i) {
00164 if (backend_name == i->name) {
00165 propstring = i->properties;
00166 break;
00167 }
00168 }
00169 if (!propstring)
00170 throw Xapian::InvalidArgumentError("Unknown backend " + backend_name);
00171 set_properties(propstring);
00172 }
00173
00174 void
00175 TestRunner::do_tests_for_backend(BackendManager * manager)
00176 {
00177 string backend_name = manager->get_dbtype();
00178 if (use_backend(backend_name)) {
00179 backendmanager = manager;
00180 backendmanager->set_datadir(srcdir + "/testdata/");
00181 set_properties_for_backend(backend_name);
00182 cout << "Running tests with backend \"" << backendmanager->get_dbtype() << "\"..." << endl;
00183 result_so_far = max(result_so_far, run());
00184 }
00185 }
00186
00187 int
00188 TestRunner::run_tests(int argc, char ** argv)
00189 {
00190 result_so_far = 0;
00191 try {
00192 test_driver::add_command_line_option("backend", 'b', &user_backend);
00193 test_driver::parse_command_line(argc, argv);
00194 srcdir = test_driver::get_srcdir();
00195
00196 {
00197 BackendManager m;
00198 do_tests_for_backend(&m);
00199 }
00200
00201 #ifdef XAPIAN_HAS_INMEMORY_BACKEND
00202 {
00203 BackendManagerInMemory m;
00204 do_tests_for_backend(&m);
00205 }
00206 #endif
00207
00208 #ifdef XAPIAN_HAS_BRASS_BACKEND
00209 {
00210 BackendManagerBrass m;
00211 do_tests_for_backend(&m);
00212 }
00213 #endif
00214
00215 #ifdef XAPIAN_HAS_CHERT_BACKEND
00216 {
00217 BackendManagerChert m;
00218 do_tests_for_backend(&m);
00219 }
00220 #endif
00221
00222 #ifdef XAPIAN_HAS_FLINT_BACKEND
00223 {
00224 BackendManagerFlint m;
00225 do_tests_for_backend(&m);
00226 }
00227 #endif
00228
00229 #ifdef XAPIAN_HAS_BRASS_BACKEND
00230 {
00231 BackendManagerMulti m("brass");
00232 do_tests_for_backend(&m);
00233 }
00234 #endif
00235 #ifdef XAPIAN_HAS_CHERT_BACKEND
00236 {
00237 BackendManagerMulti m("chert");
00238 do_tests_for_backend(&m);
00239 }
00240 #endif
00241 #ifdef XAPIAN_HAS_FLINT_BACKEND
00242 {
00243 BackendManagerMulti m("flint");
00244 do_tests_for_backend(&m);
00245 }
00246 #endif
00247
00248 #ifdef XAPIAN_HAS_REMOTE_BACKEND
00249 #ifdef XAPIAN_HAS_BRASS_BACKEND
00250 {
00251 BackendManagerRemoteProg m("brass");
00252 do_tests_for_backend(&m);
00253 }
00254 {
00255 BackendManagerRemoteTcp m("brass");
00256 do_tests_for_backend(&m);
00257 }
00258 #endif
00259 #ifdef XAPIAN_HAS_CHERT_BACKEND
00260 {
00261 BackendManagerRemoteProg m("chert");
00262 do_tests_for_backend(&m);
00263 }
00264 {
00265 BackendManagerRemoteTcp m("chert");
00266 do_tests_for_backend(&m);
00267 }
00268 #endif
00269 #ifdef XAPIAN_HAS_FLINT_BACKEND
00270 {
00271 BackendManagerRemoteProg m("flint");
00272 do_tests_for_backend(&m);
00273 }
00274 {
00275 BackendManagerRemoteTcp m("flint");
00276 do_tests_for_backend(&m);
00277 }
00278 #endif
00279 #endif
00280 } catch (const Xapian::Error &e) {
00281 cerr << "\nTest harness failed with " << e.get_description() << endl;
00282 return 1;
00283 } catch (const std::string &e) {
00284 cerr << "\nTest harness failed with \"" << e << "\"" << endl;
00285 return 1;
00286 } catch (const char * e) {
00287 cout << e << endl;
00288 return 1;
00289 }
00290 return result_so_far;
00291 }