libdballe 9.6
db/tests.h
1#include <dballe/msg/tests.h>
2#include <dballe/values.h>
3#include <dballe/core/data.h>
4#include <dballe/db/fwd.h>
5#include <dballe/db/v7/fwd.h>
6#include <dballe/db/db.h>
7#include <dballe/db/summary.h>
8#include <dballe/sql/fwd.h>
9#include <utility>
10#include <functional>
11
12namespace dballe {
13namespace tests {
14
15impl::Messages messages_from_db(std::shared_ptr<db::Transaction> tr, const dballe::Query& query);
16impl::Messages messages_from_db(std::shared_ptr<db::Transaction> tr, const char* query);
17
20{
22 std::map<std::string, core::Data> stations;
24 std::map<std::string, core::Data> data;
25
26 TestDataSet() {}
27 virtual ~TestDataSet() {}
28
29 void populate_db(dballe::DB& db);
30 virtual void populate_transaction(Transaction& tr);
31};
32
34{
35 void populate_db();
36};
37
40{
42};
43
44bool has_driver(const std::string& backend);
45
46struct V7DB
47{
48 typedef db::v7::DB DB;
49 typedef db::v7::Transaction TR;
50 static const auto format = db::Format::V7;
51 static std::shared_ptr<DB> create_db(const std::string& backend, bool wipe);
52};
53
54template<typename DB>
55struct BaseDBFixture : public Fixture
56{
57 std::string backend;
58 std::shared_ptr<typename DB::DB> db;
59 bool destroys_db = false;
60
61 BaseDBFixture(const char* backend);
62 virtual ~BaseDBFixture();
63
64 void test_setup();
65 void test_teardown();
66 virtual void create_db();
67 bool has_driver();
68};
69
70template<typename DB>
72{
73 using BaseDBFixture<DB>::BaseDBFixture;
74 std::shared_ptr<typename DB::TR> tr;
75
76 void test_setup();
77 void test_teardown();
78 void populate(TestDataSet& data_set);
79};
80
81template<typename DB, typename TestData>
83{
84 using EmptyTransactionFixture<DB>::EmptyTransactionFixture;
85
86 TestData test_data;
87
88 void create_db() override
89 {
91 wassert(test_data.populate_db(*this->db));
92 }
93};
94
95template<typename DB>
96struct DBFixture : public BaseDBFixture<DB>
97{
98 using BaseDBFixture<DB>::BaseDBFixture;
99
100 void test_setup();
101 void populate_database(TestDataSet& data_set);
102};
103
104
105struct ActualCursor : public Actual<std::shared_ptr<dballe::Cursor>>
106{
107 using Actual::Actual;
108
110 void station_keys_match(const DBStation& expected);
111
113 void data_context_matches(const Data& expected);
114
116 void data_var_matches(const Data& expected, wreport::Varcode code) {
117 data_var_matches(core::Data::downcast(expected).values.var(code));
118 }
120 void data_var_matches(const DBValues& expected) {
121 if (auto c = std::dynamic_pointer_cast<dballe::db::CursorStation>(_actual))
122 {
123 DBValues actual_values = c->get_values();
124 if (!actual_values.vars_equal(expected))
125 // Quick hack to get proper formatting of mismatch
126 wassert(actual(c->get_values()) == expected);
127 }
128 else if (auto c = std::dynamic_pointer_cast<dballe::CursorStationData>(_actual))
129 data_var_matches(expected.var(c->get_varcode()));
130 else if (auto c = std::dynamic_pointer_cast<dballe::CursorData>(_actual))
131 data_var_matches(expected.var(c->get_varcode()));
132 else
133 throw wreport::error_consistency("cannot call data_var_matches on this kind of cursor");
134 }
136 void data_var_matches(const Values& expected, wreport::Varcode code) {
137 data_var_matches(expected.var(code));
138 }
140 void data_var_matches(const wreport::Var& expected);
141
143 void data_matches(const Data& ds)
144 {
145 if (auto c = std::dynamic_pointer_cast<dballe::CursorStationData>(_actual))
146 data_matches(ds, c->get_varcode());
147 else if (auto c = std::dynamic_pointer_cast<dballe::CursorData>(_actual))
148 data_matches(ds, c->get_varcode());
149 else
150 throw wreport::error_consistency("cannot call data_matches on this kind of cursor");
151 }
153 void data_matches(const Data& ds, wreport::Varcode code);
154};
155
156typedef std::function<void(const db::DBSummary&)> result_checker;
157
158template<typename DB>
159struct ActualDB : public Actual<std::shared_ptr<DB>>
160{
161 using Actual<std::shared_ptr<DB>>::Actual;
162
164 void try_data_query(const std::string& query, unsigned expected);
165
167 void try_data_query(const Query& query, unsigned expected);
168
170 void try_station_query(const std::string& query, unsigned expected);
171
173 void try_summary_query(const std::string& query, unsigned expected, result_checker checker=nullptr);
174};
175
176inline ActualCursor actual(std::shared_ptr<dballe::Cursor>& actual) { return ActualCursor(actual); }
177inline ActualCursor actual(std::shared_ptr<dballe::CursorStation>& actual) { return ActualCursor(actual); }
178inline ActualCursor actual(std::shared_ptr<dballe::CursorStationData>& actual) { return ActualCursor(actual); }
179inline ActualCursor actual(std::shared_ptr<dballe::CursorData>& actual) { return ActualCursor(actual); }
180inline ActualCursor actual(std::shared_ptr<dballe::CursorSummary>& actual) { return ActualCursor(actual); }
181inline ActualDB<dballe::DB> actual(std::shared_ptr<dballe::DB> actual) { return ActualDB<dballe::DB>(actual); }
182ActualDB<dballe::DB> actual(std::shared_ptr<dballe::db::v7::DB> actual);
183inline ActualDB<dballe::db::Transaction> actual(std::shared_ptr<dballe::db::Transaction> actual) { return ActualDB<dballe::db::Transaction>(actual); }
184ActualDB<dballe::db::Transaction> actual(std::shared_ptr<dballe::db::v7::Transaction> actual);
185
186extern template class BaseDBFixture<V7DB>;
187extern template class DBFixture<V7DB>;
188extern template class EmptyTransactionFixture<V7DB>;
189extern template class ActualDB<dballe::DB>;
190extern template class ActualDB<dballe::db::Transaction>;
191
192}
193}
Definition: db.h:297
Key/value store where keys are strings and values are wreport variables.
Definition: data.h:18
Query used to filter DB-All.e data.
Definition: query.h:15
Definition: db.h:150
static const Data & downcast(const dballe::Data &data)
Return a reference to record downcasted as core::Record.
High level objects for working with DB-All.e DB summaries.
Definition: summary.h:45
DB-ALLe database connection for database format V7.
Definition: db/v7/db.h:21
const wreport::Var & var(wreport::Varcode code) const
Lookup a wreport::Var, throwing an exception if not found.
Functions used to connect to DB-All.e and insert, query and delete data.
uint16_t Varcode
Forward declarations for public dballe/sql names.
Definition: types.h:851
Collection of DBValue objects, indexed by wreport::Varcode.
Definition: values.h:192
bool vars_equal(const DBValues &o) const
Check if the variables are the same, regardless of the data_id.
Collection of Value objects, indexed by wreport::Varcode.
Definition: values.h:177
Definition: transaction.h:16
Definition: db/tests.h:106
void data_var_matches(const Values &expected, wreport::Varcode code)
Check cursor data variable after a query_data.
Definition: db/tests.h:136
void data_var_matches(const wreport::Var &expected)
Check cursor data variable after a query_data.
void data_var_matches(const Data &expected, wreport::Varcode code)
Check cursor data variable after a query_data.
Definition: db/tests.h:116
void data_matches(const Data &ds, wreport::Varcode code)
Check cursor data context and variable after a query_data.
void data_context_matches(const Data &expected)
Check cursor data context after a query_data.
void data_matches(const Data &ds)
Check cursor data context and variable after a query_data.
Definition: db/tests.h:143
void station_keys_match(const DBStation &expected)
Check cursor context after a query_stations.
void data_var_matches(const DBValues &expected)
Check cursor data variable(s) after a query_data.
Definition: db/tests.h:120
Definition: db/tests.h:160
void try_station_query(const std::string &query, unsigned expected)
Check results of a station query.
void try_data_query(const Query &query, unsigned expected)
Check cursor data context anda variable after a query_data.
void try_summary_query(const std::string &query, unsigned expected, result_checker checker=nullptr)
Check results of a summary query.
void try_data_query(const std::string &query, unsigned expected)
Check cursor data context anda variable after a query_data.
Definition: db/tests.h:56
Definition: db/tests.h:97
Definition: db/tests.h:34
Test fixture used by old DB-All.e db tests.
Definition: db/tests.h:40
Base for datasets used to populate test databases.
Definition: db/tests.h:20
std::map< std::string, core::Data > stations
Arbitrarily named station values.
Definition: db/tests.h:22
std::map< std::string, core::Data > data
Arbitrarily named data values.
Definition: db/tests.h:24
Definition: db/tests.h:83
Definition: db/tests.h:47
Structures used as input to database insert functions.