From 2ff0b24d92747d438959c6fbfb20cd8528c92842 Mon Sep 17 00:00:00 2001 From: Oleg Pipikin Date: Mon, 12 Dec 2022 19:43:30 +0100 Subject: [PATCH] Move ONNX reader tests from ieFuncTests to ov_onnx_frontend_tests (#14132) * Move ONNX reader tests from ieFuncTests to ov_onnx_frontend_tests * Fix code style Co-authored-by: Ilya Churaev --- src/frontends/onnx/tests/CMakeLists.txt | 9 +- .../onnx/tests}/lib_close.cpp | 2 +- .../onnx/tests}/model_support_tests.cpp | 19 ++-- .../onnx/tests}/models/data/tensor.data | Bin .../tests}/models/onnx_external_data.prototxt | 0 .../support_test/supported/basic.prototxt | 0 .../supported/basic_reverse_fields_order.onnx | 0 .../support_test/supported/more_fields.onnx | 0 .../supported/scrambled_keys.prototxt | 0 .../supported/varint_on_two_bytes.onnx | 0 .../unsupported/duplicate_onnx_fields.onnx | 0 .../unsupported/incorrect_onnx_field.onnx | 0 .../unsupported/no_graph_field.onnx | Bin .../unsupported/unknown_wire_type.onnx | 0 .../onnx/tests}/onnx_reader_external_data.cpp | 58 +++++----- .../onnx/tests/skip_tests_config.cpp | 17 +++ .../functional_test_utils/lib_close.hpp | 34 ++++++ .../functional_test_utils/src/lib_close.cpp | 102 ++++++++++++++++++ 18 files changed, 197 insertions(+), 44 deletions(-) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/lib_close.cpp (93%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/model_support_tests.cpp (93%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/data/tensor.data (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/onnx_external_data.prototxt (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/support_test/supported/basic.prototxt (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/support_test/supported/basic_reverse_fields_order.onnx (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/support_test/supported/more_fields.onnx (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/support_test/supported/scrambled_keys.prototxt (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/support_test/supported/varint_on_two_bytes.onnx (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/support_test/unsupported/duplicate_onnx_fields.onnx (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/support_test/unsupported/incorrect_onnx_field.onnx (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/support_test/unsupported/no_graph_field.onnx (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/models/support_test/unsupported/unknown_wire_type.onnx (100%) rename src/{tests/functional/inference_engine/onnx_reader => frontends/onnx/tests}/onnx_reader_external_data.cpp (79%) create mode 100644 src/frontends/onnx/tests/skip_tests_config.cpp create mode 100644 src/tests/ie_test_utils/functional_test_utils/include/functional_test_utils/lib_close.hpp create mode 100644 src/tests/ie_test_utils/functional_test_utils/src/lib_close.cpp diff --git a/src/frontends/onnx/tests/CMakeLists.txt b/src/frontends/onnx/tests/CMakeLists.txt index 7517505ef3e..127b49a6242 100644 --- a/src/frontends/onnx/tests/CMakeLists.txt +++ b/src/frontends/onnx/tests/CMakeLists.txt @@ -16,6 +16,7 @@ message(STATUS "ONNX frontend test enabled") add_compile_definitions( TEST_MODEL_ZOO="${TEST_MODEL_ZOO}" ONNX_MODELS_DIR="${TEST_MODEL_ZOO}/onnx" + ONNX_TEST_MODELS="${TEST_MODEL_ZOO}/onnx/" TEST_ONNX_MODELS_DIRNAME="${TEST_MODEL_ZOO}/onnx/" MANIFEST="${CMAKE_CURRENT_SOURCE_DIR}/unit_test.manifest" SERIALIZED_ZOO="${TEST_MODEL_ZOO}") @@ -90,7 +91,11 @@ set(SRC onnx_test_util.cpp onnx_transformations.cpp op_extension.cpp - telemetry.cpp) + telemetry.cpp + lib_close.cpp + model_support_tests.cpp + onnx_reader_external_data.cpp + skip_tests_config.cpp) foreach(src IN LISTS SRC MULTI_TEST_SRC) if(IS_ABSOLUTE "${src}") @@ -134,7 +139,7 @@ if(ONNX_TESTS_DEPENDENCIES) endif() target_link_libraries(ov_onnx_frontend_tests PRIVATE engines_test_util gtest_main_manifest openvino::runtime::dev - openvino_onnx_frontend onnx_common) + openvino_onnx_frontend onnx_common funcTestUtils) # It's needed by onnx_import_library.cpp and onnx_import_exceptions.cpp tests to include onnx_pb.h. # Not linking statically to libprotobuf (linked into libonnx) avoids false-failing onnx_editor tests. diff --git a/src/tests/functional/inference_engine/onnx_reader/lib_close.cpp b/src/frontends/onnx/tests/lib_close.cpp similarity index 93% rename from src/tests/functional/inference_engine/onnx_reader/lib_close.cpp rename to src/frontends/onnx/tests/lib_close.cpp index bfa1147dd9d..3191c8a06c8 100644 --- a/src/tests/functional/inference_engine/onnx_reader/lib_close.cpp +++ b/src/frontends/onnx/tests/lib_close.cpp @@ -1,7 +1,7 @@ // Copyright (C) 2018-2022 Intel Corporation // SPDX-License-Identifier: Apache-2.0 // -#include "lib_close.hpp" +#include "functional_test_utils/lib_close.hpp" #include diff --git a/src/tests/functional/inference_engine/onnx_reader/model_support_tests.cpp b/src/frontends/onnx/tests/model_support_tests.cpp similarity index 93% rename from src/tests/functional/inference_engine/onnx_reader/model_support_tests.cpp rename to src/frontends/onnx/tests/model_support_tests.cpp index 500b2104e4d..8047a4e5ea4 100644 --- a/src/tests/functional/inference_engine/onnx_reader/model_support_tests.cpp +++ b/src/frontends/onnx/tests/model_support_tests.cpp @@ -2,21 +2,22 @@ // SPDX-License-Identifier: Apache-2.0 // -#include "common_test_utils/file_utils.hpp" -#include "ie_common.h" #include -#include +#include #include +#include "common_test_utils/file_utils.hpp" +#include "ie_common.h" + namespace { - std::string model_path(const char* model) { - std::string path = ONNX_TEST_MODELS; - path += "support_test/"; - path += model; - return CommonTestUtils::getModelFromTestModelZoo(path); - } +std::string model_path(const char* model) { + std::string path = ONNX_TEST_MODELS; + path += "support_test/"; + path += model; + return CommonTestUtils::getModelFromTestModelZoo(path); } +} // namespace TEST(ONNXReader_ModelSupported, basic_model) { // this model is a basic ONNX model taken from ngraph's unit test (add_abc.onnx) diff --git a/src/tests/functional/inference_engine/onnx_reader/models/data/tensor.data b/src/frontends/onnx/tests/models/data/tensor.data similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/data/tensor.data rename to src/frontends/onnx/tests/models/data/tensor.data diff --git a/src/tests/functional/inference_engine/onnx_reader/models/onnx_external_data.prototxt b/src/frontends/onnx/tests/models/onnx_external_data.prototxt similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/onnx_external_data.prototxt rename to src/frontends/onnx/tests/models/onnx_external_data.prototxt diff --git a/src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/basic.prototxt b/src/frontends/onnx/tests/models/support_test/supported/basic.prototxt similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/basic.prototxt rename to src/frontends/onnx/tests/models/support_test/supported/basic.prototxt diff --git a/src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/basic_reverse_fields_order.onnx b/src/frontends/onnx/tests/models/support_test/supported/basic_reverse_fields_order.onnx similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/basic_reverse_fields_order.onnx rename to src/frontends/onnx/tests/models/support_test/supported/basic_reverse_fields_order.onnx diff --git a/src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/more_fields.onnx b/src/frontends/onnx/tests/models/support_test/supported/more_fields.onnx similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/more_fields.onnx rename to src/frontends/onnx/tests/models/support_test/supported/more_fields.onnx diff --git a/src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/scrambled_keys.prototxt b/src/frontends/onnx/tests/models/support_test/supported/scrambled_keys.prototxt similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/scrambled_keys.prototxt rename to src/frontends/onnx/tests/models/support_test/supported/scrambled_keys.prototxt diff --git a/src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/varint_on_two_bytes.onnx b/src/frontends/onnx/tests/models/support_test/supported/varint_on_two_bytes.onnx similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/support_test/supported/varint_on_two_bytes.onnx rename to src/frontends/onnx/tests/models/support_test/supported/varint_on_two_bytes.onnx diff --git a/src/tests/functional/inference_engine/onnx_reader/models/support_test/unsupported/duplicate_onnx_fields.onnx b/src/frontends/onnx/tests/models/support_test/unsupported/duplicate_onnx_fields.onnx similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/support_test/unsupported/duplicate_onnx_fields.onnx rename to src/frontends/onnx/tests/models/support_test/unsupported/duplicate_onnx_fields.onnx diff --git a/src/tests/functional/inference_engine/onnx_reader/models/support_test/unsupported/incorrect_onnx_field.onnx b/src/frontends/onnx/tests/models/support_test/unsupported/incorrect_onnx_field.onnx similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/support_test/unsupported/incorrect_onnx_field.onnx rename to src/frontends/onnx/tests/models/support_test/unsupported/incorrect_onnx_field.onnx diff --git a/src/tests/functional/inference_engine/onnx_reader/models/support_test/unsupported/no_graph_field.onnx b/src/frontends/onnx/tests/models/support_test/unsupported/no_graph_field.onnx similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/support_test/unsupported/no_graph_field.onnx rename to src/frontends/onnx/tests/models/support_test/unsupported/no_graph_field.onnx diff --git a/src/tests/functional/inference_engine/onnx_reader/models/support_test/unsupported/unknown_wire_type.onnx b/src/frontends/onnx/tests/models/support_test/unsupported/unknown_wire_type.onnx similarity index 100% rename from src/tests/functional/inference_engine/onnx_reader/models/support_test/unsupported/unknown_wire_type.onnx rename to src/frontends/onnx/tests/models/support_test/unsupported/unknown_wire_type.onnx diff --git a/src/tests/functional/inference_engine/onnx_reader/onnx_reader_external_data.cpp b/src/frontends/onnx/tests/onnx_reader_external_data.cpp similarity index 79% rename from src/tests/functional/inference_engine/onnx_reader/onnx_reader_external_data.cpp rename to src/frontends/onnx/tests/onnx_reader_external_data.cpp index 53a745697ef..ffdf9da0c0c 100644 --- a/src/tests/functional/inference_engine/onnx_reader/onnx_reader_external_data.cpp +++ b/src/frontends/onnx/tests/onnx_reader_external_data.cpp @@ -2,24 +2,26 @@ // SPDX-License-Identifier: Apache-2.0 // -#include -#include -#include -#include -#include - -#include -#include #include +#include +#include + +#include +#include +#include +#include +#include #include +#include + #include "common_test_utils/file_utils.hpp" #include "common_test_utils/unicode_utils.hpp" -#include TEST(ONNX_Reader_Tests, ImportModelWithExternalDataFromFile) { InferenceEngine::Core ie; - auto cnnNetwork = ie.ReadNetwork(CommonTestUtils::getModelFromTestModelZoo( - std::string(ONNX_TEST_MODELS) + "onnx_external_data.onnx"), ""); + auto cnnNetwork = ie.ReadNetwork( + CommonTestUtils::getModelFromTestModelZoo(std::string(ONNX_TEST_MODELS) + "onnx_external_data.onnx"), + ""); auto function = cnnNetwork.getFunction(); int count_additions = 0; @@ -51,27 +53,21 @@ TEST(ONNX_Reader_Tests, ImportModelWithExternalDataFromFile) { TEST(ONNX_Reader_Tests, ImportModelWithExternalDataFromStringException) { InferenceEngine::Core ie; - const auto path = CommonTestUtils::getModelFromTestModelZoo( - std::string(ONNX_TEST_MODELS) + "onnx_external_data.onnx"); - InferenceEngine::Blob::CPtr weights; // not used + const auto path = + CommonTestUtils::getModelFromTestModelZoo(std::string(ONNX_TEST_MODELS) + "onnx_external_data.onnx"); + InferenceEngine::Blob::CPtr weights; // not used std::ifstream stream(path, std::ios::binary); std::string modelAsString((std::istreambuf_iterator(stream)), std::istreambuf_iterator()); stream.close(); try { auto cnnNetwork = ie.ReadNetwork(modelAsString, weights); - } - catch(const ngraph::ngraph_error& e) { - EXPECT_PRED_FORMAT2( - testing::IsSubstring, - std::string("invalid external data:"), - e.what()); + } catch (const ngraph::ngraph_error& e) { + EXPECT_PRED_FORMAT2(testing::IsSubstring, std::string("invalid external data:"), e.what()); - EXPECT_PRED_FORMAT2( - testing::IsSubstring, - std::string("data/tensor.data, offset: 0, data_length: 0)"), - e.what()); - } - catch(...) { + EXPECT_PRED_FORMAT2(testing::IsSubstring, + std::string("data/tensor.data, offset: 0, data_length: 0)"), + e.what()); + } catch (...) { FAIL() << "Reading network failed for unexpected reason"; } } @@ -79,14 +75,12 @@ TEST(ONNX_Reader_Tests, ImportModelWithExternalDataFromStringException) { #if defined(OPENVINO_ENABLE_UNICODE_PATH_SUPPORT) && defined(_WIN32) TEST(ONNX_Reader_Tests, ImportModelWithExternalDataFromWstringNamedFile) { InferenceEngine::Core ie; - std::string win_dir_path = CommonTestUtils::getModelFromTestModelZoo( - ONNX_TEST_MODELS "onnx_external_data.onnx"); - std::wstring wmodel = CommonTestUtils::addUnicodePostfixToPath(win_dir_path, - CommonTestUtils::test_unicode_postfix_vector[0]); + std::string win_dir_path = CommonTestUtils::getModelFromTestModelZoo(ONNX_TEST_MODELS "onnx_external_data.onnx"); + std::wstring wmodel = + CommonTestUtils::addUnicodePostfixToPath(win_dir_path, CommonTestUtils::test_unicode_postfix_vector[0]); bool is_copy_successfully = CommonTestUtils::copyFile(win_dir_path, wmodel); if (!is_copy_successfully) { - FAIL() << "Unable to copy from '" << win_dir_path << "' to '" - << ov::util::wstring_to_string(wmodel) << "'"; + FAIL() << "Unable to copy from '" << win_dir_path << "' to '" << ov::util::wstring_to_string(wmodel) << "'"; } auto cnnNetwork = ie.ReadNetwork(wmodel, L""); diff --git a/src/frontends/onnx/tests/skip_tests_config.cpp b/src/frontends/onnx/tests/skip_tests_config.cpp new file mode 100644 index 00000000000..6eb55500b0d --- /dev/null +++ b/src/frontends/onnx/tests/skip_tests_config.cpp @@ -0,0 +1,17 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "functional_test_utils/skip_tests_config.hpp" + +#include +#include + +std::vector disabledTestPatterns() { + return { +#ifndef BUILD_SHARED_LIBS + // Disable tests for static libraries + ".*FrontendLibCloseTest.*" +#endif + }; +} diff --git a/src/tests/ie_test_utils/functional_test_utils/include/functional_test_utils/lib_close.hpp b/src/tests/ie_test_utils/functional_test_utils/include/functional_test_utils/lib_close.hpp new file mode 100644 index 00000000000..cedbbf5452e --- /dev/null +++ b/src/tests/ie_test_utils/functional_test_utils/include/functional_test_utils/lib_close.hpp @@ -0,0 +1,34 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include + +#include + +/** + * \brief Front end library close test parameters. + * + * \param frontend Frontend name. + * \param model_path Model file path. + * \param exp_name Tensor name in model used to get place. + */ +using FrontendLibCloseParams = std::tuple; + +/** \brief Frontend library close test fixture with parameters \ref FrontendLibCloseParams. */ +class FrontendLibCloseTest : public testing::TestWithParam { +public: + static std::string get_test_case_name(const testing::TestParamInfo& obj); + +protected: + std::string frontend; + std::string model_path; + std::string exp_name; + + void SetUp() override; +}; diff --git a/src/tests/ie_test_utils/functional_test_utils/src/lib_close.cpp b/src/tests/ie_test_utils/functional_test_utils/src/lib_close.cpp new file mode 100644 index 00000000000..65bde31226c --- /dev/null +++ b/src/tests/ie_test_utils/functional_test_utils/src/lib_close.cpp @@ -0,0 +1,102 @@ +// Copyright (C) 2018-2022 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "functional_test_utils/lib_close.hpp" + +#include "common_test_utils/file_utils.hpp" +#include "functional_test_utils/skip_tests_config.hpp" +#include "gtest/gtest.h" +#include "openvino/frontend/manager.hpp" +#include "openvino/runtime/core.hpp" +#include "openvino/util/file_util.hpp" + +using namespace testing; +using namespace ov::util; +using namespace ov::frontend; + +std::string FrontendLibCloseTest::get_test_case_name(const testing::TestParamInfo& obj) { + return std::get<0>(obj.param); +} + +void FrontendLibCloseTest::SetUp() { + SKIP_IF_CURRENT_TEST_IS_DISABLED() + std::tie(frontend, model_path, exp_name) = GetParam(); + model_path = CommonTestUtils::getModelFromTestModelZoo(model_path); +} + +/** + * \brief Delete InputModel object as last. + * + * Frontend library must close after object deletion, otherwise segfault can occur. + */ +TEST_P(FrontendLibCloseTest, testModelIsLasDeletedObject) { + InputModel::Ptr model; + { + auto fem = std::make_shared(); + auto fe = fem->load_by_framework(frontend); + model = fe->load(model_path); + } + ASSERT_NE(model, nullptr); +} + +/** \brief Frontend library must close after object deletion, otherwise segfault can occur. */ +TEST_P(FrontendLibCloseTest, testPlaceIsLastDeletedObject) { + Place::Ptr place; + { + auto fem = std::make_shared(); + auto fe = fem->load_by_framework(frontend); + auto model = fe->load(model_path); + place = model->get_place_by_tensor_name(exp_name); + } + + ASSERT_NE(place, nullptr); + EXPECT_EQ(place->get_names().at(0), exp_name); +} + +/** \brief Frontend library unload before object deletion, expecting segfault. */ +TEST_P(FrontendLibCloseTest, testUnloadLibBeforeDeletingDependentObject) { + EXPECT_DEATH( + { + Place::Ptr place; + { + auto fem = std::make_shared(); + auto fe = fem->load_by_framework(frontend); + auto model = fe->load(model_path); + place = model->get_place_by_tensor_name(exp_name); + } + + ov::shutdown(); + + ASSERT_NE(place, nullptr); + }, + ".*"); +} + +/** \brief Delete place which is created from other place instance. */ +TEST_P(FrontendLibCloseTest, testPlaceFromPlaceIsLastDeletedObject) { + Place::Ptr port_place; + { + auto fem = std::make_shared(); + auto fe = fem->load_by_framework(frontend); + auto model = fe->load(model_path); + auto tensor_place = model->get_place_by_tensor_name(exp_name); + port_place = tensor_place->get_producing_port(); + } + + ASSERT_NE(port_place, nullptr); + ASSERT_EQ(port_place->get_producing_port(), nullptr); +} + +/** \brief Delete vector of places object as last one. */ +TEST_P(FrontendLibCloseTest, testGetVectorOfPlaces) { + std::vector inputs; + { + auto fem = std::make_shared(); + auto fe = fem->load_by_framework(frontend); + auto model = fe->load(model_path); + inputs = model->get_inputs(); + } + + ASSERT_FALSE(inputs.empty()); +}