From: Pawel Wieczorek Date: Mon, 1 Dec 2014 13:14:41 +0000 (+0100) Subject: Add compareDbs() function with database patterns X-Git-Tag: security-manager_5.5_testing~163 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=78276b7c11eb10b5012934e6fbb0a05e251f914b;p=platform%2Fcore%2Ftest%2Fsecurity-tests.git Add compareDbs() function with database patterns Added function can be used to compare expected with actual contents of Cynara's database. Patterns are taken from test patterns directory. Available patterns: * minimal contents with default DENY policy * minimal contents with default ALLOW policy * database with sample DENY policy Change-Id: I510ba58e1ce12ecc388fd560e71a0f67929db757 --- diff --git a/packaging/security-tests.spec b/packaging/security-tests.spec index 055cdb8..ed597ae 100644 --- a/packaging/security-tests.spec +++ b/packaging/security-tests.spec @@ -107,4 +107,4 @@ echo "security-tests postinst done ..." /usr/bin/cynara-test /usr/bin/ckm-tests /usr/share/ckm-test/* - +/etc/security-tests diff --git a/tests/common/memory.h b/tests/common/memory.h index 22083cb..4ed2407 100644 --- a/tests/common/memory.h +++ b/tests/common/memory.h @@ -4,6 +4,7 @@ #include #include #include +#include #define DEFINE_SMARTPTR(func, type, name) \ struct deleter_##func { \ @@ -24,6 +25,7 @@ DEFINE_SMARTPTR(free, char, CStringPtr); DEFINE_SMARTPTR(closePtr, int, FdUniquePtr); DEFINE_SMARTPTR(smack_accesses_free, smack_accesses, SmackAccessesPtr); DEFINE_SMARTPTR(closedir, DIR, DirPtr); +DEFINE_SMARTPTR(globfree, glob_t, GlobPtr); // Custom typedefs diff --git a/tests/cynara-tests/CMakeLists.txt b/tests/cynara-tests/CMakeLists.txt index a203261..9fc6066 100644 --- a/tests/cynara-tests/CMakeLists.txt +++ b/tests/cynara-tests/CMakeLists.txt @@ -67,3 +67,8 @@ INSTALL(FILES ${PROJECT_SOURCE_DIR}/tests/cynara-tests/WRT_test_for_cynara_rules.smack DESTINATION /usr/share/privilege-control/ ) + +INSTALL(DIRECTORY + ${PROJECT_SOURCE_DIR}/tests/cynara-tests/db_patterns + DESTINATION /etc/security-tests/ +) diff --git a/tests/cynara-tests/db_patterns/default/_ b/tests/cynara-tests/db_patterns/default/_ new file mode 100644 index 0000000..e69de29 diff --git a/tests/cynara-tests/db_patterns/default/buckets b/tests/cynara-tests/db_patterns/default/buckets new file mode 100644 index 0000000..29ab987 --- /dev/null +++ b/tests/cynara-tests/db_patterns/default/buckets @@ -0,0 +1 @@ +;0x0; diff --git a/tests/cynara-tests/db_patterns/defaultAllowed/_ b/tests/cynara-tests/db_patterns/defaultAllowed/_ new file mode 100644 index 0000000..e69de29 diff --git a/tests/cynara-tests/db_patterns/defaultAllowed/buckets b/tests/cynara-tests/db_patterns/defaultAllowed/buckets new file mode 100644 index 0000000..1614852 --- /dev/null +++ b/tests/cynara-tests/db_patterns/defaultAllowed/buckets @@ -0,0 +1 @@ +;0xFFFF; diff --git a/tests/cynara-tests/db_patterns/nonEmptyDatabase/_ b/tests/cynara-tests/db_patterns/nonEmptyDatabase/_ new file mode 100644 index 0000000..f13b4a6 --- /dev/null +++ b/tests/cynara-tests/db_patterns/nonEmptyDatabase/_ @@ -0,0 +1 @@ +client;user;privilege;0x0; diff --git a/tests/cynara-tests/db_patterns/nonEmptyDatabase/buckets b/tests/cynara-tests/db_patterns/nonEmptyDatabase/buckets new file mode 100644 index 0000000..29ab987 --- /dev/null +++ b/tests/cynara-tests/db_patterns/nonEmptyDatabase/buckets @@ -0,0 +1 @@ +;0x0; diff --git a/tests/cynara-tests/test_cases_db.cpp b/tests/cynara-tests/test_cases_db.cpp index c343daa..63ec312 100644 --- a/tests/cynara-tests/test_cases_db.cpp +++ b/tests/cynara-tests/test_cases_db.cpp @@ -22,5 +22,95 @@ */ #include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + +const std::string cynaraTestPatternsPath("/etc/security-tests/db_patterns/"); +const std::string directoryWildcard("/*"); + +bool unordered_files_match(const std::string &patternFilePath, const std::string &resultFilePath) { + std::ifstream patternFile(patternFilePath, std::ifstream::in | std::ifstream::binary); + std::ifstream resultFile(resultFilePath, std::ifstream::in | std::ifstream::binary); + + RUNNER_ASSERT_MSG(patternFile.is_open(), "Failed to open " << patternFile << "."); + RUNNER_ASSERT_MSG(resultFile.is_open(), "Failed to open " << resultFile << "."); + + auto patternRecords = std::multiset(std::istream_iterator(patternFile), + std::istream_iterator()); + + auto resultRecords = std::multiset(std::istream_iterator(resultFile), + std::istream_iterator()); + + return patternRecords == resultRecords; +} + +size_t glob_count(const std::string &source, const std::string &wildcard) { + //for counting files in directory + glob_t globbuf; + std::string pattern = source + wildcard; + + //for freeing allocated memory + GlobPtr globbufPtr(&globbuf); + + //actually count files in directory - including dotfiles + RUNNER_ASSERT_MSG(0 == glob(pattern.c_str(), GLOB_NOSORT | GLOB_PERIOD, NULL, &globbuf), + "Failed to search for requested pathnames in " << source << "."); + + return globbuf.gl_pathc; +} + +size_t db_files_count(const std::string &source) { + size_t dbFilesCount = 0; + + //database directory must not be empty + RUNNER_ASSERT_MSG(0 != (dbFilesCount = glob_count(source, directoryWildcard)), + "Unexpected condition: " << source << " was empty."); + + return dbFilesCount; +} + +void compareDbs(const std::string &source) +{ + //for accessing files in directory + std::string patternDir = cynaraTestPatternsPath + source; + DIR *patternDirPtr = nullptr; + struct dirent *direntPtr; + + size_t patternFileCount = db_files_count(patternDir); + size_t resultFileCount = db_files_count(CynaraTestConsts::DB_DIR); + + //directories do not match if there is different number of files + RUNNER_ASSERT_MSG(patternFileCount == resultFileCount, + "No match in database and pattern directory file count"); + + //compare files in database directory with pattern directory + RUNNER_ASSERT_ERRNO_MSG(patternDirPtr = opendir(patternDir.c_str()), + "Opening " << patternDir << " directory failed"); + DirPtr patternDirScopedPtr(patternDirPtr); + + while ((direntPtr = readdir(patternDirPtr)) != nullptr) { + if (!strcmp(direntPtr->d_name, ".") + || !strcmp(direntPtr->d_name, "..")) + continue; + std::string patternName = patternDir + "/" + direntPtr->d_name; + std::string resultName = CynaraTestConsts::DB_DIR + "/" + direntPtr->d_name; + + //comparing file saved db dir with reference file from patterns dir + RUNNER_ASSERT_MSG(true == unordered_files_match(patternName, resultName), + "No match in stored file and pattern file"); + } +} + +} RUNNER_TEST_GROUP_INIT(cynara_db_tests)