| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | #include "base/macros.h" | 
 | #include "base/message_loop/message_loop.h" | 
 | #include "base/trace_event/memory_dump_manager.h" | 
 | #include "base/trace_event/process_memory_dump.h" | 
 | #include "cc/resources/ui_resource_bitmap.h" | 
 | #include "cc/resources/ui_resource_manager.h" | 
 | #include "cc/test/stub_layer_tree_host_client.h" | 
 | #include "cc/test/test_task_graph_runner.h" | 
 | #include "testing/gmock/include/gmock/gmock.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 | #include "third_party/skia/include/core/SkBitmap.h" | 
 | #include "third_party/skia/include/core/SkCanvas.h" | 
 | #include "ui/android/resources/resource_manager_impl.h" | 
 | #include "ui/android/resources/system_ui_resource_type.h" | 
 | #include "ui/android/window_android.h" | 
 | #include "ui/gfx/android/java_bitmap.h" | 
 |  | 
 |  | 
 | using ::testing::_; | 
 | using ::testing::AtLeast; | 
 | using ::testing::DoAll; | 
 | using ::testing::InSequence; | 
 | using ::testing::Invoke; | 
 | using ::testing::MatcherCast; | 
 | using ::testing::Mock; | 
 | using ::testing::Pointee; | 
 | using ::testing::Return; | 
 | using ::testing::SaveArg; | 
 | using ::testing::SetArrayArgument; | 
 | using ::testing::SetArgPointee; | 
 | using ::testing::StrEq; | 
 | using ::testing::StrictMock; | 
 |  | 
 | namespace ui { | 
 |  | 
 | class TestResourceManagerImpl : public ResourceManagerImpl { | 
 |  public: | 
 |   TestResourceManagerImpl(WindowAndroid* window_android) | 
 |       : ResourceManagerImpl(window_android) {} | 
 |  | 
 |   ~TestResourceManagerImpl() override {} | 
 |  | 
 |   void SetResourceAsLoaded(AndroidResourceType res_type, int res_id) { | 
 |     SkBitmap small_bitmap; | 
 |     SkCanvas canvas(small_bitmap); | 
 |     small_bitmap.allocPixels( | 
 |         SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType)); | 
 |     canvas.drawColor(SK_ColorWHITE); | 
 |     small_bitmap.setImmutable(); | 
 |  | 
 |     OnResourceReady(nullptr, nullptr, res_type, res_id, | 
 |                     gfx::ConvertToJavaBitmap(&small_bitmap), | 
 |                     reinterpret_cast<intptr_t>(new Resource())); | 
 |   } | 
 |  | 
 |  protected: | 
 |   void PreloadResourceFromJava(AndroidResourceType res_type, | 
 |                                int res_id) override {} | 
 |  | 
 |   void RequestResourceFromJava(AndroidResourceType res_type, | 
 |                                int res_id) override { | 
 |     SetResourceAsLoaded(res_type, res_id); | 
 |   } | 
 | }; | 
 |  | 
 | namespace { | 
 |  | 
 | const ui::SystemUIResourceType kTestResourceType = ui::OVERSCROLL_GLOW; | 
 |  | 
 | class MockUIResourceManager : public cc::UIResourceManager { | 
 |  public: | 
 |   MockUIResourceManager() {} | 
 |  | 
 |   MOCK_METHOD1(CreateUIResource, cc::UIResourceId(cc::UIResourceClient*)); | 
 |   MOCK_METHOD1(DeleteUIResource, void(cc::UIResourceId)); | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(MockUIResourceManager); | 
 | }; | 
 |  | 
 | }  // namespace | 
 |  | 
 | class ResourceManagerTest : public testing::Test { | 
 |  public: | 
 |   ResourceManagerTest() | 
 |       : window_android_(WindowAndroid::CreateForTesting()), | 
 |         resource_manager_(window_android_) { | 
 |     resource_manager_.Init(&ui_resource_manager_); | 
 |   } | 
 |  | 
 |   ~ResourceManagerTest() override { | 
 |     window_android_->Destroy(nullptr, nullptr); | 
 |   } | 
 |  | 
 |   void PreloadResource(ui::SystemUIResourceType type) { | 
 |     resource_manager_.PreloadResource(ui::ANDROID_RESOURCE_TYPE_SYSTEM, type); | 
 |   } | 
 |  | 
 |   cc::UIResourceId GetUIResourceId(ui::SystemUIResourceType type) { | 
 |     return resource_manager_.GetUIResourceId(ui::ANDROID_RESOURCE_TYPE_SYSTEM, | 
 |                                              type); | 
 |   } | 
 |  | 
 |   void SetResourceAsLoaded(ui::SystemUIResourceType type) { | 
 |     resource_manager_.SetResourceAsLoaded(ui::ANDROID_RESOURCE_TYPE_SYSTEM, | 
 |                                           type); | 
 |   } | 
 |  | 
 |  private: | 
 |   base::MessageLoop message_loop_; | 
 |   WindowAndroid* window_android_; | 
 |  | 
 |  protected: | 
 |   MockUIResourceManager ui_resource_manager_; | 
 |   TestResourceManagerImpl resource_manager_; | 
 |   cc::StubLayerTreeHostClient stub_client_; | 
 | }; | 
 |  | 
 | TEST_F(ResourceManagerTest, GetResource) { | 
 |   const cc::UIResourceId kResourceId = 99; | 
 |   EXPECT_CALL(ui_resource_manager_, CreateUIResource(_)) | 
 |       .WillOnce(Return(kResourceId)) | 
 |       .RetiresOnSaturation(); | 
 |   EXPECT_EQ(kResourceId, GetUIResourceId(kTestResourceType)); | 
 | } | 
 |  | 
 | TEST_F(ResourceManagerTest, PreloadEnsureResource) { | 
 |   const cc::UIResourceId kResourceId = 99; | 
 |   PreloadResource(kTestResourceType); | 
 |   EXPECT_CALL(ui_resource_manager_, CreateUIResource(_)) | 
 |       .WillOnce(Return(kResourceId)) | 
 |       .RetiresOnSaturation(); | 
 |   SetResourceAsLoaded(kTestResourceType); | 
 |   EXPECT_EQ(kResourceId, GetUIResourceId(kTestResourceType)); | 
 | } | 
 |  | 
 | TEST_F(ResourceManagerTest, TestOnMemoryDumpEmitsData) { | 
 |   SetResourceAsLoaded(kTestResourceType); | 
 |  | 
 |   base::trace_event::MemoryDumpArgs dump_args = { | 
 |       base::trace_event::MemoryDumpLevelOfDetail::DETAILED}; | 
 |   std::unique_ptr<base::trace_event::ProcessMemoryDump> process_memory_dump = | 
 |       std::make_unique<base::trace_event::ProcessMemoryDump>(dump_args); | 
 |   resource_manager_.OnMemoryDump(dump_args, process_memory_dump.get()); | 
 |   const auto& allocator_dumps = process_memory_dump->allocator_dumps(); | 
 |   const char* system_allocator_pool_name = | 
 |       base::trace_event::MemoryDumpManager::GetInstance() | 
 |           ->system_allocator_pool_name(); | 
 |   size_t kExpectedDumpCount = 10; | 
 |   EXPECT_EQ(kExpectedDumpCount, allocator_dumps.size()); | 
 |   for (const auto& dump : allocator_dumps) { | 
 |     ASSERT_TRUE(dump.first.find("ui/resource_manager") == 0 || | 
 |                 dump.first.find(system_allocator_pool_name) == 0); | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace ui |