beegfs/fsck/tests/TestTable.cpp
2025-08-10 01:34:16 +02:00

183 lines
4.3 KiB
C++

#include "TestTable.h"
void TestTable::SetUp()
{
FlatTest::SetUp();
this->table.reset(new Table<Data>(this->fileName, 4096) );
}
void TestTable::TearDown()
{
if(this->table)
this->table->drop();
FlatTest::TearDown();
}
TEST_F(TestTable, dataHandling)
{
Data d = {0, {}};
// first, only ordered inserts
d.id = 0;
this->table->insert(d);
d.id = 1;
this->table->insert(d);
// complete the base set
this->table->commitChanges();
// insert "in order"
d.id = 2;
this->table->insert(d);
// unordered delete should fail
ASSERT_THROW(this->table->remove(1), std::runtime_error);
// ordered delete should work
this->table->remove(3);
// reinsert of same id should work
d.id = 3;
this->table->insert(d);
// unordered insert should now fail
ASSERT_THROW(this->table->insert(d), std::runtime_error);
// reset changes
this->table->commitChanges();
// unordered insert should work
d.id = 0;
this->table->insert(d);
d.id = 4;
this->table->insert(d);
d.id = 1;
this->table->insert(d);
// delete should fail
ASSERT_THROW(this->table->remove(1), std::runtime_error);
// reset changes
this->table->commitChanges();
// ordered delete should work
this->table->remove(1);
this->table->remove(2);
this->table->remove(3);
// unordered insert should fail
d.id = 2;
ASSERT_THROW(this->table->insert(d), std::runtime_error);
// unordered delete should work
this->table->remove(3);
// insert should fail after unordered delete
d.id = 10;
ASSERT_THROW(this->table->insert(d), std::runtime_error);
// uncomitted changes should yield the sequence [0, 0, 1, 1, 2, 3, 4]
{
Table<Data>::QueryType cursor = this->table->cursor();
unsigned expect[7] = { 0, 0, 1, 1, 2, 3, 4 };
for(unsigned i = 0; i < 7; i++)
{
ASSERT_TRUE(cursor.step());
ASSERT_EQ(cursor.get()->id, expect[i]);
}
ASSERT_FALSE(cursor.step());
}
// commited should contain the sequence [0, 0, 4]
this->table->commitChanges();
{
Table<Data>::QueryType cursor = this->table->cursor();
ASSERT_TRUE(cursor.step());
ASSERT_EQ(cursor.get()->id, 0u);
ASSERT_TRUE(cursor.step());
ASSERT_EQ(cursor.get()->id, 0u);
ASSERT_TRUE(cursor.step());
ASSERT_EQ(cursor.get()->id, 4u);
ASSERT_FALSE(cursor.step());
}
ASSERT_TRUE(this->table->getByKey(4).first);
ASSERT_EQ(this->table->getByKey(4).second.id, 4u);
ASSERT_FALSE(this->table->getByKey(3).first);
struct ops
{
static int64_t key(uint64_t key) { return key + 6; }
};
ASSERT_TRUE(this->table->getByKeyProjection(10, ops::key).first);
ASSERT_EQ(this->table->getByKeyProjection(10, ops::key).second.id, 4u);
}
TEST_F(TestTable, bulkInsert)
{
{
boost::shared_ptr<Buffer<Data> > buf1, buf2;
buf1 = this->table->bulkInsert();
buf2 = this->table->bulkInsert();
Data d = { 0, {} };
d.id = 1;
buf1->append(d);
d.id = 2;
buf2->append(d);
}
// all insert must have gone to base, queryable immediatly
{
Table<Data>::QueryType cursor = this->table->cursor();
ASSERT_TRUE(cursor.step());
ASSERT_EQ(cursor.get()->id, 1u);
ASSERT_TRUE(cursor.step());
ASSERT_EQ(cursor.get()->id, 2u);
ASSERT_FALSE(cursor.step());
}
// another bulk insert is fine, no modifications happened yet
{
boost::shared_ptr<Buffer<Data> > buf;
buf = this->table->bulkInsert();
Data d = { 3, {} };
buf->append(d);
// can't do normal insert or remove during bulk insert
ASSERT_THROW(this->table->insert(d), std::runtime_error);
ASSERT_THROW(this->table->remove(4), std::runtime_error);
}
// all insert must have gone to base, queryable immediatly
{
Table<Data>::QueryType cursor = this->table->cursor();
ASSERT_TRUE(cursor.step());
ASSERT_EQ(cursor.get()->id, 1u);
ASSERT_TRUE(cursor.step());
ASSERT_EQ(cursor.get()->id, 2u);
ASSERT_TRUE(cursor.step() );
ASSERT_EQ(cursor.get()->id, 3u);
ASSERT_FALSE(cursor.step());
}
this->table->remove(1);
ASSERT_THROW(this->table->bulkInsert(), std::runtime_error);
this->table->commitChanges();
ASSERT_THROW(this->table->bulkInsert(), std::runtime_error);
}