diff options
Diffstat (limited to 'ipc/ipdl/test/gtest/TestMultiMgrs.cpp')
-rw-r--r-- | ipc/ipdl/test/gtest/TestMultiMgrs.cpp | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/ipc/ipdl/test/gtest/TestMultiMgrs.cpp b/ipc/ipdl/test/gtest/TestMultiMgrs.cpp new file mode 100644 index 0000000000..06dac581f3 --- /dev/null +++ b/ipc/ipdl/test/gtest/TestMultiMgrs.cpp @@ -0,0 +1,202 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=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/. */ + +/* + * Test a chain of managers, ensuring ownership is maintained correctly. + */ + +#include "gtest/gtest.h" + +#include "mozilla/_ipdltest/IPDLUnitTest.h" +#include "mozilla/_ipdltest/PTestMultiMgrsChild.h" +#include "mozilla/_ipdltest/PTestMultiMgrsParent.h" +#include "mozilla/_ipdltest/PTestMultiMgrsLeftChild.h" +#include "mozilla/_ipdltest/PTestMultiMgrsLeftParent.h" +#include "mozilla/_ipdltest/PTestMultiMgrsRightChild.h" +#include "mozilla/_ipdltest/PTestMultiMgrsRightParent.h" +#include "mozilla/_ipdltest/PTestMultiMgrsBottomChild.h" +#include "mozilla/_ipdltest/PTestMultiMgrsBottomParent.h" + +#include <algorithm> + +using namespace mozilla::ipc; + +namespace mozilla::_ipdltest { + +class TestMultiMgrsBottomParent : public PTestMultiMgrsBottomParent { + NS_INLINE_DECL_REFCOUNTING(TestMultiMgrsBottomParent, override) + private: + ~TestMultiMgrsBottomParent() = default; +}; + +class TestMultiMgrsBottomChild : public PTestMultiMgrsBottomChild { + NS_INLINE_DECL_REFCOUNTING(TestMultiMgrsBottomChild, override) + private: + ~TestMultiMgrsBottomChild() = default; +}; + +class TestMultiMgrsChild : public PTestMultiMgrsChild { + NS_INLINE_DECL_REFCOUNTING(TestMultiMgrsChild, override) + public: + PTestMultiMgrsBottomChild* mBottomL = nullptr; + PTestMultiMgrsBottomChild* mBottomR = nullptr; + + private: + already_AddRefed<PTestMultiMgrsLeftChild> AllocPTestMultiMgrsLeftChild() + final override; + + already_AddRefed<PTestMultiMgrsRightChild> AllocPTestMultiMgrsRightChild() + final override; + + IPCResult RecvCheck() final override; + + ~TestMultiMgrsChild() = default; +}; + +class TestMultiMgrsLeftParent : public PTestMultiMgrsLeftParent { + NS_INLINE_DECL_REFCOUNTING(TestMultiMgrsLeftParent, override) + public: + bool HasChild(PTestMultiMgrsBottomParent* c) { + const auto& managed = ManagedPTestMultiMgrsBottomParent(); + return std::find(managed.begin(), managed.end(), c) != managed.end(); + } + + private: + ~TestMultiMgrsLeftParent() = default; +}; + +class TestMultiMgrsLeftChild : public PTestMultiMgrsLeftChild { + NS_INLINE_DECL_REFCOUNTING(TestMultiMgrsLeftChild, override) + public: + bool HasChild(PTestMultiMgrsBottomChild* c) { + const auto& managed = ManagedPTestMultiMgrsBottomChild(); + return std::find(managed.begin(), managed.end(), c) != managed.end(); + } + + private: + already_AddRefed<PTestMultiMgrsBottomChild> AllocPTestMultiMgrsBottomChild() + final override { + return MakeAndAddRef<TestMultiMgrsBottomChild>(); + } + + IPCResult RecvPTestMultiMgrsBottomConstructor( + PTestMultiMgrsBottomChild* actor) final override { + static_cast<TestMultiMgrsChild*>(Manager())->mBottomL = actor; + return IPC_OK(); + } + + ~TestMultiMgrsLeftChild() = default; +}; + +class TestMultiMgrsRightParent : public PTestMultiMgrsRightParent { + NS_INLINE_DECL_REFCOUNTING(TestMultiMgrsRightParent, override) + public: + bool HasChild(PTestMultiMgrsBottomParent* c) { + const auto& managed = ManagedPTestMultiMgrsBottomParent(); + return std::find(managed.begin(), managed.end(), c) != managed.end(); + } + + private: + ~TestMultiMgrsRightParent() = default; +}; + +class TestMultiMgrsRightChild : public PTestMultiMgrsRightChild { + NS_INLINE_DECL_REFCOUNTING(TestMultiMgrsRightChild, override) + public: + bool HasChild(PTestMultiMgrsBottomChild* c) { + const auto& managed = ManagedPTestMultiMgrsBottomChild(); + return std::find(managed.begin(), managed.end(), c) != managed.end(); + } + + private: + already_AddRefed<PTestMultiMgrsBottomChild> AllocPTestMultiMgrsBottomChild() + final override { + return MakeAndAddRef<TestMultiMgrsBottomChild>(); + } + + IPCResult RecvPTestMultiMgrsBottomConstructor( + PTestMultiMgrsBottomChild* actor) final override { + static_cast<TestMultiMgrsChild*>(Manager())->mBottomR = actor; + return IPC_OK(); + } + + ~TestMultiMgrsRightChild() = default; +}; + +class TestMultiMgrsParent : public PTestMultiMgrsParent { + NS_INLINE_DECL_REFCOUNTING(TestMultiMgrsParent, override) + private: + IPCResult RecvOK() final override { + Close(); + return IPC_OK(); + } + + ~TestMultiMgrsParent() = default; +}; + +already_AddRefed<PTestMultiMgrsLeftChild> +TestMultiMgrsChild::AllocPTestMultiMgrsLeftChild() { + return MakeAndAddRef<TestMultiMgrsLeftChild>(); +} + +already_AddRefed<PTestMultiMgrsRightChild> +TestMultiMgrsChild::AllocPTestMultiMgrsRightChild() { + return MakeAndAddRef<TestMultiMgrsRightChild>(); +} + +IPCResult TestMultiMgrsChild::RecvCheck() { + EXPECT_EQ(ManagedPTestMultiMgrsLeftChild().Count(), (uint32_t)1) + << "where's leftie?"; + EXPECT_EQ(ManagedPTestMultiMgrsRightChild().Count(), (uint32_t)1) + << "where's rightie?"; + + TestMultiMgrsLeftChild* leftie = static_cast<TestMultiMgrsLeftChild*>( + LoneManagedOrNullAsserts(ManagedPTestMultiMgrsLeftChild())); + TestMultiMgrsRightChild* rightie = static_cast<TestMultiMgrsRightChild*>( + LoneManagedOrNullAsserts(ManagedPTestMultiMgrsRightChild())); + + EXPECT_TRUE(leftie->HasChild(mBottomL)) + << "leftie didn't have a child it was supposed to!"; + EXPECT_FALSE(leftie->HasChild(mBottomR)) << "leftie had rightie's child!"; + + EXPECT_TRUE(rightie->HasChild(mBottomR)) + << "rightie didn't have a child it was supposed to!"; + EXPECT_FALSE(rightie->HasChild(mBottomL)) << "rightie had leftie's child!"; + + EXPECT_TRUE(SendOK()) << "couldn't send OK()"; + + return IPC_OK(); +} + +IPDL_TEST(TestMultiMgrs) { + auto leftie = MakeRefPtr<TestMultiMgrsLeftParent>(); + EXPECT_TRUE(mActor->SendPTestMultiMgrsLeftConstructor(leftie)) + << "error sending ctor"; + + auto rightie = MakeRefPtr<TestMultiMgrsRightParent>(); + EXPECT_TRUE(mActor->SendPTestMultiMgrsRightConstructor(rightie)) + << "error sending ctor"; + + auto bottomL = MakeRefPtr<TestMultiMgrsBottomParent>(); + EXPECT_TRUE(leftie->SendPTestMultiMgrsBottomConstructor(bottomL)) + << "error sending ctor"; + + auto bottomR = MakeRefPtr<TestMultiMgrsBottomParent>(); + EXPECT_TRUE(rightie->SendPTestMultiMgrsBottomConstructor(bottomR)) + << "error sending ctor"; + + EXPECT_TRUE(leftie->HasChild(bottomL)) + << "leftie didn't have a child it was supposed to!"; + EXPECT_FALSE(leftie->HasChild(bottomR)) << "leftie had rightie's child!"; + + EXPECT_TRUE(rightie->HasChild(bottomR)) + << "rightie didn't have a child it was supposed to!"; + EXPECT_FALSE(rightie->HasChild(bottomL)) << "rightie had rightie's child!"; + + EXPECT_TRUE(mActor->SendCheck()) << "couldn't kick off the child-side check"; +} + +} // namespace mozilla::_ipdltest |