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)