1 // Copyright 2015 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.
5 #include "content/browser/browser_io_surface_manager_mac.h"
7 #include "testing/gtest/include/gtest/gtest.h"
11 class BrowserIOSurfaceManagerTest
: public testing::Test
{
13 void EnsureRunning() { io_surface_manager_
.EnsureRunning(); }
15 IOSurfaceManagerToken
GetGpuProcessToken() const {
16 return io_surface_manager_
.GetGpuProcessToken();
19 IOSurfaceManagerToken
GenerateChildProcessToken(int child_process_id
) {
20 return io_surface_manager_
.GenerateChildProcessToken(child_process_id
);
23 void InvalidateChildProcessToken(const IOSurfaceManagerToken
& token
) {
24 io_surface_manager_
.InvalidateChildProcessToken(token
);
27 bool HandleRegisterIOSurfaceRequest(
28 const IOSurfaceManagerHostMsg_RegisterIOSurface
& request
,
29 IOSurfaceManagerMsg_RegisterIOSurfaceReply
* reply
) {
30 return io_surface_manager_
.HandleRegisterIOSurfaceRequest(request
, reply
);
33 bool HandleUnregisterIOSurfaceRequest(
34 const IOSurfaceManagerHostMsg_UnregisterIOSurface
& request
) {
35 return io_surface_manager_
.HandleUnregisterIOSurfaceRequest(request
);
38 bool HandleAcquireIOSurfaceRequest(
39 const IOSurfaceManagerHostMsg_AcquireIOSurface
& request
,
40 IOSurfaceManagerMsg_AcquireIOSurfaceReply
* reply
) {
41 return io_surface_manager_
.HandleAcquireIOSurfaceRequest(request
, reply
);
44 // Helper function used to register an IOSurface for testing.
45 void RegisterIOSurface(int io_surface_id
,
47 mach_port_t io_surface_port
) {
48 IOSurfaceManagerToken gpu_process_token
= GetGpuProcessToken();
49 IOSurfaceManagerHostMsg_RegisterIOSurface request
= {{0}};
50 IOSurfaceManagerMsg_RegisterIOSurfaceReply reply
= {{0}};
51 request
.io_surface_id
= io_surface_id
;
52 request
.client_id
= client_id
;
53 request
.io_surface_port
.name
= io_surface_port
;
54 memcpy(request
.token_name
, gpu_process_token
.name
,
55 sizeof(gpu_process_token
.name
));
56 ASSERT_TRUE(HandleRegisterIOSurfaceRequest(request
, &reply
));
57 ASSERT_TRUE(reply
.result
);
61 BrowserIOSurfaceManager io_surface_manager_
;
64 TEST_F(BrowserIOSurfaceManagerTest
, EnsureRunning
) {
66 base::mac::ScopedMachSendRight service_port
=
67 BrowserIOSurfaceManager::LookupServicePort(getpid());
68 EXPECT_TRUE(service_port
.is_valid());
71 TEST_F(BrowserIOSurfaceManagerTest
, RegisterIOSurfaceSucceeds
) {
72 const int kIOSurfaceId
= 1;
73 const int kClientId
= 1;
75 IOSurfaceManagerToken gpu_process_token
= GetGpuProcessToken();
77 IOSurfaceManagerHostMsg_RegisterIOSurface request
= {{0}};
78 IOSurfaceManagerMsg_RegisterIOSurfaceReply reply
= {{0}};
80 request
.io_surface_id
= kIOSurfaceId
;
81 request
.client_id
= kClientId
;
82 memcpy(request
.token_name
, gpu_process_token
.name
,
83 sizeof(gpu_process_token
.name
));
84 EXPECT_TRUE(HandleRegisterIOSurfaceRequest(request
, &reply
));
85 EXPECT_TRUE(reply
.result
);
88 TEST_F(BrowserIOSurfaceManagerTest
, RegisterIOSurfaceFailsWithInvalidToken
) {
89 const int kIOSurfaceId
= 1;
90 const int kClientId
= 1;
92 IOSurfaceManagerHostMsg_RegisterIOSurface request
= {{0}};
93 IOSurfaceManagerMsg_RegisterIOSurfaceReply reply
= {{0}};
94 request
.io_surface_id
= kIOSurfaceId
;
95 request
.client_id
= kClientId
;
96 // Fails as request doesn't contain a valid token.
97 EXPECT_FALSE(HandleRegisterIOSurfaceRequest(request
, &reply
));
100 TEST_F(BrowserIOSurfaceManagerTest
,
101 RegisterIOSurfaceFailsWithChildProcessToken
) {
102 const int kIOSurfaceId
= 1;
103 const int kClientId
= 1;
105 IOSurfaceManagerToken child_process_token
=
106 GenerateChildProcessToken(kClientId
);
108 IOSurfaceManagerHostMsg_RegisterIOSurface request
= {{0}};
109 IOSurfaceManagerMsg_RegisterIOSurfaceReply reply
= {{0}};
110 request
.io_surface_id
= kIOSurfaceId
;
111 request
.client_id
= kClientId
;
112 memcpy(request
.token_name
, child_process_token
.name
,
113 sizeof(child_process_token
.name
));
114 // Fails as child process is not allowed to register IOSurfaces.
115 EXPECT_FALSE(HandleRegisterIOSurfaceRequest(request
, &reply
));
118 TEST_F(BrowserIOSurfaceManagerTest
, UnregisterIOSurfaceSucceeds
) {
119 const int kIOSurfaceId
= 1;
120 const int kClientId
= 1;
122 IOSurfaceManagerToken gpu_process_token
= GetGpuProcessToken();
124 RegisterIOSurface(kIOSurfaceId
, kClientId
, 0);
126 IOSurfaceManagerHostMsg_UnregisterIOSurface request
= {{0}};
127 request
.io_surface_id
= kIOSurfaceId
;
128 request
.client_id
= kClientId
;
129 memcpy(request
.token_name
, gpu_process_token
.name
,
130 sizeof(gpu_process_token
.name
));
131 EXPECT_TRUE(HandleUnregisterIOSurfaceRequest(request
));
134 TEST_F(BrowserIOSurfaceManagerTest
, UnregisterIOSurfaceFailsWithInvalidToken
) {
135 const int kIOSurfaceId
= 1;
136 const int kClientId
= 1;
138 RegisterIOSurface(kIOSurfaceId
, kClientId
, 0);
140 IOSurfaceManagerHostMsg_UnregisterIOSurface request
= {{0}};
141 request
.io_surface_id
= kIOSurfaceId
;
142 request
.client_id
= kClientId
;
143 // Fails as request doesn't contain valid GPU token.
144 EXPECT_FALSE(HandleUnregisterIOSurfaceRequest(request
));
147 TEST_F(BrowserIOSurfaceManagerTest
,
148 UnregisterIOSurfaceFailsWithChildProcessToken
) {
149 const int kIOSurfaceId
= 1;
150 const int kClientId
= 1;
152 IOSurfaceManagerToken child_process_token
=
153 GenerateChildProcessToken(kClientId
);
155 RegisterIOSurface(kIOSurfaceId
, kClientId
, 0);
157 IOSurfaceManagerHostMsg_UnregisterIOSurface request
= {{0}};
158 request
.io_surface_id
= kIOSurfaceId
;
159 request
.client_id
= kClientId
;
160 memcpy(request
.token_name
, child_process_token
.name
,
161 sizeof(child_process_token
.name
));
162 // Fails as child process is not allowed to unregister IOSurfaces.
163 EXPECT_FALSE(HandleUnregisterIOSurfaceRequest(request
));
166 TEST_F(BrowserIOSurfaceManagerTest
, AcquireIOSurfaceSucceeds
) {
167 const int kIOSurfaceId
= 10;
168 const int kClientId
= 1;
169 const mach_port_t kIOSurfacePortId
= 100u;
171 IOSurfaceManagerToken child_process_token
=
172 GenerateChildProcessToken(kClientId
);
174 RegisterIOSurface(kIOSurfaceId
, kClientId
, kIOSurfacePortId
);
176 IOSurfaceManagerHostMsg_AcquireIOSurface request
= {{0}};
177 IOSurfaceManagerMsg_AcquireIOSurfaceReply reply
= {{0}};
178 request
.io_surface_id
= kIOSurfaceId
;
179 memcpy(request
.token_name
, child_process_token
.name
,
180 sizeof(child_process_token
.name
));
181 EXPECT_TRUE(HandleAcquireIOSurfaceRequest(request
, &reply
));
182 EXPECT_EQ(kIOSurfacePortId
, reply
.io_surface_port
.name
);
185 TEST_F(BrowserIOSurfaceManagerTest
, AcquireIOSurfaceFailsWithInvalidToken
) {
186 const int kIOSurfaceId
= 10;
187 const int kClientId
= 1;
188 const mach_port_t kIOSurfacePortId
= 100u;
190 RegisterIOSurface(kIOSurfaceId
, kClientId
, kIOSurfacePortId
);
192 IOSurfaceManagerHostMsg_AcquireIOSurface request
= {{0}};
193 IOSurfaceManagerMsg_AcquireIOSurfaceReply reply
= {{0}};
194 request
.io_surface_id
= kIOSurfaceId
;
195 // Fails as request doesn't contain valid token.
196 EXPECT_FALSE(HandleAcquireIOSurfaceRequest(request
, &reply
));
199 TEST_F(BrowserIOSurfaceManagerTest
,
200 AcquireIOSurfaceFailsWithWrongChildProcessToken
) {
201 const int kIOSurfaceId
= 10;
202 const int kClientId1
= 1;
203 const int kClientId2
= 2;
204 const mach_port_t kIOSurfacePortId
= 100u;
206 IOSurfaceManagerToken child_process_token2
=
207 GenerateChildProcessToken(kClientId2
);
209 RegisterIOSurface(kIOSurfaceId
, kClientId1
, kIOSurfacePortId
);
211 IOSurfaceManagerHostMsg_AcquireIOSurface request
= {{0}};
212 IOSurfaceManagerMsg_AcquireIOSurfaceReply reply
= {{0}};
213 request
.io_surface_id
= kIOSurfaceId
;
214 memcpy(request
.token_name
, child_process_token2
.name
,
215 sizeof(child_process_token2
.name
));
216 // Fails as child process 2 is not allowed to acquire this IOSurface.
217 EXPECT_FALSE(HandleAcquireIOSurfaceRequest(request
, &reply
));
220 TEST_F(BrowserIOSurfaceManagerTest
,
221 AcquireIOSurfaceFailsAfterInvalidatingChildProcessToken
) {
222 const int kIOSurfaceId
= 10;
223 const int kClientId
= 1;
224 const mach_port_t kIOSurfacePortId
= 100u;
226 IOSurfaceManagerToken child_process_token
=
227 GenerateChildProcessToken(kClientId
);
229 RegisterIOSurface(kIOSurfaceId
, kClientId
, kIOSurfacePortId
);
231 InvalidateChildProcessToken(child_process_token
);
233 IOSurfaceManagerHostMsg_AcquireIOSurface request
= {{0}};
234 IOSurfaceManagerMsg_AcquireIOSurfaceReply reply
= {{0}};
235 request
.io_surface_id
= kIOSurfaceId
;
236 memcpy(request
.token_name
, child_process_token
.name
,
237 sizeof(child_process_token
.name
));
238 // Fails as token is no longer valid.
239 EXPECT_FALSE(HandleAcquireIOSurfaceRequest(request
, &reply
));
242 } // namespace content