00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include "api_closedb.h"
00025
00026 #include <xapian.h>
00027
00028 #include "apitest.h"
00029 #include "testutils.h"
00030
00031 using namespace std;
00032
00033 #define COUNT_CLOSEDEXC(CODE) \
00034 try { CODE; } catch (const Xapian::DatabaseError &) { ++closedexc_count; }
00035
00036 #define IF_NOT_CLOSEDEXC(CODE) \
00037 do { \
00038 hadexc = false; \
00039 try { \
00040 CODE; \
00041 } catch (const Xapian::DatabaseError &) { \
00042 ++closedexc_count; \
00043 hadexc = true; \
00044 } \
00045 } while (false); if (hadexc)
00046
00047
00048 struct closedb1_iterators {
00049 Xapian::Database db;
00050 Xapian::Document doc1;
00051 Xapian::PostingIterator pl1;
00052 Xapian::PostingIterator pl2;
00053 Xapian::PostingIterator plend;
00054
00055 void setup(Xapian::Database db_) {
00056 db = db_;
00057
00058
00059 pl1 = db.postlist_begin("paragraph");
00060 pl2 = db.postlist_begin("paragraph");
00061 ++pl2;
00062 plend = db.postlist_end("paragraph");
00063 }
00064
00065 int perform() {
00066 int closedexc_count = 0;
00067 bool hadexc;
00068
00069
00070 IF_NOT_CLOSEDEXC(doc1 = db.get_document(1)) {
00071 COUNT_CLOSEDEXC(TEST_EQUAL(doc1.get_data().substr(0, 33),
00072 "This is a test document used with"));
00073 COUNT_CLOSEDEXC(doc1.termlist_begin());
00074 }
00075
00076
00077
00078 COUNT_CLOSEDEXC(db.postlist_begin("paragraph"));
00079 COUNT_CLOSEDEXC(db.get_document(1).get_value(1));
00080 COUNT_CLOSEDEXC(db.termlist_begin(1));
00081 COUNT_CLOSEDEXC(db.positionlist_begin(1, "paragraph"));
00082 COUNT_CLOSEDEXC(db.allterms_begin());
00083 COUNT_CLOSEDEXC(db.allterms_begin("p"));
00084 COUNT_CLOSEDEXC(db.get_termfreq("paragraph"));
00085 COUNT_CLOSEDEXC(db.get_collection_freq("paragraph"));
00086 COUNT_CLOSEDEXC(db.term_exists("paragraph"));
00087 try {
00088 COUNT_CLOSEDEXC(db.get_value_freq(1));
00089 COUNT_CLOSEDEXC(db.get_value_lower_bound(1));
00090 COUNT_CLOSEDEXC(db.get_value_upper_bound(1));
00091 } catch (const Xapian::UnimplementedError &) { }
00092 COUNT_CLOSEDEXC(db.valuestream_begin(1));
00093 COUNT_CLOSEDEXC(db.get_doclength(1));
00094
00095
00096 COUNT_CLOSEDEXC(db.reopen());
00097
00098 TEST_NOT_EQUAL(pl1, plend);
00099
00100 COUNT_CLOSEDEXC(db.postlist_begin("paragraph"));
00101
00102 COUNT_CLOSEDEXC(TEST_EQUAL(*pl1, 1));
00103 COUNT_CLOSEDEXC(TEST_EQUAL(pl1.get_doclength(), 28));
00104
00105
00106
00107 bool advanced = false;
00108 try {
00109 ++pl1;
00110 advanced = true;
00111 } catch (const Xapian::DatabaseError &) {}
00112
00113 if (advanced) {
00114 COUNT_CLOSEDEXC(TEST_EQUAL(*pl1, 2));
00115 COUNT_CLOSEDEXC(TEST_EQUAL(pl1.get_doclength(), 81));
00116 }
00117
00118 return closedexc_count;
00119 }
00120 };
00121
00122
00123 DEFINE_TESTCASE(closedb1, backend) {
00124 Xapian::Database db(get_database("apitest_simpledata"));
00125 closedb1_iterators iters;
00126
00127
00128 iters.setup(db);
00129 int closedexc_count = iters.perform();
00130 TEST_EQUAL(closedexc_count, 0);
00131
00132
00133 iters.setup(db);
00134
00135
00136 db.close();
00137
00138
00139 TEST_EXCEPTION(Xapian::DatabaseError, db.reopen());
00140
00141
00142 closedexc_count = iters.perform();
00143 TEST_NOT_EQUAL(closedexc_count, 0);
00144
00145
00146
00147
00148 TEST(!db.get_description().empty());
00149
00150
00151 db.close();
00152
00153 return true;
00154 }
00155
00156
00157 DEFINE_TESTCASE(closedb2, writable && !inmemory && !remote) {
00158 Xapian::WritableDatabase dbw1(get_named_writable_database("apitest_closedb2"));
00159 TEST_EXCEPTION(Xapian::DatabaseLockError,
00160 Xapian::WritableDatabase db(get_named_writable_database_path("apitest_closedb2"),
00161 Xapian::DB_OPEN));
00162 dbw1.close();
00163 Xapian::WritableDatabase dbw2 = get_named_writable_database("apitest_closedb2");
00164 TEST_EXCEPTION(Xapian::DatabaseError, dbw1.postlist_begin("paragraph"));
00165 TEST_EQUAL(dbw2.postlist_begin("paragraph"), dbw2.postlist_end("paragraph"));
00166
00167 return true;
00168 }
00169
00171 DEFINE_TESTCASE(closedb3, backend) {
00172 Xapian::Database db(get_database("etext"));
00173 const string & uuid = db.get_uuid();
00174 db.close();
00175 try {
00176 TEST_EQUAL(db.get_uuid(), uuid);
00177 } catch (const Xapian::DatabaseError &) {
00178 }
00179 try {
00180 TEST(db.has_positions());
00181 } catch (const Xapian::DatabaseError &) {
00182 }
00183 try {
00184 TEST_EQUAL(db.get_doccount(), 566);
00185 } catch (const Xapian::DatabaseError &) {
00186 }
00187 try {
00188 TEST_EQUAL(db.get_lastdocid(), 566);
00189 } catch (const Xapian::DatabaseError &) {
00190 }
00191 try {
00192 TEST_REL(db.get_doclength_lower_bound(), <, db.get_avlength());
00193 } catch (const Xapian::DatabaseError &) {
00194 }
00195 try {
00196 TEST_REL(db.get_doclength_upper_bound(), >, db.get_avlength());
00197 } catch (const Xapian::DatabaseError &) {
00198 }
00199 try {
00200 TEST(db.get_wdf_upper_bound("king"));
00201 } catch (const Xapian::DatabaseError &) {
00202 }
00203 try {
00204
00205 db.keep_alive();
00206 } catch (const Xapian::DatabaseError &) {
00207 }
00208 return true;
00209 }
00210
00212 DEFINE_TESTCASE(closedb4, writable && !inmemory) {
00213 Xapian::WritableDatabase wdb(get_writable_database());
00214 wdb.add_document(Xapian::Document());
00215 TEST_EQUAL(wdb.get_doccount(), 1);
00216 wdb.close();
00217 Xapian::Database db(get_writable_database_as_database());
00218 TEST_EQUAL(db.get_doccount(), 1);
00219 return true;
00220 }
00221
00223 DEFINE_TESTCASE(closedb5, transactions && !remote) {
00224
00225
00226 {
00227 Xapian::WritableDatabase wdb = get_writable_database();
00228 wdb.begin_transaction();
00229 wdb.add_document(Xapian::Document());
00230 TEST_EQUAL(wdb.get_doccount(), 1);
00231 wdb.close();
00232 Xapian::Database db = get_writable_database_as_database();
00233 TEST_EQUAL(db.get_doccount(), 0);
00234 }
00235
00236 {
00237
00238 Xapian::WritableDatabase wdb = get_writable_database();
00239 wdb.begin_transaction(false);
00240 wdb.add_document(Xapian::Document());
00241 TEST_EQUAL(wdb.get_doccount(), 1);
00242 wdb.close();
00243 Xapian::Database db = get_writable_database_as_database();
00244 TEST_EQUAL(db.get_doccount(), 0);
00245 }
00246 return true;
00247 }
00248
00250 DEFINE_TESTCASE(closedb6, remote) {
00251 Xapian::Database db(get_database("etext"));
00252 db.close();
00253
00254 try {
00255 db.keep_alive();
00256 return false;
00257 } catch (const Xapian::DatabaseError &) {
00258 }
00259 return true;
00260 }
00261
00262
00263 DEFINE_TESTCASE(closedb7, writable) {
00264 Xapian::WritableDatabase db(get_writable_database());
00265 db.add_document(Xapian::Document());
00266 db.close();
00267
00268
00269
00270
00271
00272 TEST_EXCEPTION(Xapian::DatabaseError,
00273 db.add_document(Xapian::Document()));
00274 TEST_EXCEPTION(Xapian::DatabaseError,
00275 db.delete_document(1));
00276 TEST_EXCEPTION(Xapian::DatabaseError,
00277 db.replace_document(1, Xapian::Document()));
00278 TEST_EXCEPTION(Xapian::DatabaseError,
00279 db.replace_document(2, Xapian::Document()));
00280 TEST_EXCEPTION(Xapian::DatabaseError,
00281 db.replace_document("Qi", Xapian::Document()));
00282
00283 return true;
00284 }
00285
00286
00287 DEFINE_TESTCASE(closedb8, writable && spelling) {
00288 Xapian::WritableDatabase db(get_writable_database());
00289 db.add_spelling("pneumatic");
00290 db.add_spelling("pneumonia");
00291 db.close();
00292
00293 TEST_EXCEPTION(Xapian::DatabaseError,
00294 db.add_spelling("penmanship"));
00295 TEST_EXCEPTION(Xapian::DatabaseError,
00296 db.remove_spelling("pneumatic"));
00297 TEST_EXCEPTION(Xapian::DatabaseError,
00298 db.get_spelling_suggestion("newmonia"));
00299 TEST_EXCEPTION(Xapian::DatabaseError,
00300 db.spellings_begin());
00301
00302 return true;
00303 }
00304
00305
00306 DEFINE_TESTCASE(closedb9, writable && synonyms) {
00307 Xapian::WritableDatabase db(get_writable_database());
00308 db.add_synonym("color", "colour");
00309 db.add_synonym("honor", "honour");
00310 db.close();
00311
00312 TEST_EXCEPTION(Xapian::DatabaseError,
00313 db.add_synonym("behavior", "behaviour"));
00314 TEST_EXCEPTION(Xapian::DatabaseError,
00315 db.remove_synonym("honor", "honour"));
00316 TEST_EXCEPTION(Xapian::DatabaseError,
00317 db.clear_synonyms("honor"));
00318 TEST_EXCEPTION(Xapian::DatabaseError,
00319 db.synonyms_begin("color"));
00320 TEST_EXCEPTION(Xapian::DatabaseError,
00321 db.synonym_keys_begin());
00322
00323 return true;
00324 }
00325
00326
00327 DEFINE_TESTCASE(closedb10, writable && metadata) {
00328 Xapian::WritableDatabase db(get_writable_database());
00329 db.set_metadata("foo", "FOO");
00330 db.set_metadata("bar", "BAR");
00331 db.close();
00332
00333 TEST_EXCEPTION(Xapian::DatabaseError,
00334 db.set_metadata("test", "TEST"));
00335 TEST_EXCEPTION(Xapian::DatabaseError,
00336 db.get_metadata("foo"));
00337 TEST_EXCEPTION(Xapian::DatabaseError,
00338 db.get_metadata("foo"));
00339 try {
00340 TEST_EXCEPTION(Xapian::DatabaseError, db.metadata_keys_begin());
00341 } catch (const Xapian::UnimplementedError &) {
00342
00343 }
00344
00345 return true;
00346 }