From f5f0830ba8af2c3ec063bc9e86125a0330ac9841 Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Tue, 23 Apr 2019 09:42:31 +0200 Subject: [core] Add unit test for ImageManager::reduceMemoryUsage --- test/renderer/image_manager.test.cpp | 61 +++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/test/renderer/image_manager.test.cpp b/test/renderer/image_manager.test.cpp index 51b257094a..a5fffce479 100644 --- a/test/renderer/image_manager.test.cpp +++ b/test/renderer/image_manager.test.cpp @@ -164,8 +164,10 @@ TEST(ImageManager, NotifiesRequestorImmediatelyIfDependenciesAreSatisfied) { class StubImageManagerObserver : public ImageManagerObserver { public: int count = 0; - virtual void onStyleImageMissing(const std::string&, std::function done) override { + std::function imageMissing = [](const std::string&){}; + virtual void onStyleImageMissing(const std::string& id, std::function done) override { count++; + imageMissing(id); done(); } }; @@ -234,3 +236,60 @@ TEST(ImageManager, OnStyleImageMissingAfterSpriteLoaded) { EXPECT_EQ(observer.count, 1); ASSERT_TRUE(notified); } + +TEST(ImageManager, ReduceMemoryUsage) { + ImageManager imageManager; + StubImageManagerObserver observer; + + observer.imageMissing = [&imageManager] (const std::string& id) { + imageManager.addImage(makeMutable(id, PremultipliedImage({ 16, 16 }), 1)); + }; + + imageManager.setObserver(&observer); + imageManager.setLoaded(true); + + // Single requestor + { + std::unique_ptr requestor = std::make_unique(imageManager); + imageManager.getImages(*requestor, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 0ull)); + EXPECT_EQ(observer.count, 1); + ASSERT_FALSE(imageManager.getImage("missing") == nullptr); + } + + // Reduce memory usage and check that unused image was deleted. + imageManager.reduceMemoryUse(); + ASSERT_TRUE(imageManager.getImage("missing") == nullptr); + + // Multiple requestors + { + std::unique_ptr requestor1 = std::make_unique(imageManager); + std::unique_ptr requestor2 = std::make_unique(imageManager); + imageManager.getImages(*requestor1, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 0ull)); + imageManager.getImages(*requestor2, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 1ull)); + EXPECT_EQ(observer.count, 2); + ASSERT_FALSE(imageManager.getImage("missing") == nullptr); + } + + // Reduce memory usage and check that unused image was deleted when all requestors are destructed. + imageManager.reduceMemoryUse(); + ASSERT_TRUE(imageManager.getImage("missing") == nullptr); + + // Multiple requestors, check that image resource is not destroyed if there is at least 1 requestor that uses it. + std::unique_ptr requestor = std::make_unique(imageManager); + { + std::unique_ptr requestor1 = std::make_unique(imageManager); + imageManager.getImages(*requestor, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 0ull)); + imageManager.getImages(*requestor1, std::make_pair(ImageDependencies{{"missing", ImageType::Icon}}, 1ull)); + EXPECT_EQ(observer.count, 3); + ASSERT_FALSE(imageManager.getImage("missing") == nullptr); + } + + // Reduce memory usage and check that requested image is not destructed. + imageManager.reduceMemoryUse(); + ASSERT_FALSE(imageManager.getImage("missing") == nullptr); + + // Release last requestor and check if resource was released after reduceMemoryUse(). + requestor.reset(); + imageManager.reduceMemoryUse(); + ASSERT_TRUE(imageManager.getImage("missing") == nullptr); +} -- cgit v1.2.1