summaryrefslogtreecommitdiffstats
path: root/cc/surfaces/surface_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc/surfaces/surface_unittest.cc')
-rw-r--r--cc/surfaces/surface_unittest.cc128
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