Index: content/browser/browser_io_surface_manager_mac_unittest.cc |
diff --git a/content/browser/browser_io_surface_manager_mac_unittest.cc b/content/browser/browser_io_surface_manager_mac_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..07be739e7b578147e3afad6bf0fb990d4fdcf9c4 |
--- /dev/null |
+++ b/content/browser/browser_io_surface_manager_mac_unittest.cc |
@@ -0,0 +1,192 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/browser/browser_io_surface_manager_mac.h" |
+ |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace content { |
+ |
+class BrowserIOSurfaceManagerTest : public testing::Test { |
+ public: |
+ void EnsureRunning() { io_surface_manager_.EnsureRunning(); } |
+ |
+ gpu::Mailbox GetGpuProcessMailbox() const { |
+ return io_surface_manager_.GetGpuProcessMailbox(); |
+ } |
+ |
+ gpu::Mailbox GenerateChildProcessMailbox(int child_process_id) { |
+ return io_surface_manager_.GenerateChildProcessMailbox(child_process_id); |
+ } |
+ |
+ void InvalidateChildProcessMailbox(const gpu::Mailbox& mailbox) { |
+ io_surface_manager_.InvalidateChildProcessMailbox(mailbox); |
+ } |
+ |
+ bool HandleRegisterIOSurfaceRequest( |
+ const IOSurfaceManagerHostMsg_RegisterIOSurface& request, |
+ IOSurfaceManagerMsg_RegisterIOSurfaceReply* reply) { |
+ return io_surface_manager_.HandleRegisterIOSurfaceRequest(request, reply); |
+ } |
+ |
+ bool HandleUnregisterIOSurfaceRequest( |
+ const IOSurfaceManagerHostMsg_UnregisterIOSurface& request) { |
+ return io_surface_manager_.HandleUnregisterIOSurfaceRequest(request); |
+ } |
+ |
+ bool HandleAcquireIOSurfaceRequest( |
+ const IOSurfaceManagerHostMsg_AcquireIOSurface& request, |
+ IOSurfaceManagerMsg_AcquireIOSurfaceReply* reply) { |
+ return io_surface_manager_.HandleAcquireIOSurfaceRequest(request, reply); |
+ } |
+ |
+ private: |
+ BrowserIOSurfaceManager io_surface_manager_; |
+}; |
+ |
+TEST_F(BrowserIOSurfaceManagerTest, EnsureRunning) { |
+ EnsureRunning(); |
+ mach_port_t service_port = |
+ BrowserIOSurfaceManager::LookupServicePort(getpid()); |
+ EXPECT_NE(static_cast<mach_port_t>(MACH_PORT_NULL), service_port); |
+ mach_port_deallocate(mach_task_self(), service_port); |
+} |
+ |
+TEST_F(BrowserIOSurfaceManagerTest, IOSurfaceRegistration) { |
+ const int kIOSurfaceId = 1; |
+ const int kClientId = 1; |
+ |
+ gpu::Mailbox child_process_mailbox = GenerateChildProcessMailbox(kClientId); |
+ |
+ { |
+ IOSurfaceManagerHostMsg_RegisterIOSurface request = {{0}}; |
+ IOSurfaceManagerMsg_RegisterIOSurfaceReply reply = {{0}}; |
+ |
+ request.io_surface_id = kIOSurfaceId; |
+ request.client_id = kClientId; |
+ |
+ // Fails as request doesn't contain valid mailbox. |
+ EXPECT_FALSE(HandleRegisterIOSurfaceRequest(request, &reply)); |
+ |
+ memcpy(request.mailbox_name, child_process_mailbox.name, |
+ sizeof(child_process_mailbox.name)); |
+ // Fails as child process is not allowed to register IOSurfaces. |
+ EXPECT_FALSE(HandleRegisterIOSurfaceRequest(request, &reply)); |
+ |
+ gpu::Mailbox gpu_process_mailbox = GetGpuProcessMailbox(); |
+ memcpy(request.mailbox_name, gpu_process_mailbox.name, |
+ sizeof(gpu_process_mailbox.name)); |
+ EXPECT_TRUE(HandleRegisterIOSurfaceRequest(request, &reply)); |
+ EXPECT_TRUE(reply.result); |
+ } |
+ |
+ { |
+ IOSurfaceManagerHostMsg_UnregisterIOSurface request = {{0}}; |
+ |
+ request.io_surface_id = kIOSurfaceId; |
+ request.client_id = kClientId; |
+ |
+ // Fails as request doesn't contain valid GPU mailbox. |
+ EXPECT_FALSE(HandleUnregisterIOSurfaceRequest(request)); |
+ |
+ memcpy(request.mailbox_name, child_process_mailbox.name, |
+ sizeof(child_process_mailbox.name)); |
+ // Fails as child process is not allowed to unregister IOSurfaces. |
+ EXPECT_FALSE(HandleUnregisterIOSurfaceRequest(request)); |
+ |
+ gpu::Mailbox gpu_process_mailbox = GetGpuProcessMailbox(); |
+ memcpy(request.mailbox_name, gpu_process_mailbox.name, |
+ sizeof(gpu_process_mailbox.name)); |
+ EXPECT_TRUE(HandleUnregisterIOSurfaceRequest(request)); |
+ } |
+} |
+ |
+TEST_F(BrowserIOSurfaceManagerTest, AcquireIOSurface) { |
+ const int kIOSurfaceId1 = 10; |
+ const int kIOSurfaceId2 = 20; |
+ const int kClientId1 = 1; |
+ const int kClientId2 = 2; |
+ const mach_port_t kIOSurfacePortId1 = 100u; |
+ const mach_port_t kIOSurfacePortId2 = 200u; |
+ |
+ gpu::Mailbox child_process_mailbox1 = GenerateChildProcessMailbox(kClientId1); |
+ gpu::Mailbox child_process_mailbox2 = GenerateChildProcessMailbox(kClientId2); |
+ |
+ { |
+ IOSurfaceManagerHostMsg_RegisterIOSurface request = {{0}}; |
+ IOSurfaceManagerMsg_RegisterIOSurfaceReply reply = {{0}}; |
+ |
+ // Register IOSurface for use by kClientId1. |
+ request.io_surface_id = kIOSurfaceId1; |
+ request.client_id = kClientId1; |
+ request.io_surface_port.name = kIOSurfacePortId1; |
+ gpu::Mailbox gpu_process_mailbox = GetGpuProcessMailbox(); |
+ memcpy(request.mailbox_name, gpu_process_mailbox.name, |
+ sizeof(gpu_process_mailbox.name)); |
+ EXPECT_TRUE(HandleRegisterIOSurfaceRequest(request, &reply)); |
+ EXPECT_TRUE(reply.result); |
+ } |
+ |
+ { |
+ IOSurfaceManagerHostMsg_RegisterIOSurface request = {{0}}; |
+ IOSurfaceManagerMsg_RegisterIOSurfaceReply reply = {{0}}; |
+ |
+ // Register IOSurface for use by kClientId2. |
+ request.io_surface_id = kIOSurfaceId2; |
+ request.client_id = kClientId2; |
+ request.io_surface_port.name = kIOSurfacePortId2; |
+ gpu::Mailbox gpu_process_mailbox = GetGpuProcessMailbox(); |
+ memcpy(request.mailbox_name, gpu_process_mailbox.name, |
+ sizeof(gpu_process_mailbox.name)); |
+ EXPECT_TRUE(HandleRegisterIOSurfaceRequest(request, &reply)); |
+ EXPECT_TRUE(reply.result); |
+ } |
+ |
+ { |
+ IOSurfaceManagerHostMsg_AcquireIOSurface request = {{0}}; |
+ IOSurfaceManagerMsg_AcquireIOSurfaceReply reply = {{0}}; |
+ |
+ request.io_surface_id = kIOSurfaceId2; |
+ |
+ // Fails as request doesn't contain valid mailbox. |
+ EXPECT_FALSE(HandleAcquireIOSurfaceRequest(request, &reply)); |
+ |
+ memcpy(request.mailbox_name, child_process_mailbox1.name, |
+ sizeof(child_process_mailbox1.name)); |
+ // Fails as child process 1 is not allowed to acquire this IOSurface. |
+ EXPECT_FALSE(HandleAcquireIOSurfaceRequest(request, &reply)); |
+ |
+ request.io_surface_id = kIOSurfaceId1; |
+ EXPECT_TRUE(HandleAcquireIOSurfaceRequest(request, &reply)); |
+ EXPECT_EQ(kIOSurfacePortId1, reply.io_surface_port.name); |
+ } |
+ |
+ { |
+ IOSurfaceManagerHostMsg_AcquireIOSurface request = {{0}}; |
+ IOSurfaceManagerMsg_AcquireIOSurfaceReply reply = {{0}}; |
+ |
+ request.io_surface_id = kIOSurfaceId2; |
+ |
+ memcpy(request.mailbox_name, child_process_mailbox2.name, |
+ sizeof(child_process_mailbox2.name)); |
+ EXPECT_TRUE(HandleAcquireIOSurfaceRequest(request, &reply)); |
+ EXPECT_EQ(kIOSurfacePortId2, reply.io_surface_port.name); |
+ } |
+ |
+ InvalidateChildProcessMailbox(child_process_mailbox2); |
+ |
+ { |
+ IOSurfaceManagerHostMsg_AcquireIOSurface request = {{0}}; |
+ IOSurfaceManagerMsg_AcquireIOSurfaceReply reply = {{0}}; |
+ |
+ request.io_surface_id = kIOSurfaceId2; |
+ |
+ memcpy(request.mailbox_name, child_process_mailbox2.name, |
+ sizeof(child_process_mailbox2.name)); |
+ // Fails as as mailbox is no longer valid. |
+ EXPECT_FALSE(HandleAcquireIOSurfaceRequest(request, &reply)); |
+ } |
+} |
+ |
+} // namespace content |