add essential action test
authorYoungjae Shin <yj99.shin@samsung.com>
Fri, 14 Feb 2020 00:46:46 +0000 (09:46 +0900)
committerYoungjae Shin <yj99.shin@samsung.com>
Thu, 19 Mar 2020 04:30:37 +0000 (13:30 +0900)
app/AppActionLaunch.cpp
app/AppActionLaunch.h
packaging/modes-plugins.spec
unittests/mdsp_test_app.cpp
unittests/mode/tizen_appLaunch_mode.xml [new file with mode: 0644]
wifi/tizen_wifi_rule.xml

index e3f084808b9bfb3c591170c901e0cc26bdaefb95..14822bf0fd5066e6feec91fc12166f0c045715ad 100644 (file)
@@ -16,6 +16,7 @@
 #include "AppActionLaunch.h"
 
 #include <algorithm>
+#include <aul.h>
 #include <app_control.h>
 #include <app_manager.h>
 #include <app_manager_extension.h>
 MODES_NAMESPACE_USE;
 
 const std::string AppActionLaunch::NAME = "launch";
-std::list<std::string> AppActionLaunch::appidList;
 
 AppActionLaunch::AppActionLaunch()
-       : AppAction(NAME)
+       : AppAction(NAME), cb(nullptr), cbData(nullptr)
 {
-}
-
-void AppActionLaunch::appContextStatusCallback(app_context_h app_context, app_context_status_e status, void *user_data)
-{
-       DBG("appContextStatusCallback(status:%d)", status);
-       if (APP_CONTEXT_STATUS_TERMINATED != status)
-               return;
-
-       char *appid = NULL;
-       int ret = app_context_get_app_id(app_context, &appid);
-       if (APP_MANAGER_ERROR_NONE != ret) {
-               ERR("app_context_get_app_id() Fail(%d)", ret);
-               return;
-       }
-
-       appidList.remove(appid);
-
-       free(appid);
-       return;
+       aul_launch_init(NULL, NULL);
 }
 
 int AppActionLaunch::set(const std::string &val)
 {
-       DBG("id(%s)", val.c_str());
-
-       auto found = std::find(appidList.begin(), appidList.end(), val);
-
-       if (found == appidList.end())
-       {
-               bool running;
-               app_manager_is_running(val.c_str(), &running);
-
-               if (running) {
-                       ERR("It's already running before started mode-supervisor daemon");
-                       return MODES_ERROR_CONFLICT;
-               }
-
-               app_control_h service;
-               app_control_create(&service);
-               app_control_set_app_id(service, val.c_str());
-               app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT);
-               app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_SINGLE);
-
-               int ret = app_control_send_launch_request(service, NULL, NULL);
-               if (APP_CONTROL_ERROR_NONE != ret) {
-                       ERR("app_control_send_launch_request() Fail(%s)", get_error_message(ret));
-                       return MODES_ERROR_SYSTEM;
-               }
-               app_control_destroy(service);
-
-               appidList.push_back(val);
-
-               DBG("APP_CONTEXT_EVENT_LAUNCHED(appid : %s) added list\n", val.c_str());
-
-               int err = app_manager_set_app_context_status_cb(AppActionLaunch::appContextStatusCallback, val.c_str(), NULL);
-               if (APP_MANAGER_ERROR_NONE != err) {
-                       ERR("app_manager_set_app_context_status_cb() Fail(%s)", get_error_message(err));
-                       return MODES_ERROR_SYSTEM;
-               }
-
-               appID = val;
+       bool running;
+       app_manager_is_running(val.c_str(), &running);
+       if (running)
+               INFO("It's already running before started mode-supervisor daemon");
+
+       app_control_h service;
+       app_control_create(&service);
+       app_control_set_app_id(service, val.c_str());
+       app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT);
+       app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_SINGLE);
+
+       int ret = app_control_send_launch_request(service, nullptr, nullptr);
+       if (APP_CONTROL_ERROR_NONE != ret) {
+               ERR("app_control_send_launch_request() Fail(%s)", get_error_message(ret));
+               return MODES_ERROR_SYSTEM;
        }
+       app_control_destroy(service);
 
-       return MODES_ERROR_NONE;
-}
+       appID = val;
 
-int AppActionLaunch::get(std::string *val)
-{
-       if(val)
-               *val = appID;
        return MODES_ERROR_NONE;
 }
 
@@ -114,13 +69,7 @@ void AppActionLaunch::undo()
                return;
        }
 
