rotation: Added initial TC, for available rotations of a window. 90/94290/2
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 28 Oct 2016 04:51:05 +0000 (13:51 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Fri, 28 Oct 2016 05:36:59 +0000 (14:36 +0900)
Major Number: 0500
Brief Description Added TC: Test whether available rotation works fine for a window.

Change-Id: I54a2977f1b4b1fb030b576b09a2f9dcf1fc06b15

src/0500_rotation.c [new file with mode: 0644]
src/0500_rotation.h [new file with mode: 0644]
src/Makefile.am
src/e_test_runner.c
src/e_test_runner.h

diff --git a/src/0500_rotation.c b/src/0500_rotation.c
new file mode 100644 (file)
index 0000000..293b542
--- /dev/null
@@ -0,0 +1,111 @@
+#include "e_test_runner.h"
+
+static Eina_Bool
+_e_tc_rot_win_rotation_test(E_Test_Runner *runner, E_TC_Win *tw, int rot)
+{
+   Eina_Bool res;
+
+   res = e_test_runner_req_zone_rotation_change(runner, rot);
+   if (!res)
+     {
+        ERR("Changing rotaiton is denied.");
+        return EINA_FALSE;
+     }
+
+   res = e_test_runner_ev_wait(runner, E_TC_EVENT_TYPE_WINDOW_ROTATION_CHANGE);
+   if (!res)
+     {
+        ERR("Failed waiting rotation change event");
+        return EINA_FALSE;
+     }
+
+   res = e_test_runner_req_win_info_get(runner, tw);
+   if ((!res) ||
+       (tw->rot != rot))
+     {
+        ERR("Failed to rotate res %d, pass %d, result %d", res, rot, tw->rot);
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+/* @ Brief
+ *  Test whether available rotation works fine for a window.
+ *
+ * @ Test Step:
+ * 1. Creating a Window
+ * 2. Set a available rotation list(0, 90, 180, 270) to window
+ * 3. Request to server for rotation about all available angles.
+ * 4. Verifying a window is rotated.
+ *
+ * @ Expected Result:
+ *   Window should be rotated after accepted request for rotation.
+ */
+ROT_TC_DEFINE(00, available_rots)
+{
+   E_TC_Win *tw;
+   Eina_Bool res;
+   int rot, saved_rot;
+   const int rots[4] = {0, 90, 180, 270};
+
+   /* create window */
+   tw = e_tc_win_add(NULL, ELM_WIN_BASIC,
+                     EINA_FALSE, "Test Window for Rotation",
+                     0, 0, 0, 0, EINA_FALSE,
+                     200, E_TC_WIN_COLOR_BLUE);
+   EINA_SAFETY_ON_NULL_GOTO(tw, end);
+
+   /* set available rotations */
+   elm_win_wm_rotation_available_rotations_set(tw->elm_win, rots, 4);
+
+   /* register window */
+   res = e_test_runner_req_win_register(tc->runner, tw);
+   if (!res)
+     goto err_reg;
+
+   e_tc_win_geom_update(tw);
+   e_tc_win_show(tw);
+   e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_VIS_ON);
+
+   /* Update window info */
+   res = e_test_runner_req_win_info_get(tc->runner, tw);
+   if (!res)
+     {
+        ERR("Failed to get initial window info");
+        goto err_info_get;
+     }
+
+   /* to restore orientation after finishing tc */
+   saved_rot = tw->rot;
+
+   for (rot = ((saved_rot + 90) % 360);
+        rot == saved_rot;
+        rot = ((rot + 90) % 360))
+     {
+        /* hard coded, reverse portrait(180) mode is disabled in mobile */
+        if (rot == 180) continue;
+
+        res = _e_tc_rot_win_rotation_test(tc->runner, tw, rot);
+        if (!res)
+          {
+             ERR("Failed to try to rotate given angle: %d", rot);
+             goto err_tc;
+          }
+     }
+
+   tc->passed = EINA_TRUE;
+
+err_tc:
+   /* restore orientation */
+   res = e_test_runner_req_zone_rotation_change(tc->runner, saved_rot);
+   if (!res)
+     ERR("Failed to restore orientation");
+err_info_get:
+   e_test_runner_req_win_deregister(tc->runner, tw);
+   e_tc_win_hide(tw);
+err_reg:
+   e_tc_win_del(tw);
+end:
+   return tc->passed;
+}
diff --git a/src/0500_rotation.h b/src/0500_rotation.h
new file mode 100644 (file)
index 0000000..20a35c0
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef TC_ROTATION_H
+#define TC_ROTATION_H
+
+#include <Eina.h>
+
+#define  ROT_TC_DEFINE(num, name)   Eina_Bool tc_05##num##_rotation_##name(E_TC *tc)
+
+ROT_TC_DEFINE(00, available_rots);
+
+#endif
index bcf0f7eb7eb8bf145596084bb967a89e34092869..496e7a6afeaa0be8827095000b629d9c51713ed1 100644 (file)
@@ -15,7 +15,8 @@ e_test_runner.h \
 0150_base_operation_multi_wins.c \
 0200_transient_for.c \
 0300_notification.c \
-0400_tzsh.c
+0400_tzsh.c \
+0500_rotation.c
 
 MAINTAINERCLEANFILES = \
 Makefile.in
index 3e558fee401e73ef942f7d24751fbad52dd496b3..283e414a07a3aa41dc1b4ce91f1bd5b8753deb4c 100644 (file)
@@ -1,6 +1,7 @@
 #include "e_test_runner.h"
 
 #define E_TEST_RUNNER_WORK_TIME 3.0
+#define E_TC_SIGN_WIN_INFO  "usiiiiibbbiibbbbbi"
 
 int _log_dom = -1;
 
@@ -81,6 +82,55 @@ _e_test_runner_window_id_get(Evas_Object *elm_win)
    return id;
 }
 
+static void
+_cb_method_win_info_get(void *data,
+                        const Eldbus_Message *msg,
+                        Eldbus_Pending *p EINA_UNUSED)
+{
+   const char *name = NULL, *text = NULL, *wname = NULL;
+   E_TC_Win *tw;
+   Eina_Bool res;
+
+   tw = data;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get
+      (msg,
+       E_TC_SIGN_WIN_INFO,
+       &tw->native_win,
+       &wname,
+       &tw->x, &tw->y, &tw->w, &tw->h,
+       &tw->layer,
+       &tw->effect,
+       &tw->vis.win,
+       &tw->vis.obj,
+       &tw->vis.opaque,
+       &tw->vis.type,
+       &tw->vis.skip,
+       &tw->iconic,
+       &tw->alpha,
+       &tw->focus.win,
+       &tw->focus.obj,
+       &tw->rot);
+
+   if (wname)
+     {
+        if (tw->name)
+          eina_stringshare_del(tw->name);
+        tw->name = eina_stringshare_add(wname);
+     }
+
+finish:
+   if ((name) || (text))
+     {
+        ERR("errname:%s errmsg:%s\n", name, text);
+     }
+
+   elm_exit();
+}
+
 static void
 _cb_method_win_info_list_get(void *data,
                              const Eldbus_Message *msg,
@@ -98,7 +148,7 @@ _cb_method_win_info_list_get(void *data,
    res = eldbus_message_error_get(msg, &name, &text);
    EINA_SAFETY_ON_TRUE_GOTO(res, finish);
 
-   res = eldbus_message_arguments_get(msg, "ua(usiiiiibbbiibbbbb)", &target_win, &array);
+   res = eldbus_message_arguments_get(msg, "ua("E_TC_SIGN_WIN_INFO")", &target_win, &array);
    EINA_SAFETY_ON_FALSE_GOTO(res, finish);
 
    while (eldbus_message_iter_get_and_next(array, 'r', &ec))
@@ -108,7 +158,7 @@ _cb_method_win_info_list_get(void *data,
 
         res = eldbus_message_iter_arguments_get
            (ec,
-            "usiiiiibbbiibbbbb",
+            E_TC_SIGN_WIN_INFO,
             &tw->native_win,
             &tw->name,
             &tw->x, &tw->y, &tw->w, &tw->h,
@@ -122,7 +172,8 @@ _cb_method_win_info_list_get(void *data,
             &tw->iconic,
             &tw->alpha,
             &tw->focus.win,
-            &tw->focus.obj);
+            &tw->focus.obj,
+            &tw->rot);
 
         if (tw->effect)
           animating = EINA_TRUE;
@@ -204,6 +255,33 @@ finish:
    elm_exit();
 }
 
+static void
+_cb_method_zone_rotation_change(void *data,
+                                const Eldbus_Message *msg,
+                                Eldbus_Pending *p EINA_UNUSED)
+{
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+   Eina_Bool *allowed = data;
+
+   *allowed = EINA_FALSE;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "b", allowed);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+   EINA_SAFETY_ON_FALSE_GOTO(*allowed, finish);
+
+finish:
+   if ((name) || (text))
+     {
+        ERR("errname:%s errmsg:%s\n", name, text);
+     }
+
+   elm_exit();
+}
+
 static void
 _cb_signal_vis_changed(void *data,
                        const Eldbus_Message *msg)
@@ -262,6 +340,33 @@ finish:
      }
 }
 
