Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / tests / unit / inference_engine_tests / so_pointer_tests.cpp
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <gtest/gtest.h>
6 #include <gmock/gmock.h>
7 #include <gmock/gmock-spec-builders.h>
8
9 #include <memory>
10 #include <details/ie_so_pointer.hpp>
11
12 using namespace InferenceEngine::details;
13 using namespace ::testing;
14 using ::testing::InSequence;
15
16 class PointedObjHelper {
17 public:
18     MOCK_METHOD0(obj_dtor, void());
19
20     virtual ~PointedObjHelper() {
21         obj_dtor();
22     }
23 };
24
25 class SharedObjectLoaderHelper {
26 public:
27     MOCK_METHOD0(loader_dtor, void());
28
29     virtual ~SharedObjectLoaderHelper() {
30         loader_dtor();
31     }
32 };
33
34 template<class T=PointedObjHelper, class L = SharedObjectLoaderHelper>
35 class SoPointerHelper : public SOPointer<T, L> {
36 public:
37     SoPointerHelper(std::shared_ptr<L>&& loader, std::shared_ptr<T>&& object)
38             : SOPointer<T, L>() {
39         SOPointer<T, L>::_so_loader = std::move(loader);
40         SOPointer<T, L>::_pointedObj = std::move(object);
41     }
42 };
43
44 class SoPointerTests : public ::testing::Test {
45 protected:
46     SharedObjectLoaderHelper *loader1 = nullptr, *loader2 = nullptr;
47     PointedObjHelper *obj1 = nullptr, *obj2 = nullptr;
48 };
49
50 TEST_F(SoPointerTests, assignObjThenLoader) {
51     auto loaderPtr1 = std::make_shared<SharedObjectLoaderHelper>();
52     auto objPtr1 = std::make_shared<PointedObjHelper>();
53     auto loaderPtr2 = std::make_shared<SharedObjectLoaderHelper>();
54     auto objPtr2 = std::make_shared<PointedObjHelper>();
55     loader1 = loaderPtr1.get();
56     obj1 = objPtr1.get();
57     loader2 = loaderPtr2.get();
58     obj2 = objPtr2.get();
59     SoPointerHelper<> soPointer1(std::move(loaderPtr1), std::move(objPtr1));
60     SoPointerHelper<> soPointer2(std::move(loaderPtr2), std::move(objPtr2));
61
62     {
63         InSequence dummy;
64         EXPECT_CALL(*obj1, obj_dtor());
65         EXPECT_CALL(*loader1, loader_dtor());
66         EXPECT_CALL(*obj2, obj_dtor());
67         EXPECT_CALL(*loader2, loader_dtor());
68     }
69
70     soPointer1 = soPointer2;
71 }