1 // Copyright (C) 2018 Intel Corporation
3 // SPDX-License-Identifier: Apache-2.0
6 #include <gtest/gtest.h>
7 #include <gmock/gmock-spec-builders.h>
10 #include <ie_common.h>
11 #include <details/ie_exception.hpp>
12 #include <cpp_interfaces/ie_task.hpp>
13 #include <cpp_interfaces/ie_task_executor.hpp>
14 #include <cpp_interfaces/ie_task_with_stages.hpp>
15 #include <cpp_interfaces/ie_task_synchronizer.hpp>
16 #include "task_tests_utils.hpp"
19 using namespace ::testing;
21 using namespace InferenceEngine;
22 using namespace InferenceEngine::details;
31 class TaskCommonTests : public ::testing::Test, public testing::WithParamInterface<TaskFlavor> {
35 Task::Ptr createTask(std::function<void()> function = nullptr, bool forceNull = false) {
36 TaskFlavor flavor = GetParam();
37 bool condition = function || forceNull;
38 Task::Ptr baseTask = condition ? make_shared<Task>(function) : make_shared<Task>();
39 Task::Ptr stagedTask = condition ? make_shared<StagedTask>(function, 1) : make_shared<StagedTask>();
40 auto executor = make_shared<TaskExecutor>();
47 throw logic_error("Specified non-existent flavor of task");
52 TEST_P(TaskCommonTests, canCreateTask) {
53 ASSERT_NO_THROW(_task = createTask());
54 ASSERT_EQ(_task->getStatus(), Task::TS_INITIAL);
57 TEST_P(TaskCommonTests, canSetBusyStatus) {
58 ASSERT_NO_THROW(_task = createTask());
59 ASSERT_NO_THROW(_task->occupy());
60 ASSERT_EQ(_task->getStatus(), Task::TS_BUSY);
63 TEST_P(TaskCommonTests, firstOccupyReturnTrueSecondFalse) {
64 ASSERT_NO_THROW(_task = createTask());
65 ASSERT_TRUE(_task->occupy());
66 ASSERT_FALSE(_task->occupy());
69 TEST_P(TaskCommonTests, canRunDefaultTask) {
71 ASSERT_NO_THROW(_task->runNoThrowNoBusyCheck());
72 ASSERT_EQ(_task->getStatus(), Task::TS_DONE);
75 TEST_P(TaskCommonTests, throwIfFunctionNull) {
76 ASSERT_THROW(_task = createTask(nullptr, true), InferenceEngineException);
79 TEST_P(TaskCommonTests, canWaitWithoutRun) {
81 ASSERT_NO_THROW(_task->wait(-1));
82 ASSERT_EQ(_task->getStatus(), Task::TS_INITIAL);
83 ASSERT_NO_THROW(_task->wait(1));
84 ASSERT_EQ(_task->getStatus(), Task::TS_INITIAL);
87 TEST_P(TaskCommonTests, canRunTaskFromThread) {
90 MetaThread metaThread([=]() {
91 _task->runNoThrowNoBusyCheck();
95 ASSERT_EQ(Task::Status::TS_DONE, _task->getStatus());
99 TEST_P(TaskCommonTests, canRunTaskFromThreadWithoutWait) {
100 _task = createTask([]() {
101 std::this_thread::sleep_for(std::chrono::milliseconds(500));
103 std::thread thread([this]() { _task->runNoThrowNoBusyCheck(); });
104 if (thread.joinable()) thread.join();
107 TEST_P(TaskCommonTests, waitReturnNotStartedIfTaskWasNotRun) {
108 _task = createTask();
109 Task::Status status = _task->wait(1);
110 ASSERT_EQ(status, Task::Status::TS_INITIAL);
113 TEST_P(TaskCommonTests, canCatchIEException) {
114 _task = createTask([]() { THROW_IE_EXCEPTION; });
115 ASSERT_NO_THROW(_task->runNoThrowNoBusyCheck());
116 Task::Status status = _task->getStatus();
117 ASSERT_EQ(status, Task::Status::TS_ERROR);
118 EXPECT_THROW(_task->checkException(), InferenceEngineException);
121 TEST_P(TaskCommonTests, waitReturnErrorIfException) {
122 _task = createTask([]() { THROW_IE_EXCEPTION; });
123 ASSERT_NO_THROW(_task->occupy());
124 ASSERT_NO_THROW(_task->runNoThrowNoBusyCheck());
125 Task::Status status = _task->wait(-1);
126 ASSERT_EQ(status, Task::Status::TS_ERROR);
127 EXPECT_THROW(_task->checkException(), InferenceEngineException);
130 TEST_P(TaskCommonTests, canCatchStdException) {
131 _task = createTask([]() { throw std::bad_alloc(); });
132 ASSERT_NO_THROW(_task->runNoThrowNoBusyCheck());
133 Task::Status status = _task->getStatus();
134 ASSERT_EQ(status, Task::Status::TS_ERROR);
135 EXPECT_THROW(_task->checkException(), std::bad_alloc);
138 TEST_P(TaskCommonTests, canCleanExceptionPtr) {
139 bool throwException = true;
140 _task = createTask([&throwException]() { if (throwException) throw std::bad_alloc(); else return; });
141 ASSERT_NO_THROW(_task->runNoThrowNoBusyCheck());
142 EXPECT_THROW(_task->checkException(), std::bad_alloc);
143 throwException = false;
144 ASSERT_NO_THROW(_task->runNoThrowNoBusyCheck());
145 EXPECT_NO_THROW(_task->checkException());
148 std::string getTestCaseName(testing::TestParamInfo<TaskFlavor> obj) {
149 #define CASE(x) case x: return #x;
153 CASE(BASE_WITH_CALLBACK);
154 CASE(STAGED_WITH_CALLBACK);
161 INSTANTIATE_TEST_CASE_P(Task, TaskCommonTests,
162 ::testing::ValuesIn(std::vector<TaskFlavor>{BASE_TASK, STAGED_TASK}), getTestCaseName);