Skip to content

Commit

Permalink
Bug 1500219: Part 2 - Test UniquePtr integration with IPDL (r=jld)
Browse files Browse the repository at this point in the history
Tests that pass UniquePtrs in IPDL messages.

Depends on D9143

Differential Revision: https://phabricator.services.mozilla.com/D9144

--HG--
extra : moz-landing-system : lando
  • Loading branch information
David Parks committed Oct 24, 2018
1 parent 737cd42 commit 41d439e
Show file tree
Hide file tree
Showing 4 changed files with 184 additions and 0 deletions.
23 changes: 23 additions & 0 deletions ipc/ipdl/test/cxx/PTestUniquePtrIPC.ipdl
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

namespace mozilla {
namespace _ipdltest {

struct DummyStruct {
int x;
};

protocol PTestUniquePtrIPC
{
child:
async TestMessage(UniquePtr<int> a1, UniquePtr<DummyStruct> a2,
DummyStruct a3, UniquePtr<int> a4);
async TestSendReference(UniquePtr<DummyStruct> a);
};

}
}
88 changes: 88 additions & 0 deletions ipc/ipdl/test/cxx/TestUniquePtrIPC.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "TestUniquePtrIPC.h"

namespace mozilla {
namespace _ipdltest {

// ---------------------------------------------------------------------------
// PARENT PROCESS
// ---------------------------------------------------------------------------

void
TestUniquePtrIPCParent::Main()
{
UniquePtr<int> a1 = MakeUnique<int>(1);
UniquePtr<DummyStruct> a2 = MakeUnique<DummyStruct>(2);
DummyStruct a3(3);
UniquePtr<int> a4;

if (!SendTestMessage(std::move(a1), std::move(a2), a3, std::move(a4))) {
fail("failed sending UniquePtr items");
}

if (a1 || a2) {
fail("did not move TestMessage items in parent");
}

if (a4) {
fail("somehow turned null ptr into non-null by sending it");
}

// Pass UniquePtr by reference
UniquePtr<DummyStruct> b = MakeUnique<DummyStruct>(1);

if (!SendTestSendReference(b)) {
fail("failed sending UniquePtr by reference");
}
if (b) {
fail("did not move UniquePtr sent by reference");
}
}

// ---------------------------------------------------------------------------
// CHILD PROCESS
// ---------------------------------------------------------------------------

mozilla::ipc::IPCResult
TestUniquePtrIPCChild::RecvTestMessage(UniquePtr<int>&& aA1,
UniquePtr<DummyStruct>&& aA2,
const DummyStruct& aA3,
UniquePtr<int>&& aA4)
{
if ((!aA1) || (!aA2)) {
fail("TestMessage received NULL items in child");
}

if (aA4) {
fail("TestMessage received non-NULL when expecting NULL");
}

if ((*aA1 != 1) || (aA2->x() != 2) || (aA3.x() != 3)) {
fail("TestMessage received incorrect items in child");
}

return IPC_OK();
}

mozilla::ipc::IPCResult
TestUniquePtrIPCChild::RecvTestSendReference(UniquePtr<DummyStruct>&& aA)
{
if (!aA) {
fail("TestSendReference received NULL item in child");
}

if (*aA != 1) {
fail("TestSendReference received incorrect item in child");
}

Close();
return IPC_OK();
}


} // namespace _ipdltest
} // namespace mozilla
71 changes: 71 additions & 0 deletions ipc/ipdl/test/cxx/TestUniquePtrIPC.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_TestUniquePtrIPC_h
#define mozilla_TestUniquePtrIPC_h

#include "mozilla/_ipdltest/IPDLUnitTests.h"

#include "mozilla/_ipdltest/PTestUniquePtrIPCParent.h"
#include "mozilla/_ipdltest/PTestUniquePtrIPCChild.h"

namespace mozilla {
namespace _ipdltest {

class TestUniquePtrIPCParent :
public PTestUniquePtrIPCParent
{
public:
TestUniquePtrIPCParent() { MOZ_COUNT_CTOR(TestUniquePtrIPCParent); }
virtual ~TestUniquePtrIPCParent() { MOZ_COUNT_DTOR(TestUniquePtrIPCParent); }

static bool RunTestInProcesses() { return true; }
static bool RunTestInThreads() { return false; }

void Main();

bool ShouldContinueFromReplyTimeout() override
{
return false;
}

virtual void ActorDestroy(ActorDestroyReason why) override
{
if (NormalShutdown != why) {
fail("Abnormal shutdown of parent");
}
passed("ok");
QuitParent();
}
};


class TestUniquePtrIPCChild :
public PTestUniquePtrIPCChild
{
public:
TestUniquePtrIPCChild() { MOZ_COUNT_CTOR(TestUniquePtrIPCChild); }
virtual ~TestUniquePtrIPCChild() { MOZ_COUNT_DTOR(TestUniquePtrIPCChild); }

mozilla::ipc::IPCResult
RecvTestMessage(UniquePtr<int>&& aA1, UniquePtr<DummyStruct>&& aA2,
const DummyStruct& aA3, UniquePtr<int>&& aA4) override;

mozilla::ipc::IPCResult
RecvTestSendReference(UniquePtr<DummyStruct>&& aA) override;

virtual void ActorDestroy(ActorDestroyReason why) override
{
if (NormalShutdown != why) {
fail("Abnormal shutdown of child");
}
QuitChild();
}
};

} // namespace _ipdltest
} // namespace mozilla

#endif // mozilla_TestUniquePtrIPC_h
2 changes: 2 additions & 0 deletions ipc/ipdl/test/cxx/moz.build
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ SOURCES += [
'TestSyncError.cpp',
'TestSyncHang.cpp',
'TestSyncWakeup.cpp',
'TestUniquePtrIPC.cpp',
'TestUrgency.cpp',
'TestUrgentHangs.cpp',
]
Expand Down Expand Up @@ -123,6 +124,7 @@ IPDL_SOURCES += [
'PTestSyncError.ipdl',
'PTestSyncHang.ipdl',
'PTestSyncWakeup.ipdl',
'PTestUniquePtrIPC.ipdl',
'PTestUrgency.ipdl',
'PTestUrgentHangs.ipdl',
]
Expand Down

0 comments on commit 41d439e

Please sign in to comment.