2 * Samsung Ukraine R&D Center (SRK under a contract between)
3 * LLC "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
4 * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
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
18 #include <gmock/gmock.h>
19 #include <gtest/gtest.h>
23 #include <jsoncpp/json/reader.h>
24 #include <jsoncpp/json/writer.h>
25 #include "dbuslistener.h"
26 #include "dbushandler.h"
27 #include "uninstallhandler.h"
29 #include "dbus_mock.h"
30 #include "device_policy_manager_mock.h"
34 using ::testing::StrEq;
35 using ::testing::Return;
36 using ::testing::DoAll;
37 using ::testing::Invoke;
41 const std::string APP_ID = "org.example.photostealware";
42 const char* TEST_SIGNAL = "{\"type\":\"uninstall_application\",\"data\":{\"app_id\":\"org.example.photostealware\"}}";
43 const char* TEST_SIGNAL_EMPTY_DATA = "{\"type\":\"uninstall_application\"}";
44 const char* TEST_SIGNAL_INCORRECT_APP_ID = "{\"type\":\"uninstall_application\",\"data\":{\"app_id\":0}}";
48 * @brief Test signal when device is locked
50 TEST(TestUninstallHandler, test_process_locked)
52 DBusConnectionMock conn;
54 DBusMessageIterMock iter;
55 EXPECT_CALL(conn, dbus_bus_get(_, _)).WillOnce(Return(&conn));
56 EXPECT_CALL(conn, dbus_bus_request_name(_, _, _)).WillOnce(Return(DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER));
57 EXPECT_CALL(conn, dbus_bus_add_match(_, _)).Times(1);
58 EXPECT_CALL(conn, dbus_connection_flush()).Times(1);
59 EXPECT_CALL(conn, dbus_connection_read_write(_)).WillRepeatedly(Return(true));
60 EXPECT_CALL(conn, dbus_connection_pop_message()).WillOnce(Return(&msg)).WillRepeatedly(Return(nullptr));
61 EXPECT_CALL(conn, dbus_connection_unref()).Times(1);
62 EXPECT_CALL(msg, dbus_message_is_signal(_, _)).WillOnce(Return(true));
63 EXPECT_CALL(msg, dbus_message_iter_init(_)).WillOnce(Return(true));
64 EXPECT_CALL(msg, dbus_message_unref()).Times(1);
65 EXPECT_CALL(iter, dbus_message_iter_get_arg_type()).WillOnce(Return(DBUS_TYPE_STRING));
66 EXPECT_CALL(iter, dbus_message_iter_get_basic(_)).WillOnce(Invoke([](void* value) {*(char**)value = strdup(TEST_SIGNAL);}));
69 dbus::DBusListener listener{[&allowed](){return allowed;}};
70 dbus::UninstallHandler handler{listener};
72 agent::Settings::instance().setLock(true);
74 std::thread t(&dbus::DBusListener::loop, &listener);
75 std::this_thread::sleep_for(std::chrono::milliseconds(100));
79 agent::Settings::instance().setLock(false);
83 * @brief Test signal with empty data
85 TEST(TestUninstallHandler, test_process_empty_data)
87 DBusConnectionMock conn;
89 DBusMessageIterMock iter;
90 EXPECT_CALL(conn, dbus_bus_get(_, _)).WillOnce(Return(&conn));
91 EXPECT_CALL(conn, dbus_bus_request_name(_, _, _)).WillOnce(Return(DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER));
92 EXPECT_CALL(conn, dbus_bus_add_match(_, _)).Times(1);
93 EXPECT_CALL(conn, dbus_connection_flush()).Times(1);
94 EXPECT_CALL(conn, dbus_connection_read_write(_)).WillRepeatedly(Return(true));
95 EXPECT_CALL(conn, dbus_connection_pop_message()).WillOnce(Return(&msg)).WillRepeatedly(Return(nullptr));
96 EXPECT_CALL(conn, dbus_connection_unref()).Times(1);
97 EXPECT_CALL(msg, dbus_message_is_signal(_, _)).WillOnce(Return(true));
98 EXPECT_CALL(msg, dbus_message_iter_init(_)).WillOnce(Return(true));
99 EXPECT_CALL(msg, dbus_message_unref()).Times(1);
100 EXPECT_CALL(iter, dbus_message_iter_get_arg_type()).WillOnce(Return(DBUS_TYPE_STRING));
101 EXPECT_CALL(iter, dbus_message_iter_get_basic(_)).WillOnce(Invoke([](void* value) {*(char**)value = strdup(TEST_SIGNAL_EMPTY_DATA);}));
104 dbus::DBusListener listener{[&allowed](){return allowed;}};
105 dbus::UninstallHandler handler{listener};
107 std::thread t(&dbus::DBusListener::loop, &listener);
108 std::this_thread::sleep_for(std::chrono::milliseconds(100));
114 * @brief Test signal with invalid application id
116 TEST(TestUninstallHandler, test_process_invalid_app_id)
118 DBusConnectionMock conn;
120 DBusMessageIterMock iter;
121 EXPECT_CALL(conn, dbus_bus_get(_, _)).WillOnce(Return(&conn));
122 EXPECT_CALL(conn, dbus_bus_request_name(_, _, _)).WillOnce(Return(DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER));
123 EXPECT_CALL(conn, dbus_bus_add_match(_, _)).Times(1);
124 EXPECT_CALL(conn, dbus_connection_flush()).Times(1);
125 EXPECT_CALL(conn, dbus_connection_read_write(_)).WillRepeatedly(Return(true));
126 EXPECT_CALL(conn, dbus_connection_pop_message()).WillOnce(Return(&msg)).WillRepeatedly(Return(nullptr));
127 EXPECT_CALL(conn, dbus_connection_unref()).Times(1);
128 EXPECT_CALL(msg, dbus_message_is_signal(_, _)).WillOnce(Return(true));
129 EXPECT_CALL(msg, dbus_message_iter_init(_)).WillOnce(Return(true));
130 EXPECT_CALL(msg, dbus_message_unref()).Times(1);
131 EXPECT_CALL(iter, dbus_message_iter_get_arg_type()).WillOnce(Return(DBUS_TYPE_STRING));
132 EXPECT_CALL(iter, dbus_message_iter_get_basic(_)).WillOnce(Invoke([](void* value) {*(char**)value = strdup(TEST_SIGNAL_INCORRECT_APP_ID);}));
135 dbus::DBusListener listener{[&allowed](){return allowed;}};
136 dbus::UninstallHandler handler{listener};
138 std::thread t(&dbus::DBusListener::loop, &listener);
139 std::this_thread::sleep_for(std::chrono::milliseconds(100));
145 * @brief Test signal for normal sequence
147 TEST(TestUninstallHandler, test_process)
149 DBusConnectionMock conn;
151 DBusMessageIterMock iter;
153 EXPECT_CALL(conn, dbus_bus_get(_, _)).WillOnce(Return(&conn));
154 EXPECT_CALL(conn, dbus_bus_request_name(_, _, _)).WillOnce(Return(DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER));
155 EXPECT_CALL(conn, dbus_bus_add_match(_, _)).Times(1);
156 EXPECT_CALL(conn, dbus_connection_flush()).Times(1);
157 EXPECT_CALL(conn, dbus_connection_read_write(_)).WillRepeatedly(Return(true));
158 EXPECT_CALL(conn, dbus_connection_pop_message()).WillOnce(Return(&msg)).WillRepeatedly(Return(nullptr));
159 EXPECT_CALL(conn, dbus_connection_unref()).Times(1);
160 EXPECT_CALL(msg, dbus_message_is_signal(_, _)).WillOnce(Return(true));
161 EXPECT_CALL(msg, dbus_message_iter_init(_)).WillOnce(Return(true));
162 EXPECT_CALL(msg, dbus_message_unref()).Times(1);
163 EXPECT_CALL(iter, dbus_message_iter_get_arg_type()).WillOnce(Return(DBUS_TYPE_STRING));
164 EXPECT_CALL(iter, dbus_message_iter_get_basic(_)).WillOnce(Invoke([](void* value) {*(char**)value = strdup(TEST_SIGNAL);}));
165 EXPECT_CALL(dpm, dpm_manager_create()).WillOnce(Return(&dpm));
166 EXPECT_CALL(dpm, dpm_application_uninstall_package(StrEq(APP_ID))).WillOnce(Return(0));
167 EXPECT_CALL(dpm, dpm_manager_destroy()).Times(1);
170 dbus::DBusListener listener{[&allowed](){return allowed;}};
171 dbus::UninstallHandler handler{listener};
173 std::thread t(&dbus::DBusListener::loop, &listener);
174 std::this_thread::sleep_for(std::chrono::milliseconds(100));