5#include <gtest/gtest.h>
35 return kcenon::common::ok();
41 return kcenon::common::VoidResult::err(
static_cast<int>(monitoring_error_code::operation_failed),
"Simulated failure");
47 return kcenon::common::ok();
52 return validation_result::valid;
56 return validation_result::invalid;
60 return kcenon::common::ok();
66 auto op = std::make_unique<transaction_operation>(
68 [
this]() {
return test_operation(); },
69 [
this]() {
return rollback_operation(); }
72 EXPECT_EQ(op->name(),
"test_op");
73 EXPECT_FALSE(op->is_executed());
75 auto result = op->execute();
76 EXPECT_TRUE(result.is_ok());
77 EXPECT_TRUE(op->is_executed());
78 EXPECT_EQ(call_count.load(), 1);
79 EXPECT_EQ(success_count.load(), 1);
81 auto rollback_result = op->rollback();
82 EXPECT_TRUE(rollback_result);
83 EXPECT_EQ(rollback_count.load(), 1);
92 auto op1 = std::make_unique<transaction_operation>(
93 "op1", [
this]() {
return test_operation(); });
94 auto op2 = std::make_unique<transaction_operation>(
95 "op2", [
this]() {
return test_operation(); });
99 EXPECT_TRUE(add_result1);
100 EXPECT_TRUE(add_result2);
103 EXPECT_EQ(tx.
state(), transaction_state::active);
106 auto commit_result = tx.
commit();
107 EXPECT_TRUE(commit_result);
108 EXPECT_EQ(tx.
state(), transaction_state::committed);
109 EXPECT_EQ(call_count.load(), 2);
110 EXPECT_EQ(success_count.load(), 2);
118 auto op1 = std::make_unique<transaction_operation>(
120 [
this]() {
return test_operation(); },
121 [
this]() {
return rollback_operation(); });
122 auto op2 = std::make_unique<transaction_operation>(
123 "op2", [
this]() {
return failing_operation(); });
129 auto commit_result = tx.
commit();
130 EXPECT_FALSE(commit_result);
131 EXPECT_EQ(tx.
state(), transaction_state::aborted);
132 EXPECT_EQ(call_count.load(), 2);
133 EXPECT_EQ(success_count.load(), 1);
134 EXPECT_EQ(rollback_count.load(), 1);
141 auto op = std::make_unique<transaction_operation>(
143 [
this]() {
return test_operation(); },
144 [
this]() {
return rollback_operation(); });
149 auto abort_result = tx.
abort();
150 EXPECT_TRUE(abort_result);
151 EXPECT_EQ(tx.
state(), transaction_state::aborted);
154 auto op2 = std::make_unique<transaction_operation>(
"op2", [
this]() {
return test_operation(); });
156 EXPECT_FALSE(add_result);
161 config.
timeout = std::chrono::milliseconds(50);
164 auto op = std::make_unique<transaction_operation>(
"op", [
this]() {
return test_operation(); });
168 std::this_thread::sleep_for(std::chrono::milliseconds(100));
170 auto commit_result = tx.
commit();
171 EXPECT_FALSE(commit_result);
172 EXPECT_EQ(tx.
state(), transaction_state::aborted);
184 [
this]() {
return test_validation(); },
185 [
this]() {
return test_repair(); }
187 EXPECT_TRUE(add_result);
190 auto validation_res = validator.
validate();
191 EXPECT_TRUE(validation_res.is_ok());
193 auto results = validation_res.value();
194 EXPECT_EQ(results.size(), 1);
195 EXPECT_EQ(results[
"test_rule"], validation_result::valid);
198 EXPECT_TRUE(health.is_ok());
199 EXPECT_TRUE(health.value());
208 std::atomic<bool> should_fail{
true};
212 return should_fail.load() ? validation_result::invalid : validation_result::valid;
221 auto validation_res = validator.
validate();
222 EXPECT_TRUE(validation_res.is_ok());
224 auto results = validation_res.value();
225 EXPECT_EQ(results[
"failing_rule"], validation_result::invalid);
226 EXPECT_EQ(results[
"failing_rule_after_repair"], validation_result::valid);
229 EXPECT_EQ(metrics.validation_runs.load(), 1);
230 EXPECT_EQ(metrics.repair_operations.load(), 1);
238 std::atomic<int> validation_calls{0};
241 [&validation_calls]() {
243 return validation_result::valid;
248 auto start_result = validator.
start();
249 EXPECT_TRUE(start_result.is_ok());
253 std::this_thread::sleep_for(std::chrono::milliseconds(400));
256 auto stop_result = validator.
stop();
257 EXPECT_TRUE(stop_result.is_ok());
261 EXPECT_GE(validation_calls.load(), 2);
271 EXPECT_TRUE(begin_result.is_ok());
273 auto tx = begin_result.value();
274 EXPECT_EQ(tx->id(),
"tx1");
275 EXPECT_EQ(tx->state(), transaction_state::active);
279 auto op = std::make_unique<transaction_operation>(
"op", [
this]() {
return test_operation(); });
280 tx->add_operation(std::move(op));
283 EXPECT_TRUE(commit_result);
288 EXPECT_EQ(metrics.total_transactions.load(), 1);
289 EXPECT_EQ(metrics.committed_transactions.load(), 1);
290 EXPECT_EQ(metrics.aborted_transactions.load(), 0);
298 EXPECT_TRUE(begin_result.is_ok());
301 EXPECT_TRUE(abort_result);
304 EXPECT_EQ(metrics.total_transactions.load(), 1);
305 EXPECT_EQ(metrics.committed_transactions.load(), 0);
306 EXPECT_EQ(metrics.aborted_transactions.load(), 1);
307 EXPECT_NEAR(metrics.get_abort_rate(), 1.0, 0.01);
315 EXPECT_TRUE(begin_result1.is_ok());
319 EXPECT_FALSE(begin_result2.is_ok());
320 EXPECT_EQ(begin_result2.error().code,
static_cast<int>(monitoring_error_code::already_exists));
325 config.
timeout = std::chrono::milliseconds(100);
330 EXPECT_TRUE(begin_result.is_ok());
333 std::this_thread::sleep_for(std::chrono::milliseconds(250));
336 EXPECT_TRUE(deadlocks.is_ok());
337 EXPECT_EQ(deadlocks.value().size(), 1);
338 EXPECT_EQ(deadlocks.value()[0],
"long_tx");
341 EXPECT_EQ(metrics.deadlocks_detected.load(), 1);
350 EXPECT_TRUE(begin_result.is_ok());
352 auto op = std::make_unique<transaction_operation>(
"op", [
this]() {
return test_operation(); });
353 begin_result.value()->add_operation(std::move(op));
369 EXPECT_TRUE(add_result.is_ok());
372 EXPECT_NE(manager,
nullptr);
373 EXPECT_EQ(manager->get_name(),
"tx_manager");
377 EXPECT_FALSE(duplicate_result.is_ok());
378 EXPECT_EQ(duplicate_result.error().code,
static_cast<int>(monitoring_error_code::already_exists));
386 EXPECT_TRUE(add_result.is_ok());
389 EXPECT_NE(validator,
nullptr);
390 EXPECT_EQ(validator->get_name(),
"validator");
405 EXPECT_TRUE(start_result.is_ok());
407 std::this_thread::sleep_for(std::chrono::milliseconds(50));
411 EXPECT_TRUE(stop_result.is_ok());
425 auto health = consistency_manager.
is_healthy();
426 EXPECT_TRUE(health.is_ok());
427 EXPECT_TRUE(health.value());
442 EXPECT_EQ(all_metrics.size(), 2);
443 EXPECT_TRUE(all_metrics.find(
"tx_manager_transactions") != all_metrics.end());
444 EXPECT_TRUE(all_metrics.find(
"validator_validation") != all_metrics.end());
452 config.
timeout = std::chrono::seconds(30);
458 config.
timeout = std::chrono::milliseconds(0);
462 config.
timeout = std::chrono::seconds(30);
504 const int num_threads = 5;
505 const int transactions_per_thread = 10;
506 std::atomic<int> successful_transactions{0};
508 std::vector<std::thread> threads;
509 for (
int i = 0; i < num_threads; ++i) {
510 threads.emplace_back([&, i]() {
511 for (
int j = 0; j < transactions_per_thread; ++j) {
512 std::string tx_id =
"tx_" + std::to_string(i) +
"_" + std::to_string(j);
515 if (begin_result.is_ok()) {
516 auto tx = begin_result.value();
518 auto op = std::make_unique<transaction_operation>(
519 "op", [
this]() {
return test_operation(); });
520 tx->add_operation(std::move(op));
524 successful_transactions++;
531 for (
auto& thread : threads) {
535 EXPECT_EQ(successful_transactions.load(), num_threads * transactions_per_thread);
538 EXPECT_EQ(metrics.total_transactions.load(), num_threads * transactions_per_thread);
539 EXPECT_EQ(metrics.committed_transactions.load(), num_threads * transactions_per_thread);
545 EXPECT_NE(tx_manager,
nullptr);
546 EXPECT_EQ(tx_manager->get_name(),
"factory_tx_manager");
549 EXPECT_NE(validator,
nullptr);
550 EXPECT_EQ(validator->get_name(),
"factory_validator");
553 EXPECT_NE(consistency_manager,
nullptr);
std::atomic< int > rollback_count
kcenon::common::VoidResult failing_operation()
std::atomic< int > call_count
kcenon::common::VoidResult test_operation()
std::atomic< int > success_count
kcenon::common::VoidResult test_repair()
validation_result test_validation()
kcenon::common::VoidResult rollback_operation()
validation_result failing_validation()
Data consistency manager coordinating transaction managers and validators.
common::VoidResult start_all_validators()
std::unordered_map< std::string, std::string > get_all_metrics() const
transaction_manager * get_transaction_manager(const std::string &name)
common::VoidResult add_transaction_manager(const std::string &name, const transaction_config &config)
state_validator * get_state_validator(const std::string &name)
common::Result< bool > is_healthy() const
common::VoidResult add_state_validator(const std::string &name, const validation_config &config)
common::VoidResult stop_all_validators()
State validator for validating system state.
bool add_validation_rule(const std::string &name, validation_func_t validation_func, repair_func_t repair_func=nullptr)
validation_metrics & get_metrics()
common::Result< bool > is_healthy() const
common::VoidResult stop()
common::Result< std::unordered_map< std::string, validation_result > > validate()
common::VoidResult start()
Transaction manager for coordinating transactions.
size_t completed_transaction_count() const
size_t active_transaction_count() const
common::Result< std::shared_ptr< transaction > > begin_transaction(const std::string &id)
bool commit_transaction(const std::string &id)
void cleanup_completed_transactions(std::chrono::milliseconds)
common::Result< std::vector< std::string > > detect_deadlocks()
transaction_metrics & get_metrics()
bool abort_transaction(const std::string &id)
Transaction containing multiple operations.
bool add_operation(std::unique_ptr< transaction_operation > op)
transaction_state state() const
size_t operation_count() const
Transaction states and consistency validation for metric storage.
std::shared_ptr< state_validator > create_state_validator(const std::string &name)
Factory function to create a state validator.
validation_result
Validation result states.
std::shared_ptr< data_consistency_manager > create_data_consistency_manager(const std::string &name)
Factory function to create a data consistency manager.
std::shared_ptr< transaction_manager > create_transaction_manager(const std::string &name)
Factory function to create a transaction manager.
Transaction configuration.
std::chrono::milliseconds lock_timeout
std::chrono::milliseconds timeout
Validation configuration.
double corruption_threshold
size_t max_validation_failures
std::chrono::milliseconds validation_interval
TEST_F(DataConsistencyTest, TransactionOperationBasic)