2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Mateusz Malicki <m.malicki2@samsung.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
22 * @author Mateusz Malicki (m.malicki2@samsung.com)
23 * @brief Unit tests of the client C API
28 #include <vasum-client.h>
30 #include "utils/latch.hpp"
31 #include "utils/scoped-dir.hpp"
32 #include "zones-manager.hpp"
33 #include "zone-dbus-definitions.hpp"
43 using namespace vasum;
44 using namespace vasum::utils;
48 const std::string TEST_DBUS_CONFIG_PATH =
49 VSM_TEST_CONFIG_INSTALL_DIR "/client/ut-client/test-dbus-daemon.conf";
50 const std::string ZONES_PATH = "/tmp/ut-zones"; // the same as in daemon.conf
55 vsm_start_glib_loop();
65 utils::ScopedDir mZonesPathGuard;
66 utils::ScopedDir mRunGuard;
71 : mZonesPathGuard(ZONES_PATH)
72 , mRunGuard("/tmp/ut-run")
73 , cm(TEST_DBUS_CONFIG_PATH)
79 const int EVENT_TIMEOUT = 5000; ///< ms
80 const std::map<std::string, std::string> EXPECTED_DBUSES_STARTED = {
82 "ut-zones-manager-console1-dbus",
83 "unix:path=/tmp/ut-run/ut-zones-manager-console1-dbus/dbus/system_bus_socket"
86 "ut-zones-manager-console2-dbus",
87 "unix:path=/tmp/ut-run/ut-zones-manager-console2-dbus/dbus/system_bus_socket"
90 "ut-zones-manager-console3-dbus",
91 "unix:path=/tmp/ut-run/ut-zones-manager-console3-dbus/dbus/system_bus_socket"
95 void convertDictToMap(VsmArrayString keys,
96 VsmArrayString values,
97 std::map<std::string, std::string>& ret)
100 VsmArrayString iValues;
101 for (iKeys = keys, iValues = values; *iKeys && *iValues; iKeys++, iValues++) {
102 ret.insert(std::make_pair(*iKeys, *iValues));
106 void convertArrayToSet(VsmArrayString values, std::set<std::string>& ret)
108 for (VsmArrayString iValues = values; *iValues; iValues++) {
109 ret.insert(*iValues);
113 int getArrayStringLength(VsmArrayString astring, int max_len = -1)
116 for (i = 0; astring[i]; i++) {
126 // make nice BOOST_*_EQUAL output
127 // (does not work inside anonymous namespace)
128 std::ostream& operator<<(std::ostream& out, VsmStatus status)
131 case VSMCLIENT_CUSTOM_ERROR: return out << "CUSTOM_ERROR";
132 case VSMCLIENT_IO_ERROR: return out << "IO_ERROR";
133 case VSMCLIENT_OPERATION_FAILED: return out << "OPERATION_FAILED";
134 case VSMCLIENT_INVALID_ARGUMENT: return out << "INVALID_ARGUMENT";
135 case VSMCLIENT_OTHER_ERROR: return out << "OTHER_ERROR";
136 case VSMCLIENT_SUCCESS: return out << "SUCCESS";
137 default: return out << "UNKNOWN(" << (int)status << ")";
141 BOOST_FIXTURE_TEST_SUITE(ClientSuite, Fixture)
143 BOOST_AUTO_TEST_CASE(NotRunningServerTest)
147 VsmClient client = vsm_client_create();
148 VsmStatus status = vsm_connect_custom(client,
149 EXPECTED_DBUSES_STARTED.begin()->second.c_str());
150 BOOST_CHECK_EQUAL(VSMCLIENT_IO_ERROR, status);
151 vsm_client_free(client);
154 BOOST_AUTO_TEST_CASE(GetZoneDbusesTest)
156 VsmClient client = vsm_client_create();
157 VsmStatus status = vsm_connect(client);
158 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
159 VsmArrayString keys, values;
160 status = vsm_get_zone_dbuses(client, &keys, &values);
161 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
163 BOOST_CHECK_EQUAL(getArrayStringLength(keys, EXPECTED_DBUSES_STARTED.size() + 1u),
164 EXPECTED_DBUSES_STARTED.size());
165 BOOST_CHECK_EQUAL(getArrayStringLength(values, EXPECTED_DBUSES_STARTED.size() + 1u),
166 EXPECTED_DBUSES_STARTED.size());
168 std::map<std::string, std::string> zones;
169 convertDictToMap(keys, values, zones);
170 BOOST_CHECK(zones == EXPECTED_DBUSES_STARTED);
171 vsm_array_string_free(keys);
172 vsm_array_string_free(values);
173 vsm_client_free(client);
176 BOOST_AUTO_TEST_CASE(GetZoneIdsTest)
178 VsmClient client = vsm_client_create();
179 VsmStatus status = vsm_connect(client);
180 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
181 VsmArrayString values;
182 status = vsm_get_zone_ids(client, &values);
183 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
184 BOOST_CHECK_EQUAL(getArrayStringLength(values, EXPECTED_DBUSES_STARTED.size() + 1u),
185 EXPECTED_DBUSES_STARTED.size());
187 std::set<std::string> zones;
188 convertArrayToSet(values, zones);
190 for (const auto& zone : zones) {
191 BOOST_CHECK(EXPECTED_DBUSES_STARTED.find(zone) != EXPECTED_DBUSES_STARTED.cend());
193 vsm_array_string_free(values);
194 vsm_client_free(client);
197 BOOST_AUTO_TEST_CASE(GetActiveZoneIdTest)
199 VsmClient client = vsm_client_create();
200 VsmStatus status = vsm_connect(client);
201 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
203 status = vsm_get_active_zone_id(client, &zone);
204 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
206 BOOST_CHECK_EQUAL(zone, cm.getRunningForegroundZoneId());
208 vsm_string_free(zone);
209 vsm_client_free(client);
212 BOOST_AUTO_TEST_CASE(SetActiveZoneTest)
214 const std::string newActiveZoneId = "ut-zones-manager-console2-dbus";
216 BOOST_REQUIRE_NE(newActiveZoneId, cm.getRunningForegroundZoneId());
218 VsmClient client = vsm_client_create();
219 VsmStatus status = vsm_connect(client);
220 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
221 status = vsm_set_active_zone(client, newActiveZoneId.c_str());
222 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
223 BOOST_CHECK_EQUAL(newActiveZoneId, cm.getRunningForegroundZoneId());
224 vsm_client_free(client);
227 BOOST_AUTO_TEST_CASE(CreateZoneTest)
229 const std::string newActiveZoneId = "";
231 VsmClient client = vsm_client_create();
232 VsmStatus status = vsm_connect(client);
233 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
234 status = vsm_create_zone(client, newActiveZoneId.c_str(), NULL);
235 BOOST_REQUIRE_EQUAL(VSMCLIENT_CUSTOM_ERROR, status);
236 vsm_client_free(client);
239 BOOST_AUTO_TEST_CASE(StartShutdownZoneTest)
241 const std::string newActiveZoneId = "ut-zones-manager-console1-dbus";
243 VsmClient client = vsm_client_create();
244 VsmStatus status = vsm_connect(client);
245 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
246 status = vsm_shutdown_zone(client, newActiveZoneId.c_str());
247 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
248 status = vsm_start_zone(client, newActiveZoneId.c_str());
249 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
250 vsm_client_free(client);
253 BOOST_AUTO_TEST_CASE(LockUnlockZoneTest)
255 const std::string newActiveZoneId = "ut-zones-manager-console2-dbus";
257 VsmClient client = vsm_client_create();
258 VsmStatus status = vsm_connect(client);
259 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
260 status = vsm_lock_zone(client, newActiveZoneId.c_str());
261 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
262 status = vsm_unlock_zone(client, newActiveZoneId.c_str());
263 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
264 vsm_client_free(client);
267 BOOST_AUTO_TEST_CASE(FileMoveRequestTest)
269 const std::string path = "/tmp/fake_path";
270 const std::string secondZone = "fake_zone";
272 VsmClient client = vsm_client_create();
273 VsmStatus status = vsm_connect_custom(client, EXPECTED_DBUSES_STARTED.begin()->second.c_str());
274 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
275 status = vsm_file_move_request(client, secondZone.c_str(), path.c_str());
276 BOOST_REQUIRE_EQUAL(VSMCLIENT_CUSTOM_ERROR, status);
277 BOOST_REQUIRE_EQUAL(api::zone::FILE_MOVE_DESTINATION_NOT_FOUND,
278 vsm_get_status_message(client));
279 vsm_client_free(client);
282 BOOST_AUTO_TEST_CASE(NotificationTest)
284 const std::string MSG_CONTENT = "msg";
285 const std::string MSG_APP = "app";
287 struct CallbackData {
288 Latch signalReceivedLatch;
289 std::vector< std::tuple<std::string, std::string, std::string> > receivedSignalMsg;
292 auto callback = [](const char* zone,
293 const char* application,
296 CallbackData& callbackData = *reinterpret_cast<CallbackData*>(data);
297 callbackData.receivedSignalMsg.push_back(std::make_tuple(zone, application, message));
298 callbackData.signalReceivedLatch.set();
301 CallbackData callbackData;
302 std::map<std::string, VsmClient> clients;
303 for (const auto& it : EXPECTED_DBUSES_STARTED) {
304 VsmClient client = vsm_client_create();
305 VsmStatus status = vsm_connect_custom(client, it.second.c_str());
306 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
307 clients[it.first] = client;
309 for (auto& client : clients) {
310 VsmStatus status = vsm_add_notification_callback(client.second,
314 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
316 for (auto& client : clients) {
317 VsmStatus status = vsm_notify_active_zone(client.second,
319 MSG_CONTENT.c_str());
320 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
323 BOOST_CHECK(callbackData.signalReceivedLatch.waitForN(clients.size() - 1u, EVENT_TIMEOUT));
324 BOOST_CHECK(callbackData.signalReceivedLatch.empty());
326 for (const auto& msg : callbackData.receivedSignalMsg) {
327 BOOST_CHECK(clients.count(std::get<0>(msg)) > 0);
328 BOOST_CHECK_EQUAL(std::get<1>(msg), MSG_APP);
329 BOOST_CHECK_EQUAL(std::get<2>(msg), MSG_CONTENT);
332 for (auto& client : clients) {
333 vsm_client_free(client.second);
337 BOOST_AUTO_TEST_CASE(GetZoneIdByPidTest1)
339 VsmClient client = vsm_client_create();
341 VsmStatus status = vsm_lookup_zone_by_pid(client, 1, &zone);
342 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
344 BOOST_CHECK_EQUAL(zone, std::string("host"));
346 vsm_string_free(zone);
347 vsm_client_free(client);
350 BOOST_AUTO_TEST_CASE(GetZoneIdByPidTest2)
352 std::set<std::string> ids;
354 VsmClient client = vsm_client_create();
355 for (int n = 0; n < 100000; ++n) {
357 VsmStatus status = vsm_lookup_zone_by_pid(client, n, &zone);
358 if (status == VSMCLIENT_SUCCESS) {
360 vsm_string_free(zone);
362 BOOST_WARN_MESSAGE(status == VSMCLIENT_INVALID_ARGUMENT, vsm_get_status_message(client));
365 vsm_client_free(client);
367 BOOST_CHECK(ids.count("host") == 1);
369 for (const auto& dbus : EXPECTED_DBUSES_STARTED) {
370 BOOST_CHECK(ids.count(dbus.first) == 1);
374 BOOST_AUTO_TEST_CASE(GrantRevokeTest)
376 const std::string zoneId = "ut-zones-manager-console2-dbus";
377 const std::string dev = "tty3";
379 VsmClient client = vsm_client_create();
380 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, vsm_connect(client));
382 BOOST_CHECK_EQUAL(VSMCLIENT_SUCCESS, vsm_grant_device(client, zoneId.c_str(), dev.c_str(), 0));
383 BOOST_CHECK_EQUAL(VSMCLIENT_SUCCESS, vsm_revoke_device(client, zoneId.c_str(), dev.c_str()));
385 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, vsm_lock_zone(client, zoneId.c_str()));
386 BOOST_CHECK_EQUAL(VSMCLIENT_SUCCESS, vsm_grant_device(client, zoneId.c_str(), dev.c_str(), 0));
387 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, vsm_unlock_zone(client, zoneId.c_str()));
389 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, vsm_shutdown_zone(client, zoneId.c_str()));
390 BOOST_CHECK_EQUAL(VSMCLIENT_CUSTOM_ERROR, vsm_grant_device(client, zoneId.c_str(), dev.c_str(), 0));
391 BOOST_CHECK_EQUAL(VSMCLIENT_CUSTOM_ERROR, vsm_revoke_device(client, zoneId.c_str(), dev.c_str()));
393 vsm_client_free(client);
396 BOOST_AUTO_TEST_SUITE_END()