From: Lukasz Wojciechowski Date: Mon, 12 Jan 2015 10:16:34 +0000 (+0100) Subject: Add timeout mechanism for time-limited function calls X-Git-Tag: security-manager_5.5_testing~144 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=77233c42c5e1907839eb039d58ee486d2cf20903;p=platform%2Fcore%2Ftest%2Fsecurity-tests.git Add timeout mechanism for time-limited function calls Timeout mechanism: 1) launches given function in new thread; 2) waits given time period; 3) cancels called function using custom user CancelFunction; 4) checks if function has finished in expected way; 5) returns function answer (value or exception). Change-Id: Ia65d271095712e6afaaac96932f8d14d61b1702a --- diff --git a/tests/common/timeout.h b/tests/common/timeout.h new file mode 100644 index 00000000..7e985abe --- /dev/null +++ b/tests/common/timeout.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file timeout.h + * @author Lukasz Wojciechowski + * @brief Definition of time limited execution of synchronous functions + */ + +#ifndef TIMEOUT_H +#define TIMEOUT_H + +#include +#include +#include +#include + +#include + +namespace Timeout { + +template +using Timeout = std::chrono::duration; + +template +using Function = std::function; + +typedef std::function CancelFunction; + +enum ExpectMode { + FINISHED, + TIMEOUT, + IGNORE, +}; + +std::ostream& operator<<(std::ostream& os, const std::future_status &status) +{ + switch (status) { + case std::future_status::ready: + os << ""; + break; + case std::future_status::timeout: + os << ""; + break; + case std::future_status::deferred: + os << ""; + break; + } + os << " [" << static_cast(status) << "]"; + return os; +} + +template +Ret callAndWait(const Timeout &timeout, + ExpectMode expect, + CancelFunction cancelFunction, + Function function, + Args... args) { + RUNNER_ASSERT_MSG(function, + "not empty function must be passed to callAndWait"); + + std::future fut = std::async(std::launch::async, function, std::forward(args)...); + std::future_status status = fut.wait_for(timeout); + + if (status == std::future_status::timeout && cancelFunction) + cancelFunction(); + + switch (expect) { + case FINISHED: + RUNNER_ASSERT_MSG(status == std::future_status::ready, + "expected future status is " << std::future_status::ready + << " received future status is " << status); + break; + case TIMEOUT: + RUNNER_ASSERT_MSG(status == std::future_status::timeout, + "expected future status is " << std::future_status::timeout + << " received future status is " << status); + break; + case IGNORE: + break; + } + + return fut.get(); +} + +} // namespace Timeout + +#endif // TIMEOUT_H