OLD | NEW |
(Empty) | |
| 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. |
| 4 |
| 5 #include "content/browser/browser_io_surface_manager_mac.h" |
| 6 |
| 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 |
| 9 namespace content { |
| 10 |
| 11 class BrowserIOSurfaceManagerTest : public testing::Test { |
| 12 public: |
| 13 void EnsureRunning() { io_surface_manager_.EnsureRunning(); } |
| 14 |
| 15 IOSurfaceManagerToken GetGpuProcessToken() const { |
| 16 return io_surface_manager_.GetGpuProcessToken(); |
| 17 } |
| 18 |
| 19 IOSurfaceManagerToken GenerateChildProcessToken(int child_process_id) { |
| 20 return io_surface_manager_.GenerateChildProcessToken(child_process_id); |
| 21 } |
| 22 |
| 23 void InvalidateChildProcessToken(const IOSurfaceManagerToken& token) { |
| 24 io_surface_manager_.InvalidateChildProcessToken(token); |
| 25 } |
| 26 |
| 27 bool HandleRegisterIOSurfaceRequest( |
| 28 const IOSurfaceManagerHostMsg_RegisterIOSurface& request, |
| 29 IOSurfaceManagerMsg_RegisterIOSurfaceReply* reply) { |
| 30 return io_surface_manager_.HandleRegisterIOSurfaceRequest(request, reply); |
| 31 } |
| 32 |
| 33 bool HandleUnregisterIOSurfaceRequest( |
| 34 const IOSurfaceManagerHostMsg_UnregisterIOSurface& request) { |
| 35 return io_surface_manager_.HandleUnregisterIOSurfaceRequest(request); |
| 36 } |
| 37 |
| 38 bool HandleAcquireIOSurfaceRequest( |
| 39 const IOSurfaceManagerHostMsg_AcquireIOSurface& request, |
| 40 IOSurfaceManagerMsg_AcquireIOSurfaceReply* reply) { |
| 41 return io_surface_manager_.HandleAcquireIOSurfaceRequest(request, reply); |
| 42 } |
| 43 |
| 44 private: |
| 45 BrowserIOSurfaceManager io_surface_manager_; |
| 46 }; |
| 47 |
| 48 TEST_F(BrowserIOSurfaceManagerTest, EnsureRunning) { |
| 49 EnsureRunning(); |
| 50 base::mac::ScopedMachSendRight service_port = |
| 51 BrowserIOSurfaceManager::LookupServicePort(getpid()); |
| 52 EXPECT_TRUE(service_port.is_valid()); |
| 53 } |
| 54 |
| 55 TEST_F(BrowserIOSurfaceManagerTest, RegisterIOSurface) { |
| 56 const int kIOSurfaceId = 1; |
| 57 const int kClientId = 1; |
| 58 |
| 59 IOSurfaceManagerToken child_process_token = |
| 60 GenerateChildProcessToken(kClientId); |
| 61 |
| 62 IOSurfaceManagerHostMsg_RegisterIOSurface request = {{0}}; |
| 63 IOSurfaceManagerMsg_RegisterIOSurfaceReply reply = {{0}}; |
| 64 |
| 65 request.io_surface_id = kIOSurfaceId; |
| 66 request.client_id = kClientId; |
| 67 |
| 68 // Fails as request doesn't contain valid token. |
| 69 EXPECT_FALSE(HandleRegisterIOSurfaceRequest(request, &reply)); |
| 70 |
| 71 memcpy(request.token_name, child_process_token.name, |
| 72 sizeof(child_process_token.name)); |
| 73 // Fails as child process is not allowed to register IOSurfaces. |
| 74 EXPECT_FALSE(HandleRegisterIOSurfaceRequest(request, &reply)); |
| 75 |
| 76 IOSurfaceManagerToken gpu_process_token = GetGpuProcessToken(); |
| 77 memcpy(request.token_name, gpu_process_token.name, |
| 78 sizeof(gpu_process_token.name)); |
| 79 EXPECT_TRUE(HandleRegisterIOSurfaceRequest(request, &reply)); |
| 80 EXPECT_TRUE(reply.result); |
| 81 } |
| 82 |
| 83 TEST_F(BrowserIOSurfaceManagerTest, UnregisterIOSurface) { |
| 84 const int kIOSurfaceId = 1; |
| 85 const int kClientId = 1; |
| 86 |
| 87 IOSurfaceManagerToken child_process_token = |
| 88 GenerateChildProcessToken(kClientId); |
| 89 |
| 90 { |
| 91 IOSurfaceManagerHostMsg_RegisterIOSurface request = {{0}}; |
| 92 IOSurfaceManagerMsg_RegisterIOSurfaceReply reply = {{0}}; |
| 93 |
| 94 // Register IOSurface for use by kClientId. |
| 95 request.io_surface_id = kIOSurfaceId; |
| 96 request.client_id = kClientId; |
| 97 IOSurfaceManagerToken gpu_process_token = GetGpuProcessToken(); |
| 98 memcpy(request.token_name, gpu_process_token.name, |
| 99 sizeof(gpu_process_token.name)); |
| 100 EXPECT_TRUE(HandleRegisterIOSurfaceRequest(request, &reply)); |
| 101 EXPECT_TRUE(reply.result); |
| 102 } |
| 103 |
| 104 { |
| 105 IOSurfaceManagerHostMsg_UnregisterIOSurface request = {{0}}; |
| 106 |
| 107 request.io_surface_id = kIOSurfaceId; |
| 108 request.client_id = kClientId; |
| 109 |
| 110 // Fails as request doesn't contain valid GPU token. |
| 111 EXPECT_FALSE(HandleUnregisterIOSurfaceRequest(request)); |
| 112 |
| 113 memcpy(request.token_name, child_process_token.name, |
| 114 sizeof(child_process_token.name)); |
| 115 // Fails as child process is not allowed to unregister IOSurfaces. |
| 116 EXPECT_FALSE(HandleUnregisterIOSurfaceRequest(request)); |
| 117 |
| 118 IOSurfaceManagerToken gpu_process_token = GetGpuProcessToken(); |
| 119 memcpy(request.token_name, gpu_process_token.name, |
| 120 sizeof(gpu_process_token.name)); |
| 121 EXPECT_TRUE(HandleUnregisterIOSurfaceRequest(request)); |
| 122 } |
| 123 } |
| 124 |
| 125 TEST_F(BrowserIOSurfaceManagerTest, AcquireIOSurface) { |
| 126 const int kIOSurfaceId1 = 10; |
| 127 const int kIOSurfaceId2 = 20; |
| 128 const int kClientId1 = 1; |
| 129 const int kClientId2 = 2; |
| 130 const mach_port_t kIOSurfacePortId1 = 100u; |
| 131 const mach_port_t kIOSurfacePortId2 = 200u; |
| 132 |
| 133 IOSurfaceManagerToken child_process_token1 = |
| 134 GenerateChildProcessToken(kClientId1); |
| 135 IOSurfaceManagerToken child_process_token2 = |
| 136 GenerateChildProcessToken(kClientId2); |
| 137 |
| 138 { |
| 139 IOSurfaceManagerHostMsg_RegisterIOSurface request = {{0}}; |
| 140 IOSurfaceManagerMsg_RegisterIOSurfaceReply reply = {{0}}; |
| 141 |
| 142 // Register IOSurface for use by kClientId1. |
| 143 request.io_surface_id = kIOSurfaceId1; |
| 144 request.client_id = kClientId1; |
| 145 request.io_surface_port.name = kIOSurfacePortId1; |
| 146 IOSurfaceManagerToken gpu_process_token = GetGpuProcessToken(); |
| 147 memcpy(request.token_name, gpu_process_token.name, |
| 148 sizeof(gpu_process_token.name)); |
| 149 EXPECT_TRUE(HandleRegisterIOSurfaceRequest(request, &reply)); |
| 150 EXPECT_TRUE(reply.result); |
| 151 } |
| 152 |
| 153 { |
| 154 IOSurfaceManagerHostMsg_RegisterIOSurface request = {{0}}; |
| 155 IOSurfaceManagerMsg_RegisterIOSurfaceReply reply = {{0}}; |
| 156 |
| 157 // Register IOSurface for use by kClientId2. |
| 158 request.io_surface_id = kIOSurfaceId2; |
| 159 request.client_id = kClientId2; |
| 160 request.io_surface_port.name = kIOSurfacePortId2; |
| 161 IOSurfaceManagerToken gpu_process_token = GetGpuProcessToken(); |
| 162 memcpy(request.token_name, gpu_process_token.name, |
| 163 sizeof(gpu_process_token.name)); |
| 164 EXPECT_TRUE(HandleRegisterIOSurfaceRequest(request, &reply)); |
| 165 EXPECT_TRUE(reply.result); |
| 166 } |
| 167 |
| 168 { |
| 169 IOSurfaceManagerHostMsg_AcquireIOSurface request = {{0}}; |
| 170 IOSurfaceManagerMsg_AcquireIOSurfaceReply reply = {{0}}; |
| 171 |
| 172 request.io_surface_id = kIOSurfaceId2; |
| 173 |
| 174 // Fails as request doesn't contain valid token. |
| 175 EXPECT_FALSE(HandleAcquireIOSurfaceRequest(request, &reply)); |
| 176 |
| 177 memcpy(request.token_name, child_process_token1.name, |
| 178 sizeof(child_process_token1.name)); |
| 179 // Fails as child process 1 is not allowed to acquire this IOSurface. |
| 180 EXPECT_FALSE(HandleAcquireIOSurfaceRequest(request, &reply)); |
| 181 |
| 182 request.io_surface_id = kIOSurfaceId1; |
| 183 EXPECT_TRUE(HandleAcquireIOSurfaceRequest(request, &reply)); |
| 184 EXPECT_EQ(kIOSurfacePortId1, reply.io_surface_port.name); |
| 185 } |
| 186 |
| 187 { |
| 188 IOSurfaceManagerHostMsg_AcquireIOSurface request = {{0}}; |
| 189 IOSurfaceManagerMsg_AcquireIOSurfaceReply reply = {{0}}; |
| 190 |
| 191 request.io_surface_id = kIOSurfaceId2; |
| 192 |
| 193 memcpy(request.token_name, child_process_token2.name, |
| 194 sizeof(child_process_token2.name)); |
| 195 EXPECT_TRUE(HandleAcquireIOSurfaceRequest(request, &reply)); |
| 196 EXPECT_EQ(kIOSurfacePortId2, reply.io_surface_port.name); |
| 197 } |
| 198 |
| 199 InvalidateChildProcessToken(child_process_token2); |
| 200 |
| 201 { |
| 202 IOSurfaceManagerHostMsg_AcquireIOSurface request = {{0}}; |
| 203 IOSurfaceManagerMsg_AcquireIOSurfaceReply reply = {{0}}; |
| 204 |
| 205 request.io_surface_id = kIOSurfaceId2; |
| 206 |
| 207 memcpy(request.token_name, child_process_token2.name, |
| 208 sizeof(child_process_token2.name)); |
| 209 // Fails as as token is no longer valid. |
| 210 EXPECT_FALSE(HandleAcquireIOSurfaceRequest(request, &reply)); |
| 211 } |
| 212 } |
| 213 |
| 214 } // namespace content |
OLD | NEW |