tests for transaction RAII behaviour, transaction documentation, minor doc fixes
All checks were successful
Main LMDBAL workfow / Archlinux (push) Successful in 37s
All checks were successful
Main LMDBAL workfow / Archlinux (push) Successful in 37s
This commit is contained in:
parent
de741eda21
commit
6b348023bb
8 changed files with 215 additions and 12 deletions
|
@ -229,3 +229,51 @@ TEST_F(CacheTransactionsTest, ConcurentModification) {
|
|||
EXPECT_EQ(c1->getRecord(5), -46);
|
||||
}
|
||||
|
||||
TEST_F(CacheTransactionsTest, RAIIResourceFree) {
|
||||
EXPECT_EQ(db->ready(), true);
|
||||
|
||||
int pid = fork();
|
||||
if (pid == 0) { // I am the child
|
||||
std::cout << "beggining child transaction" << std::endl;
|
||||
LMDBAL::WriteTransaction txn2 = db->beginTransaction(); //<--- this is where the execution should pause
|
||||
//and wait for the first transaction to get finished
|
||||
std::cout << "checking result of the parent transaction value" << std::endl;
|
||||
EXPECT_FALSE(c1->checkRecord(221, txn2));
|
||||
|
||||
std::cout << "performing modification from the child thread" << std::endl;
|
||||
c1->addRecord(221, 14, txn2);
|
||||
|
||||
std::cout << "commiting child transaction" << std::endl;
|
||||
txn2.commit();
|
||||
|
||||
std::cout << "quitting child thread, letting child transaction be destroyed after commit" << std::endl;
|
||||
exit(testing::Test::HasFailure());
|
||||
} else { // I am the parent
|
||||
std::cout << "beggining parent transaction" << std::endl;
|
||||
{
|
||||
LMDBAL::WriteTransaction txn1 = db->beginTransaction();
|
||||
|
||||
std::cout << "putting parent thread to sleep for 5 ms" << std::endl;
|
||||
usleep(5);
|
||||
std::cout << "parent thread woke up" << std::endl;
|
||||
|
||||
std::cout << "adding value from parent thread" << std::endl;
|
||||
c1->addRecord(221, 320, txn1);
|
||||
|
||||
std::cout << "checking value from parent thread using transaction" << std::endl;
|
||||
EXPECT_EQ(c1->getRecord(221, txn1), 320);
|
||||
|
||||
std::cout << "checking value independently from parent thread" << std::endl;
|
||||
EXPECT_FALSE(c1->checkRecord(221));
|
||||
|
||||
std::cout << "implicitly aborting transaction by leaving the scope" << std::endl;
|
||||
}
|
||||
|
||||
std::cout << "child thread should resume after this line" << std::endl;
|
||||
ASSERT_EQ(0, waitForChildFork(pid)); //child process should have no problems
|
||||
}
|
||||
|
||||
std::cout << "checking the final result" << std::endl;
|
||||
EXPECT_EQ(c1->getRecord(221), 14);
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ protected:
|
|||
|
||||
~StorageTransactionsTest() {}
|
||||
|
||||
int waitForChildFork(int pid) {
|
||||
int waitForChildFork(int pid) {
|
||||
int status;
|
||||
if (0 > waitpid(pid, &status, 0)) {
|
||||
std::cerr << "[----------] Waitpid error!" << std::endl;
|
||||
|
@ -22,9 +22,9 @@ protected:
|
|||
}
|
||||
if (WIFEXITED(status)) {
|
||||
const int exit_status = WEXITSTATUS(status);
|
||||
if (exit_status != 0) {
|
||||
if (exit_status != 0)
|
||||
std::cerr << "[----------] Non-zero exit status " << exit_status << " from test!" << std::endl;
|
||||
}
|
||||
|
||||
return exit_status;
|
||||
} else {
|
||||
std::cerr << "[----------] Non-normal exit from child!" << std::endl;
|
||||
|
@ -224,6 +224,54 @@ TEST_F(StorageTransactionsTest, ConcurentModification) {
|
|||
ASSERT_EQ(0, waitForChildFork(pid)); //child process should have no problems
|
||||
}
|
||||
|
||||
std::cout << "checking final result" << std::endl;
|
||||
std::cout << "checking the final result" << std::endl;
|
||||
EXPECT_EQ(t1->getRecord(5), -46);
|
||||
}
|
||||
|
||||
TEST_F(StorageTransactionsTest, RAIIResourceFree) {
|
||||
EXPECT_EQ(db->ready(), true);
|
||||
|
||||
int pid = fork();
|
||||
if (pid == 0) { // I am the child
|
||||
std::cout << "beggining child transaction" << std::endl;
|
||||
LMDBAL::WriteTransaction txn2 = db->beginTransaction(); //<--- this is where the execution should pause
|
||||
//and wait for the first transaction to get finished
|
||||
std::cout << "checking result of the parent transaction value" << std::endl;
|
||||
EXPECT_FALSE(t1->checkRecord(221, txn2));
|
||||
|
||||
std::cout << "performing modification from the child thread" << std::endl;
|
||||
t1->addRecord(221, 14, txn2);
|
||||
|
||||
std::cout << "commiting child transaction" << std::endl;
|
||||
txn2.commit();
|
||||
|
||||
std::cout << "quitting child thread, letting child transaction be destroyed after commit" << std::endl;
|
||||
exit(testing::Test::HasFailure());
|
||||
} else { // I am the parent
|
||||
std::cout << "beggining parent transaction" << std::endl;
|
||||
{
|
||||
LMDBAL::WriteTransaction txn1 = db->beginTransaction();
|
||||
|
||||
std::cout << "putting parent thread to sleep for 5 ms" << std::endl;
|
||||
usleep(5);
|
||||
std::cout << "parent thread woke up" << std::endl;
|
||||
|
||||
std::cout << "adding value from parent thread" << std::endl;
|
||||
t1->addRecord(221, 320, txn1);
|
||||
|
||||
std::cout << "checking value from parent thread using transaction" << std::endl;
|
||||
EXPECT_EQ(t1->getRecord(221, txn1), 320);
|
||||
|
||||
std::cout << "checking value independently from parent thread" << std::endl;
|
||||
EXPECT_FALSE(t1->checkRecord(221));
|
||||
|
||||
std::cout << "implicitly aborting transaction by leaving the scope" << std::endl;
|
||||
}
|
||||
|
||||
std::cout << "child thread should resume after this line" << std::endl;
|
||||
ASSERT_EQ(0, waitForChildFork(pid)); //child process should have no problems
|
||||
}
|
||||
|
||||
std::cout << "checking the final result" << std::endl;
|
||||
EXPECT_EQ(t1->getRecord(221), 14);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue