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 //TODO: Clean up if BOOST_REQUIRE_EQUAL fail (remove client). Same in other client tests.
162 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
164 BOOST_CHECK_EQUAL(getArrayStringLength(keys, EXPECTED_DBUSES_STARTED.size() + 1u),
165 EXPECTED_DBUSES_STARTED.size());
166 BOOST_CHECK_EQUAL(getArrayStringLength(values, EXPECTED_DBUSES_STARTED.size() + 1u),
167 EXPECTED_DBUSES_STARTED.size());
169 std::map<std::string, std::string> zones;
170 convertDictToMap(keys, values, zones);
171 BOOST_CHECK(zones == EXPECTED_DBUSES_STARTED);
172 vsm_array_string_free(keys);
173 vsm_array_string_free(values);
174 vsm_client_free(client);
177 BOOST_AUTO_TEST_CASE(GetZoneIdsTest)
179 VsmClient client = vsm_client_create();
180 VsmStatus status = vsm_connect(client);
181 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
182 VsmArrayString values;
183 status = vsm_get_zone_ids(client, &values);
184 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
185 BOOST_CHECK_EQUAL(getArrayStringLength(values, EXPECTED_DBUSES_STARTED.size() + 1u),
186 EXPECTED_DBUSES_STARTED.size());
188 std::set<std::string> zones;
189 convertArrayToSet(values, zones);
191 for (const auto& zone : zones) {
192 BOOST_CHECK(EXPECTED_DBUSES_STARTED.find(zone) != EXPECTED_DBUSES_STARTED.cend());
194 vsm_array_string_free(values);
195 vsm_client_free(client);
198 BOOST_AUTO_TEST_CASE(GetActiveZoneIdTest)
200 VsmClient client = vsm_client_create();
201 VsmStatus status = vsm_connect(client);
202 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
204 status = vsm_get_active_zone_id(client, &zone);
205 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
207 BOOST_CHECK_EQUAL(zone, cm.getRunningForegroundZoneId());
209 vsm_string_free(zone);
210 vsm_client_free(client);
213 BOOST_AUTO_TEST_CASE(SetActiveZoneTest)
215 const std::string newActiveZoneId = "ut-zones-manager-console2-dbus";
217 BOOST_REQUIRE_NE(newActiveZoneId, cm.getRunningForegroundZoneId());
219 VsmClient client = vsm_client_create();
220 VsmStatus status = vsm_connect(client);
221 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
222 status = vsm_set_active_zone(client, newActiveZoneId.c_str());
223 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
224 BOOST_CHECK_EQUAL(newActiveZoneId, cm.getRunningForegroundZoneId());
225 vsm_client_free(client);
228 BOOST_AUTO_TEST_CASE(CreateZoneTest)
230 const std::string newActiveZoneId = "";
232 VsmClient client = vsm_client_create();
233 VsmStatus status = vsm_connect(client);
234 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
235 status = vsm_create_zone(client, newActiveZoneId.c_str(), NULL);
236 BOOST_REQUIRE_EQUAL(VSMCLIENT_CUSTOM_ERROR, status);
237 vsm_client_free(client);
240 BOOST_AUTO_TEST_CASE(StartShutdownZoneTest)
242 const std::string newActiveZoneId = "ut-zones-manager-console1-dbus";
244 VsmClient client = vsm_client_create();
245 VsmStatus status = vsm_connect(client);
246 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
247 status = vsm_shutdown_zone(client, newActiveZoneId.c_str());
248 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
249 status = vsm_start_zone(client, newActiveZoneId.c_str());
250 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
251 vsm_client_free(client);
254 BOOST_AUTO_TEST_CASE(LockUnlockZoneTest)
256 const std::string newActiveZoneId = "ut-zones-manager-console2-dbus";
258 VsmClient client = vsm_client_create();
259 VsmStatus status = vsm_connect(client);
260 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
261 status = vsm_lock_zone(client, newActiveZoneId.c_str());
262 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
263 status = vsm_unlock_zone(client, newActiveZoneId.c_str());
264 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
265 vsm_client_free(client);
268 BOOST_AUTO_TEST_CASE(FileMoveRequestTest)
270 const std::string path = "/tmp/fake_path";
271 const std::string secondZone = "fake_zone";
273 VsmClient client = vsm_client_create();
274 VsmStatus status = vsm_connect_custom(client, EXPECTED_DBUSES_STARTED.begin()->second.c_str());
275 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
276 status = vsm_file_move_request(client, secondZone.c_str(), path.c_str());
277 BOOST_REQUIRE_EQUAL(VSMCLIENT_CUSTOM_ERROR, status);
278 BOOST_REQUIRE_EQUAL(api::zone::FILE_MOVE_DESTINATION_NOT_FOUND,
279 vsm_get_status_message(client));
280 vsm_client_free(client);
283 BOOST_AUTO_TEST_CASE(NotificationTest)
285 const std::string MSG_CONTENT = "msg";
286 const std::string MSG_APP = "app";
288 struct CallbackData {
289 Latch signalReceivedLatch;
290 std::vector< std::tuple<std::string, std::string, std::string> > receivedSignalMsg;
293 auto callback = [](const char* zone,
294 const char* application,
297 CallbackData& callbackData = *reinterpret_cast<CallbackData*>(data);
298 callbackData.receivedSignalMsg.push_back(std::make_tuple(zone, application, message));
299 callbackData.signalReceivedLatch.set();
302 CallbackData callbackData;
303 std::map<std::string, VsmClient> clients;
304 for (const auto& it : EXPECTED_DBUSES_STARTED) {
305 VsmClient client = vsm_client_create();
306 VsmStatus status = vsm_connect_custom(client, it.second.c_str());
307 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
308 clients[it.first] = client;
310 for (auto& client : clients) {
311 VsmStatus status = vsm_add_notification_callback(client.second,
315 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
317 for (auto& client : clients) {
318 VsmStatus status = vsm_notify_active_zone(client.second,
320 MSG_CONTENT.c_str());
321 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
324 BOOST_CHECK(callbackData.signalReceivedLatch.waitForN(clients.size() - 1u, EVENT_TIMEOUT));
325 BOOST_CHECK(callbackData.signalReceivedLatch.empty());
327 for (const auto& msg : callbackData.receivedSignalMsg) {
328 BOOST_CHECK(clients.count(std::get<0>(msg)) > 0);
329 BOOST_CHECK_EQUAL(std::get<1>(msg), MSG_APP);
330 BOOST_CHECK_EQUAL(std::get<2>(msg), MSG_CONTENT);
333 for (auto& client : clients) {
334 vsm_client_free(client.second);
338 BOOST_AUTO_TEST_CASE(GetZoneIdByPidTest1)
340 VsmClient client = vsm_client_create();
342 VsmStatus status = vsm_lookup_zone_by_pid(client, 1, &zone);
343 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
345 BOOST_CHECK_EQUAL(zone, std::string("host"));
347 vsm_string_free(zone);
348 vsm_client_free(client);
351 BOOST_AUTO_TEST_CASE(GetZoneIdByPidTest2)
353 std::set<std::string> ids;
355 VsmClient client = vsm_client_create();
356 for (int n = 0; n < 100000; ++n) {
358 VsmStatus status = vsm_lookup_zone_by_pid(client, n, &zone);
359 if (status == VSMCLIENT_SUCCESS) {
361 vsm_string_free(zone);
363 BOOST_WARN_MESSAGE(status == VSMCLIENT_INVALID_ARGUMENT, vsm_get_status_message(client));
366 vsm_client_free(client);
368 BOOST_CHECK(ids.count("host") == 1);
370 for (const auto& dbus : EXPECTED_DBUSES_STARTED) {
371 BOOST_CHECK(ids.count(dbus.first) == 1);
375 BOOST_AUTO_TEST_CASE(GrantRevokeTest)
377 const std::string zoneId = "ut-zones-manager-console2-dbus";
378 const std::string dev = "tty3";
380 VsmClient client = vsm_client_create();
381 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, vsm_connect(client));
383 BOOST_CHECK_EQUAL(VSMCLIENT_SUCCESS, vsm_grant_device(client, zoneId.c_str(), dev.c_str(), 0));
384 BOOST_CHECK_EQUAL(VSMCLIENT_SUCCESS, vsm_revoke_device(client, zoneId.c_str(), dev.c_str()));
386 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, vsm_lock_zone(client, zoneId.c_str()));
387 BOOST_CHECK_EQUAL(VSMCLIENT_SUCCESS, vsm_grant_device(client, zoneId.c_str(), dev.c_str(), 0));
388 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, vsm_unlock_zone(client, zoneId.c_str()));
390 BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, vsm_shutdown_zone(client, zoneId.c_str()));
391 BOOST_CHECK_EQUAL(VSMCLIENT_CUSTOM_ERROR, vsm_grant_device(client, zoneId.c_str(), dev.c_str(), 0));
392 BOOST_CHECK_EQUAL(VSMCLIENT_CUSTOM_ERROR, vsm_revoke_device(client, zoneId.c_str(), dev.c_str()));
394 vsm_client_free(client);
397 BOOST_AUTO_TEST_SUITE_END()