2 * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
5 * @file security_server_tests_stress.cpp
6 * @author Pawel Polawski (p.polawski@partner.samsung.com)
8 * @brief Test cases for security server stress tests
12 #include <dpl/test/test_runner.h>
13 #include <dpl/test/test_runner_multiprocess.h>
14 #include <tests_common.h>
15 #include <summary_collector.h>
17 #include <sys/smack.h>
22 #include <sys/types.h>
24 #include "security-server.h"
28 std::mutex g_msgMutex;
29 size_t g_successes = 0;
32 const size_t g_threadsNumber = 5;
35 const std::string g_subject("woda");
36 const std::string g_object("wiadro");
37 const std::string g_rule("rwx");
43 void appendError(const std::string &message)
45 std::lock_guard<std::mutex> lock(g_msgMutex);
50 void cookie_api_thread_function(bool isSmack)
55 int security_server_get_cookie_size(void);
56 int security_server_request_cookie(char *cookie, size_t bufferSize);
57 int security_server_check_privilege(const char *cookie, gid_t privilege);
58 int security_server_check_privilege_by_cookie(const char *cookie,
60 const char *access_rights);
61 int security_server_get_cookie_pid(const char *cookie);
62 char *security_server_get_smacklabel_cookie(const char *cookie);
68 //security_server_get_cookie_size()
69 COOKIE_SIZE = security_server_get_cookie_size();
70 if (COOKIE_SIZE != 20) {
71 appendError("Error in security_server_get_cookie_size(): " + std::to_string(COOKIE_SIZE));
75 //security_server_request_cookie()
76 std::vector<char> cookie(COOKIE_SIZE);
77 ret = security_server_request_cookie(cookie.data(), COOKIE_SIZE);
79 appendError("Error in security_server_request_cookie(): " + std::to_string(ret));
83 //security_server_check_privilege()
84 ret = security_server_check_privilege(cookie.data(), 0);
86 appendError("Error in security_server_check_privilege(): " + std::to_string(ret));
90 //security_server_check_privilege_by_cookie()
91 ret = security_server_check_privilege_by_cookie(cookie.data(), g_object.data(), g_rule.data());
93 appendError("Error in security_server_check_privilege_by_cookie(): " + std::to_string(ret));
97 //security_server_get_cookie_pid
98 ret = security_server_get_cookie_pid(cookie.data());
100 appendError("Error in security_server_get_cookie_pid(): " + std::to_string(ret));
105 //security_server_get_smacklabel_cookie()
106 char *tmp = security_server_get_smacklabel_cookie(cookie.data());
107 std::string labelFromCookie(tmp ? tmp : "");
109 if (labelFromCookie.size() == 0) {
110 appendError("Error in security_server_get_smacklabel_cookie(): " + labelFromCookie);
114 char *labelFromSelfTmp = NULL;
115 ret = smack_new_label_from_self(&labelFromSelfTmp);
117 appendError("Error in smack_new_label_from_self(): " + std::to_string(ret));
121 std::string labelFromSelf(labelFromSelfTmp ? labelFromSelfTmp : "");
122 free(labelFromSelfTmp);
123 if (labelFromSelf != labelFromCookie) {
124 appendError("Error in comparing SMACK label: " + std::to_string(ret));
129 std::lock_guard<std::mutex> lock(g_mutex);
133 void testFunction(bool isSmack)
135 std::vector<std::thread> threadsVector;
138 //preapre environment
139 int ret = smack_set_label_for_self(g_subject.data());
140 RUNNER_ASSERT_MSG_BT(ret == 0, "Error in smack_set_label_for_self()");
142 struct smack_accesses *rulesRaw = NULL;
143 ret = smack_accesses_new(&rulesRaw);
144 RUNNER_ASSERT_MSG_BT(ret == 0, "Error in smack_accesses_new()");
145 SmackAccessesPtr rules(rulesRaw);
146 ret = smack_accesses_add(rules.get(), g_subject.data(), g_object.data(), g_rule.data());
147 RUNNER_ASSERT_MSG_BT(ret == 0, "Error in smack_accesses_add()");
148 ret = smack_accesses_apply(rules.get());
149 RUNNER_ASSERT_MSG_BT(ret == 0, "Error in smack_accesses_apply()");
153 for (size_t i = 0 ; i < g_threadsNumber; ++i)
154 threadsVector.push_back(std::thread(cookie_api_thread_function, isSmack));
156 //waiting for threads end
157 for (auto itr = threadsVector.begin(); itr != threadsVector.end(); ++itr)
162 RUNNER_TEST_GROUP_INIT(stress_tests)
164 RUNNER_CHILD_TEST_SMACK(tc_stress_cookie_api_smack)
168 RUNNER_ASSERT_MSG_BT(g_successes == g_threadsNumber,
169 "Not all threads exit with success: "
170 << g_successes << "/ " << g_threadsNumber
171 << std::endl << "Errors:" << std::endl << g_errors);
174 RUNNER_CHILD_TEST_NOSMACK(tc_stress_cookie_api_no_smack)
178 RUNNER_ASSERT_MSG_BT(g_successes == g_threadsNumber,
179 "Not all threads exit with success: "
180 << g_successes << "/ " << g_threadsNumber
181 << std::endl << "Errors:" << std::endl << g_errors);
186 int main (int argc, char *argv[])
188 SummaryCollector::Register();
189 return DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);