Index: cc/surfaces/surface_unittest.cc |
diff --git a/cc/surfaces/surface_unittest.cc b/cc/surfaces/surface_unittest.cc |
index 42fd55f4a03a9b3ebb0ca67aab8d3c49cb05bce6..5a9b744fd75dc320129d0be30ac106f4673fb65f 100644 |
--- a/cc/surfaces/surface_unittest.cc |
+++ b/cc/surfaces/surface_unittest.cc |
@@ -4,16 +4,36 @@ |
#include "cc/surfaces/surface.h" |
#include "cc/surfaces/surface_factory.h" |
+#include "cc/surfaces/surface_factory_client.h" |
#include "cc/surfaces/surface_manager.h" |
+#include "cc/test/scheduler_test_common.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/gfx/geometry/size.h" |
namespace cc { |
namespace { |
+class FakeSurfaceFactoryClient : public SurfaceFactoryClient { |
+ public: |
+ FakeSurfaceFactoryClient() : begin_frame_source_(nullptr) {} |
+ |
+ void ReturnResources(const ReturnedResourceArray& resources) override {} |
+ |
+ void SetBeginFrameSource(SurfaceId surface_id, |
+ BeginFrameSource* begin_frame_source) override { |
+ begin_frame_source_ = begin_frame_source; |
+ } |
+ |
+ BeginFrameSource* begin_frame_source() { return begin_frame_source_; } |
+ |
+ private: |
+ BeginFrameSource* begin_frame_source_; |
+}; |
+ |
TEST(SurfaceTest, SurfaceLifetime) { |
SurfaceManager manager; |
- SurfaceFactory factory(&manager, NULL); |
+ FakeSurfaceFactoryClient surface_factory_client; |
+ SurfaceFactory factory(&manager, &surface_factory_client); |
SurfaceId surface_id(6); |
{ |
@@ -25,5 +45,111 @@ TEST(SurfaceTest, SurfaceLifetime) { |
EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id)); |
} |
+TEST(SurfaceTest, StableBeginFrameSourceIndependentOfOrderAdded) { |
+ SurfaceManager manager; |
+ FakeSurfaceFactoryClient surface_factory_client; |
+ SurfaceFactory factory(&manager, &surface_factory_client); |
+ |
+ SurfaceId surface_id(6); |
+ factory.Create(surface_id); |
+ Surface* surface = manager.GetSurfaceForId(surface_id); |
+ |
+ FakeBeginFrameSource bfs1; |
+ FakeBeginFrameSource bfs2; |
+ FakeBeginFrameSource bfs3; |
+ |
+ // Order 1. |
+ surface->AddBeginFrameSource(&bfs1); |
+ surface->AddBeginFrameSource(&bfs2); |
+ surface->AddBeginFrameSource(&bfs3); |
+ BeginFrameSource* bfs_order1 = surface_factory_client.begin_frame_source(); |
+ // Make sure one of the provided sources was chosen. |
+ EXPECT_TRUE(&bfs1 == bfs_order1 || &bfs2 == bfs_order1 || |
+ &bfs3 == bfs_order1); |
+ surface->RemoveBeginFrameSource(&bfs1); |
+ surface->RemoveBeginFrameSource(&bfs2); |
+ surface->RemoveBeginFrameSource(&bfs3); |
+ EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source()); |
+ |
+ // Order 2. |
+ surface->AddBeginFrameSource(&bfs1); |
+ surface->AddBeginFrameSource(&bfs3); |
+ surface->AddBeginFrameSource(&bfs2); |
+ BeginFrameSource* bfs_order2 = surface_factory_client.begin_frame_source(); |
+ // Verify choice is same as before. |
+ EXPECT_EQ(bfs_order1, bfs_order2); |
+ surface->RemoveBeginFrameSource(&bfs1); |
+ surface->RemoveBeginFrameSource(&bfs2); |
+ surface->RemoveBeginFrameSource(&bfs3); |
+ EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source()); |
+ |
+ // Order 3. |
+ surface->AddBeginFrameSource(&bfs2); |
+ surface->AddBeginFrameSource(&bfs1); |
+ surface->AddBeginFrameSource(&bfs3); |
+ BeginFrameSource* bfs_order3 = surface_factory_client.begin_frame_source(); |
+ // Verify choice is same as before. |
+ EXPECT_EQ(bfs_order2, bfs_order3); |
+ surface->RemoveBeginFrameSource(&bfs1); |
+ surface->RemoveBeginFrameSource(&bfs2); |
+ surface->RemoveBeginFrameSource(&bfs3); |
+ EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source()); |
+ |
+ // Order 4. |
+ surface->AddBeginFrameSource(&bfs2); |
+ surface->AddBeginFrameSource(&bfs3); |
+ surface->AddBeginFrameSource(&bfs1); |
+ BeginFrameSource* bfs_order4 = surface_factory_client.begin_frame_source(); |
+ // Verify choice is same as before. |
+ EXPECT_EQ(bfs_order3, bfs_order4); |
+ surface->RemoveBeginFrameSource(&bfs1); |
+ surface->RemoveBeginFrameSource(&bfs2); |
+ surface->RemoveBeginFrameSource(&bfs3); |
+ EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source()); |
+ |
+ // Order 5. |
+ surface->AddBeginFrameSource(&bfs3); |
+ surface->AddBeginFrameSource(&bfs1); |
+ surface->AddBeginFrameSource(&bfs2); |
+ BeginFrameSource* bfs_order5 = surface_factory_client.begin_frame_source(); |
+ // Verify choice is same as before. |
+ EXPECT_EQ(bfs_order4, bfs_order5); |
+ surface->RemoveBeginFrameSource(&bfs1); |
+ surface->RemoveBeginFrameSource(&bfs2); |
+ surface->RemoveBeginFrameSource(&bfs3); |
+ EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source()); |
+ |
+ // Order 6. |
+ surface->AddBeginFrameSource(&bfs3); |
+ surface->AddBeginFrameSource(&bfs2); |
+ surface->AddBeginFrameSource(&bfs1); |
+ BeginFrameSource* bfs_order6 = surface_factory_client.begin_frame_source(); |
+ // Verify choice is same as before. |
+ EXPECT_EQ(bfs_order5, bfs_order6); |
+ surface->RemoveBeginFrameSource(&bfs1); |
+ surface->RemoveBeginFrameSource(&bfs2); |
+ surface->RemoveBeginFrameSource(&bfs3); |
+ EXPECT_EQ(nullptr, surface_factory_client.begin_frame_source()); |
+} |
+ |
+TEST(SurfaceTest, BeginFrameSourceRemovedOnSurfaceDestruction) { |
+ SurfaceManager manager; |
+ FakeSurfaceFactoryClient surface_factory_client; |
+ SurfaceFactory factory(&manager, &surface_factory_client); |
+ FakeBeginFrameSource bfs; |
+ |
+ SurfaceId surface_id(6); |
+ factory.Create(surface_id); |
+ Surface* surface = manager.GetSurfaceForId(surface_id); |
+ surface->AddBeginFrameSource(&bfs); |
+ |
+ BeginFrameSource* bfs_before = surface_factory_client.begin_frame_source(); |
+ factory.Destroy(surface_id); |
+ BeginFrameSource* bfs_after = surface_factory_client.begin_frame_source(); |
+ |
+ EXPECT_EQ(&bfs, bfs_before); |
+ EXPECT_EQ(nullptr, bfs_after); |
+} |
+ |
} // namespace |
} // namespace cc |