1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <gtest/gtest.h>
6 #include "tests_utils.hpp"
7 #include <details/ie_exception.hpp>
8 #include <cpp_interfaces/exception2status.hpp>
9 #include <details/ie_exception_conversion.hpp>
11 using namespace InferenceEngine;
12 class ExceptionTests : public ::testing::Test {};
14 TEST_F(ExceptionTests, canThrowUsingMacro) {
15 std::string message = "Exception message!";
16 EXPECT_THROW(THROW_IE_EXCEPTION << message, InferenceEngine::details::InferenceEngineException);
19 TEST_F(ExceptionTests, canThrowScoringException) {
20 InferenceEngine::details::InferenceEngineException exception(__FILE__, __LINE__);
21 EXPECT_THROW(throw exception, InferenceEngine::details::InferenceEngineException);
24 TEST_F(ExceptionTests, canDefineExceptionContent) {
25 InferenceEngine::details::InferenceEngineException exception(__FILE__, __LINE__);
27 ASSERT_STR_CONTAINS(exception.what(), "");
30 TEST_F(ExceptionTests, exceptionShowsCorrectMessage) {
31 std::string message = "Exception message!";
33 THROW_IE_EXCEPTION << message;
35 catch (InferenceEngine::details::InferenceEngineException ex) {
36 ASSERT_STR_CONTAINS(ex.what(), message);
40 //TODO: enable test once info appears in exception message
41 TEST_F(ExceptionTests, DISABLED_exceptionShowsCorrectFileAndLineNumbers) {
42 std::string message = __FILE__;
45 lineNum = __LINE__; THROW_IE_EXCEPTION;
47 catch (InferenceEngine::details::InferenceEngineException ex) {
48 message += ":" + std::to_string(lineNum);
49 ASSERT_STR_CONTAINS(ex.what(), message);
53 TEST_F(ExceptionTests, exceptionCanBeCoughtAsStandard) {
54 ASSERT_THROW(THROW_IE_EXCEPTION, std::exception);
58 TEST_F(ExceptionTests, canThrowStatusCode) {
60 THROW_IE_EXCEPTION << InferenceEngine::details::as_status << InferenceEngine::StatusCode::INFER_NOT_STARTED;
62 catch (const InferenceEngine::details::InferenceEngineException &iex) {
63 ASSERT_TRUE(iex.hasStatus());
64 ASSERT_EQ(iex.getStatus(), InferenceEngine::StatusCode::INFER_NOT_STARTED);
68 TEST_F(ExceptionTests, handleOnlyFirstStatus) {
70 THROW_IE_EXCEPTION<< InferenceEngine::details::as_status <<
71 InferenceEngine::StatusCode::NETWORK_NOT_LOADED << InferenceEngine::StatusCode::NOT_FOUND;
73 catch (const InferenceEngine::details::InferenceEngineException &iex) {
74 ASSERT_TRUE(iex.hasStatus());
75 ASSERT_EQ(iex.getStatus(), InferenceEngine::StatusCode::NETWORK_NOT_LOADED);
79 TEST_F(ExceptionTests, ignoreNotStatusCodeEnumAfterManip) {
80 enum testEnum : int { FIRST = 1 };
82 THROW_IE_EXCEPTION<< InferenceEngine::details::as_status << testEnum::FIRST;
84 catch (const InferenceEngine::details::InferenceEngineException &iex) {
85 ASSERT_FALSE(iex.hasStatus());
89 TEST_F(ExceptionTests, canUseManipulatorStandalone) {
90 auto iex = details::InferenceEngineException("filename", 1);
93 throw iex << NOT_IMPLEMENTED;
94 } catch (const InferenceEngine::details::InferenceEngineException &iex) {
95 ASSERT_TRUE(iex.hasStatus());
96 ASSERT_EQ(iex.getStatus(), InferenceEngine::StatusCode::NOT_IMPLEMENTED);
100 TEST_F(ExceptionTests, statusCodeNotAppearInMessageAfterCatch) {
101 std::string message = "Exception message!";
102 std::string strStatusCode = std::to_string(StatusCode::NETWORK_NOT_LOADED);
104 THROW_IE_EXCEPTION<< "<unique--" << InferenceEngine::details::as_status <<
105 InferenceEngine::StatusCode::NETWORK_NOT_LOADED << "--unique>" << message;
107 catch (const InferenceEngine::details::InferenceEngineException &iex) {
108 ASSERT_STR_CONTAINS(iex.what(), message);
109 ASSERT_STR_DOES_NOT_CONTAIN(iex.what(), "<unique--" + strStatusCode + "--unique>");
113 TEST_F(ExceptionTests, statusCodeAppearInMessageAfterCatch) {
114 std::string message = "Exception message!";
115 std::string strStatusCode = std::to_string(StatusCode::NETWORK_NOT_LOADED);
117 THROW_IE_EXCEPTION<< "<unique--" << InferenceEngine::StatusCode::NETWORK_NOT_LOADED << "--unique>" << message;
119 catch (const InferenceEngine::details::InferenceEngineException &iex) {
120 ASSERT_STR_CONTAINS(iex.what(), message);
121 ASSERT_STR_CONTAINS(iex.what(), "<unique--" + strStatusCode + "--unique>");
125 template <StatusCode T>
128 static InferenceEngine::StatusCode toStatusWrapper(InferenceEngine::ResponseDesc* resp) {
129 TO_STATUS(THROW_IE_EXCEPTION << details::as_status << T);
131 static InferenceEngine::StatusCode toStatusWrapperMsg(std::string &msg, InferenceEngine::ResponseDesc* resp) {
132 TO_STATUS(THROW_IE_EXCEPTION << details::as_status << T << msg);
136 // TO_STATUS macros tests
137 TEST_F(ExceptionTests, canConvertToStatus) {
138 ResponseDesc *resp = nullptr;
139 ASSERT_EQ(WrapperClass<StatusCode::GENERAL_ERROR>::toStatusWrapper(resp), StatusCode::GENERAL_ERROR);
140 ASSERT_EQ(WrapperClass<StatusCode::NOT_IMPLEMENTED>::toStatusWrapper(resp), StatusCode::NOT_IMPLEMENTED);
141 ASSERT_EQ(WrapperClass<StatusCode::NETWORK_NOT_LOADED>::toStatusWrapper(resp), StatusCode::NETWORK_NOT_LOADED);
142 ASSERT_EQ(WrapperClass<StatusCode::PARAMETER_MISMATCH>::toStatusWrapper(resp), StatusCode::PARAMETER_MISMATCH);
143 ASSERT_EQ(WrapperClass<StatusCode::NOT_FOUND>::toStatusWrapper(resp), StatusCode::NOT_FOUND);
144 ASSERT_EQ(WrapperClass<StatusCode::OUT_OF_BOUNDS>::toStatusWrapper(resp), StatusCode::OUT_OF_BOUNDS);
145 ASSERT_EQ(WrapperClass<StatusCode::UNEXPECTED>::toStatusWrapper(resp), StatusCode::UNEXPECTED);
146 ASSERT_EQ(WrapperClass<StatusCode::REQUEST_BUSY>::toStatusWrapper(resp), StatusCode::REQUEST_BUSY);
147 ASSERT_EQ(WrapperClass<StatusCode::RESULT_NOT_READY>::toStatusWrapper(resp), StatusCode::RESULT_NOT_READY);
148 ASSERT_EQ(WrapperClass<StatusCode::NOT_ALLOCATED>::toStatusWrapper(resp), StatusCode::NOT_ALLOCATED);
149 ASSERT_EQ(WrapperClass<StatusCode::INFER_NOT_STARTED>::toStatusWrapper(resp), StatusCode::INFER_NOT_STARTED);
152 // CALL_STATUS_FNC macros tests
153 TEST_F(ExceptionTests, canConvertStatusToException) {
154 std::shared_ptr<WrapperClass<StatusCode::INFER_NOT_STARTED>> actual;
155 ASSERT_THROW(CALL_STATUS_FNC_NO_ARGS(toStatusWrapper), InferenceEngine::InferNotStarted);
158 TEST_F(ExceptionTests, throwAfterConvertStatusToClassContainMessage) {
159 std::string message = "Exception message!";
160 std::shared_ptr<WrapperClass<StatusCode::NOT_ALLOCATED>> actual;
162 CALL_STATUS_FNC(toStatusWrapperMsg, message);
163 } catch (const NotAllocated &iex) {
164 ASSERT_STR_CONTAINS(iex.what(), message);
168 #ifdef NDEBUG //disabled for debug as macros calls assert()
169 TEST_F(ExceptionTests, exceptionWithAssertThrowsNothingIfTrue) {
170 EXPECT_NO_THROW(IE_ASSERT(true) << "shouldn't assert if true");
173 TEST_F(ExceptionTests, exceptionWithAssertThrowsNothingIfExpressionTrue) {
174 EXPECT_NO_THROW(IE_ASSERT(2 > 0) << "shouldn't assert if true expression");
177 TEST_F(ExceptionTests, exceptionWithAssertThrowsExceptionIfFalse) {
178 EXPECT_THROW(IE_ASSERT(false), InferenceEngine::details::InferenceEngineException);
181 TEST_F(ExceptionTests, exceptionWithAssertThrowsExceptionIfFalseExpession) {
182 EXPECT_THROW(IE_ASSERT(0 == 1), InferenceEngine::details::InferenceEngineException);