--- /dev/null
+/*
+* Copyright © 2021 Samsung Electronics co., Ltd. All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice (including the next
+* paragraph) shall be included in all copies or substantial portions of the
+* Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*/
+#include "mmi-manager-tests.h"
+extern "C" {
+#include "mmi-manager-dbg.h"
+#include "mmi-provider.h"
+#include "mmi-provider-iface.h"
+}
+
+#include <Ecore.h>
+#include <dirent.h>
+#include <dlfcn.h>
+
+class MMIProviderTest : public ::testing::Test
+{
+public:
+ void SetUp(void) override
+ {
+ ecore_init();
+ }
+
+ void TearDown(void) override
+ {
+ ecore_shutdown();
+ }
+};
+
+TEST_F(MMIProviderTest, MMIProviderInitShutdown)
+{
+ modality_providers_init();
+ EXPECT_NE(MMI_PROVIDER_EVENT_KEY, -1);
+
+ modality_providers_shutdown();
+ EXPECT_EQ(MMI_PROVIDER_EVENT_KEY, -1);
+}
+
+unsigned long long state_caps[MMI_STATE_TERMINATION+1] =
+{
+ //MMI_STATE_NONE
+ MODALITY_PROVIDER_CAP_NONE,
+ //MMI_STATE_INITIATION
+ MODALITY_PROVIDER_CAP_KEY_EVENT |
+ MODALITY_PROVIDER_CAP_VOICE_EVENT |
+ MODALITY_PROVIDER_CAP_GESTURE_EVENT,
+ //MMI_STATE_EXPLORATION
+ MODALITY_PROVIDER_CAP_KEY_EVENT |
+ MODALITY_PROVIDER_CAP_VOICE_EVENT |
+ MODALITY_PROVIDER_CAP_GESTURE_EVENT,
+ //MMI_STATE_EXECUTION
+ MODALITY_PROVIDER_CAP_KEY_EVENT |
+ MODALITY_PROVIDER_CAP_VOICE_EVENT |
+ MODALITY_PROVIDER_CAP_GESTURE_EVENT,
+ //MMI_STATE_FEEDBACK
+ MODALITY_PROVIDER_CAP_KEY_EVENT |
+ MODALITY_PROVIDER_CAP_VOICE_EVENT |
+ MODALITY_PROVIDER_CAP_GESTURE_EVENT,
+ //MMI_STATE_OBSERVATION
+ MODALITY_PROVIDER_CAP_VOICE_EVENT |
+ MODALITY_PROVIDER_CAP_GESTURE_EVENT |
+ MODALITY_PROVIDER_CAP_VISION_EVENT,
+ //MMI_STATE_TERMINATION
+ MODALITY_PROVIDER_CAP_KEY_EVENT |
+ MODALITY_PROVIDER_CAP_VOICE_EVENT |
+ MODALITY_PROVIDER_CAP_GESTURE_EVENT |
+ MODALITY_PROVIDER_CAP_VISION_EVENT
+};
+
+TEST_F(MMIProviderTest, MMIProviderSetOpModeOnCaps)
+{
+ modality_providers_init();
+ EXPECT_NE(MMI_PROVIDER_EVENT_KEY, -1);
+
+ int r = -1;
+ unsigned long long caps = state_caps[MMI_STATE_INITIATION];
+ r = mmi_provider_set_op_mode_on_caps(caps, MODALITY_PROVIDER_MODE_PROPAGATE_EVENT);
+ EXPECT_EQ(r, 0);
+
+ r = mmi_provider_set_op_mode_on_caps(caps, MODALITY_PROVIDER_MODE_NONE);
+ EXPECT_EQ(r, 0);
+
+ modality_providers_shutdown();
+ EXPECT_EQ(MMI_PROVIDER_EVENT_KEY, -1);
+}
+
+TEST_F(MMIProviderTest, MMIProviderSetOpModeOnCapsFail)
+{
+ modality_providers_init();
+ EXPECT_NE(MMI_PROVIDER_EVENT_KEY, -1);
+
+ int r = -1;
+ r = mmi_provider_set_op_mode_on_caps(MODALITY_PROVIDER_CAP_NONE, MODALITY_PROVIDER_MODE_PROPAGATE_EVENT);
+ EXPECT_EQ(r, -1);
+
+ modality_providers_shutdown();
+ EXPECT_EQ(MMI_PROVIDER_EVENT_KEY, -1);
+}
+
+class MMIProviderIfaceTest : public ::testing::Test
+{
+public:
+ void SetUp(void) override
+ {
+ ecore_init();
+ }
+
+ void TearDown(void) override
+ {
+ ecore_shutdown();
+ }
+};
+
+mmi_provider_handle *
+_provider_load_module(const char *provider_name)
+{
+ mmi_provider_handle *provider = (mmi_provider_handle *)calloc(1, sizeof(mmi_provider_handle));
+
+ if (!provider)
+ {
+ LOGE("Failed to alloc provider handle");
+ return NULL;
+ }
+
+ void *provider_info = NULL;
+ mmi_provider_module *mmi_provider_module_info = NULL;
+ mmi_provider_module_data *provider_module_data = NULL;
+
+ provider_info = dlopen(provider_name, RTLD_LAZY);
+
+ if(!provider_info)
+ {
+ LOGE("Failed to dlopen(error :%s, path :%s)!\n", dlerror(), provider_name);
+ goto err;
+ }
+
+ mmi_provider_module_info = (mmi_provider_module *)dlsym(provider_info, "mmi_provider_module_info");
+
+ if(!mmi_provider_module_info)
+ {
+ LOGE("Module(%s) dosen't have mmi_provider_module_info \n", provider_name);
+ goto err;
+ }
+
+ if(!mmi_provider_module_info->provider_init || !mmi_provider_module_info->provider_deinit)
+ {
+ LOGE("Module(%s) doesn't have init/deinit function\n", provider_name);
+ goto err;
+ }
+
+ provider_module_data = mmi_provider_module_info->provider_init();
+
+ if(!provider_module_data)
+ {
+ LOGE("Failed to init module (%s) !\n", provider_name);
+ goto err;
+ }
+
+ LOGI("moudle info name = %s\n", mmi_provider_module_info->name);
+ provider->provider_info = provider_info;
+ provider->module_info = mmi_provider_module_info;
+ provider->module_data = provider_module_data;
+ provider->capabilities = mmi_provider_module_info->capabilities;
+ provider->op_mode = provider_module_data->get_mode();
+
+ return provider;
+
+err:
+ if(mmi_provider_module_info && mmi_provider_module_info->provider_deinit)
+ mmi_provider_module_info->provider_deinit(provider_module_data);
+
+ if(provider_info)
+ dlclose(provider_info);
+
+ if(provider)
+ free(provider);
+ return NULL;
+}
+
+TEST_F(MMIProviderIfaceTest, MMIProviderRegisterCaps)
+{
+ int r = -1;
+
+ mmi_provider_handle *provider = _provider_load_module("/lib/provider/libmmi_modality_keyboard.so");
+ EXPECT_EQ(provider->capabilities, MODALITY_PROVIDER_CAP_KEY_EVENT);
+ EXPECT_NE(provider, nullptr);
+
+ r = mmi_provider_register_caps(provider, MODALITY_PROVIDER_CAP_VOICE_EVENT);
+ EXPECT_EQ(r, 0);
+ EXPECT_EQ(provider->capabilities, (MODALITY_PROVIDER_CAP_KEY_EVENT | MODALITY_PROVIDER_CAP_VOICE_EVENT));
+}
+
+TEST_F(MMIProviderIfaceTest, MMIProviderRegisterCapsFail)
+{
+ int r = -1;
+
+ mmi_provider_handle *provider = _provider_load_module("/lib/provider/libmmi_modality_keyboard.so");
+ EXPECT_EQ(provider->capabilities, MODALITY_PROVIDER_CAP_KEY_EVENT);
+ EXPECT_NE(provider, nullptr);
+
+ r = mmi_provider_register_caps(NULL, MODALITY_PROVIDER_CAP_VOICE_EVENT);
+ EXPECT_EQ(r, -1);
+ r = mmi_provider_register_caps(provider, MODALITY_PROVIDER_CAP_NONE);
+ EXPECT_EQ(r, -1);
+ EXPECT_EQ(provider->capabilities, MODALITY_PROVIDER_CAP_KEY_EVENT);
+}