e_test_event: added eventWatcher that waitEvent method makes waiting until event... 82/267382/1
authorJunseok, Kim <juns.kim@samsung.com>
Thu, 2 Dec 2021 07:21:23 +0000 (16:21 +0900)
committerJunseok, Kim <juns.kim@samsung.com>
Thu, 2 Dec 2021 07:21:28 +0000 (16:21 +0900)
previous waitEvent method wait fixed time(500ms) for receive event signal.
It could cause testcase failure by timeout even if server delayed for busy job.
for prevent this issue, raise maximum wait time to 3sec and added eventWatcher for stop mainloop when the desired event received.

Change-Id: I1bca6a17e80ec66aab6c4316b64d77b472962766

src/e_test_base.cpp
src/e_test_event.cpp
src/e_test_event.h

index efd73e810fafb14dac00d127091a64e5093d3c70..1a66a6f79b6b0fdc29589cfa73bd1afe533246bb 100644 (file)
@@ -20,6 +20,7 @@ etTCBase::~etTCBase()
 
    etRunner::get().setTCEnd();
    etRunner::get().flushEventQueue();
+   etRunner::get().unwatchEventSignal();
 
    // if there are any error, print list of window
    if (HasFailure())
index ac42d8ee59756e6d9900c14bbb46e53f4f71d03b..4cc718fc7e0df6db5ea8beab9776a429b4d8bbb3 100644 (file)
@@ -1459,6 +1459,42 @@ etRunner::getAuxHint(etWin *tw, const char *hint_key)
    return NULL;
 }
 
+void
+etRunner::watchEventSignal(Ecore_Window win, E_TC_Event_Type ev_type)
+{
+   ev.eventWatcher = std::make_shared<eventItem>(win, ev_type);
+}
+
+void
+etRunner::unwatchEventSignal()
+{
+   ev.eventWatcher = nullptr;
+}
+
+Eina_Bool
+etRunner::isWatchingEventSignal(std::shared_ptr<eventItem> ei)
+{
+   if (ei == nullptr) return EINA_FALSE;
+   if (ev.eventWatcher == nullptr) return EINA_FALSE;
+
+   if (ev.eventWatcher->isSameEvent(ei))
+     return EINA_TRUE;
+
+   return EINA_FALSE;
+}
+
+Eina_Bool
+etRunner::isWatchingEventSignal(Ecore_Window win, E_TC_Event_Type ev_type)
+{
+   if (ev.eventWatcher == nullptr) return EINA_FALSE;
+
+   if ((ev.eventWatcher->isSameWin(win) &&
+        ev.eventWatcher->isSameType(ev_type)))
+     return EINA_TRUE;
+
+   return EINA_FALSE;
+}
+
 std::shared_ptr<eventItem>
 etRunner::waitEvent(etWin *win, E_TC_Event_Type ev_type)
 {
@@ -1511,11 +1547,12 @@ etRunner::waitEvent(etWin *win, E_TC_Event_Type ev_type)
      }
 
    // pre-waiting events
-   work(0.5);
+   watchEventSignal(win?win->native_win:0, ev_type);
+   work();
 
    if (*ev.wait_event_index == ev.last_event)
      {
-        work(0.5); // waiting additional time
+        work(); // waiting additional time
         if (*ev.wait_event_index == ev.last_event)
         {
            std::shared_ptr<eventItem> res = std::make_shared<eventItem>(0, E_TC_EVENT_TYPE_NONE);
@@ -1570,6 +1607,12 @@ etRunner::insertEventQueue(std::shared_ptr<eventItem> ei)
    ev.recv_queue.push_back(ei);
    ev.last_event = ei;
 
+   if (isWatchingEventSignal(ei))
+     {
+        unwatchEventSignal();
+        finishWork();
+     }
+
    return EINA_TRUE;
 }
 
@@ -1582,6 +1625,12 @@ etRunner::insertEventQueue(Ecore_Window id, E_TC_Event_Type ev_type)
    ev.recv_queue.push_back(ei);
    ev.last_event = ei;
 
+   if (isWatchingEventSignal(id, ev_type))
+     {
+        unwatchEventSignal();
+        finishWork();
+     }
+
    return EINA_TRUE;
 }
 
@@ -3247,6 +3296,8 @@ etRunner::verifyTC(std::string basetype, std::string tcname)
    EINA_SAFETY_ON_FALSE_RETURN_VAL(execute_verifyTC, EINA_TRUE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(screenshot, EINA_FALSE);
 
+   work(0.3);
+
    surface = efl_util_screenshot_take_tbm_surface(screenshot);
    if (surface == NULL)
      {
index 746c5a697655928e06899d72e5653144323c5ab9..6a88804b187273039a355edcd25047518f51d278 100644 (file)
@@ -23,6 +23,8 @@ public:
    ~eventItem() {}
 
 public:
+   Eina_Bool isSameEvent(eventItem *ei) { return (ei->win == this->win) && (ei->type == this->type); }
+   Eina_Bool isSameEvent(std::shared_ptr<eventItem> ei) { return (ei->win == this->win) && (ei->type == this->type); }
    Eina_Bool isSameWin(Ecore_Window win) { return win == this->win; }
    Eina_Bool isSameType(E_TC_Event_Type type) {return type == this->type; }
 
@@ -204,13 +206,14 @@ public: /* TODO: make it hidden */
         Evas_Object *elm_win;
         Ecore_Window native_win;
 
-        Eina_List *sh_list;
-        Eina_List *eh_list;
+        Eina_List *sh_list; // Signal Handler list
+        Eina_List *eh_list; // Event Handler list
         std::list<std::shared_ptr<eventItem>> recv_queue;
 
         std::list<std::shared_ptr<eventItem>>::iterator wait_event_index;
         std::shared_ptr<eventItem>  last_event;
         std::shared_ptr<eventItem>  last_checkpoint;
+        std::shared_ptr<eventItem> eventWatcher;
 
         struct
           {
@@ -341,6 +344,7 @@ public:
    void          setEventCheckpoint();
    Eina_Bool     addSignalHandlers();
    void          delSignalHandlers();
+   void          unwatchEventSignal();
 
    Eldbus_Proxy  *getDbusProxy()  { return dbus.ds_proxy; }
    Eldbus_Object *getDbusObject() { return dbus.ds_obj;   }
@@ -354,6 +358,9 @@ public:
 
 protected:
    Eina_Bool initProtocols();
+   void      watchEventSignal(Ecore_Window win, E_TC_Event_Type ev_type);
+   Eina_Bool isWatchingEventSignal(std::shared_ptr<eventItem> ei);
+   Eina_Bool isWatchingEventSignal(Ecore_Window win, E_TC_Event_Type ev_type);
    efl_util_inputgen_h inputGenerator = NULL;
 #ifndef DISABLE_GESTURE_TESTS
    efl_util_gesture_h gestureHandler = NULL;