Add compareDbs() function with database patterns 14/30714/11
authorPawel Wieczorek <p.wieczorek2@samsung.com>
Mon, 1 Dec 2014 13:14:41 +0000 (14:14 +0100)
committerPawel Wieczorek <p.wieczorek2@samsung.com>
Mon, 15 Dec 2014 10:21:22 +0000 (11:21 +0100)
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

packaging/security-tests.spec
tests/common/memory.h
tests/cynara-tests/CMakeLists.txt
tests/cynara-tests/db_patterns/default/_ [new file with mode: 0644]
tests/cynara-tests/db_patterns/default/buckets [new file with mode: 0644]
tests/cynara-tests/db_patterns/defaultAllowed/_ [new file with mode: 0644]
tests/cynara-tests/db_patterns/defaultAllowed/buckets [new file with mode: 0644]
tests/cynara-tests/db_patterns/nonEmptyDatabase/_ [new file with mode: 0644]
tests/cynara-tests/db_patterns/nonEmptyDatabase/buckets [new file with mode: 0644]
tests/cynara-tests/test_cases_db.cpp

index 055cdb8..ed597ae 100644 (file)
@@ -107,4 +107,4 @@ echo "security-tests postinst done ..."
 /usr/bin/cynara-test
 /usr/bin/ckm-tests
 /usr/share/ckm-test/*
-
+/etc/security-tests
index 22083cb..4ed2407 100644 (file)
@@ -4,6 +4,7 @@
 #include <memory>
 #include <sys/smack.h>
 #include <dirent.h>
+#include <glob.h>
 
 #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
 
index a203261..9fc6066 100644 (file)
@@ -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 (file)
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 (file)
index 0000000..29ab987
--- /dev/null
@@ -0,0 +1 @@
+;0x0;
diff --git a/tests/cynara-tests/db_patterns/defaultAllowed/_ b/tests/cynara-tests/db_patterns/defaultAllowed/_
new file mode 100644 (file)
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 (file)
index 0000000..1614852
--- /dev/null
@@ -0,0 +1 @@
+;0xFFFF;
diff --git a/tests/cynara-tests/db_patterns/nonEmptyDatabase/_ b/tests/cynara-tests/db_patterns/nonEmptyDatabase/_
new file mode 100644 (file)
index 0000000..f13b4a6
--- /dev/null
@@ -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 (file)
index 0000000..29ab987
--- /dev/null
@@ -0,0 +1 @@
+;0x0;
index c343daa..63ec312 100644 (file)
  */
 
 #include <dpl/test/test_runner.h>
+#include <cynara_test_commons.h>
+
+#include <dirent.h>
+#include <glob.h>
+#include <fstream>
+#include <iterator>
+#include <memory.h>
+#include <set>
+#include <string>
+
+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::string>(std::istream_iterator<std::string>(patternFile),
+                                                     std::istream_iterator<std::string>());
+
+    auto resultRecords = std::multiset<std::string>(std::istream_iterator<std::string>(resultFile),
+                                                    std::istream_iterator<std::string>());
+
+    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)