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
This commit is contained in:
Sybren A. Stüvel 2021-10-18 15:45:02 +02:00
parent 729b2d026d
commit 3edae09eaa
1 changed files with 18 additions and 0 deletions

View File

@ -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)