diff options
Diffstat (limited to 'cc/surfaces/surface_unittest.cc')
-rw-r--r-- | cc/surfaces/surface_unittest.cc | 128 |
1 files changed, 127 insertions, 1 deletions
diff --git a/cc/surfaces/surface_unittest.cc b/cc/surfaces/surface_unittest.cc index 42fd55f..5a9b744 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 |