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

Unified Diff: content/browser/browser_io_surface_manager_mac_unittest.cc

Issue 1137453002: content: Pass IOSurface references using Mach IPC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase, remove extra DCHECKs and fix reply port typo Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698