Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(495)

Side by Side Diff: cc/surfaces/surface_unittest.cc

Issue 1304063014: cc: Plumbing for BeginFrameSource based on Surfaces (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More use-after-free. Attempt to fix mojo. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/surfaces/surface.h" 5 #include "cc/surfaces/surface.h"
6 #include "cc/surfaces/surface_factory.h" 6 #include "cc/surfaces/surface_factory.h"
7 #include "cc/surfaces/surface_factory_client.h"
7 #include "cc/surfaces/surface_manager.h" 8 #include "cc/surfaces/surface_manager.h"
9 #include "cc/test/scheduler_test_common.h"
8 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
9 #include "ui/gfx/geometry/size.h" 11 #include "ui/gfx/geometry/size.h"
10 12
11 namespace cc { 13 namespace cc {
12 namespace { 14 namespace {
13 15
16 class FakeSurfaceFactoryClient : public SurfaceFactoryClient {
17 public:
18 FakeSurfaceFactoryClient() : begin_frame_source_(nullptr) {}
19
20 void ReturnResources(const ReturnedResourceArray& resources) override {}
21
22 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {
23 begin_frame_source_ = begin_frame_source;
24 }
25
26 BeginFrameSource* begin_frame_source() { return begin_frame_source_; }
27
28 private:
29 BeginFrameSource* begin_frame_source_;
30 };
31
14 TEST(SurfaceTest, SurfaceLifetime) { 32 TEST(SurfaceTest, SurfaceLifetime) {
15 SurfaceManager manager; 33 SurfaceManager manager;
16 SurfaceFactory factory(&manager, NULL); 34 FakeSurfaceFactoryClient surface_factory_client;
35 SurfaceFactory factory(&manager, &surface_factory_client);
17 36
18 SurfaceId surface_id(6); 37 SurfaceId surface_id(6);
19 { 38 {
20 factory.Create(surface_id); 39 factory.Create(surface_id);
21 EXPECT_TRUE(manager.GetSurfaceForId(surface_id)); 40 EXPECT_TRUE(manager.GetSurfaceForId(surface_id));
22 factory.Destroy(surface_id); 41 factory.Destroy(surface_id);
23 } 42 }
24 43
25 EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id)); 44 EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id));
26 } 45 }
27 46
47 TEST(SurfaceTest, StableBeginFrameSourceIndependentOfOrderAdded) {
48 SurfaceManager manager;
49 FakeSurfaceFactoryClient surface_factory_client;
50 SurfaceFactory factory(&manager, &surface_factory_client);
51
52 SurfaceId surface_id(6);
53 factory.Create(surface_id);
54 Surface* surface = manager.GetSurfaceForId(surface_id);
55
56 FakeBeginFrameSource bfs1;
57 FakeBeginFrameSource bfs2;
58 FakeBeginFrameSource bfs3;
59
mithro-old 2015/10/01 03:00:24 This test is a bit weird, but I'm unsure how to ma
brianderson 2015/10/07 20:54:48 Given each order would also need a SurfaceFactoryC
60 // Order 1.
61 surface->AddBeginFrameSource(&bfs1);
62 surface->AddBeginFrameSource(&bfs2);
63 surface->AddBeginFrameSource(&bfs3);
64 BeginFrameSource* bfs_order1 = surface_factory_client.begin_frame_source();
65 surface->RemoveBeginFrameSource(&bfs1);
66 surface->RemoveBeginFrameSource(&bfs2);
67 surface->RemoveBeginFrameSource(&bfs3);
68
69 // Order 2.
70 surface->AddBeginFrameSource(&bfs1);
71 surface->AddBeginFrameSource(&bfs3);
72 surface->AddBeginFrameSource(&bfs2);
73 BeginFrameSource* bfs_order2 = surface_factory_client.begin_frame_source();
74 surface->RemoveBeginFrameSource(&bfs1);
75 surface->RemoveBeginFrameSource(&bfs2);
76 surface->RemoveBeginFrameSource(&bfs3);
77
78 // Order 3.
79 surface->AddBeginFrameSource(&bfs2);
80 surface->AddBeginFrameSource(&bfs1);
81 surface->AddBeginFrameSource(&bfs3);
82 BeginFrameSource* bfs_order3 = surface_factory_client.begin_frame_source();
83 surface->RemoveBeginFrameSource(&bfs1);
84 surface->RemoveBeginFrameSource(&bfs2);
85 surface->RemoveBeginFrameSource(&bfs3);
86
87 // Order 4.
88 surface->AddBeginFrameSource(&bfs2);
89 surface->AddBeginFrameSource(&bfs3);
90 surface->AddBeginFrameSource(&bfs1);
91 BeginFrameSource* bfs_order4 = surface_factory_client.begin_frame_source();
92 surface->RemoveBeginFrameSource(&bfs1);
93 surface->RemoveBeginFrameSource(&bfs2);
94 surface->RemoveBeginFrameSource(&bfs3);
95
96 // Order 5.
97 surface->AddBeginFrameSource(&bfs3);
98 surface->AddBeginFrameSource(&bfs1);
99 surface->AddBeginFrameSource(&bfs2);
100 BeginFrameSource* bfs_order5 = surface_factory_client.begin_frame_source();
101 surface->RemoveBeginFrameSource(&bfs1);
102 surface->RemoveBeginFrameSource(&bfs2);
103 surface->RemoveBeginFrameSource(&bfs3);
104
105 // Order 6.
106 surface->AddBeginFrameSource(&bfs3);
107 surface->AddBeginFrameSource(&bfs2);
108 surface->AddBeginFrameSource(&bfs1);
109 BeginFrameSource* bfs_order6 = surface_factory_client.begin_frame_source();
110 surface->RemoveBeginFrameSource(&bfs1);
111 surface->RemoveBeginFrameSource(&bfs2);
112 surface->RemoveBeginFrameSource(&bfs3);
113
114 EXPECT_NE(nullptr, bfs_order1);
mithro-old 2015/10/01 03:00:24 Should this be an ASSERT_NE?
brianderson 2015/10/07 20:54:48 nullptr could be a valid result if the surface doe
115 EXPECT_TRUE(&bfs1 == bfs_order1 || &bfs2 == bfs_order1 ||
116 &bfs3 == bfs_order1);
mithro-old 2015/10/01 03:00:24 I'm not sure what the above EXPECT_TRUE is checkin
brianderson 2015/10/07 20:54:48 Added a comment. It checks that one of the sources
117 EXPECT_EQ(bfs_order1, bfs_order2);
118 EXPECT_EQ(bfs_order2, bfs_order3);
119 EXPECT_EQ(bfs_order3, bfs_order4);
120 EXPECT_EQ(bfs_order4, bfs_order5);
121 EXPECT_EQ(bfs_order5, bfs_order6);
122 }
123
124 TEST(SurfaceTest, BeginFrameSourceRemovedOnSurfaceDestruction) {
125 SurfaceManager manager;
126 FakeSurfaceFactoryClient surface_factory_client;
127 SurfaceFactory factory(&manager, &surface_factory_client);
128 FakeBeginFrameSource bfs;
129
130 SurfaceId surface_id(6);
131 factory.Create(surface_id);
132 Surface* surface = manager.GetSurfaceForId(surface_id);
133 surface->AddBeginFrameSource(&bfs);
134
135 BeginFrameSource* bfs_before = surface_factory_client.begin_frame_source();
136 factory.Destroy(surface_id);
137 BeginFrameSource* bfs_after = surface_factory_client.begin_frame_source();
138
139 EXPECT_EQ(&bfs, bfs_before);
140 EXPECT_EQ(nullptr, bfs_after);
141 }
142
28 } // namespace 143 } // namespace
29 } // namespace cc 144 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698