-       int ret = app_manager_unset_app_context_status_cb(appContextStatusCallback, appID.c_str());
-       if (APP_MANAGER_ERROR_NONE != ret)
-               ERR("app_manager_unset_app_context_status_cb() Fail(%s)", get_error_message(ret));
-
-       appidList.remove(appID);
-
-       ret = app_manager_get_app_context(appID.c_str(), &runAppContext);
+       int ret = app_manager_get_app_context(appID.c_str(), &runAppContext);
        if (APP_MANAGER_ERROR_NONE != ret) {
                ERR("app_manager_get_app_context(%s) Fail(%s)", appID.c_str(), get_error_message(ret));
                return;
@@ -140,3 +89,49 @@ int AppActionLaunch::parse(const std::string &archive)
        appID = archive;
        return MODES_ERROR_NONE;
 }
+
+int AppActionLaunch::setChangedCallback(valueChangedCB callback, void *userData)
+{
+       RETV_IF(nullptr == callback, MODES_ERROR_INVALID_PARAMETER);
+
+       int err = app_manager_set_app_context_status_cb(appContextStatusCB, appID.c_str(), this);
+       if (APP_MANAGER_ERROR_NONE != err) {
+               ERR("app_manager_set_app_context_status_cb() Fail(%s)", get_error_message(err));
+               return MODES_ERROR_SYSTEM;
+       }
+
+       cb = callback;
+       cbData = userData;
+
+       return MODES_ERROR_NONE;
+}
+
+void AppActionLaunch::unSetChangedCallback(valueChangedCB callback, void *userData)
+{
+       int ret = app_manager_unset_app_context_status_cb(appContextStatusCB, appID.c_str());
+       if (APP_MANAGER_ERROR_NONE != ret)
+               ERR("app_manager_unset_app_context_status_cb() Fail(%s)", get_error_message(ret));
+
+       cb = nullptr;
+       cbData = nullptr;
+}
+
+void AppActionLaunch::appContextStatusCB(app_context_h app_context, app_context_status_e status, void *userData)
+{
+       RET_IF(nullptr == userData);
+       RET_IF(APP_CONTEXT_STATUS_TERMINATED != status);
+
+       char *appid = nullptr;
+       int ret = app_context_get_app_id(app_context, &appid);
+       if (APP_MANAGER_ERROR_NONE != ret) {
+               ERR("app_context_get_app_id() Fail(%d)", ret);
+               return;
+       }
+
+       AppActionLaunch *action = (AppActionLaunch*)userData;
+       if (appid == action->appID && action->cb)
+               action->cb(action->cbData);
+
+       free(appid);
+       return;
+}
index 752be406d5ad9ef5af7a00e61253c0f04d859607..ae70d2a891579ad24e3531f561b3515a8f456f96 100644 (file)
@@ -29,14 +29,16 @@ public:
        AppActionLaunch();
 
        int set(const std::string &val) override;
-       int get(std::string *val) override;
        void undo() override;
        std::string serialize() override;
        int parse(const std::string &data) override;
-       static void appContextStatusCallback(app_context_h app_context, app_context_status_e status, void *user_data);
+       int setChangedCallback(valueChangedCB callback, void *userData) override;
+       void unSetChangedCallback(valueChangedCB callback, void *userData) override;
 private:
+       static void appContextStatusCB(app_context_h app_context, app_context_status_e status, void *user_data);
        std::string appID;
-       static std::list<std::string> appidList;
+       valueChangedCB cb;
+       void *cbData;
 };
 
 MODES_NAMESPACE_END
index aa39960280d084361f16e33d26410bcade7325ce..efd45bc8a81e383011d0a7f0d21f46e27d80e6a8 100644 (file)
@@ -11,6 +11,7 @@ Source1001: %{name}.manifest
 
 BuildRequires: cmake
 BuildRequires: modes-plugin-devel
+BuildRequires: pkgconfig(modes)
 BuildRequires: pkgconfig(dlog)
 BuildRequires: pkgconfig(capi-appfw-application)
 BuildRequires: pkgconfig(capi-appfw-app-manager)
@@ -74,6 +75,7 @@ make %{?_smp_mflags}
 
 %check
 xmllint --noout --schema %{modes_ro_dir}/schema/tizen_action_rule.xsd %{buildroot}%{modes_ro_dir}/rule/tizen_*_rule.xml
+xmllint --noout --schema %{modes_ro_dir}/schema/tizen_mode.xsd %{buildroot}%{modes_ro_dir}/mode/tizen_*_mode.xml
 
 %post
 /sbin/ldconfig
index 0da1b0943fa225a8b7d39acc28d41ae986431cdc..3801df9b65190541b162a709df8ed9213a0a3d9f 100644 (file)
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <glib.h>
+#include <iostream>
 #include <string>
+
 #include <gtest/gtest.h>
+#include <glib.h>
+#include <aul.h>
 #include <Plugin.h>
 #include <modes_errors.h>
 #include <app_manager.h>
