20#include <gtest/gtest.h>
39class succeeding_backend
40 :
public backend_base<succeeding_backend, database_types::sqlite>
43 static constexpr const char* backend_name() {
return "succeeding_backend"; }
45 int init_call_count = 0;
46 int shutdown_call_count = 0;
48 kcenon::common::Result<database_result> select_query(
const std::string&)
override
53 kcenon::common::VoidResult execute_query(
const std::string&)
override
55 return kcenon::common::ok();
58 kcenon::common::VoidResult begin_transaction()
override
60 return kcenon::common::ok();
63 kcenon::common::VoidResult commit_transaction()
override
65 return kcenon::common::ok();
68 kcenon::common::VoidResult rollback_transaction()
override
70 return kcenon::common::ok();
73 bool in_transaction()
const override {
return false; }
74 std::string last_error()
const override {
return ""; }
75 std::map<std::string, std::string> connection_info()
const override {
return {}; }
80 kcenon::common::VoidResult do_initialize(const connection_config&)
83 return kcenon::common::ok();
86 kcenon::common::VoidResult do_shutdown()
88 shutdown_call_count++;
89 return kcenon::common::ok();
97 :
public backend_base<failing_backend, database_types::postgres>
100 static constexpr const char* backend_name() {
return "failing_backend"; }
102 int init_call_count = 0;
104 kcenon::common::Result<database_result> select_query(
const std::string&)
override
106 return kcenon::common::error_info{-1,
"Not initialized"};
109 kcenon::common::VoidResult execute_query(
const std::string&)
override
111 return kcenon::common::error_info{-1,
"Not initialized"};
114 kcenon::common::VoidResult begin_transaction()
override
116 return kcenon::common::error_info{-1,
"Not initialized"};
119 kcenon::common::VoidResult commit_transaction()
override
121 return kcenon::common::error_info{-1,
"Not initialized"};
124 kcenon::common::VoidResult rollback_transaction()
override
126 return kcenon::common::error_info{-1,
"Not initialized"};
129 bool in_transaction()
const override {
return false; }
130 std::string last_error()
const override {
return "Connection failed"; }
131 std::map<std::string, std::string> connection_info()
const override {
return {}; }
136 kcenon::common::VoidResult do_initialize(const connection_config&)
139 return kcenon::common::error_info{
141 "Simulated connection failure",
146 kcenon::common::VoidResult do_shutdown()
148 return kcenon::common::ok();
178 succeeding_backend backend;
179 EXPECT_EQ(backend.type(), database_types::sqlite);
184 failing_backend backend;
185 EXPECT_EQ(backend.type(), database_types::postgres);
194 succeeding_backend backend;
195 EXPECT_FALSE(backend.is_initialized());
200 succeeding_backend backend;
201 auto result = backend.initialize(test_config_);
202 EXPECT_TRUE(result.is_ok());
203 EXPECT_TRUE(backend.is_initialized());
208 failing_backend backend;
209 auto result = backend.initialize(test_config_);
210 EXPECT_FALSE(result.is_ok());
211 EXPECT_FALSE(backend.is_initialized());
216 succeeding_backend backend;
217 EXPECT_TRUE(backend.initialize(test_config_).is_ok());
220 auto result = backend.initialize(test_config_);
221 EXPECT_FALSE(result.is_ok());
222 EXPECT_TRUE(backend.is_initialized());
227 succeeding_backend backend;
228 backend.initialize(test_config_);
229 backend.initialize(test_config_);
232 EXPECT_EQ(backend.init_call_count, 1);
237 succeeding_backend backend;
238 EXPECT_TRUE(backend.initialize(test_config_).is_ok());
239 EXPECT_TRUE(backend.shutdown().is_ok());
240 EXPECT_FALSE(backend.is_initialized());
243 auto result = backend.initialize(test_config_);
244 EXPECT_TRUE(result.is_ok());
245 EXPECT_TRUE(backend.is_initialized());
246 EXPECT_EQ(backend.init_call_count, 2);
255 succeeding_backend backend;
256 auto result = backend.shutdown();
257 EXPECT_TRUE(result.is_ok());
258 EXPECT_FALSE(backend.is_initialized());
260 EXPECT_EQ(backend.shutdown_call_count, 0);
265 succeeding_backend backend;
266 backend.initialize(test_config_);
267 auto result = backend.shutdown();
268 EXPECT_TRUE(result.is_ok());
269 EXPECT_FALSE(backend.is_initialized());
270 EXPECT_EQ(backend.shutdown_call_count, 1);
275 succeeding_backend backend;
276 backend.initialize(test_config_);
278 auto result = backend.shutdown();
279 EXPECT_TRUE(result.is_ok());
280 EXPECT_EQ(backend.shutdown_call_count, 1);
287 succeeding_backend backend;
288 backend.initialize(test_config_);
290 EXPECT_FALSE(backend.is_initialized());
299 auto backend = succeeding_backend::create();
300 ASSERT_NE(backend,
nullptr);
301 EXPECT_EQ(backend->type(), database_types::sqlite);
302 EXPECT_FALSE(backend->is_initialized());
307 auto b1 = succeeding_backend::create();
308 auto b2 = succeeding_backend::create();
309 EXPECT_NE(b1.get(), b2.get());
318 int shutdown_count = 0;
320 succeeding_backend backend;
321 backend.initialize(test_config_);
322 shutdown_count = backend.shutdown_call_count;
323 EXPECT_EQ(shutdown_count, 0);
334 { succeeding_backend backend; }
344 succeeding_backend backend;
347 EXPECT_FALSE(backend.is_initialized());
350 EXPECT_TRUE(backend.initialize(test_config_).is_ok());
351 EXPECT_TRUE(backend.is_initialized());
354 auto result = backend.execute_query(
"INSERT INTO test VALUES (1)");
355 EXPECT_TRUE(result.is_ok());
358 EXPECT_TRUE(backend.shutdown().is_ok());
359 EXPECT_FALSE(backend.is_initialized());
364 succeeding_backend backend;
366 for (
int i = 0; i < 5; ++i) {
367 EXPECT_TRUE(backend.initialize(test_config_).is_ok());
368 EXPECT_TRUE(backend.is_initialized());
369 EXPECT_TRUE(backend.shutdown().is_ok());
370 EXPECT_FALSE(backend.is_initialized());
373 EXPECT_EQ(backend.init_call_count, 5);
374 EXPECT_EQ(backend.shutdown_call_count, 5);
383 EXPECT_FALSE(std::is_copy_constructible_v<succeeding_backend>);
384 EXPECT_FALSE(std::is_copy_assignable_v<succeeding_backend>);
389 EXPECT_FALSE(std::is_move_constructible_v<succeeding_backend>);
390 EXPECT_FALSE(std::is_move_assignable_v<succeeding_backend>);
395 ::testing::InitGoogleTest(&argc, argv);
396 return RUN_ALL_TESTS();
CRTP template base class for database backends.
TEST_F(BackendBaseTest, TypeReturnsCorrectDatabaseType)
connection_config test_config_
CRTP template base class for database backends.
Abstract interface for database backends.
std::vector< database_row > database_result
database_types
Represents various database backends or modes.
@ sqlite
Indicates a SQLite database.
@ postgres
Indicates a PostgreSQL database.
Configuration for database connection.