1 /** @file
2  * @brief Run multiple tests for different backends.
3  */
4 /* Copyright 2008 Lemur Consulting Ltd
5  * Copyright 2008,2009,2014,2015,2017,2018 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, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
20  * USA
21  */
22 
23 #ifndef XAPIAN_INCLUDED_TESTRUNNER_H
24 #define XAPIAN_INCLUDED_TESTRUNNER_H
25 
26 #include <string>
27 
28 class BackendManager;
29 
30 /// backendmanager is global so that it can be accessed by individual tests.
31 extern BackendManager * backendmanager;
32 
33 /** A test runner, which runs the tests (implemented by subclassing it) with
34  *  a variety of backends.
35  */
36 class TestRunner {
37     /** Backend specified by the user (or empty if none was specified).
38      */
39     std::string user_backend;
40 
41     /** Result of running tests so far.
42      *
43      *  Actually, the maximum value returned by run() so far.
44      */
45     int result_so_far;
46 
47     /** The source directory, read from the test driver.
48      */
49     std::string srcdir;
50 
51     /** Return true iff we should use the named backend.
52      */
53     bool use_backend(const std::string & backend_name);
54 
55     /** Set the property flags to those for the named backend.
56      */
57     void set_properties_for_backend(const std::string & backend_name);
58 
59     void do_tests_for_backend_(BackendManager* manager);
60 
61     /** Run the tests with the specified backend.
62      */
do_tests_for_backend(BackendManager && manager)63     void do_tests_for_backend(BackendManager&& manager) {
64 	do_tests_for_backend_(&manager);
65     }
66 
do_tests_for_backend(BackendManager & manager)67     void do_tests_for_backend(BackendManager& manager) {
68 	do_tests_for_backend_(&manager);
69     }
70 
71   protected:
72     enum {
73 	BACKEND		= 0x00000001,
74 	REMOTE		= 0x00000002,
75 	TRANSACTIONS	= 0x00000004,
76 	POSITIONAL	= 0x00000008,
77 	WRITABLE	= 0x00000010,
78 	SPELLING	= 0x00000020,
79 	METADATA	= 0x00000040,
80 	SYNONYMS	= 0x00000080,
81 	REPLICAS	= 0x00000100,
82 	VALUESTATS	= 0x00000200,
83 	GENERATED	= 0x00000400,
84 	MULTI		= 0x00000800,
85 	SINGLEFILE	= 0x00001000,
86 	INMEMORY	= 0x00002000,
87 	CHERT		= 0x00004000,
88 	GLASS		= 0x00008000,
89 	COMPACT		= 0x00010000,
90 	/// Requires get_database_path() or similar.
91 	PATH		= 0x00020000,
92     };
93 
94   public:
95     /// Property bitmask.
96     unsigned properties;
97 
98     /// Virtual destructor - needed for abstract class.
99     virtual ~TestRunner();
100 
101     /** Run all the tests.
102      *
103      *  This should be passed the command line arguments supplied to main,
104      *  and will parse them for options.
105      */
106     int run_tests(int argc, char ** argv);
107 
108     /** Run the tests with a particular backend.
109      *
110      *  Properties of the backend can be determined by checking the settings of
111      *  the flags.
112      */
113     virtual int run() const = 0;
114 };
115 
116 #endif // XAPIAN_INCLUDED_TESTRUNNER_H
117