@@ -43,62 +46,77 @@ protected:
                plugin = NULL;
        }
 
-       static gboolean appPluginUndoConflictIdler(gpointer data)
+       static gboolean appUndoTimeout(gpointer data)
+       {
+               PluginAction *action = (PluginAction*)data;
+               plugin->undo(action);
+               g_main_loop_quit(loop);
+               return false;
+       }
+
+       static gboolean checkSetUndoIdler(gpointer data)
        {
                PluginAction *action;
-               result = plugin->set("launch", std::string("org.tizen.net-popup"), &action);
+               result = plugin->set("launch", std::string(testApp), &action);
                EXPECT_EQ(MODES_ERROR_NONE, result);
 
-               app_context_h runAppContext = NULL;
-               app_manager_get_app_context("org.tizen.net-popup", &runAppContext);
-               app_manager_terminate_app(runAppContext);
-               plugin->undo(action);
-               g_main_loop_quit(loop);
+               if (MODES_ERROR_NONE == result)
+                       g_timeout_add(1000, appUndoTimeout, action);
+               else
+                       g_main_loop_quit(loop);
 
                return G_SOURCE_REMOVE;
        }
 
-       static gboolean appPluginSetUndoTimeout(gpointer data)
+       static void changedCB(void *userData)
        {
-               PluginAction *action = (PluginAction*)data;
-               plugin->undo(action);
-               g_main_loop_quit(loop);
-               return false;
+               const char *appName = (char*)userData;
+               std::cout << appName << "is terminated" << std::endl;
        }
 
-       static gboolean appPluginSetUndoIdler(gpointer data)
+       static gboolean checkChangedCBIdler(gpointer data)
        {
                PluginAction *action;
-               result = plugin->set("launch", std::string("org.tizen.net-popup"), &action);
+               result = plugin->set("launch", std::string(testApp), &action);
                EXPECT_EQ(MODES_ERROR_NONE, result);
 
+               int ret = action->setChangedCallback(changedCB, (void*)testApp);
+               EXPECT_EQ(MODES_ERROR_NONE, ret);
+
+               app_context_h runAppContext = NULL;
+               app_manager_get_app_context(testApp, &runAppContext);
+               app_manager_terminate_app(runAppContext);
+
                if (MODES_ERROR_NONE == result)
-                       g_timeout_add(1000, appPluginSetUndoTimeout, action);
+                       g_timeout_add(3000, appUndoTimeout, action);
                else
                        g_main_loop_quit(loop);
 
                return G_SOURCE_REMOVE;
        }
 
+       static const char *testApp;
        static int result;
        static GMainLoop *loop;
        static GThread *my_thread;
        static Plugin *plugin;
 };
 
+const char *AppPluginTest::testApp = "org.tizen.setting";
 int AppPluginTest::result = 0;
 Plugin *AppPluginTest::plugin = NULL;
 GMainLoop *AppPluginTest::loop = NULL;
 
-TEST_F(AppPluginTest, setUndoPluginApp)
+TEST_F(AppPluginTest, CheckSetUndo)
 {
-       g_idle_add(appPluginSetUndoIdler, plugin);
+       g_idle_add(checkSetUndoIdler, plugin);
        g_main_loop_run(loop);
 }
 
-TEST_F(AppPluginTest, undoConflictPluginApp)
+TEST_F(AppPluginTest, checkChangedCB)
 {
-       g_idle_add(appPluginUndoConflictIdler, nullptr);
+       sleep(3);
+       g_idle_add(checkChangedCBIdler, nullptr);
        g_main_loop_run(loop);
 }
 
diff --git a/unittests/mode/tizen_appLaunch_mode.xml b/unittests/mode/tizen_appLaunch_mode.xml
new file mode 100644 (file)
index 0000000..f286dac
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<tizenModes xmlns="http://www.tizen.org" version="6.0">
+  <mode name="EssentialCheck" type="normal">
+    <action rule="app.launch" restrict="essential">org.tizen.modesupervisor</action>
+    <action rule="wifi.power">off</action>
+    <action rule="bluetooth.power">off</action>
+  </mode>
+</tizenModes>
index a91085509f2b02cf59a1b54200082655cfa9fd9b..5285a6be360d8b4381e23c1fc29463bc0477232b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <tizenModes xmlns="http://www.tizen.org" version="6.0">
   <actionRule>
-    <rule name="wifi.power" type="bool" since="6.0" plugin="wifi-manager">
+    <rule name="wifi.power" type="bool" since="6.0" plugin="wifi">
       <alias name="on">1</alias>
       <alias name="off">0</alias>
       <desc>wifi On/Off</desc>