1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <gtest/gtest.h>
6 #include <gmock/gmock-spec-builders.h>
10 #include <details/ie_exception.hpp>
11 #include <cpp_interfaces/ie_task.hpp>
12 #include <cpp_interfaces/ie_task_synchronizer.hpp>
13 #include "task_tests_utils.hpp"
16 using namespace ::testing;
18 using namespace InferenceEngine;
19 using namespace InferenceEngine::details;
22 class TaskTests : public ::testing::Test {
24 Task::Ptr _task = std::make_shared<Task>();
27 TEST_F(TaskTests, canRunWithTaskSync) {
28 TaskSynchronizer::Ptr taskSynchronizer = std::make_shared<TaskSynchronizer>();
29 ASSERT_NO_THROW(_task->runWithSynchronizer(taskSynchronizer));
30 ASSERT_EQ(_task->getStatus(), Task::TS_DONE);
33 TEST_F(TaskTests, canRunWithTaskSyncAndWait) {
34 TaskSynchronizer::Ptr taskSynchronizer = std::make_shared<TaskSynchronizer>();
35 ASSERT_NO_THROW(_task->runWithSynchronizer(taskSynchronizer));
36 Task::Status status = _task->wait(-1);
37 ASSERT_EQ(status, Task::TS_DONE);
41 TEST_F(TaskTests, DISABLED_returnBusyStatusWhenStartTaskWhichIsRunning) {
42 TaskSynchronizer::Ptr taskSynchronizer = std::make_shared<TaskSynchronizer>();
43 std::vector<Task::Status> statuses;
44 std::vector<MetaThread::Ptr> metaThreads;
45 // otherwise push_back to the vector won't be thread-safe
46 statuses.reserve(MAX_NUMBER_OF_TASKS_IN_QUEUE);
49 for (int i = 0; i < MAX_NUMBER_OF_TASKS_IN_QUEUE; i++) {
50 metaThreads.push_back(make_shared<MetaThread>([&]() {
51 statuses.push_back(_task->runWithSynchronizer(taskSynchronizer));
55 for (auto &metaThread : metaThreads) metaThread->join();
56 for (auto &status : statuses) ASSERT_EQ(Task::Status::TS_BUSY, status) << "Start task never return busy status";
59 TEST_F(TaskTests, canSyncNThreadsUsingTaskSync) {
60 TaskSynchronizer::Ptr taskSynchronizer = std::make_shared<TaskSynchronizer>();
62 size_t THREAD_NUMBER = MAX_NUMBER_OF_TASKS_IN_QUEUE;
63 size_t NUM_INTERNAL_ITERATIONS = 5000;
64 std::vector<Task::Status> statuses;
65 std::vector<MetaThread::Ptr> metaThreads;
66 // otherwise push_back to the vector won't be thread-safe
67 statuses.reserve(THREAD_NUMBER);
69 for (int i = 0; i < THREAD_NUMBER; i++) {
70 metaThreads.push_back(make_shared<MetaThread>([&]() {
71 auto status = Task([&]() {
72 for (int k = 0; k < NUM_INTERNAL_ITERATIONS; k++) sharedVar++;
73 }).runWithSynchronizer(taskSynchronizer);
74 statuses.push_back(status);
78 for (auto &metaThread : metaThreads) metaThread->join();
79 for (auto &status : statuses) ASSERT_NE(Task::Status::TS_BUSY, status);
80 ASSERT_EQ(sharedVar, THREAD_NUMBER * NUM_INTERNAL_ITERATIONS);