Files
MuditaOS/module-db/tests/SMSTemplateTable_tests.cpp
Borys Jelenski b00efa685b [EGD-5115] Fix dangling ptrs in module-db tests
The dangling ptrs derefencing freed memory has been fixed.
They caused the tests to trigger the ASan. Additonally, in some tests
where DB objects were allocated dynamically, they are now allocated
automatically on the stack to simplify the code.
2021-02-04 16:45:50 +01:00

106 lines
3.0 KiB
C++

// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include <catch2/catch.hpp>
#include "Database/Database.hpp"
#include "Databases/SmsDB.hpp"
#include "Tables/SMSTemplateTable.hpp"
#include <vfs.hpp>
#include <filesystem>
#include <purefs/filesystem_paths.hpp>
#include <algorithm>
#include <string>
#include <cstdint>
TEST_CASE("SMS Templates Table tests")
{
Database::initialize();
const auto smsPath = purefs::dir::getUserDiskPath() / "sms.db";
std::filesystem::remove(smsPath);
SmsDB smsDb{smsPath.c_str()};
REQUIRE(smsDb.isInitialized());
auto &templatesTbl = smsDb.templates;
SMSTemplateTableRow testRow = {{.ID = 0}, .text = "Test text", .lastUsageTimestamp = 100};
// add 4 elements into table
REQUIRE(templatesTbl.add(testRow));
REQUIRE(templatesTbl.add(testRow));
REQUIRE(templatesTbl.add(testRow));
REQUIRE(templatesTbl.add(testRow));
REQUIRE(templatesTbl.count() == 4);
SECTION("Get entry by ID")
{
auto templ = templatesTbl.getById(4);
REQUIRE(templ.ID == 4);
REQUIRE(templ.text == testRow.text);
REQUIRE(templ.lastUsageTimestamp == testRow.lastUsageTimestamp);
}
SECTION("Entry update")
{
testRow.ID = 4;
testRow.text = "New text";
testRow.lastUsageTimestamp = 200;
REQUIRE(templatesTbl.update(testRow));
auto templ = templatesTbl.getById(4);
REQUIRE(templ.ID == 4);
REQUIRE(templ.text == testRow.text);
REQUIRE(templ.lastUsageTimestamp == testRow.lastUsageTimestamp);
}
SECTION("Get entry - invalid ID")
{
auto templ = templatesTbl.getById(100);
REQUIRE(templ.ID == DB_ID_NONE);
REQUIRE(templ.text == "");
REQUIRE(templ.lastUsageTimestamp == 0);
}
SECTION("Get table rows")
{
// Get table rows using valid offset/limit parameters
auto retOffsetLimit = templatesTbl.getLimitOffset(0, 4);
REQUIRE(retOffsetLimit.size() == 4);
// Get table rows using invalid limit parameters(should return 4 elements instead of 100)
auto retOffsetLimitBigger = templatesTbl.getLimitOffset(0, 100);
REQUIRE(retOffsetLimitBigger.size() == 4);
// Get table rows using invalid offset/limit parameters(should return empty object)
auto retOffsetLimitFailed = templatesTbl.getLimitOffset(5, 4);
REQUIRE(retOffsetLimitFailed.size() == 0);
}
SECTION("Remove entries")
{
REQUIRE(templatesTbl.removeById(2));
// Table should have now 3 elements
REQUIRE(templatesTbl.count() == 3);
// Remove non existing element
REQUIRE(templatesTbl.removeById(100));
// Remove all elements from table
REQUIRE(templatesTbl.removeById(1));
REQUIRE(templatesTbl.removeById(3));
REQUIRE(templatesTbl.removeById(4));
// Table should be empty now
REQUIRE(templatesTbl.count() == 0);
}
Database::deinitialize();
}