From 7b43287c5574a8320e1921459743753cc4b72297 Mon Sep 17 00:00:00 2001 From: Hosang Kim Date: Fri, 29 Jul 2022 18:57:54 +0900 Subject: [PATCH] aurum: add waiter for bootstrap Change-Id: I6a0e682e817384e94d3265d375fc3b5815835d76 --- libaurum/inc/Until.h | 13 +++++++++ libaurum/inc/Waiter.h | 16 ++++++++++- libaurum/src/Until.cc | 10 +++++++ libaurum/src/Waiter.cc | 28 +++++++++++++++++-- .../inc/AurumServiceImpl.h | 5 ++++ .../inc/Commands/FindElementCommand.h | 4 ++- .../inc/Commands/FindElementsCommand.h | 4 ++- .../src/AurumServiceImpl.cc | 16 +++++++++-- .../src/Commands/FindElementCommand.cc | 9 ++++-- .../src/Commands/FindElementsCommand.cc | 10 +++++-- protocol/aurum.proto | 9 ++++++ 11 files changed, 110 insertions(+), 14 deletions(-) diff --git a/libaurum/inc/Until.h b/libaurum/inc/Until.h index ecbaeed..f34c8c5 100644 --- a/libaurum/inc/Until.h +++ b/libaurum/inc/Until.h @@ -115,6 +115,19 @@ public: */ static std::function checkable( const bool isCheckable); + + /** + * @brief Checks that there are objects that are satisfied with selector condition. + * + * @param[in] selector @UiSelctor + * + * @return function that performs findObjects + * returned function will return vector if succeed, else vector size is zero + * + * @since_tizen 7.0 + */ + static std::function>(const ISearchable *)> + findObjects(const std::shared_ptr selector); }; } diff --git a/libaurum/inc/Waiter.h b/libaurum/inc/Waiter.h index e865ecf..fe95ecc 100644 --- a/libaurum/inc/Waiter.h +++ b/libaurum/inc/Waiter.h @@ -47,11 +47,13 @@ public: * * @param[in] searchableObject ISearchable pointer * @param[in] uiObject UiObject pointer + * @param[in] timeout timeout value * * @since_tizen 6.5 */ Waiter(const ISearchable *searchableObject, - const UiObject *uiObject = nullptr); + const UiObject *uiObject = nullptr, + const int timeout = 5000); /** * @brief Waiter destructor. @@ -85,6 +87,18 @@ public: template R waitFor(const std::function object) const; + /** + * @brief wait for condition satisfied. + * + * @param[in] condition @ISearchable + * + * @return template vector + * + * @since_tizen 7.0 + */ + template + std::vector waitFor(const std::function(const ISearchable *)> condition) const; + private: const ISearchable *mSearchableObject; const UiObject *mUiObject; diff --git a/libaurum/src/Until.cc b/libaurum/src/Until.cc index 3a30831..0affb12 100644 --- a/libaurum/src/Until.cc +++ b/libaurum/src/Until.cc @@ -46,3 +46,13 @@ std::function Until::checkable(const bool isCheckable) return object->isClickable() == isCheckable; }; } + +std::function>(const ISearchable *)> Until::findObjects( + const std::shared_ptr selector) +{ + return [=](const ISearchable *searchable) -> std::vector> { + LOGI("findObjects search:%p", searchable); + std::vector> result = searchable->findObjects(selector); + return result; + }; +} diff --git a/libaurum/src/Waiter.cc b/libaurum/src/Waiter.cc index 43c8194..0bc0278 100644 --- a/libaurum/src/Waiter.cc +++ b/libaurum/src/Waiter.cc @@ -26,11 +26,11 @@ Waiter::Waiter() : Waiter(nullptr) {} Waiter::~Waiter() {} -Waiter::Waiter(const ISearchable *searchableObject, const UiObject *uiObject) +Waiter::Waiter(const ISearchable *searchableObject, const UiObject *uiObject, const int timeout) : mSearchableObject{searchableObject}, mUiObject{uiObject}, - WAIT_INTERVAL_MS{500}, - WAIT_TIMEOUT_MS{5000} + WAIT_INTERVAL_MS{100}, + WAIT_TIMEOUT_MS{timeout} { } @@ -44,6 +44,10 @@ template std::shared_ptr Waiter::waitFor( template bool Waiter::waitFor( const std::function condition) const; +template std::vector> Waiter::waitFor( + const std::function> (const ISearchable *)> + condition) const; + template R Waiter::waitFor(const std::function condition) const { @@ -82,3 +86,21 @@ R Waiter::waitFor(const std::function condition) const } return R(); } + +template +std::vector Waiter::waitFor(const std::function(const ISearchable *)> condition) const +{ + LOGI("waitFor ISearchable"); + std::chrono::system_clock::time_point start = + std::chrono::system_clock::now(); + std::vector result = condition(mSearchableObject); + while (result.empty()) { + if ((std::chrono::system_clock::now() - start) > + std::chrono::milliseconds{WAIT_TIMEOUT_MS}) + break; + std::this_thread::sleep_for( + std::chrono::milliseconds{WAIT_INTERVAL_MS}); + result = condition(mSearchableObject); + } + return result; +} diff --git a/org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h b/org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h index 5857444..a47581e 100644 --- a/org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h +++ b/org.tizen.aurum-bootstrap/inc/AurumServiceImpl.h @@ -129,6 +129,11 @@ public: ::grpc::Status getTextMinBoundingRect(::grpc::ServerContext *context, const ::aurum::ReqGetTextMinBoundingRect *request, ::aurum::RspGetTextMinBoundingRect *response) override; + ::grpc::Status setTimeout(::grpc::ServerContext *context, + const ::aurum::ReqSetTimeout *request, + ::aurum::RspSetTimeout *response) override; +public: + int WAIT_TIMEOUT_MS; }; #endif diff --git a/org.tizen.aurum-bootstrap/inc/Commands/FindElementCommand.h b/org.tizen.aurum-bootstrap/inc/Commands/FindElementCommand.h index 01e4a21..4edc4e8 100644 --- a/org.tizen.aurum-bootstrap/inc/Commands/FindElementCommand.h +++ b/org.tizen.aurum-bootstrap/inc/Commands/FindElementCommand.h @@ -26,13 +26,15 @@ class FindElementCommand : public Command { protected: const ::aurum::ReqFindElement *mRequest; ::aurum::RspFindElement *mResponse; + int mTimeout; protected: ObjectMapper *mObjMap; public: FindElementCommand(const ::aurum::ReqFindElement *request, - ::aurum::RspFindElement *response); + ::aurum::RspFindElement *response, + int timeout = 0); ::grpc::Status execute() override; protected: virtual std::shared_ptr getSearchableTop(void); diff --git a/org.tizen.aurum-bootstrap/inc/Commands/FindElementsCommand.h b/org.tizen.aurum-bootstrap/inc/Commands/FindElementsCommand.h index c7ea99e..92d325b 100644 --- a/org.tizen.aurum-bootstrap/inc/Commands/FindElementsCommand.h +++ b/org.tizen.aurum-bootstrap/inc/Commands/FindElementsCommand.h @@ -26,13 +26,15 @@ class FindElementsCommand : public Command { protected: const ::aurum::ReqFindElements *mRequest; ::aurum::RspFindElements *mResponse; + int mTimeout; protected: ObjectMapper *mObjMap; public: FindElementsCommand(const ::aurum::ReqFindElements *request, - ::aurum::RspFindElements *response); + ::aurum::RspFindElements *response, + int timeout = 0); ::grpc::Status execute() override; protected: virtual std::shared_ptr getSearchableTop(void); diff --git a/org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc b/org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc index ca19a75..0cb4f82 100644 --- a/org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc +++ b/org.tizen.aurum-bootstrap/src/AurumServiceImpl.cc @@ -29,6 +29,7 @@ using namespace grpc; using namespace aurum; aurumServiceImpl::aurumServiceImpl() + : WAIT_TIMEOUT_MS{0} { LOGI("creates watcher instance (start to look up at_spi server)"); AccessibleWatcher::getInstance(); @@ -60,7 +61,7 @@ aurumServiceImpl::~aurumServiceImpl() ::grpc::ServerContext *context, const ::aurum::ReqFindElement *request, ::aurum::RspFindElement *response) { - std::unique_ptr cmd = std::make_unique(request, response); + std::unique_ptr cmd = std::make_unique(request, response, WAIT_TIMEOUT_MS); return execute(cmd.get(), true); } @@ -68,7 +69,7 @@ aurumServiceImpl::~aurumServiceImpl() ::grpc::ServerContext *context, const ::aurum::ReqFindElements *request, ::aurum::RspFindElements *response) { - std::unique_ptr cmd = std::make_unique(request, response); + std::unique_ptr cmd = std::make_unique(request, response, WAIT_TIMEOUT_MS); return execute(cmd.get(), true); } @@ -288,3 +289,14 @@ aurumServiceImpl::~aurumServiceImpl() std::unique_ptr cmd = std::make_unique(request, response); return execute(cmd.get(), true); } + +::grpc::Status aurumServiceImpl::setTimeout(::grpc::ServerContext *context, + const ::aurum::ReqSetTimeout *request, + ::aurum::RspSetTimeout *response) +{ + WAIT_TIMEOUT_MS = request->timeout(); + LOGI("setTimeout: %d", WAIT_TIMEOUT_MS); + + response->set_status(::aurum::RspStatus::OK); + return ::grpc::Status::OK; +} diff --git a/org.tizen.aurum-bootstrap/src/Commands/FindElementCommand.cc b/org.tizen.aurum-bootstrap/src/Commands/FindElementCommand.cc index c2664ad..c0d4641 100644 --- a/org.tizen.aurum-bootstrap/src/Commands/FindElementCommand.cc +++ b/org.tizen.aurum-bootstrap/src/Commands/FindElementCommand.cc @@ -25,10 +25,12 @@ #ifdef MQTT_ENABLED #include "SaObject.h" #endif +#include "Until.h" FindElementCommand::FindElementCommand(const ::aurum::ReqFindElement *request, - ::aurum::RspFindElement *response) - : mRequest{request}, mResponse{response} + ::aurum::RspFindElement *response, + int timeout) + : mRequest{request}, mResponse{response}, mTimeout(timeout) { mObjMap = ObjectMapper::getInstance(); } @@ -126,7 +128,8 @@ std::shared_ptr FindElementCommand::getSelector(void) mDevice->RequestScreenAnalyze(); } - auto found = searchableObj->findObject(selector); + auto waiter = new Waiter(searchableObj.get(), nullptr, mTimeout); + auto found = waiter->waitFor(Until::findObject(selector)); if (found != nullptr) { UiObject *obj = found.get(); diff --git a/org.tizen.aurum-bootstrap/src/Commands/FindElementsCommand.cc b/org.tizen.aurum-bootstrap/src/Commands/FindElementsCommand.cc index 3a0e6b7..fe09e14 100644 --- a/org.tizen.aurum-bootstrap/src/Commands/FindElementsCommand.cc +++ b/org.tizen.aurum-bootstrap/src/Commands/FindElementsCommand.cc @@ -25,10 +25,12 @@ #ifdef MQTT_ENABLED #include "SaObject.h" #endif +#include "Until.h" FindElementsCommand::FindElementsCommand(const ::aurum::ReqFindElements *request, - ::aurum::RspFindElements *response) - : mRequest{request}, mResponse{response} + ::aurum::RspFindElements *response, + int timeout) + : mRequest{request}, mResponse{response}, mTimeout{timeout} { mObjMap = ObjectMapper::getInstance(); } @@ -134,8 +136,10 @@ std::vector> FindElementsCommand::getSelectors(void) std::vector> founds = {}; + auto waiter = new Waiter(searchableObj.get(), nullptr, mTimeout); + for ( auto &sel : selectors ) { - auto ret = searchableObj->findObjects(sel); + auto ret = waiter->waitFor(Until::findObjects(sel)); std::move(std::begin(ret), std::end(ret), std::back_inserter(founds)); } diff --git a/protocol/aurum.proto b/protocol/aurum.proto index d1a7696..2240ae5 100644 --- a/protocol/aurum.proto +++ b/protocol/aurum.proto @@ -36,6 +36,7 @@ service Bootstrap { rpc getActiveAppToolkitName(ReqGetActiveAppToolkitName) returns (RspGetActiveAppToolkitName) {} rpc enableScreenAnalyzer(ReqEnableScreenAnalyzer) returns (RspEnableScreenAnalyzer) {} rpc getTextMinBoundingRect(ReqGetTextMinBoundingRect) returns (RspGetTextMinBoundingRect) {} + rpc setTimeout(ReqSetTimeout) returns (RspSetTimeout) {} } // ------------------------------------ // @@ -610,3 +611,11 @@ message RspGetTextMinBoundingRect { RspStatus status = 1; Rect size = 2; } + +message ReqSetTimeout { + int32 timeout = 1; +} + +message RspSetTimeout { + RspStatus status = 1; +} -- 2.34.1