Branch data Line data Source code
1 : : /** @file api_transdb.cc
2 : : * @brief tests requiring a database backend supporting transactions
3 : : */
4 : : /* Copyright (C) 2006,2009 Olly Betts
5 : : *
6 : : * This program is free software; you can redistribute it and/or modify
7 : : * it under the terms of the GNU General Public License as published by
8 : : * the Free Software Foundation; either version 2 of the License, or
9 : : * (at your option) any later version.
10 : : *
11 : : * This program is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : * GNU General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with this program; if not, write to the Free Software
18 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 : : */
20 : :
21 : : #include <config.h>
22 : :
23 : : #include "api_transdb.h"
24 : :
25 : : #include <xapian.h>
26 : :
27 : : #include "apitest.h"
28 : : #include "testutils.h"
29 : :
30 : : using namespace std;
31 : :
32 : : /// Test incorrect uses of the transaction API lead to errors.
33 : 9 : DEFINE_TESTCASE(badtransaction1, transactions) {
34 : 9 : Xapian::WritableDatabase db(get_writable_database("apitest_simpledata"));
35 : :
36 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.commit_transaction());
[ # # ][ - + ]
37 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.cancel_transaction());
[ # # ][ - + ]
38 : :
39 : 9 : db.begin_transaction();
40 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.begin_transaction());
[ # # ][ - + ]
41 : 9 : db.commit_transaction();
42 : :
43 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.commit_transaction());
[ # # ][ - + ]
44 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.cancel_transaction());
[ # # ][ - + ]
45 : :
46 : 9 : db.begin_transaction();
47 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.begin_transaction());
[ # # ][ - + ]
48 : 9 : db.cancel_transaction();
49 : :
50 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.commit_transaction());
[ # # ][ - + ]
51 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.cancel_transaction());
[ # # ][ - + ]
52 : :
53 : 9 : db.begin_transaction();
54 : 9 : db.commit_transaction();
55 : :
56 : 9 : db.begin_transaction();
57 : 9 : db.cancel_transaction();
58 : :
59 : 9 : return true;
60 : : }
61 : :
62 : : /// Test committing a simple transaction.
63 : 9 : DEFINE_TESTCASE(committransaction1, transactions) {
64 : 9 : Xapian::WritableDatabase db(get_writable_database("apitest_simpledata"));
65 : :
66 : 9 : Xapian::doccount docs = db.get_doccount();
67 : 9 : db.begin_transaction();
68 : 9 : Xapian::Document doc;
69 : 9 : doc.set_data("testing");
70 : 9 : doc.add_term("befuddlement");
71 : 9 : db.add_document(doc);
72 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.begin_transaction());
[ # # ][ - + ]
73 [ - + # # ]: 9 : TEST_EQUAL(db.get_doccount(), docs + 1);
74 [ - + ][ # # ]: 9 : TEST_EQUAL(db.get_termfreq("befuddlement"), 1);
75 : 9 : db.commit_transaction();
76 [ - + # # ]: 9 : TEST_EQUAL(db.get_doccount(), docs + 1);
77 [ - + ][ # # ]: 9 : TEST_EQUAL(db.get_termfreq("befuddlement"), 1);
78 : :
79 : 9 : return true;
80 : : }
81 : :
82 : : /// Test cancelling a simple transaction.
83 : 9 : DEFINE_TESTCASE(canceltransaction1, transactions) {
84 : 9 : Xapian::WritableDatabase db(get_writable_database("apitest_simpledata"));
85 : :
86 : 9 : Xapian::doccount docs = db.get_doccount();
87 : 9 : db.begin_transaction();
88 : 9 : Xapian::Document doc;
89 : 9 : doc.set_data("testing");
90 : 9 : doc.add_term("befuddlement");
91 : 9 : db.add_document(doc);
92 [ + - ][ - + ]: 18 : TEST_EXCEPTION(Xapian::InvalidOperationError, db.begin_transaction());
[ # # ][ - + ]
93 [ - + # # ]: 9 : TEST_EQUAL(db.get_doccount(), docs + 1);
94 [ - + ][ # # ]: 9 : TEST_EQUAL(db.get_termfreq("befuddlement"), 1);
95 : 9 : db.cancel_transaction();
96 [ - + # # ]: 9 : TEST_EQUAL(db.get_doccount(), docs);
97 [ - + ][ # # ]: 9 : TEST_EQUAL(db.get_termfreq("befuddlement"), 0);
98 : :
99 : 9 : return true;
100 : : }
101 : :
102 : : /// Test that begin_transaction() commits any changes pending before the
103 : : // transaction.
104 : 9 : DEFINE_TESTCASE(canceltransaction2, transactions) {
105 : 9 : Xapian::WritableDatabase db(get_writable_database("apitest_simpledata"));
106 : :
107 : 9 : Xapian::doccount docs = db.get_doccount();
108 : 9 : Xapian::Document doc0;
109 : 9 : doc0.set_data("pending");
110 : 9 : doc0.add_term("pending_update");
111 : 9 : Xapian::docid docid = db.add_document(doc0);
112 : :
113 : 9 : db.begin_transaction();
114 [ - + # # ]: 9 : TEST_EQUAL(db.get_doccount(), docs + 1);
115 : 9 : Xapian::Document doc;
116 : 9 : doc.set_data("testing");
117 : 9 : doc.add_term("befuddlement");
118 : 9 : db.add_document(doc);
119 [ - + # # ]: 9 : TEST_EQUAL(db.get_doccount(), docs + 2);
120 : 9 : db.cancel_transaction();
121 : :
122 [ - + # # ]: 9 : TEST_EQUAL(db.get_doccount(), docs + 1);
123 [ - + ][ # # ]: 9 : TEST(db.term_exists("pending_update"));
124 : 9 : Xapian::Document doc_out = db.get_document(docid);
125 [ - + ][ # # ]: 9 : TEST_EQUAL(doc_out.get_data(), "pending");
126 : :
127 : 9 : return true;
128 : : }
|