paint_preview_compositor_collection_impl_unittest.cc 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/services/paint_preview_compositor/paint_preview_compositor_collection_impl.h"
  5. #include "base/bind.h"
  6. #include "base/test/task_environment.h"
  7. #include "base/unguessable_token.h"
  8. #include "mojo/public/cpp/bindings/remote.h"
  9. #include "testing/gmock/include/gmock/gmock.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace paint_preview {
  12. namespace {
  13. base::OnceCallback<void(const std::vector<base::UnguessableToken>&)>
  14. ExpectedIdsCallbackFactory(
  15. const std::vector<base::UnguessableToken>& expected_ids) {
  16. return base::BindOnce(
  17. [](const std::vector<base::UnguessableToken>& expected_compositor_ids,
  18. const std::vector<base::UnguessableToken>& compositor_ids) {
  19. EXPECT_THAT(compositor_ids, testing::UnorderedElementsAreArray(
  20. expected_compositor_ids.begin(),
  21. expected_compositor_ids.end()));
  22. },
  23. expected_ids);
  24. }
  25. } // namespace
  26. TEST(PaintPreviewCompositorCollectionTest, TestAddCompositor) {
  27. base::test::TaskEnvironment task_environment;
  28. PaintPreviewCompositorCollectionImpl collection(mojo::NullReceiver(), false,
  29. nullptr);
  30. base::UnguessableToken token_1, token_2;
  31. ASSERT_TRUE(token_1.is_empty());
  32. ASSERT_TRUE(token_2.is_empty());
  33. auto create_cb_1 = base::BindOnce(
  34. [](base::UnguessableToken* out_token,
  35. const base::UnguessableToken& token) { *out_token = token; },
  36. base::Unretained(&token_1));
  37. auto create_cb_2 = base::BindOnce(
  38. [](base::UnguessableToken* out_token,
  39. const base::UnguessableToken& token) { *out_token = token; },
  40. base::Unretained(&token_2));
  41. {
  42. mojo::Remote<mojom::PaintPreviewCompositor> compositor_1;
  43. collection.CreateCompositor(compositor_1.BindNewPipeAndPassReceiver(),
  44. std::move(create_cb_1));
  45. EXPECT_FALSE(token_1.is_empty());
  46. EXPECT_TRUE(compositor_1.is_bound());
  47. EXPECT_TRUE(compositor_1.is_connected());
  48. collection.ListCompositors(ExpectedIdsCallbackFactory({token_1}));
  49. {
  50. mojo::Remote<mojom::PaintPreviewCompositor> compositor_2;
  51. collection.CreateCompositor(compositor_2.BindNewPipeAndPassReceiver(),
  52. std::move(create_cb_2));
  53. EXPECT_FALSE(token_2.is_empty());
  54. EXPECT_TRUE(compositor_2.is_bound());
  55. EXPECT_TRUE(compositor_2.is_connected());
  56. collection.ListCompositors(
  57. ExpectedIdsCallbackFactory({token_1, token_2}));
  58. }
  59. task_environment.RunUntilIdle();
  60. collection.ListCompositors(ExpectedIdsCallbackFactory({token_1}));
  61. }
  62. task_environment.RunUntilIdle();
  63. auto expect_empty =
  64. base::BindOnce([](const std::vector<base::UnguessableToken>& ids) {
  65. EXPECT_TRUE(ids.empty());
  66. });
  67. collection.ListCompositors(std::move(expect_empty));
  68. }
  69. TEST(PaintPreviewCompositorCollectionTest,
  70. TestCompositorRemoteOutlivesCollection) {
  71. base::test::TaskEnvironment task_environment;
  72. base::UnguessableToken token;
  73. auto create_cb = base::BindOnce(
  74. [](base::UnguessableToken* out_token,
  75. const base::UnguessableToken& token) { *out_token = token; },
  76. base::Unretained(&token));
  77. ASSERT_TRUE(token.is_empty());
  78. mojo::Remote<mojom::PaintPreviewCompositor> compositor;
  79. {
  80. PaintPreviewCompositorCollectionImpl collection(mojo::NullReceiver(), false,
  81. nullptr);
  82. collection.CreateCompositor(compositor.BindNewPipeAndPassReceiver(),
  83. std::move(create_cb));
  84. EXPECT_FALSE(token.is_empty());
  85. EXPECT_TRUE(compositor.is_bound());
  86. EXPECT_TRUE(compositor.is_connected());
  87. }
  88. task_environment.RunUntilIdle();
  89. EXPECT_TRUE(compositor.is_bound());
  90. EXPECT_FALSE(compositor.is_connected());
  91. // Ensure this doesn't crash even if the collection is out of scope (thus all
  92. // the receivers are deleted).
  93. compositor->SetRootFrameUrl(GURL("https://www.foo.com"));
  94. }
  95. TEST(PaintPreviewCompositorCollectionTest, MemoryPressure) {
  96. base::test::TaskEnvironment task_environment;
  97. base::UnguessableToken token;
  98. auto create_cb = base::BindOnce(
  99. [](base::UnguessableToken* out_token,
  100. const base::UnguessableToken& token) { *out_token = token; },
  101. base::Unretained(&token));
  102. ASSERT_TRUE(token.is_empty());
  103. mojo::Remote<mojom::PaintPreviewCompositor> compositor;
  104. {
  105. mojo::Remote<mojom::PaintPreviewCompositorCollection> collection;
  106. PaintPreviewCompositorCollectionImpl collection_instance(
  107. collection.BindNewPipeAndPassReceiver(), false, nullptr);
  108. task_environment.RunUntilIdle();
  109. EXPECT_TRUE(collection.is_bound());
  110. EXPECT_TRUE(collection.is_connected());
  111. // Moderate will just purge caches. They aren't needed as urgently.
  112. collection_instance.OnMemoryPressure(
  113. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
  114. task_environment.RunUntilIdle();
  115. EXPECT_TRUE(collection.is_bound());
  116. EXPECT_TRUE(collection.is_connected());
  117. // Critial will not kill process as browser side will do this.
  118. collection_instance.OnMemoryPressure(
  119. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  120. task_environment.RunUntilIdle();
  121. EXPECT_TRUE(collection.is_bound());
  122. EXPECT_TRUE(collection.is_connected());
  123. }
  124. task_environment.RunUntilIdle();
  125. }
  126. } // namespace paint_preview