From d78637102c128442d23efea0ed8a1b864612e1e3 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Wed, 20 Sep 2023 13:27:06 +0300 Subject: [PATCH] Skip test cases in case of SkipTestException in SetUp --- modules/core/test/test_misc.cpp | 11 +++++++++++ modules/ts/include/opencv2/ts/ts_ext.hpp | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/modules/core/test/test_misc.cpp b/modules/core/test/test_misc.cpp index 53d7585277..6f50600f40 100644 --- a/modules/core/test/test_misc.cpp +++ b/modules/core/test/test_misc.cpp @@ -930,4 +930,15 @@ TEST_F(TestFixtureSkip, NoBodyRun) { FAIL() << "Unreachable code called"; } +// Expected that SkipTestException thrown in SetUp method should skip test but not fail +struct TestSetUpSkip: public ::testing::Test { + virtual void SetUp() CV_OVERRIDE { + throw SkipTestException("Skip test at SetUp"); + } +}; + +TEST_F(TestSetUpSkip, NoBodyRun) { + FAIL() << "Unreachable code called"; +} + }} // namespace diff --git a/modules/ts/include/opencv2/ts/ts_ext.hpp b/modules/ts/include/opencv2/ts/ts_ext.hpp index 8395f31a4c..e7e01fb3ed 100644 --- a/modules/ts/include/opencv2/ts/ts_ext.hpp +++ b/modules/ts/include/opencv2/ts/ts_ext.hpp @@ -31,6 +31,8 @@ bool checkBigDataTests(); #define CV__TEST_INIT \ CV__TEST_NAMESPACE_CHECK \ + if (setUpSkipped) \ + return; \ ::cvtest::testSetUp(); #define CV__TEST_CLEANUP ::cvtest::testTearDown(); #define CV__TEST_BODY_IMPL(name) \ @@ -47,6 +49,16 @@ bool checkBigDataTests(); } \ } \ +#define CV__TEST_SETUP_IMPL(parent_class) { \ + setUpSkipped = false; \ + try { \ + parent_class::SetUp(); \ + } catch (const cvtest::details::SkipTestExceptionBase& e) { \ + setUpSkipped = true; \ + printf("[ SKIP ] %s\n", e.what()); \ + } \ +} \ + struct SkipThisTest : public ::testing::Test { SkipThisTest(const std::string& msg_) : msg(msg_) {} @@ -63,8 +75,10 @@ struct SkipThisTest : public ::testing::Test { public:\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ private:\ + bool setUpSkipped = false; \ virtual void TestBody() CV_OVERRIDE;\ virtual void bodyMethodName() BODY_ATTR;\ + virtual void SetUp() CV_OVERRIDE; \ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ @@ -90,6 +104,7 @@ struct SkipThisTest : public ::testing::Test { parent_class::TearDownTestCase, \ new test_case_name##test_name##_factory);\ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() BODY_IMPL( #test_case_name "_" #test_name ) \ + void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::SetUp() CV__TEST_SETUP_IMPL(parent_class) \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::bodyMethodName() #define TEST(test_case_name, test_name) TEST_(test_case_name, test_name, ::testing::Test, Body,, CV__TEST_BODY_IMPL) @@ -125,8 +140,10 @@ struct SkipThisTest : public ::testing::Test { public:\ GTEST_TEST_CLASS_NAME_(test_fixture, test_name)() {}\ private:\ + bool setUpSkipped = false; \ virtual void TestBody() CV_OVERRIDE;\ virtual void Body(); \ + virtual void SetUp() CV_OVERRIDE; \ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ GTEST_DISALLOW_COPY_AND_ASSIGN_(\ GTEST_TEST_CLASS_NAME_(test_fixture, test_name));\ @@ -152,6 +169,7 @@ struct SkipThisTest : public ::testing::Test { test_fixture::TearDownTestCase, \ new test_fixture##test_name##_factory);\ void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::TestBody() CV__TEST_BODY_IMPL( #test_fixture "_" #test_name ) \ + void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::SetUp() CV__TEST_SETUP_IMPL(test_fixture) \ void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::Body() // Don't use directly @@ -161,8 +179,10 @@ struct SkipThisTest : public ::testing::Test { public: \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ private: \ + bool setUpSkipped = false; \ virtual void bodyMethodName() BODY_ATTR; \ virtual void TestBody() CV_OVERRIDE; \ + virtual void SetUp() CV_OVERRIDE; \ static int AddToRegistry() { \ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ GetTestCasePatternHolder(\ @@ -184,6 +204,7 @@ struct SkipThisTest : public ::testing::Test { test_name)::gtest_registering_dummy_ = \ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() BODY_IMPL( #test_case_name "_" #test_name ) \ + void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::SetUp() CV__TEST_SETUP_IMPL(test_case_name) \ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::bodyMethodName() #undef TEST_P