2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <gtest/gtest.h>
19 #include <gmock/gmock.h>
20 #include <bundle_cpp.h>
21 #include <bundle_internal.h>
26 #include "widget_app.h"
27 #include "widget_app_efl.h"
28 #include "unit_tests/mock/gio_mock.h"
29 #include "unit_tests/mock/ecore_wl2_mock.h"
30 #include "unit_tests/mock/system_info_mock.h"
31 #include "unit_tests/mock/appcore_multiwindow_base_mock.h"
32 #include "unit_tests/mock/app_common_mock.h"
33 #include "unit_tests/mock/elm_mock.h"
34 #include "unit_tests/mock/aul_mock.h"
35 #include "unit_tests/mock/test_fixture.h"
38 using ::testing::DoAll;
39 using ::testing::Return;
40 using ::testing::SetArgPointee;
41 using ::testing::Invoke;
43 typedef struct _widget_base_instance_data {
51 char* pending_content;
53 } widget_base_instance_data;
55 class Mocks : public ::testing::NiceMock<GioMock>,
56 public ::testing::NiceMock<MultiWindowBaseMock>,
57 public ::testing::NiceMock<AppCommonMock>,
58 public ::testing::NiceMock<ElmMock>,
59 public ::testing::NiceMock<AulMock>,
60 public ::testing::NiceMock<SystemInfoMock>,
61 public ::testing::NiceMock<EcoreWl2Mock> {};
63 class WidgetAppTest : public TestFixture {
65 WidgetAppTest() : TestFixture(std::make_unique<Mocks>()) {}
66 virtual ~WidgetAppTest() {}
68 virtual void SetUp() {
71 virtual void TearDown() {
75 int __instance_create_cb(widget_context_h context, bundle* content,
76 int w, int h, void* user_data) {
80 int __instance_destroy_cb(widget_context_h context,
81 widget_app_destroy_type_e reason, bundle* content, void* user_data) {
85 int __instance_pause_cb(widget_context_h context, void* user_data) {
89 int __instance_resume_cb(widget_context_h context, void* user_data) {
93 int __instance_resize_cb(widget_context_h context,
94 int w, int h, void* user_data) {
98 int __instance_update_cb(widget_context_h context,
99 bundle* content, int force, void* user_data) {
103 widget_class_h __app_create_cb(void* user_data) {
107 void __app_terminate_cb(void* user_data) {
110 int __app_get_id_fake(char** id) {
111 *id = strdup("test");
115 int __aul_app_get_pkgid_bypid_fake(int pid, char* pkgid, int len) {
116 snprintf(pkgid, 10, "%s", "test");
120 struct instance_data {
126 void* __appcore_multiwindow_base_instance_get_extra_fake(
127 appcore_multiwindow_base_instance_h handle) {
128 widget_base_instance_data* data = (widget_base_instance_data*)
129 calloc(1, sizeof(widget_base_instance_data));
130 data->args = bundle_create();
131 bundle_add_str(data->args, "__AUL_WIDGET_ID__", "test");
132 bundle_add_str(data->args, "__WIDGET_OP__", "optest");
133 bundle_add_str(data->args, "__WIDGET_WIDTH__", "320");
134 bundle_add_str(data->args, "__WIDGET_HEIGHT__", "320");
135 data->pending_content = strdup("test");
136 data->content = strdup("test");
137 data->id = strdup("id");
138 data->user_data = calloc(1, sizeof (struct instance_data));
143 const char* __appcore_multiwindow_base_instance_get_id_fake(
144 appcore_multiwindow_base_instance_h handle) {
145 return strdup("test");
148 const char* __appcore_multiwindow_base_instance_get_class_id_fake(
149 appcore_multiwindow_base_instance_h context) {
150 return strdup("test");
153 appcore_multiwindow_base_class __cls;
154 void __appcore_multiwindow_base_class_add_fake(
155 appcore_multiwindow_base_class cls) {
157 cls.create(nullptr, nullptr);
158 cls.terminate(nullptr, nullptr);
159 cls.pause((appcore_multiwindow_base_instance_h)
160 calloc(1, sizeof(char)), nullptr);
161 cls.resume((appcore_multiwindow_base_instance_h)
162 calloc(1, sizeof(char)), nullptr);
165 int __appcore_multiwindow_base_init_fake(appcore_multiwindow_base_ops ops,
166 int argc, char** argv, void* data) {
167 tizen_base::Bundle b;
169 b.Add("__WIDGET_WIDTH__", "320");
170 b.Add("__WIDGET_HEIGHT__", "320");
171 b.Add("__AUL_WIDGET_INSTANCE_ID__", "instance_id");
172 b.Add("__AUL_WIDGET_ID__", "test");
173 b.Add("__WIDGET_OP__", "create");
174 ops.base.control(b.GetHandle(), nullptr);
176 b.Delete("__WIDGET_OP__");
177 b.Add("__WIDGET_OP__", "resize");
178 ops.base.control(b.GetHandle(), nullptr);
180 b.Delete("__WIDGET_OP__");
181 b.Add("__WIDGET_OP__", "update");
182 ops.base.control(b.GetHandle(), nullptr);
184 b.Delete("__WIDGET_OP__");
185 b.Add("__WIDGET_OP__", "destroy");
186 ops.base.control(b.GetHandle(), nullptr);
188 b.Delete("__WIDGET_OP__");
189 b.Add("__WIDGET_OP__", "resume");
190 ops.base.control(b.GetHandle(), nullptr);
192 b.Delete("__WIDGET_OP__");
193 b.Add("__WIDGET_OP__", "pause");
194 ops.base.control(b.GetHandle(), nullptr);
196 b.Delete("__WIDGET_OP__");
197 b.Add("__WIDGET_OP__", "terminate");
198 ops.base.control(b.GetHandle(), nullptr);
200 b.Delete("__WIDGET_OP__");
201 b.Add("__WIDGET_OP__", "period");
202 ops.base.control(b.GetHandle(), nullptr);
204 ops.base.create(nullptr);
205 ops.base.terminate(nullptr);
210 TEST_F(WidgetAppTest, widget_app_main) {
211 tizen_base::Bundle b;
212 b.Add("__AUL_WIDGET_VIEWER__", "test");
213 int ret = bundle_add_str(b.GetHandle(), "KEY", "VALUE");
214 ASSERT_EQ(ret, BUNDLE_ERROR_NONE);
216 char** argv = nullptr;
217 int argc = bundle_export_to_argv(b.GetHandle(), &argv);
218 ASSERT_EQ(get_last_result(), BUNDLE_ERROR_NONE);
219 ASSERT_NE(argv, nullptr);
222 widget_app_lifecycle_callback_s callback;
223 callback.create = __app_create_cb;
224 callback.terminate = __app_terminate_cb;
226 EXPECT_CALL(GetMock<EcoreWl2Mock>(), ecore_wl2_display_disconnect(_)).
229 EXPECT_CALL(GetMock<EcoreWl2Mock>(), ecore_wl2_shutdown()).
232 EXPECT_CALL(GetMock<SystemInfoMock>(),
233 system_info_get_platform_bool(_, _)).
235 SetArgPointee<1>(true),
238 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
239 appcore_multiwindow_base_init(_, _, _, _)).
240 WillOnce(Invoke(__appcore_multiwindow_base_init_fake));
242 EXPECT_CALL(GetMock<AulMock>(),
243 aul_app_get_pkgid_bypid(_, _, _)).
244 WillOnce(Invoke(__aul_app_get_pkgid_bypid_fake));
246 EXPECT_CALL(GetMock<AppCommonMock>(), app_get_id(_)).
247 WillOnce(Invoke(__app_get_id_fake));
249 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
250 appcore_multiwindow_base_instance_find(_)).
253 (appcore_multiwindow_base_instance_h)calloc(1, sizeof(char))));
255 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
256 appcore_multiwindow_base_instance_get_class(_)).
260 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
261 appcore_multiwindow_base_instance_get_extra(_)).
263 Invoke(__appcore_multiwindow_base_instance_get_extra_fake));
265 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
266 appcore_multiwindow_base_instance_exit(_)).Times(2);
268 ret = widget_app_main(argc, argv, &callback, nullptr);
269 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
272 TEST_F(WidgetAppTest, widget_app_exit) {
273 int ret = widget_app_exit();
274 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
277 TEST_F(WidgetAppTest, widget_app_terminate_context) {
278 widget_context_h context =
279 (widget_context_h)calloc(1, sizeof(widget_context_h));
280 int ret = widget_app_terminate_context(context);
281 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
284 bool __widget_context_cb(widget_context_h context, void *user_data) {
288 TEST_F(WidgetAppTest, widget_app_foreach_context) {
289 int ret = widget_app_foreach_context(__widget_context_cb, nullptr);
290 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
293 void __app_event_cb(app_event_info_h event_info, void *user_data) {
296 TEST_F(WidgetAppTest, widget_app_add_event_handler) {
297 app_event_handler_h handle;
298 EXPECT_CALL(GetMock<SystemInfoMock>(),
299 system_info_get_platform_bool(_, _)).
301 SetArgPointee<1>(true),
303 int ret = widget_app_add_event_handler(&handle, APP_EVENT_LOW_MEMORY,
304 __app_event_cb, nullptr);
305 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
308 TEST_F(WidgetAppTest, widget_app_remove_event_handler) {
309 app_event_handler_h handle;
310 EXPECT_CALL(GetMock<SystemInfoMock>(),
311 system_info_get_platform_bool(_, _)).
312 WillRepeatedly(DoAll(
313 SetArgPointee<1>(true),
315 int ret = widget_app_add_event_handler(&handle, APP_EVENT_LOW_MEMORY,
316 __app_event_cb, nullptr);
317 ret = widget_app_remove_event_handler(handle);
318 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
321 TEST_F(WidgetAppTest, widget_app_get_id) {
322 widget_context_h context =
323 (widget_context_h)calloc(1, sizeof(widget_context_h));
325 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
326 appcore_multiwindow_base_instance_get_id(_)).
327 WillOnce(Return("test"));
329 const char *id = widget_app_get_id(context);
330 EXPECT_STREQ(id, "test");
333 TEST_F(WidgetAppTest, widget_app_class_create) {
334 widget_instance_lifecycle_callback_s lifecycle;
336 lifecycle.create = __instance_create_cb;
337 lifecycle.destroy = __instance_destroy_cb;
338 lifecycle.pause = __instance_pause_cb;
339 lifecycle.resume = __instance_resume_cb;
340 lifecycle.resize = __instance_resize_cb;
341 lifecycle.update = __instance_update_cb;
343 EXPECT_CALL(GetMock<AppCommonMock>(), app_get_id(_)).
344 WillOnce(Invoke(__app_get_id_fake));
346 widget_class_h cls = widget_app_class_create(lifecycle, nullptr);
347 EXPECT_NE(nullptr, cls);
350 TEST_F(WidgetAppTest, widget_app_context_set_tag) {
351 widget_context_h context =
352 (widget_context_h)calloc(1, sizeof(widget_context_h));
354 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
355 appcore_multiwindow_base_instance_get_extra(_)).
356 WillOnce(Invoke(__appcore_multiwindow_base_instance_get_extra_fake));
358 int ret = widget_app_context_set_tag(context, (void*)"test");
359 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
362 TEST_F(WidgetAppTest, widget_app_context_get_tag) {
363 widget_context_h context =
364 (widget_context_h)calloc(1, sizeof(widget_context_h));
366 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
367 appcore_multiwindow_base_instance_get_extra(_)).
368 WillOnce(Invoke(__appcore_multiwindow_base_instance_get_extra_fake));
371 int ret = widget_app_context_get_tag(context, &tag);
372 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
375 TEST_F(WidgetAppTest, widget_app_context_set_content_info) {
376 widget_context_h context =
377 (widget_context_h)calloc(1, sizeof(widget_context_h));
379 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
380 appcore_multiwindow_base_instance_get_extra(_)).
381 WillOnce(Invoke(__appcore_multiwindow_base_instance_get_extra_fake));
383 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
384 appcore_multiwindow_base_instance_get_id(_)).
385 WillOnce(Invoke(__appcore_multiwindow_base_instance_get_id_fake));
387 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
388 appcore_multiwindow_base_instance_get_class_id(_)).
389 WillOnce(Invoke(__appcore_multiwindow_base_instance_get_class_id_fake));
391 bundle* content_info = bundle_create();
392 int ret = widget_app_context_set_content_info(context, content_info);
393 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
396 TEST_F(WidgetAppTest, widget_app_context_set_title) {
397 widget_context_h context =
398 (widget_context_h)calloc(1, sizeof(widget_context_h));
400 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
401 appcore_multiwindow_base_instance_get_extra(_)).
402 WillRepeatedly(Invoke(__appcore_multiwindow_base_instance_get_extra_fake));
404 int ret = widget_app_context_set_title(context, "title");
405 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
408 TEST_F(WidgetAppTest, widget_app_class_add) {
409 widget_instance_lifecycle_callback_s lifecycle;
410 widget_class_h cls = widget_app_class_add(
411 nullptr, "test", lifecycle, nullptr);
413 lifecycle.create = __instance_create_cb;
414 lifecycle.destroy = __instance_destroy_cb;
415 lifecycle.pause = __instance_pause_cb;
416 lifecycle.resume = __instance_resume_cb;
417 lifecycle.resize = __instance_resize_cb;
418 lifecycle.update = __instance_update_cb;
420 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
421 appcore_multiwindow_base_class_add(_)).
422 WillOnce(Invoke(__appcore_multiwindow_base_class_add_fake));
424 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
425 appcore_multiwindow_base_instance_get_extra(_)).
426 WillRepeatedly(Invoke(__appcore_multiwindow_base_instance_get_extra_fake));
428 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
429 appcore_multiwindow_base_instance_get_class_id(_)).
430 WillRepeatedly(Invoke(__appcore_multiwindow_base_instance_get_class_id_fake));
432 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
433 appcore_multiwindow_base_instance_drop(_)).
436 cls = widget_app_class_add(
437 nullptr, "test", lifecycle, nullptr);
438 EXPECT_NE(nullptr, cls);
440 tizen_base::Bundle b;
441 b.Add("__AUL_WIDGET_VIEWER__", "test");
442 int ret = bundle_add_str(b.GetHandle(), "KEY", "VALUE");
443 ASSERT_EQ(ret, BUNDLE_ERROR_NONE);
445 char** argv = nullptr;
446 int argc = bundle_export_to_argv(b.GetHandle(), &argv);
447 ASSERT_EQ(get_last_result(), BUNDLE_ERROR_NONE);
448 ASSERT_NE(argv, nullptr);
451 widget_app_lifecycle_callback_s callback;
452 callback.create = __app_create_cb;
453 callback.terminate = __app_terminate_cb;
455 ret = widget_app_main(argc, argv, &callback, nullptr);
456 EXPECT_EQ(WIDGET_ERROR_NONE, ret);
459 TEST_F(WidgetAppTest, widget_app_get_elm_win_negative) {
461 widget_context_h context =
462 (widget_context_h)calloc(1, sizeof(widget_context_h));
463 int ret = widget_app_get_elm_win(context, &win);
464 EXPECT_EQ(WIDGET_ERROR_FAULT, ret);
467 TEST_F(WidgetAppTest, widget_app_get_elm_win) {
468 EXPECT_CALL(GetMock<ElmMock>(),
469 elm_win_add(_, _, _)).
470 WillOnce(Return((Evas_Object*)calloc(1, sizeof(char))));
472 EXPECT_CALL(GetMock<EcoreWl2Mock>(),
473 ecore_evas_wayland2_window_get(_)).
474 WillOnce(Return((Ecore_Wl2_Window*)calloc(1, sizeof(char))));
476 EXPECT_CALL(GetMock<ElmMock>(),
477 elm_win_aux_hint_add(_, _, _)).
480 EXPECT_CALL(GetMock<EcoreWl2Mock>(),
481 ecore_wl2_window_surface_get(_)).
482 WillOnce(Return(nullptr));
484 EXPECT_CALL(GetMock<EcoreWl2Mock>(),
485 evas_object_event_callback_add(_, _, _, _)).
488 EXPECT_CALL(GetMock<EcoreWl2Mock>(),
489 evas_object_data_set(_, _, _)).
492 EXPECT_CALL(GetMock<MultiWindowBaseMock>(),
493 appcore_multiwindow_base_instance_get_extra(_)).
494 WillRepeatedly(Invoke(__appcore_multiwindow_base_instance_get_extra_fake));
497 widget_context_h context =
498 (widget_context_h)calloc(1, sizeof(widget_context_h));
499 int ret = widget_app_get_elm_win(context, &win);
500 EXPECT_EQ(WIDGET_ERROR_NONE, ret);