diff options
Diffstat (limited to 'sntp/tests/kodFile.cpp')
-rw-r--r-- | sntp/tests/kodFile.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/sntp/tests/kodFile.cpp b/sntp/tests/kodFile.cpp new file mode 100644 index 0000000..e1775f6 --- /dev/null +++ b/sntp/tests/kodFile.cpp @@ -0,0 +1,138 @@ +#include "fileHandlingTest.h" + +extern "C" { +#include "kod_management.h" + +#include "ntp_stdlib.h" // For estrdup() +}; + +/* + * We access some parts of the kod database directly, without + * going through the public interface + */ +extern int kod_db_cnt; +extern kod_entry** kod_db; +extern char* kod_db_file; + +class kodFileTest : public fileHandlingTest { +protected: + virtual void SetUp() { + kod_db_cnt = 0; + kod_db = NULL; + } + + virtual void TearDown() { + } +}; + +TEST_F(kodFileTest, ReadEmptyFile) { + kod_init_kod_db(CreatePath("kod-test-empty", INPUT_DIR).c_str(), TRUE); + + EXPECT_EQ(0, kod_db_cnt); +} + +TEST_F(kodFileTest, ReadCorrectFile) { + kod_init_kod_db(CreatePath("kod-test-correct", INPUT_DIR).c_str(), TRUE); + + EXPECT_EQ(2, kod_db_cnt); + + kod_entry* res; + + ASSERT_EQ(1, search_entry("192.0.2.5", &res)); + EXPECT_STREQ("DENY", res->type); + EXPECT_STREQ("192.0.2.5", res->hostname); + EXPECT_EQ(0x12345678, res->timestamp); + + ASSERT_EQ(1, search_entry("192.0.2.100", &res)); + EXPECT_STREQ("RSTR", res->type); + EXPECT_STREQ("192.0.2.100", res->hostname); + EXPECT_EQ(0xfff, res->timestamp); +} + +TEST_F(kodFileTest, ReadFileWithBlankLines) { + kod_init_kod_db(CreatePath("kod-test-blanks", INPUT_DIR).c_str(), TRUE); + + EXPECT_EQ(3, kod_db_cnt); + + kod_entry* res; + + ASSERT_EQ(1, search_entry("192.0.2.5", &res)); + EXPECT_STREQ("DENY", res->type); + EXPECT_STREQ("192.0.2.5", res->hostname); + EXPECT_EQ(0x12345678, res->timestamp); + + ASSERT_EQ(1, search_entry("192.0.2.100", &res)); + EXPECT_STREQ("RSTR", res->type); + EXPECT_STREQ("192.0.2.100", res->hostname); + EXPECT_EQ(0xfff, res->timestamp); + + ASSERT_EQ(1, search_entry("example.com", &res)); + EXPECT_STREQ("DENY", res->type); + EXPECT_STREQ("example.com", res->hostname); + EXPECT_EQ(0xabcd, res->timestamp); +} + +TEST_F(kodFileTest, WriteEmptyFile) { + kod_db_file = estrdup(CreatePath("kod-output-blank", OUTPUT_DIR).c_str()); + + write_kod_db(); + + // Open file and ensure that the filesize is 0 bytes. + std::ifstream is(kod_db_file, std::ios::binary); + ASSERT_FALSE(is.fail()); + + EXPECT_EQ(0, GetFileSize(is)); + + is.close(); +} + +TEST_F(kodFileTest, WriteFileWithSingleEntry) { + kod_db_file = estrdup(CreatePath("kod-output-single", OUTPUT_DIR).c_str()); + + add_entry("host1", "DENY"); + + /* Here we must manipulate the timestamps, so they match the one in + * the expected file. + */ + kod_db[0]->timestamp = 1; + + write_kod_db(); + + // Open file and compare sizes. + ifstream actual(kod_db_file, ios::binary); + ifstream expected(CreatePath("kod-expected-single", INPUT_DIR).c_str()); + ASSERT_TRUE(actual.good()); + ASSERT_TRUE(expected.good()); + + ASSERT_EQ(GetFileSize(expected), GetFileSize(actual)); + + CompareFileContent(expected, actual); +} + +TEST_F(kodFileTest, WriteFileWithMultipleEntries) { + kod_db_file = estrdup(CreatePath("kod-output-multiple", OUTPUT_DIR).c_str()); + + add_entry("example.com", "RATE"); + add_entry("192.0.2.1", "DENY"); + add_entry("192.0.2.5", "RSTR"); + + /* + * Manipulate timestamps. This is a bit of a hack, ideally these + * tests should not care about the internal representation. + */ + kod_db[0]->timestamp = 0xabcd; + kod_db[1]->timestamp = 0xabcd; + kod_db[2]->timestamp = 0xabcd; + + write_kod_db(); + + // Open file and compare sizes and content. + ifstream actual(kod_db_file, ios::binary); + ifstream expected(CreatePath("kod-expected-multiple", INPUT_DIR).c_str()); + ASSERT_TRUE(actual.good()); + ASSERT_TRUE(expected.good()); + + ASSERT_EQ(GetFileSize(expected), GetFileSize(actual)); + + CompareFileContent(expected, actual); +} |