From 3edae09eaaa6e4b7dca9bac4c98ad23edf9d08e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Mon, 18 Oct 2021 15:45:02 +0200 Subject: [PATCH] Asset Library Service: fix failing unit test On GCC in release mode (and maybe also debug mode without ASAN enabled), allocating an `AssetLibraryService` will reuse the space that should have just been freed. This made a test fail, as it was testing that new memory was allocated and not some old instance reused. To ensure that the calls that should allocate a new block of memory return a unique pointer, I added some dummy allocation to the test. No functional changes to Blender --- .../intern/asset_library_service_test.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/source/blender/blenkernel/intern/asset_library_service_test.cc b/source/blender/blenkernel/intern/asset_library_service_test.cc index 6acbe193eb7..e2d7a7680b6 100644 --- a/source/blender/blenkernel/intern/asset_library_service_test.cc +++ b/source/blender/blenkernel/intern/asset_library_service_test.cc @@ -60,12 +60,21 @@ TEST_F(AssetLibraryServiceTest, get_destroy) << "Calling twice without destroying in between should return the same instance."; AssetLibraryService::destroy(); + + /* On GCC in release mode (and maybe also debug mode without ASAN enabled), allocating an + * #AssetLibraryService will reuse the space that should have just been freed in the above + * destroy() call. To see that the get() call below really allocates a new object, allocate a + * dummy block of memory first. */ + AssetLibraryService *dummy_pointer = new AssetLibraryService(); + EXPECT_NE(service, AssetLibraryService::get()) << "Calling twice with destroying in between should return a new instance."; /* This should not crash. */ AssetLibraryService::destroy(); AssetLibraryService::destroy(); + + delete dummy_pointer; } TEST_F(AssetLibraryServiceTest, library_pointers) @@ -80,11 +89,20 @@ TEST_F(AssetLibraryServiceTest, library_pointers) << "Calling twice without destroying in between should return the same instance."; AssetLibraryService::destroy(); + + /* On GCC in release mode (and maybe also debug mode without ASAN enabled), allocating an + * #AssetLibraryService will reuse the space that should have just been freed in the above + * destroy() call. To see that the get() call below really allocates a new object, allocate a + * dummy block of memory first. */ + AssetLibrary *dummy_pointer = new AssetLibrary(); + service = AssetLibraryService::get(); EXPECT_NE(lib, service->get_asset_library_on_disk(asset_library_root_)) << "Calling twice with destroying in between should return a new instance."; EXPECT_NE(curfile_lib, service->get_asset_library_current_file()) << "Calling twice with destroying in between should return a new instance."; + + delete dummy_pointer; } TEST_F(AssetLibraryServiceTest, catalogs_loaded)