+static void
+_cb_signal_win_rot_changed(void *data,
+                           const Eldbus_Message *msg)
+{
+   E_Test_Runner *runner = data;
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+   int angle = 0;
+   Ecore_Window id;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   /* TODO unused 'window id' and 'angle' */
+   res = eldbus_message_arguments_get(msg, "ui", &id, &angle);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+
+   runner->ev.response = runner->ev.expect;
+   elm_exit();
+
+finish:
+   if ((name) || (text))
+     {
+        ERR("errname:%s errmsg:%s\n", name, text);
+     }
+}
+
 static Eina_Bool
 _cb_work_time_out(void *data EINA_UNUSED)
 {
@@ -347,6 +452,66 @@ e_test_runner_req_win_stack_set(E_Test_Runner *runner,
    return EINA_TRUE;
 }
 
+Eina_Bool
+e_test_runner_req_zone_rotation_change(E_Test_Runner *runner, int angle)
+{
+   Eldbus_Pending *p;
+   Eina_Bool allowed = EINA_FALSE;
+
+   p = eldbus_proxy_call(runner->dbus.proxy,
+                         "ChangeZoneRotation",
+                         _cb_method_zone_rotation_change,
+                         &allowed,
+                         -1,
+                         "i",
+                         angle);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(p, EINA_FALSE);
+
+   elm_run();
+
+   return allowed;
+}
+
+Eina_Bool
+e_test_runner_req_win_info_get(E_Test_Runner *runner, E_TC_Win *tw)
+{
+   Eldbus_Pending *p;
+   Ecore_Window win;
+   int retry = 10;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(runner, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tw, EINA_FALSE);
+
+   win = tw->native_win;
+   while (retry)
+     {
+        p = eldbus_proxy_call(runner->dbus.proxy,
+                              "GetWinInfo",
+                              _cb_method_win_info_get,
+                              tw,
+                              -1,
+                              "u",
+                              win);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(p, EINA_FALSE);
+
+        elm_run();
+
+        if ((tw->native_win == win) && (!tw->effect))
+          return EINA_TRUE;
+        else
+          retry--;
+     }
+
+   if (tw->native_win != win)
+     {
+        ERR("Something Wrong. Difference with querying window and received window from server");
+        tw->native_win = win;
+     }
+
+   return EINA_FALSE;
+}
+
+
 Eina_List *
 e_test_runner_req_win_info_list_get(E_Test_Runner *runner)
 {
@@ -360,7 +525,7 @@ e_test_runner_req_win_info_list_get(E_Test_Runner *runner)
    while (info_list)
      {
         p = eldbus_proxy_call(runner->dbus.proxy,
-                              "GetWindowInfo",
+                              "GetWinsInfo",
                               _cb_method_win_info_list_get,
                               info_list,
                               -1,
@@ -534,6 +699,14 @@ e_test_runner_ev_wait(E_Test_Runner *runner,
          EINA_SAFETY_ON_NULL_GOTO(sh, finish);
          break;
 
+      case E_TC_EVENT_TYPE_WINDOW_ROTATION_CHANGE:
+         sh = eldbus_proxy_signal_handler_add(runner->dbus.proxy,
+                                              "WinRotationChanged",
+                                              _cb_signal_win_rot_changed,
+                                              runner);
+         EINA_SAFETY_ON_NULL_GOTO(sh, finish);
+         break;
+
       default:
          goto finish;
          break;
@@ -849,6 +1022,8 @@ _e_test_runner_init(E_Test_Runner *runner,
    /* [0400 - 0499] tizen-ws-shell */
    TC_ADD( 400, "Screensaver: Basic",           T_FUNC( 400, scrsaver_basic            ), 1);
    TC_ADD( 401, "Screensaver Manager: Basic",   T_FUNC( 401, scrsaver_mng_basic        ), 1);
+
+   TC_ADD( 500, "Rotation: Available Rotation", T_FUNC( 500, rotation_available_rots   ), 1);
 #undef T_FUNC
 }
 
index 665e707c4fe73a278be0d5202f7bf645cbdfe73c..48ec2c2b214bdfc921246709400cd6207228f0ac 100644 (file)
@@ -70,6 +70,7 @@ typedef enum _E_TC_Event_Type
    E_TC_EVENT_TYPE_STACK_LOWER,
    E_TC_EVENT_TYPE_STACK_ABOVE,
    E_TC_EVENT_TYPE_STACK_BELOW,
+   E_TC_EVENT_TYPE_WINDOW_ROTATION_CHANGE,
    E_TC_EVENT_TYPE_MAX
 } E_TC_Event_Type;
 
@@ -161,6 +162,7 @@ struct _E_TC_Win
    Ecore_Window      native_win; // native window id
    const char       *name;       // name of client window
    int               x, y, w, h; // geometry
+   int               rot;
    E_Layer           layer;
    Eina_Bool         effect;
    struct
@@ -194,6 +196,7 @@ struct _E_TC
 
 Eina_Bool  e_test_runner_req_win_register(E_Test_Runner *runner, E_TC_Win *tw);
 Eina_Bool  e_test_runner_req_win_deregister(E_Test_Runner *runner, E_TC_Win *tw);
+Eina_Bool  e_test_runner_req_win_info_get(E_Test_Runner *runner, E_TC_Win *tw);
 Eina_List *e_test_runner_req_win_info_list_get(E_Test_Runner *runner);
 void       e_test_runner_req_win_info_list_free(Eina_List *l);
 Eina_Bool  e_test_runner_req_win_stack_set(E_Test_Runner *runner, E_TC_Win *tw, E_TC_Win *sibling, Eina_Bool above);
@@ -206,6 +209,7 @@ Eina_Bool  e_test_runner_req_ev_feed_mouse_move(E_Test_Runner *runner, int x, in
 Eina_Bool  e_test_runner_req_ev_feed_mouse_up(E_Test_Runner *runner, int x, int y);
 Eina_Bool  e_test_runner_req_ev_feed_key_down(E_Test_Runner *runner, const char *key);
 Eina_Bool  e_test_runner_req_ev_feed_key_up(E_Test_Runner *runner, const char *key);
+Eina_Bool  e_test_runner_req_zone_rotation_change(E_Test_Runner *runner, int angle);
 
 Eina_Bool  e_test_runner_ev_wait(E_Test_Runner *runner, E_TC_Event_Type ev);
 
@@ -262,4 +266,6 @@ Eina_Bool  tc_0303_notification_level_change(E_TC *tc);
 Eina_Bool  tc_0400_scrsaver_basic(E_TC *tc);
 Eina_Bool  tc_0401_scrsaver_mng_basic(E_TC *tc);
 
+#include "0500_rotation.h"
+
 #endif