xapian-core  2.0.0
testrunner.cc
Go to the documentation of this file.
1 
4 /* Copyright 2008,2009 Lemur Consulting Ltd
5  * Copyright 2008,2009,2010,2011,2015,2017,2018,2019,2023 Olly Betts
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see
19  * <https://www.gnu.org/licenses/>.
20  */
21 
22 #include <config.h>
23 
24 #include "testrunner.h"
25 
26 #include "testsuite.h"
27 #include "backendmanager.h"
28 #include "backendmanager_glass.h"
29 #include "backendmanager_honey.h"
31 #include "backendmanager_multi.h"
35 
36 #include "stringutils.h"
37 #include <iostream>
38 
39 using namespace std;
40 
42 
44 
45 bool
47 {
48  if (user_backend.empty())
49  return true;
50  if (backend_name == user_backend)
51  return true;
52  if (startswith(backend_name, user_backend + "_"))
53  return true;
54  return false;
55 }
56 
57 void
59 {
61  struct BackendProperties {
62  const char * name;
63  unsigned properties;
64  };
65 
67  static const BackendProperties backend_properties[] = {
68  { "none", 0 },
69  { "inmemory", INMEMORY|
70  BACKEND|POSITIONAL|WRITABLE|METADATA|VALUESTATS },
71  { "glass", GLASS|
72  BACKEND|TRANSACTIONS|POSITIONAL|WRITABLE|SPELLING|METADATA|
73  SYNONYMS|VALUESTATS|CHECK|COMPACT|PATH
74 #ifdef XAPIAN_HAS_REMOTE_BACKEND
75  |REPLICAS
76 #endif
77  },
78  { "multi_glass", MULTI|
79  BACKEND|TRANSACTIONS|POSITIONAL|WRITABLE|METADATA|VALUESTATS|
80  SPELLING|SYNONYMS|CHECK|COMPACT|PATH },
81  { "multi_glass_remoteprog_glass", MULTI|REMOTE|
82  BACKEND|TRANSACTIONS|POSITIONAL|WRITABLE|METADATA|VALUESTATS|
83  SYNONYMS
84  },
85  { "multi_remoteprog_glass", MULTI|REMOTE|
86  BACKEND|TRANSACTIONS|POSITIONAL|WRITABLE|METADATA|VALUESTATS|
87  SYNONYMS
88  },
89  { "remoteprog_glass", REMOTE|
90  BACKEND|TRANSACTIONS|POSITIONAL|WRITABLE|METADATA|VALUESTATS|
91  SYNONYMS
92  },
93  { "remotetcp_glass", REMOTE|REMOTETCP|
94  BACKEND|TRANSACTIONS|POSITIONAL|WRITABLE|METADATA|VALUESTATS|
95  SYNONYMS
96  },
97  { "singlefile_glass", SINGLEFILE|
98  BACKEND|POSITIONAL|METADATA|SPELLING|SYNONYMS|VALUESTATS|
99  CHECK|COMPACT|PATH
100  },
101  { "honey", HONEY|
102  BACKEND|POSITIONAL|METADATA|SPELLING|SYNONYMS|VALUESTATS|
103  CHECK|COMPACT|PATH
104  },
105  { NULL, 0 }
106  };
107 
108  for (const BackendProperties * i = backend_properties; i->name; ++i) {
109  if (backend_name == i->name) {
110  properties = i->properties;
111  return;
112  }
113  }
114  throw Xapian::InvalidArgumentError("Unknown backend " + backend_name);
115 }
116 
117 void
119 {
120  const string& backend_name = manager->get_dbtype();
121  if (use_backend(backend_name)) {
122  set_properties_for_backend(backend_name);
123  cout << "Running tests with backend \"" << backend_name << "\"...\n";
124  backendmanager = manager;
125  result_so_far = max(result_so_far, run());
126  backendmanager = NULL;
127  }
128 }
129 
130 int
131 TestRunner::run_tests(int argc, char ** argv)
132 {
133  result_so_far = 0;
134  try {
135  test_driver::add_command_line_option("backend", 'b', &user_backend);
138  string datadir = srcdir + "/testdata/";
139 
140 #ifdef XAPIAN_HAS_HONEY_BACKEND
141 # ifdef XAPIAN_HAS_GLASS_BACKEND
142  {
143  BackendManagerGlass glass_man(datadir);
144  do_tests_for_backend(BackendManagerHoney(datadir, &glass_man));
145  }
146 # else
147  do_tests_for_backend(BackendManagerHoney(datadir));
148 # endif
149 #endif
150 
151  do_tests_for_backend(BackendManager(string(), "none"));
152 
153 #ifdef XAPIAN_HAS_INMEMORY_BACKEND
154  do_tests_for_backend(BackendManagerInMemory(datadir));
155 #endif
156 
157 #ifdef XAPIAN_HAS_GLASS_BACKEND
158  {
159  BackendManagerGlass glass_man(datadir);
160 
161  // Vector for multi backendmanagers.
162  vector<BackendManager*> multi_mans;
163  multi_mans = {&glass_man, &glass_man};
164 
165  do_tests_for_backend(glass_man);
166  do_tests_for_backend(BackendManagerSingleFile(datadir, &glass_man));
167  do_tests_for_backend(BackendManagerMulti(datadir, multi_mans));
168 # ifdef XAPIAN_HAS_REMOTE_BACKEND
169  BackendManagerGlass sub_glass_man(datadir);
170  BackendManagerRemoteProg remoteprog_glass_man(&sub_glass_man);
171 
172  multi_mans = {&glass_man, &remoteprog_glass_man};
173 
174  do_tests_for_backend(BackendManagerMulti(datadir, multi_mans));
175 
176  multi_mans = {&remoteprog_glass_man, &remoteprog_glass_man};
177 
178  do_tests_for_backend(BackendManagerMulti(datadir, multi_mans));
179 
180  do_tests_for_backend(BackendManagerRemoteProg(&glass_man));
181  do_tests_for_backend(BackendManagerRemoteTcp(&glass_man));
182 # endif
183  }
184 #endif
185  } catch (const std::exception& e) {
186  cerr << "\nTest harness failed with std::exception: " << e.what()
187  << '\n';
188  return 1;
189  } catch (const Xapian::Error &e) {
190  cerr << "\nTest harness failed with " << e.get_description() << '\n';
191  return 1;
192  } catch (const std::string &e) {
193  cerr << "\nTest harness failed with \"" << e << "\"\n";
194  return 1;
195  } catch (const char * e) {
196  cout << e << '\n';
197  return 1;
198  }
199  return result_so_far;
200 }
Base class for backend handling in test harness.
BackendManager subclass for glass databases.
BackendManager subclass for honey databases.
BackendManager subclass for inmemory databases.
BackendManager subclass for multi databases.
BackendManager subclass for remoteprog databases.
BackendManager subclass for remotetcp databases.
BackendManager subclass for singlefile databases.
char name[9]
Definition: dbcheck.cc:57
const char * backend_name(int code)
Definition: backends.h:34
BackendManager subclass for glass databases.
BackendManager subclass for honey databases.
BackendManager subclass for inmemory databases.
BackendManager subclass for multi databases.
BackendManager subclass for remoteprog databases.
BackendManager subclass for remotetcp databases.
BackendManager subclass for singlefile databases.
const std::string & get_dbtype() const
Get the database type currently in use.
virtual ~TestRunner()
Virtual destructor - needed for abstract class.
Definition: testrunner.cc:43
void set_properties_for_backend(const std::string &backend_name)
Set the property flags to those for the named backend.
Definition: testrunner.cc:58
int run_tests(int argc, char **argv)
Run all the tests.
Definition: testrunner.cc:131
void do_tests_for_backend_(BackendManager *manager)
Definition: testrunner.cc:118
bool use_backend(const std::string &backend_name)
Return true iff we should use the named backend.
Definition: testrunner.cc:46
All exceptions thrown by Xapian are subclasses of Xapian::Error.
Definition: error.h:41
InvalidArgumentError indicates an invalid parameter value was passed to the API.
Definition: error.h:229
static void parse_command_line(int argc, char **argv)
Parse the command line arguments.
Definition: testsuite.cc:866
static std::string get_srcdir()
Read srcdir from environment and if not present, make a valiant attempt to guess a value.
Definition: testsuite.cc:135
static void add_command_line_option(const std::string &l, char s, std::string *arg)
Add a test-specific command line option.
Definition: testsuite.cc:855
@ SPELLING
Definition: glass_defs.h:58
static string srcdir
Definition: stemtest.cc:44
Various handy string-related helpers.
bool startswith(std::string_view s, char pfx)
Definition: stringutils.h:56
BackendManager * backendmanager
backendmanager is global so that it can be accessed by individual tests.
Definition: testrunner.cc:41
Run multiple tests for different backends.
a generic test suite engine