ebpf-blocker 1.0.0
XDP-based packet blocker using eBPF
Loading...
Searching...
No Matches
test_db.cpp
Go to the documentation of this file.
1/// \file test_db.cpp
2/// \brief Модульные тесты для BlockerDB (обёртка SQLite).
3
4#include "db.h"
5#include <gtest/gtest.h>
6
7#include <cstdlib>
8#include <cstring>
9#include <filesystem>
10
11/// Тестовое окружение: создаёт свежую временную БД для каждого теста.
12class DBTest : public ::testing::Test {
13protected:
14 void SetUp() override {
15 path_ = "/tmp/ebpf_blocker_test.db";
16 std::filesystem::remove(path_);
17 db_ = std::make_unique<BlockerDB>(path_);
18 db_->Migrate();
19 }
20
21 void TearDown() override {
22 db_.reset();
23 std::filesystem::remove(path_);
24 }
25
26 std::string path_; ///< Путь к временной тестовой БД.
27 std::unique_ptr<BlockerDB> db_; ///< Тестируемый экземпляр БД.
28};
29
30TEST_F(DBTest, EmptyDatabase) {
31 auto whitelist = db_->GetWhitelist();
32 auto blacklist = db_->GetBlacklist();
33 EXPECT_TRUE(whitelist.empty());
34 EXPECT_TRUE(blacklist.empty());
35}
36
37TEST_F(DBTest, InsertAndReadBlacklist) {
38 {
39 sqlite3 *raw = nullptr;
40 sqlite3_open(path_.c_str(), &raw);
41 sqlite3_exec(raw,
42 "INSERT INTO blocked_ips (ip, comment) VALUES ('10.0.0.0/8', "
43 "'test subnet');"
44 "INSERT INTO blocked_ips (ip, comment) VALUES ('1.2.3.4', "
45 "'single IP');",
46 nullptr, nullptr, nullptr);
47 sqlite3_close(raw);
48 }
49
50 auto entries = db_->GetBlacklist();
51 EXPECT_EQ(entries.size(), 2);
52 EXPECT_EQ(entries[0].ip, "10.0.0.0/8");
53 EXPECT_EQ(entries[1].ip, "1.2.3.4");
54}
55
56TEST_F(DBTest, InsertAndReadWhitelist) {
57 {
58 sqlite3 *raw = nullptr;
59 sqlite3_open(path_.c_str(), &raw);
60 sqlite3_exec(raw,
61 "INSERT INTO whitelist_ips (ip, comment) VALUES "
62 "('192.168.0.0/16', 'LAN');"
63 "INSERT INTO whitelist_ips (ip, comment) VALUES ('127.0.0.1', "
64 "'localhost');",
65 nullptr, nullptr, nullptr);
66 sqlite3_close(raw);
67 }
68
69 auto entries = db_->GetWhitelist();
70 EXPECT_EQ(entries.size(), 2);
71 EXPECT_EQ(entries[0].ip, "192.168.0.0/16");
72 EXPECT_EQ(entries[1].ip, "127.0.0.1");
73}
74
75TEST_F(DBTest, WhitelistAndBlacklistAreSeparate) {
76 {
77 sqlite3 *raw = nullptr;
78 sqlite3_open(path_.c_str(), &raw);
79 sqlite3_exec(raw,
80 "INSERT INTO whitelist_ips (ip) VALUES ('10.0.0.0/8');"
81 "INSERT INTO blocked_ips (ip) VALUES ('20.0.0.0/8');",
82 nullptr, nullptr, nullptr);
83 sqlite3_close(raw);
84 }
85
86 auto wl = db_->GetWhitelist();
87 auto bl = db_->GetBlacklist();
88 EXPECT_EQ(wl.size(), 1);
89 EXPECT_EQ(bl.size(), 1);
90 EXPECT_EQ(wl[0].ip, "10.0.0.0/8");
91 EXPECT_EQ(bl[0].ip, "20.0.0.0/8");
92}
93
94TEST_F(DBTest, MigrationCreatesTables) {
95 sqlite3 *raw = nullptr;
96 sqlite3_open(path_.c_str(), &raw);
97
98 auto check_table = [&](const char *name) {
99 char **results = nullptr;
100 int rows = 0, cols = 0;
101 std::string sql =
102 "SELECT name FROM sqlite_master WHERE type='table' AND name='" +
103 std::string(name) + "'";
104 sqlite3_get_table(raw, sql.c_str(), &results, &rows, &cols, nullptr);
105 bool found = (rows > 0);
106 sqlite3_free_table(results);
107 return found;
108 };
109
110 EXPECT_TRUE(check_table("whitelist_ips"));
111 EXPECT_TRUE(check_table("blocked_ips"));
112
113 sqlite3_close(raw);
114}
Тестовое окружение: создаёт свежую временную БД для каждого теста.
Definition test_db.cpp:12
void SetUp() override
Definition test_db.cpp:14
std::string path_
Путь к временной тестовой БД.
Definition test_db.cpp:26
void TearDown() override
Definition test_db.cpp:21
std::unique_ptr< BlockerDB > db_
Тестируемый экземпляр БД.
Definition test_db.cpp:27
Обёртка SQLite-базы данных и утилиты парсинга CIDR.
TEST_F(DBTest, EmptyDatabase)
Definition test_db.cpp:30