summaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:14:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:14:29 +0000
commitfbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8 (patch)
tree4c1ccaf5486d4f2009f9a338a98a83e886e29c97 /ipc
parentReleasing progress-linux version 124.0.1-1~progress7.99u1. (diff)
downloadfirefox-fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8.tar.xz
firefox-fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8.zip
Merging upstream version 125.0.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ipc')
-rw-r--r--ipc/chromium/moz.build37
-rw-r--r--ipc/chromium/src/base/message_pump_mac.h20
-rw-r--r--ipc/chromium/src/base/message_pump_mac.mm27
-rw-r--r--ipc/chromium/src/base/process_util_ios.cpp17
-rw-r--r--ipc/chromium/src/base/process_util_posix.cc2
-rw-r--r--ipc/chromium/src/chrome/common/ipc_message.h1
-rw-r--r--ipc/chromium/src/chrome/common/mach_ipc_mac.h1
-rw-r--r--ipc/chromium/src/mojo/core/ports/node.cc2
-rw-r--r--ipc/chromium/src/third_party/libeventcommon.mozbuild37
-rw-r--r--ipc/chromium/src/third_party/moz.build8
-rw-r--r--ipc/docs/processes.rst3
-rw-r--r--ipc/glue/BackgroundChildImpl.cpp5
-rw-r--r--ipc/glue/BackgroundParentImpl.cpp14
-rw-r--r--ipc/glue/BackgroundParentImpl.h7
-rw-r--r--ipc/glue/CrashReporterHost.cpp25
-rw-r--r--ipc/glue/CrashReporterHost.h8
-rw-r--r--ipc/glue/EnumSerializer.h8
-rw-r--r--ipc/glue/ForkServiceChild.cpp6
-rw-r--r--ipc/glue/ForkServiceChild.h6
-rw-r--r--ipc/glue/GeckoChildProcessHost.cpp122
-rw-r--r--ipc/glue/IPCStreamUtils.cpp2
-rw-r--r--ipc/glue/MessageChannel.cpp11
-rw-r--r--ipc/glue/MessageChannel.h5
-rw-r--r--ipc/glue/MessageLink.cpp10
-rw-r--r--ipc/glue/NodeChannel.cpp10
-rw-r--r--ipc/glue/PBackground.ipdl3
-rw-r--r--ipc/glue/PUtilityAudioDecoder.ipdl1
-rw-r--r--ipc/glue/PUtilityProcess.ipdl4
-rw-r--r--ipc/glue/ProcessChild.cpp10
-rw-r--r--ipc/glue/ProcessChild.h9
-rw-r--r--ipc/glue/ProtocolUtils.cpp19
-rw-r--r--ipc/glue/ProtocolUtils.h7
-rw-r--r--ipc/glue/UtilityAudioDecoder.cpp4
-rw-r--r--ipc/glue/UtilityAudioDecoderChild.cpp54
-rw-r--r--ipc/glue/UtilityAudioDecoderChild.h32
-rw-r--r--ipc/glue/UtilityAudioDecoderParent.cpp26
-rw-r--r--ipc/glue/UtilityAudioDecoderParent.h4
-rw-r--r--ipc/glue/UtilityProcessChild.cpp6
-rw-r--r--ipc/glue/UtilityProcessChild.h3
-rw-r--r--ipc/glue/UtilityProcessHost.cpp4
-rw-r--r--ipc/glue/UtilityProcessManager.cpp8
-rw-r--r--ipc/glue/UtilityProcessManager.h3
-rw-r--r--ipc/glue/UtilityProcessParent.cpp2
-rw-r--r--ipc/glue/moz.build2
-rw-r--r--ipc/glue/test/browser/browser_audio_fallback.toml7
-rw-r--r--ipc/glue/test/browser/browser_audio_fallback_content.toml3
-rw-r--r--ipc/glue/test/browser/browser_audio_locked.toml3
-rw-r--r--ipc/glue/test/browser/browser_audio_shutdown.toml3
-rw-r--r--ipc/glue/test/browser/browser_child_hang.js2
-rw-r--r--ipc/glue/test/browser/browser_utility_audioDecodeCrash.js2
-rw-r--r--ipc/glue/test/browser/browser_utility_audio_shutdown.js8
-rw-r--r--ipc/glue/test/browser/browser_utility_filepicker_crashed.js13
-rw-r--r--ipc/glue/test/browser/browser_utility_memoryReport.js19
-rw-r--r--ipc/glue/test/browser/head.js32
-rw-r--r--ipc/glue/test/browser/mochitest_audio_off.toml7
-rw-r--r--ipc/glue/test/browser/mochitest_audio_on.toml7
-rw-r--r--ipc/glue/test/gtest/TestUtilityProcessSandboxing.cpp6
-rw-r--r--ipc/glue/test/utility_process_xpcom/UtilityProcessTest.cpp27
-rw-r--r--ipc/ipdl/ipdl.py25
-rw-r--r--ipc/ipdl/ipdl/__init__.py2
-rw-r--r--ipc/ipdl/ipdl/ast.py16
-rw-r--r--ipc/ipdl/ipdl/cgen.py6
-rw-r--r--ipc/ipdl/ipdl/lower.py40
-rw-r--r--ipc/ipdl/ipdl/type.py4
-rw-r--r--ipc/ipdl/sync-messages.ini90
-rw-r--r--ipc/ipdl/test/cxx/PTestActorPunning.ipdl28
-rw-r--r--ipc/ipdl/test/cxx/PTestActorPunningPunned.ipdl18
-rw-r--r--ipc/ipdl/test/cxx/PTestActorPunningSub.ipdl19
-rw-r--r--ipc/ipdl/test/cxx/PTestBadActor.ipdl21
-rw-r--r--ipc/ipdl/test/cxx/PTestBadActorSub.ipdl20
-rw-r--r--ipc/ipdl/test/cxx/PTestCancel.ipdl39
-rw-r--r--ipc/ipdl/test/cxx/PTestCrashCleanup.ipdl20
-rw-r--r--ipc/ipdl/test/cxx/PTestDataStructuresSub.ipdl18
-rw-r--r--ipc/ipdl/test/cxx/PTestDemon.ipdl24
-rw-r--r--ipc/ipdl/test/cxx/PTestDesc.ipdl24
-rw-r--r--ipc/ipdl/test/cxx/PTestDescSub.ipdl21
-rw-r--r--ipc/ipdl/test/cxx/PTestDescSubsub.ipdl18
-rw-r--r--ipc/ipdl/test/cxx/PTestEndpointBridgeMain.ipdl25
-rw-r--r--ipc/ipdl/test/cxx/PTestEndpointBridgeMainSub.ipdl28
-rw-r--r--ipc/ipdl/test/cxx/PTestEndpointBridgeSub.ipdl25
-rw-r--r--ipc/ipdl/test/cxx/PTestEndpointOpens.ipdl22
-rw-r--r--ipc/ipdl/test/cxx/PTestEndpointOpensOpened.ipdl25
-rw-r--r--ipc/ipdl/test/cxx/PTestFailedCtor.ipdl17
-rw-r--r--ipc/ipdl/test/cxx/PTestFailedCtorSub.ipdl21
-rw-r--r--ipc/ipdl/test/cxx/PTestFailedCtorSubsub.ipdl18
-rw-r--r--ipc/ipdl/test/cxx/PTestHangs.ipdl22
-rw-r--r--ipc/ipdl/test/cxx/PTestHighestPrio.ipdl21
-rw-r--r--ipc/ipdl/test/cxx/PTestInterruptErrorCleanup.ipdl14
-rw-r--r--ipc/ipdl/test/cxx/PTestInterruptRaces.ipdl27
-rw-r--r--ipc/ipdl/test/cxx/PTestInterruptShutdownRace.ipdl19
-rw-r--r--ipc/ipdl/test/cxx/PTestLatency.ipdl28
-rw-r--r--ipc/ipdl/test/cxx/PTestNestedLoops.ipdl22
-rw-r--r--ipc/ipdl/test/cxx/PTestRPC.ipdl24
-rw-r--r--ipc/ipdl/test/cxx/PTestRaceDeadlock.ipdl23
-rw-r--r--ipc/ipdl/test/cxx/PTestRaceDeferral.ipdl22
-rw-r--r--ipc/ipdl/test/cxx/PTestRacyInterruptReplies.ipdl20
-rw-r--r--ipc/ipdl/test/cxx/PTestRacyReentry.ipdl23
-rw-r--r--ipc/ipdl/test/cxx/PTestRacyUndefer.ipdl30
-rw-r--r--ipc/ipdl/test/cxx/PTestSanity.ipdl21
-rw-r--r--ipc/ipdl/test/cxx/PTestShutdown.ipdl29
-rw-r--r--ipc/ipdl/test/cxx/PTestShutdownSub.ipdl23
-rw-r--r--ipc/ipdl/test/cxx/PTestShutdownSubsub.ipdl17
-rw-r--r--ipc/ipdl/test/cxx/PTestStackHooks.ipdl28
-rw-r--r--ipc/ipdl/test/cxx/PTestSyncHang.ipdl16
-rw-r--r--ipc/ipdl/test/cxx/PTestSyncWakeup.ipdl23
-rw-r--r--ipc/ipdl/test/cxx/PTestUniquePtrIPC.ipdl26
-rw-r--r--ipc/ipdl/test/cxx/PTestUrgentHangs.ipdl31
-rw-r--r--ipc/ipdl/test/cxx/TestActorPunning.cpp125
-rw-r--r--ipc/ipdl/test/cxx/TestActorPunning.h100
-rw-r--r--ipc/ipdl/test/cxx/TestAsyncReturns.cpp101
-rw-r--r--ipc/ipdl/test/cxx/TestAsyncReturns.h54
-rw-r--r--ipc/ipdl/test/cxx/TestBadActor.cpp59
-rw-r--r--ipc/ipdl/test/cxx/TestBadActor.h84
-rw-r--r--ipc/ipdl/test/cxx/TestCancel.cpp115
-rw-r--r--ipc/ipdl/test/cxx/TestCancel.h54
-rw-r--r--ipc/ipdl/test/cxx/TestCrashCleanup.cpp100
-rw-r--r--ipc/ipdl/test/cxx/TestCrashCleanup.h49
-rw-r--r--ipc/ipdl/test/cxx/TestDataStructures.cpp888
-rw-r--r--ipc/ipdl/test/cxx/TestDataStructures.h180
-rw-r--r--ipc/ipdl/test/cxx/TestDemon.cpp362
-rw-r--r--ipc/ipdl/test/cxx/TestDemon.h91
-rw-r--r--ipc/ipdl/test/cxx/TestDesc.cpp78
-rw-r--r--ipc/ipdl/test/cxx/TestDesc.h115
-rw-r--r--ipc/ipdl/test/cxx/TestEndpointBridgeMain.cpp226
-rw-r--r--ipc/ipdl/test/cxx/TestEndpointBridgeMain.h132
-rw-r--r--ipc/ipdl/test/cxx/TestEndpointOpens.cpp242
-rw-r--r--ipc/ipdl/test/cxx/TestEndpointOpens.h102
-rw-r--r--ipc/ipdl/test/cxx/TestFailedCtor.cpp112
-rw-r--r--ipc/ipdl/test/cxx/TestFailedCtor.h127
-rw-r--r--ipc/ipdl/test/cxx/TestHangs.cpp127
-rw-r--r--ipc/ipdl/test/cxx/TestHangs.h75
-rw-r--r--ipc/ipdl/test/cxx/TestHighestPrio.cpp91
-rw-r--r--ipc/ipdl/test/cxx/TestHighestPrio.h55
-rw-r--r--ipc/ipdl/test/cxx/TestInterruptErrorCleanup.cpp138
-rw-r--r--ipc/ipdl/test/cxx/TestInterruptErrorCleanup.h52
-rw-r--r--ipc/ipdl/test/cxx/TestInterruptRaces.cpp169
-rw-r--r--ipc/ipdl/test/cxx/TestInterruptRaces.h104
-rw-r--r--ipc/ipdl/test/cxx/TestInterruptShutdownRace.cpp111
-rw-r--r--ipc/ipdl/test/cxx/TestInterruptShutdownRace.h56
-rw-r--r--ipc/ipdl/test/cxx/TestJSON.cpp113
-rw-r--r--ipc/ipdl/test/cxx/TestJSON.h93
-rw-r--r--ipc/ipdl/test/cxx/TestLatency.cpp210
-rw-r--r--ipc/ipdl/test/cxx/TestLatency.h107
-rw-r--r--ipc/ipdl/test/cxx/TestManyChildAllocs.cpp83
-rw-r--r--ipc/ipdl/test/cxx/TestManyChildAllocs.h82
-rw-r--r--ipc/ipdl/test/cxx/TestMultiMgrs.cpp83
-rw-r--r--ipc/ipdl/test/cxx/TestMultiMgrs.h222
-rw-r--r--ipc/ipdl/test/cxx/TestNestedLoops.cpp78
-rw-r--r--ipc/ipdl/test/cxx/TestNestedLoops.h59
-rw-r--r--ipc/ipdl/test/cxx/TestRPC.cpp107
-rw-r--r--ipc/ipdl/test/cxx/TestRPC.h60
-rw-r--r--ipc/ipdl/test/cxx/TestRaceDeadlock.cpp102
-rw-r--r--ipc/ipdl/test/cxx/TestRaceDeadlock.h68
-rw-r--r--ipc/ipdl/test/cxx/TestRaceDeferral.cpp84
-rw-r--r--ipc/ipdl/test/cxx/TestRaceDeferral.h67
-rw-r--r--ipc/ipdl/test/cxx/TestRacyInterruptReplies.cpp94
-rw-r--r--ipc/ipdl/test/cxx/TestRacyInterruptReplies.h65
-rw-r--r--ipc/ipdl/test/cxx/TestRacyReentry.cpp63
-rw-r--r--ipc/ipdl/test/cxx/TestRacyReentry.h59
-rw-r--r--ipc/ipdl/test/cxx/TestRacyUndefer.cpp83
-rw-r--r--ipc/ipdl/test/cxx/TestRacyUndefer.h62
-rw-r--r--ipc/ipdl/test/cxx/TestSanity.cpp52
-rw-r--r--ipc/ipdl/test/cxx/TestSanity.h55
-rw-r--r--ipc/ipdl/test/cxx/TestSelfManageRoot.cpp54
-rw-r--r--ipc/ipdl/test/cxx/TestSelfManageRoot.h117
-rw-r--r--ipc/ipdl/test/cxx/TestShmem.cpp106
-rw-r--r--ipc/ipdl/test/cxx/TestShmem.h55
-rw-r--r--ipc/ipdl/test/cxx/TestShutdown.cpp185
-rw-r--r--ipc/ipdl/test/cxx/TestShutdown.h168
-rw-r--r--ipc/ipdl/test/cxx/TestStackHooks.cpp122
-rw-r--r--ipc/ipdl/test/cxx/TestStackHooks.h107
-rw-r--r--ipc/ipdl/test/cxx/TestSyncError.cpp45
-rw-r--r--ipc/ipdl/test/cxx/TestSyncError.h61
-rw-r--r--ipc/ipdl/test/cxx/TestSyncHang.cpp62
-rw-r--r--ipc/ipdl/test/cxx/TestSyncHang.h50
-rw-r--r--ipc/ipdl/test/cxx/TestSyncWakeup.cpp106
-rw-r--r--ipc/ipdl/test/cxx/TestSyncWakeup.h66
-rw-r--r--ipc/ipdl/test/cxx/TestUniquePtrIPC.cpp81
-rw-r--r--ipc/ipdl/test/cxx/TestUniquePtrIPC.h61
-rw-r--r--ipc/ipdl/test/cxx/TestUrgency.cpp117
-rw-r--r--ipc/ipdl/test/cxx/TestUrgency.h57
-rw-r--r--ipc/ipdl/test/cxx/TestUrgentHangs.cpp174
-rw-r--r--ipc/ipdl/test/cxx/TestUrgentHangs.h64
-rw-r--r--ipc/ipdl/test/cxx/moz.build134
-rw-r--r--ipc/ipdl/test/gtest/IPDLUnitTest.h97
-rw-r--r--ipc/ipdl/test/gtest/PTestAsyncReturns.ipdl (renamed from ipc/ipdl/test/cxx/PTestAsyncReturns.ipdl)9
-rw-r--r--ipc/ipdl/test/gtest/PTestCancel.ipdl39
-rw-r--r--ipc/ipdl/test/gtest/PTestDataStructures.ipdl (renamed from ipc/ipdl/test/cxx/PTestDataStructures.ipdl)43
-rw-r--r--ipc/ipdl/test/gtest/PTestDataStructuresCommon.ipdlh (renamed from ipc/ipdl/test/cxx/PTestDataStructuresCommon.ipdlh)2
-rw-r--r--ipc/ipdl/test/gtest/PTestDataStructuresSub.ipdl15
-rw-r--r--ipc/ipdl/test/gtest/PTestDescendant.ipdl22
-rw-r--r--ipc/ipdl/test/gtest/PTestDescendantSub.ipdl19
-rw-r--r--ipc/ipdl/test/gtest/PTestDescendantSubsub.ipdl14
-rw-r--r--ipc/ipdl/test/gtest/PTestEndpointOpens.ipdl22
-rw-r--r--ipc/ipdl/test/gtest/PTestEndpointOpensOpened.ipdl22
-rw-r--r--ipc/ipdl/test/gtest/PTestHangs.ipdl20
-rw-r--r--ipc/ipdl/test/gtest/PTestJSON.ipdl (renamed from ipc/ipdl/test/cxx/PTestJSON.ipdl)22
-rw-r--r--ipc/ipdl/test/gtest/PTestJSONHandle.ipdl (renamed from ipc/ipdl/test/cxx/PTestHandle.ipdl)6
-rw-r--r--ipc/ipdl/test/gtest/PTestManyChildAllocs.ipdl (renamed from ipc/ipdl/test/cxx/PTestManyChildAllocs.ipdl)6
-rw-r--r--ipc/ipdl/test/gtest/PTestManyChildAllocsSub.ipdl (renamed from ipc/ipdl/test/cxx/PTestManyChildAllocsSub.ipdl)6
-rw-r--r--ipc/ipdl/test/gtest/PTestMostNested.ipdl23
-rw-r--r--ipc/ipdl/test/gtest/PTestMultiMgrs.ipdl (renamed from ipc/ipdl/test/cxx/PTestMultiMgrs.ipdl)4
-rw-r--r--ipc/ipdl/test/gtest/PTestMultiMgrsBottom.ipdl (renamed from ipc/ipdl/test/cxx/PTestMultiMgrsBottom.ipdl)4
-rw-r--r--ipc/ipdl/test/gtest/PTestMultiMgrsLeft.ipdl (renamed from ipc/ipdl/test/cxx/PTestMultiMgrsLeft.ipdl)4
-rw-r--r--ipc/ipdl/test/gtest/PTestMultiMgrsRight.ipdl (renamed from ipc/ipdl/test/cxx/PTestMultiMgrsRight.ipdl)4
-rw-r--r--ipc/ipdl/test/gtest/PTestSelfManage.ipdl (renamed from ipc/ipdl/test/cxx/PTestSelfManage.ipdl)6
-rw-r--r--ipc/ipdl/test/gtest/PTestSelfManageRoot.ipdl (renamed from ipc/ipdl/test/cxx/PTestSelfManageRoot.ipdl)6
-rw-r--r--ipc/ipdl/test/gtest/PTestShmem.ipdl (renamed from ipc/ipdl/test/cxx/PTestShmem.ipdl)4
-rw-r--r--ipc/ipdl/test/gtest/PTestSyncError.ipdl (renamed from ipc/ipdl/test/cxx/PTestSyncError.ipdl)6
-rw-r--r--ipc/ipdl/test/gtest/PTestUniquePtrIPC.ipdl17
-rw-r--r--ipc/ipdl/test/gtest/PTestUrgency.ipdl (renamed from ipc/ipdl/test/cxx/PTestUrgency.ipdl)4
-rw-r--r--ipc/ipdl/test/gtest/TestAsyncReturns.cpp77
-rw-r--r--ipc/ipdl/test/gtest/TestCancel.cpp126
-rw-r--r--ipc/ipdl/test/gtest/TestDataStructures.cpp864
-rw-r--r--ipc/ipdl/test/gtest/TestDescendant.cpp98
-rw-r--r--ipc/ipdl/test/gtest/TestEndpointOpens.cpp159
-rw-r--r--ipc/ipdl/test/gtest/TestHangs.cpp133
-rw-r--r--ipc/ipdl/test/gtest/TestJSON.cpp157
-rw-r--r--ipc/ipdl/test/gtest/TestManyChildAllocs.cpp82
-rw-r--r--ipc/ipdl/test/gtest/TestMostNested.cpp88
-rw-r--r--ipc/ipdl/test/gtest/TestMultiMgrs.cpp202
-rw-r--r--ipc/ipdl/test/gtest/TestSelfManage.cpp100
-rw-r--r--ipc/ipdl/test/gtest/TestShmem.cpp122
-rw-r--r--ipc/ipdl/test/gtest/TestSyncError.cpp44
-rw-r--r--ipc/ipdl/test/gtest/TestUniquePtrIPC.cpp80
-rw-r--r--ipc/ipdl/test/gtest/TestUrgency.cpp115
-rw-r--r--ipc/ipdl/test/gtest/moz.build41
-rw-r--r--ipc/ipdl/test/ipdl/error/ReturnFromDestructor.ipdl7
-rw-r--r--ipc/ipdl/test/ipdl/error/SyncDestructor.ipdl7
-rw-r--r--ipc/ipdl/test/ipdl/ok/PDeleteSub.ipdl2
-rw-r--r--ipc/ipdl/test/ipdl/sync-messages.ini2
231 files changed, 3448 insertions, 9998 deletions
diff --git a/ipc/chromium/moz.build b/ipc/chromium/moz.build
index 56f24c24bb..429c068d34 100644
--- a/ipc/chromium/moz.build
+++ b/ipc/chromium/moz.build
@@ -39,7 +39,7 @@ UNIFIED_SOURCES += [
"src/mojo/core/ports/user_message.cc",
]
-if os_win:
+if CONFIG["TARGET_KERNEL"] == "WINNT":
SOURCES += [
"src/base/condition_variable_win.cc",
"src/base/lock_impl_win.cc",
@@ -60,7 +60,7 @@ if os_win:
elif not CONFIG["MOZ_SYSTEM_LIBEVENT"]:
DIRS += ["src/third_party"]
-if os_posix:
+if CONFIG["TARGET_KERNEL"] != "WINNT":
UNIFIED_SOURCES += [
"src/base/condition_variable_posix.cc",
"src/base/lock_impl_posix.cc",
@@ -75,12 +75,9 @@ if os_posix:
"src/chrome/common/process_watcher_posix_sigchld.cc",
]
-if os_macosx:
+if CONFIG["TARGET_KERNEL"] == "Darwin":
UNIFIED_SOURCES += [
- "src/base/chrome_application_mac.mm",
- "src/base/mac_util.mm",
"src/base/message_pump_mac.mm",
- "src/base/process_util_mac.mm",
"src/base/scoped_nsautorelease_pool.mm",
"src/base/sys_string_conversions_mac.mm",
"src/base/time_mac.cc",
@@ -93,13 +90,25 @@ if os_macosx:
"src/base/platform_thread_mac.mm",
]
-if os_bsd:
+if CONFIG["TARGET_OS"] == "OSX":
+ UNIFIED_SOURCES += [
+ "src/base/chrome_application_mac.mm",
+ "src/base/mac_util.mm",
+ "src/base/process_util_mac.mm",
+ ]
+
+if CONFIG["TARGET_OS"] == "iOS":
+ UNIFIED_SOURCES += [
+ "src/base/process_util_ios.cpp",
+ ]
+
+if CONFIG["TARGET_KERNEL"] in ("DragonFly", "FreeBSD", "NetBSD", "OpenBSD"):
SOURCES += [
"src/base/process_util_linux.cc",
"src/base/time_posix.cc",
]
-if os_linux:
+if CONFIG["TARGET_KERNEL"] == "Linux":
SOURCES += [
"src/base/process_util_linux.cc",
"src/base/set_process_title_linux.cc",
@@ -112,17 +121,15 @@ if os_linux:
DEFINES["ANDROID"] = True
DEFINES["_POSIX_MONOTONIC_CLOCK"] = 0
-if os_bsd or os_linux:
- if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
- SOURCES += [
- "src/base/message_pump_glib.cc",
- ]
-
-if os_solaris:
+if CONFIG["TARGET_KERNEL"] == "SunOS":
SOURCES += [
"src/base/process_util_linux.cc",
"src/base/time_posix.cc",
]
+elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
+ SOURCES += [
+ "src/base/message_pump_glib.cc",
+ ]
if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"]
diff --git a/ipc/chromium/src/base/message_pump_mac.h b/ipc/chromium/src/base/message_pump_mac.h
index 13902bbf3e..7d7796b98b 100644
--- a/ipc/chromium/src/base/message_pump_mac.h
+++ b/ipc/chromium/src/base/message_pump_mac.h
@@ -144,11 +144,13 @@ class MessagePumpCFRunLoopBase : public MessagePump {
// the basis of run loops starting and stopping.
virtual void EnterExitRunLoop(CFRunLoopActivity activity);
+#if !defined(XP_IOS)
// IOKit power state change notification callback, called when the system
// enters and leaves the sleep state.
static void PowerStateNotification(void* info, io_service_t service,
uint32_t message_type,
void* message_argument);
+#endif
// The thread's run loop.
CFRunLoopRef run_loop_;
@@ -241,6 +243,23 @@ class MessagePumpNSRunLoop : public MessagePumpCFRunLoopBase {
DISALLOW_COPY_AND_ASSIGN(MessagePumpNSRunLoop);
};
+#if defined(XP_IOS)
+// This is a fake message pump. It attaches sources to the main thread's
+// CFRunLoop, so PostTask() will work, but it is unable to drive the loop
+// directly, so calling Run() or Quit() are errors.
+class MessagePumpUIApplication : public MessagePumpCFRunLoopBase {
+ public:
+ MessagePumpUIApplication() {}
+
+ void DoRun(Delegate* delegate) override;
+ void Quit() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MessagePumpUIApplication);
+};
+
+#else
+
class MessagePumpNSApplication : public MessagePumpCFRunLoopBase {
public:
MessagePumpNSApplication();
@@ -264,6 +283,7 @@ class MessagePumpNSApplication : public MessagePumpCFRunLoopBase {
DISALLOW_COPY_AND_ASSIGN(MessagePumpNSApplication);
};
+#endif
class MessagePumpMac {
public:
diff --git a/ipc/chromium/src/base/message_pump_mac.mm b/ipc/chromium/src/base/message_pump_mac.mm
index 1382e2a0dc..a5e7092d16 100644
--- a/ipc/chromium/src/base/message_pump_mac.mm
+++ b/ipc/chromium/src/base/message_pump_mac.mm
@@ -4,14 +4,18 @@
#include "base/message_pump_mac.h"
-#import <AppKit/AppKit.h>
+#if !defined(XP_IOS)
+# import <AppKit/AppKit.h>
+# include <IOKit/pwr_mgt/IOPMLib.h>
+#endif
#import <Foundation/Foundation.h>
#include <IOKit/IOMessage.h>
-#include <IOKit/pwr_mgt/IOPMLib.h>
#include <limits>
-#import "base/chrome_application_mac.h"
+#if !defined(XP_IOS)
+# import "base/chrome_application_mac.h"
+#endif
#include "base/logging.h"
#include "base/time.h"
@@ -120,6 +124,7 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase()
EnterExitObserver, &observer_context);
CFRunLoopAddObserver(run_loop_, enter_exit_observer_, kCFRunLoopCommonModes);
+#if !defined(XP_IOS)
root_power_domain_ = IORegisterForSystemPower(this, &power_notification_port_,
PowerStateNotification,
&power_notification_object_);
@@ -128,12 +133,14 @@ MessagePumpCFRunLoopBase::MessagePumpCFRunLoopBase()
run_loop_, IONotificationPortGetRunLoopSource(power_notification_port_),
kCFRunLoopCommonModes);
}
+#endif
}
// Ideally called on the run loop thread. If other run loops were running
// lower on the run loop thread's stack when this object was created, the
// same number of run loops must be running when this object is destroyed.
MessagePumpCFRunLoopBase::~MessagePumpCFRunLoopBase() {
+#if !defined(XP_IOS)
if (root_power_domain_ != MACH_PORT_NULL) {
CFRunLoopRemoveSource(
run_loop_, IONotificationPortGetRunLoopSource(power_notification_port_),
@@ -142,6 +149,7 @@ MessagePumpCFRunLoopBase::~MessagePumpCFRunLoopBase() {
IOServiceClose(root_power_domain_);
IONotificationPortDestroy(power_notification_port_);
}
+#endif
CFRunLoopRemoveObserver(run_loop_, enter_exit_observer_,
kCFRunLoopCommonModes);
@@ -478,6 +486,7 @@ void MessagePumpCFRunLoopBase::EnterExitObserver(CFRunLoopObserverRef observer,
self->EnterExitRunLoop(activity);
}
+#if !defined(XP_IOS)
// Called from the run loop.
// static
void MessagePumpCFRunLoopBase::PowerStateNotification(void* info,
@@ -544,6 +553,7 @@ void MessagePumpCFRunLoopBase::PowerStateNotification(void* info,
break;
}
}
+#endif
// Called by MessagePumpCFRunLoopBase::EnterExitRunLoop. The default
// implementation is a no-op.
@@ -630,6 +640,12 @@ void MessagePumpNSRunLoop::Quit() {
CFRunLoopWakeUp(run_loop());
}
+#if defined(XP_IOS)
+void MessagePumpUIApplication::DoRun(Delegate* delegate) { NOTREACHED(); }
+
+void MessagePumpUIApplication::Quit() { NOTREACHED(); }
+
+#else
MessagePumpNSApplication::MessagePumpNSApplication()
: keep_running_(true), running_own_loop_(false) {}
@@ -722,11 +738,16 @@ NSAutoreleasePool* MessagePumpNSApplication::CreateAutoreleasePool() {
}
return pool;
}
+#endif
// static
MessagePump* MessagePumpMac::Create() {
if ([NSThread isMainThread]) {
+#if defined(XP_IOS)
+ return new MessagePumpUIApplication;
+#else
return new MessagePumpNSApplication;
+#endif
}
return new MessagePumpNSRunLoop;
diff --git a/ipc/chromium/src/base/process_util_ios.cpp b/ipc/chromium/src/base/process_util_ios.cpp
new file mode 100644
index 0000000000..1ec4e77561
--- /dev/null
+++ b/ipc/chromium/src/base/process_util_ios.cpp
@@ -0,0 +1,17 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+// Copyright (c) 2008 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 "base/process_util.h"
+
+namespace base {
+
+Result<Ok, LaunchError> LaunchApp(const std::vector<std::string>& argv,
+ LaunchOptions&& options,
+ ProcessHandle* process_handle) {
+ return Err(LaunchError("LaunchApp is not supported on iOS"));
+}
+
+} // namespace base
diff --git a/ipc/chromium/src/base/process_util_posix.cc b/ipc/chromium/src/base/process_util_posix.cc
index 3229570ad8..d91dc25e9f 100644
--- a/ipc/chromium/src/base/process_util_posix.cc
+++ b/ipc/chromium/src/base/process_util_posix.cc
@@ -198,7 +198,7 @@ void CloseSuperfluousFds(void* aCtx, bool (*aShouldPreserve)(void*, int)) {
bool IsProcessDead(ProcessHandle handle, bool blocking) {
auto handleForkServer = [handle]() -> mozilla::Maybe<bool> {
#ifdef MOZ_ENABLE_FORKSERVER
- if (errno == ECHILD && mozilla::ipc::ForkServiceChild::Get()) {
+ if (errno == ECHILD && mozilla::ipc::ForkServiceChild::WasUsed()) {
// We only know if a process exists, but not if it has crashed.
//
// Since content processes are not direct children of the chrome
diff --git a/ipc/chromium/src/chrome/common/ipc_message.h b/ipc/chromium/src/chrome/common/ipc_message.h
index 733ae9e493..281a6d6bad 100644
--- a/ipc/chromium/src/chrome/common/ipc_message.h
+++ b/ipc/chromium/src/chrome/common/ipc_message.h
@@ -37,6 +37,7 @@ namespace IPC {
//------------------------------------------------------------------------------
// Generated by IPDL compiler
+bool IPCMessageTypeIsSync(uint32_t aMessageType);
const char* StringFromIPCMessageType(uint32_t aMessageType);
class Channel;
diff --git a/ipc/chromium/src/chrome/common/mach_ipc_mac.h b/ipc/chromium/src/chrome/common/mach_ipc_mac.h
index c9af70c0c6..4d2af64176 100644
--- a/ipc/chromium/src/chrome/common/mach_ipc_mac.h
+++ b/ipc/chromium/src/chrome/common/mach_ipc_mac.h
@@ -9,7 +9,6 @@
#include <mach/mach.h>
#include <mach/message.h>
-#include <servers/bootstrap.h>
#include <sys/types.h>
#include "mozilla/Maybe.h"
diff --git a/ipc/chromium/src/mojo/core/ports/node.cc b/ipc/chromium/src/mojo/core/ports/node.cc
index 63e58c9928..935771eeb7 100644
--- a/ipc/chromium/src/mojo/core/ports/node.cc
+++ b/ipc/chromium/src/mojo/core/ports/node.cc
@@ -516,6 +516,7 @@ int Node::AcceptEvent(const NodeName& from_node, ScopedEvent event) {
return AcceptEventInternal(port_ref, from_node, std::move(event));
}
+#ifndef FUZZING_SNAPSHOT
// Before processing the event, verify the sender and sequence number.
{
SinglePortLocker locker(&port_ref);
@@ -532,6 +533,7 @@ int Node::AcceptEvent(const NodeName& from_node, ScopedEvent event) {
return OK;
}
}
+#endif
int ret = AcceptEventInternal(port_ref, from_node, std::move(event));
diff --git a/ipc/chromium/src/third_party/libeventcommon.mozbuild b/ipc/chromium/src/third_party/libeventcommon.mozbuild
index 5037ec77a5..e8a74bf802 100644
--- a/ipc/chromium/src/third_party/libeventcommon.mozbuild
+++ b/ipc/chromium/src/third_party/libeventcommon.mozbuild
@@ -4,35 +4,18 @@
# 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/.
-os_win = 0
-os_posix = 0
-os_macosx = 0
-os_bsd = 0
-os_linux = 0
-os_solaris = 0
-
-if CONFIG['OS_ARCH'] == 'WINNT':
- os_win = 1
+if CONFIG['TARGET_KERNEL'] == 'Darwin':
+ libevent_include_suffix = 'mac'
+elif CONFIG['TARGET_KERNEL'] in ('DragonFly', 'FreeBSD', 'NetBSD', 'OpenBSD'):
+ libevent_include_suffix = 'bsd'
+elif CONFIG['TARGET_KERNEL'] == 'SunOS':
+ libevent_include_suffix = 'solaris'
+elif CONFIG['TARGET_OS'] == 'Android':
+ libevent_include_suffix = 'android'
else:
- os_posix = 1
- if CONFIG['OS_ARCH'] == 'Darwin':
- os_macosx = 1
- libevent_include_suffix = 'mac'
- elif CONFIG['OS_ARCH'] in ['DragonFly', 'FreeBSD', 'GNU_kFreeBSD',
- 'NetBSD', 'OpenBSD']:
- os_bsd = 1
- libevent_include_suffix = 'bsd'
- elif CONFIG['OS_ARCH'] == 'SunOS':
- os_solaris = 1
- libevent_include_suffix = 'solaris'
- else:
- os_linux = 1
- if CONFIG['OS_TARGET'] == 'Android':
- libevent_include_suffix = 'android'
- else:
- libevent_include_suffix = 'linux'
+ libevent_include_suffix = 'linux'
-if os_posix and not CONFIG['MOZ_SYSTEM_LIBEVENT']:
+if CONFIG["TARGET_KERNEL"] != "WINNT" and not CONFIG['MOZ_SYSTEM_LIBEVENT']:
DEFINES['HAVE_CONFIG_H'] = True
LOCAL_INCLUDES += sorted([
'libevent',
diff --git a/ipc/chromium/src/third_party/moz.build b/ipc/chromium/src/third_party/moz.build
index 6572d01aa9..4a7dfd3fd1 100644
--- a/ipc/chromium/src/third_party/moz.build
+++ b/ipc/chromium/src/third_party/moz.build
@@ -7,7 +7,7 @@
libevent_path_prefix = '.'
include(libevent_path_prefix + '/libeventcommon.mozbuild')
-if os_win:
+if CONFIG["TARGET_KERNEL"] == "WINNT":
error('should not reach here on Windows')
if CONFIG['MOZ_SYSTEM_LIBEVENT']:
@@ -42,12 +42,12 @@ SOURCES += [
# 'libevent/evrpc.c', # Unused file. # conflicting TAILQ_ENTRY definition
]
-if os_macosx or os_bsd:
+if CONFIG["TARGET_KERNEL"] in ("Darwin", "DragonFly", "FreeBSD", "NetBSD", "OpenBSD"):
UNIFIED_SOURCES += [
'libevent/kqueue.c',
]
-if os_linux:
+if CONFIG["TARGET_KERNEL"] == "Linux":
UNIFIED_SOURCES += [
'libevent/epoll.c',
]
@@ -56,7 +56,7 @@ if os_linux:
'libevent/epoll_sub.c',
]
-if os_solaris:
+if CONFIG["TARGET_KERNEL"] == "SunOS":
SOURCES += [
'libevent/devpoll.c',
'libevent/evport.c',
diff --git a/ipc/docs/processes.rst b/ipc/docs/processes.rst
index 89ec5e8013..08e0177de2 100644
--- a/ipc/docs/processes.rst
+++ b/ipc/docs/processes.rst
@@ -324,7 +324,8 @@ process there.
- For `about:processes` you will probably want to follow the following steps:
+ Add handling for your new process type producing a unique `fluentName <https://searchfox.org/mozilla-central/rev/be4604e4be8c71b3c1dbff2398a5b05f15411673/toolkit/components/aboutprocesses/content/aboutProcesses.js#472-539>`_, i.e., constructing a dynamic name is highly discouraged
- + Add matching localization strings within `fluent localization file <https://searchfox.org/mozilla-central/rev/be4604e4be8c71b3c1dbff2398a5b05f15411673/toolkit/locales/en-US/toolkit/about/aboutProcesses.ftl#35-55>`_
+ + Add matching localization strings within `about:processes localization file <https://searchfox.org/mozilla-central/rev/be4604e4be8c71b3c1dbff2398a5b05f15411673/toolkit/locales/en-US/toolkit/about/aboutProcesses.ftl#35-55>`_
+ + Add matching localization strings within `about:support localization file <https://searchfox.org/mozilla-central/source/toolkit/locales/en-US/toolkit/global/processTypes.ftl#54-60>`_
Profiler
########
diff --git a/ipc/glue/BackgroundChildImpl.cpp b/ipc/glue/BackgroundChildImpl.cpp
index 5bcfbd2838..f21f393e2c 100644
--- a/ipc/glue/BackgroundChildImpl.cpp
+++ b/ipc/glue/BackgroundChildImpl.cpp
@@ -138,9 +138,8 @@ void BackgroundChildImpl::ProcessingError(Result aCode, const char* aReason) {
MOZ_CRASH("Unknown error code!");
}
- nsDependentCString reason(aReason);
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::ipc_channel_error, reason);
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::ipc_channel_error, aReason);
MOZ_CRASH_UNSAFE_PRINTF("%s: %s", abortMessage.get(), aReason);
}
diff --git a/ipc/glue/BackgroundParentImpl.cpp b/ipc/glue/BackgroundParentImpl.cpp
index e9d0adbb94..6fcd344ddb 100644
--- a/ipc/glue/BackgroundParentImpl.cpp
+++ b/ipc/glue/BackgroundParentImpl.cpp
@@ -148,8 +148,8 @@ void BackgroundParentImpl::ProcessingError(Result aCode, const char* aReason) {
GetIPCChannel()->InduceConnectionError();
}
} else {
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::ipc_channel_error, reason);
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::ipc_channel_error, aReason);
MOZ_CRASH("in-process BackgroundParent abort due to IPC error");
}
@@ -191,26 +191,28 @@ bool BackgroundParentImpl::DeallocPBackgroundTestParent(
}
auto BackgroundParentImpl::AllocPBackgroundIDBFactoryParent(
- const LoggingInfo& aLoggingInfo)
+ const LoggingInfo& aLoggingInfo, const nsACString& aSystemLocale)
-> already_AddRefed<PBackgroundIDBFactoryParent> {
using mozilla::dom::indexedDB::AllocPBackgroundIDBFactoryParent;
AssertIsInMainProcess();
AssertIsOnBackgroundThread();
- return AllocPBackgroundIDBFactoryParent(aLoggingInfo);
+ return AllocPBackgroundIDBFactoryParent(aLoggingInfo, aSystemLocale);
}
mozilla::ipc::IPCResult
BackgroundParentImpl::RecvPBackgroundIDBFactoryConstructor(
- PBackgroundIDBFactoryParent* aActor, const LoggingInfo& aLoggingInfo) {
+ PBackgroundIDBFactoryParent* aActor, const LoggingInfo& aLoggingInfo,
+ const nsACString& aSystemLocale) {
using mozilla::dom::indexedDB::RecvPBackgroundIDBFactoryConstructor;
AssertIsInMainProcess();
AssertIsOnBackgroundThread();
MOZ_ASSERT(aActor);
- if (!RecvPBackgroundIDBFactoryConstructor(aActor, aLoggingInfo)) {
+ if (!RecvPBackgroundIDBFactoryConstructor(aActor, aLoggingInfo,
+ aSystemLocale)) {
return IPC_FAIL_NO_REASON(this);
}
return IPC_OK();
diff --git a/ipc/glue/BackgroundParentImpl.h b/ipc/glue/BackgroundParentImpl.h
index 42f40a1a2b..c36a8c83af 100644
--- a/ipc/glue/BackgroundParentImpl.h
+++ b/ipc/glue/BackgroundParentImpl.h
@@ -31,11 +31,12 @@ class BackgroundParentImpl : public PBackgroundParent {
bool DeallocPBackgroundTestParent(PBackgroundTestParent* aActor) override;
already_AddRefed<PBackgroundIDBFactoryParent>
- AllocPBackgroundIDBFactoryParent(const LoggingInfo& aLoggingInfo) override;
+ AllocPBackgroundIDBFactoryParent(const LoggingInfo& aLoggingInfo,
+ const nsACString& aSystemLocale) override;
mozilla::ipc::IPCResult RecvPBackgroundIDBFactoryConstructor(
- PBackgroundIDBFactoryParent* aActor,
- const LoggingInfo& aLoggingInfo) override;
+ PBackgroundIDBFactoryParent* aActor, const LoggingInfo& aLoggingInfo,
+ const nsACString& aSystemLocale) override;
PBackgroundIndexedDBUtilsParent* AllocPBackgroundIndexedDBUtilsParent()
override;
diff --git a/ipc/glue/CrashReporterHost.cpp b/ipc/glue/CrashReporterHost.cpp
index d4f0c0f968..9fee9187a6 100644
--- a/ipc/glue/CrashReporterHost.cpp
+++ b/ipc/glue/CrashReporterHost.cpp
@@ -153,27 +153,26 @@ void CrashReporterHost::NotifyCrashService(GeckoProcessType aProcessType,
getter_AddRefs(promise));
}
-void CrashReporterHost::AddAnnotation(CrashReporter::Annotation aKey,
- bool aValue) {
+void CrashReporterHost::AddAnnotationBool(CrashReporter::Annotation aKey,
+ bool aValue) {
+ MOZ_ASSERT(TypeOfAnnotation(aKey) == CrashReporter::AnnotationType::Boolean,
+ "Wrong annotation type");
mExtraAnnotations[aKey] = aValue ? "1"_ns : "0"_ns;
}
-void CrashReporterHost::AddAnnotation(CrashReporter::Annotation aKey,
- int aValue) {
+void CrashReporterHost::AddAnnotationU32(CrashReporter::Annotation aKey,
+ uint32_t aValue) {
+ MOZ_ASSERT(TypeOfAnnotation(aKey) == CrashReporter::AnnotationType::U32,
+ "Wrong annotation type");
nsAutoCString valueString;
valueString.AppendInt(aValue);
mExtraAnnotations[aKey] = valueString;
}
-void CrashReporterHost::AddAnnotation(CrashReporter::Annotation aKey,
- unsigned int aValue) {
- nsAutoCString valueString;
- valueString.AppendInt(aValue);
- mExtraAnnotations[aKey] = valueString;
-}
-
-void CrashReporterHost::AddAnnotation(CrashReporter::Annotation aKey,
- const nsACString& aValue) {
+void CrashReporterHost::AddAnnotationNSCString(CrashReporter::Annotation aKey,
+ const nsACString& aValue) {
+ MOZ_ASSERT(TypeOfAnnotation(aKey) == CrashReporter::AnnotationType::String,
+ "Wrong annotation type");
mExtraAnnotations[aKey] = aValue;
}
diff --git a/ipc/glue/CrashReporterHost.h b/ipc/glue/CrashReporterHost.h
index 7b71b64cdf..df0af17d43 100644
--- a/ipc/glue/CrashReporterHost.h
+++ b/ipc/glue/CrashReporterHost.h
@@ -84,10 +84,10 @@ class CrashReporterHost {
return CrashReporter::GetIDFromMinidump(targetDump, mDumpID);
}
- void AddAnnotation(CrashReporter::Annotation aKey, bool aValue);
- void AddAnnotation(CrashReporter::Annotation aKey, int aValue);
- void AddAnnotation(CrashReporter::Annotation aKey, unsigned int aValue);
- void AddAnnotation(CrashReporter::Annotation aKey, const nsACString& aValue);
+ void AddAnnotationBool(CrashReporter::Annotation aKey, bool aValue);
+ void AddAnnotationU32(CrashReporter::Annotation aKey, uint32_t aValue);
+ void AddAnnotationNSCString(CrashReporter::Annotation aKey,
+ const nsACString& aValue);
bool HasMinidump() const { return !mDumpID.IsEmpty(); }
const nsString& MinidumpID() const {
diff --git a/ipc/glue/EnumSerializer.h b/ipc/glue/EnumSerializer.h
index 13c1de3841..989e1127f5 100644
--- a/ipc/glue/EnumSerializer.h
+++ b/ipc/glue/EnumSerializer.h
@@ -65,12 +65,12 @@ struct EnumSerializer {
static bool Read(MessageReader* aReader, paramType* aResult) {
uintParamType value;
if (!ReadParam(aReader, &value)) {
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::IPCReadErrorReason, "Bad iter"_ns);
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::IPCReadErrorReason, "Bad iter");
return false;
} else if (!EnumValidator::IsLegalValue(value)) {
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::IPCReadErrorReason, "Illegal value"_ns);
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::IPCReadErrorReason, "Illegal value");
return false;
}
*aResult = paramType(value);
diff --git a/ipc/glue/ForkServiceChild.cpp b/ipc/glue/ForkServiceChild.cpp
index 65560dfaea..09d7c48457 100644
--- a/ipc/glue/ForkServiceChild.cpp
+++ b/ipc/glue/ForkServiceChild.cpp
@@ -3,11 +3,13 @@
/* 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 "ForkServiceChild.h"
#include "ForkServer.h"
-#include "mozilla/ipc/IPDLParamTraits.h"
+#include "mozilla/Atomics.h"
#include "mozilla/Logging.h"
#include "mozilla/ipc/GeckoChildProcessHost.h"
+#include "mozilla/ipc/IPDLParamTraits.h"
#include "mozilla/ipc/ProtocolMessageUtils.h"
#include "mozilla/StaticPrefs_dom.h"
#include "mozilla/Services.h"
@@ -23,6 +25,7 @@ namespace ipc {
extern LazyLogModule gForkServiceLog;
mozilla::UniquePtr<ForkServiceChild> ForkServiceChild::sForkServiceChild;
+Atomic<bool> ForkServiceChild::sForkServiceUsed;
static bool ConfigurePipeFd(int aFd) {
int flags = fcntl(aFd, F_GETFD, 0);
@@ -55,6 +58,7 @@ void ForkServiceChild::StartForkServer() {
return;
}
+ sForkServiceUsed = true;
sForkServiceChild =
mozilla::MakeUnique<ForkServiceChild>(server.release(), subprocess);
}
diff --git a/ipc/glue/ForkServiceChild.h b/ipc/glue/ForkServiceChild.h
index 73d090d556..9db3dc3828 100644
--- a/ipc/glue/ForkServiceChild.h
+++ b/ipc/glue/ForkServiceChild.h
@@ -74,6 +74,11 @@ class ForkServiceChild {
return child == nullptr || child->mFailed ? nullptr : child;
}
+ /**
+ * Returns whether the fork server was ever active. Thread-safe.
+ */
+ static bool WasUsed() { return sForkServiceUsed; }
+
private:
// Called when a message is received.
void OnMessageReceived(UniquePtr<IPC::Message> message);
@@ -81,6 +86,7 @@ class ForkServiceChild {
UniquePtr<MiniTransceiver> mTcver;
static UniquePtr<ForkServiceChild> sForkServiceChild;
+ static Atomic<bool> sForkServiceUsed;
pid_t mRecvPid;
bool mFailed; // The forkserver has crashed or disconnected.
GeckoChildProcessHost* mProcess;
diff --git a/ipc/glue/GeckoChildProcessHost.cpp b/ipc/glue/GeckoChildProcessHost.cpp
index bde3a9a389..cd03b488ed 100644
--- a/ipc/glue/GeckoChildProcessHost.cpp
+++ b/ipc/glue/GeckoChildProcessHost.cpp
@@ -13,6 +13,7 @@
#include "base/task.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/process_watcher.h"
+#include "mozilla/ProcessType.h"
#ifdef MOZ_WIDGET_COCOA
# include <bsm/libbsm.h>
# include <mach/mach_traps.h>
@@ -66,6 +67,7 @@
#ifdef XP_WIN
# include <stdlib.h>
+# include "mozilla/WindowsVersion.h"
# include "nsIWinTaskbar.h"
# define NS_TASKBAR_CONTRACTID "@mozilla.org/windows-taskbar;1"
@@ -249,7 +251,7 @@ class BaseProcessLauncher {
};
#ifdef XP_WIN
-class WindowsProcessLauncher : public BaseProcessLauncher {
+class WindowsProcessLauncher final : public BaseProcessLauncher {
public:
WindowsProcessLauncher(GeckoChildProcessHost* aHost,
std::vector<std::string>&& aExtraOpts)
@@ -261,8 +263,13 @@ class WindowsProcessLauncher : public BaseProcessLauncher {
virtual RefPtr<ProcessHandlePromise> DoLaunch() override;
virtual Result<Ok, LaunchError> DoFinishLaunch() override;
+ private:
+ void AddApplicationPrefetchArgument();
+
mozilla::Maybe<CommandLine> mCmdLine;
+# ifdef MOZ_SANDBOX
bool mUseSandbox = false;
+# endif
const Buffer<IMAGE_THUNK_DATA>* mCachedNtdllThunk;
};
@@ -343,7 +350,20 @@ class LinuxProcessLauncher : public PosixProcessLauncher {
virtual Result<Ok, LaunchError> DoSetup() override;
};
typedef LinuxProcessLauncher ProcessLauncher;
-# elif
+# elif defined(MOZ_WIDGET_UIKIT)
+class IosProcessLauncher : public PosixProcessLauncher {
+ public:
+ IosProcessLauncher(GeckoChildProcessHost* aHost,
+ std::vector<std::string>&& aExtraOpts)
+ : PosixProcessLauncher(aHost, std::move(aExtraOpts)) {}
+
+ protected:
+ virtual RefPtr<ProcessHandlePromise> DoLaunch() override {
+ MOZ_CRASH("IosProcessLauncher::DoLaunch not implemented");
+ }
+};
+typedef IosProcessLauncher ProcessLauncher;
+# else
# error "Unknown platform"
# endif
#endif // XP_UNIX
@@ -1189,7 +1209,7 @@ Result<Ok, LaunchError> PosixProcessLauncher::DoSetup() {
}
mLaunchOptions->env_map["LD_LIBRARY_PATH"] = new_ld_lib_path.get();
-# elif XP_DARWIN
+# elif XP_MACOSX
// With signed production Mac builds, the dynamic linker (dyld) will
// ignore dyld environment variables preventing the use of variables
// such as DYLD_LIBRARY_PATH and DYLD_INSERT_LIBRARIES.
@@ -1212,7 +1232,7 @@ Result<Ok, LaunchError> PosixProcessLauncher::DoSetup() {
// Prevent connection attempts to diagnosticd(8) to save cycles. Log
// messages can trigger these connection attempts, but access to
// diagnosticd is blocked in sandboxed child processes.
-# ifdef MOZ_SANDBOX
+# if defined(MOZ_SANDBOX) && defined(XP_MACOSX)
if (mDisableOSActivityMode) {
mLaunchOptions->env_map["OS_ACTIVITY_MODE"] = "disable";
}
@@ -1388,6 +1408,97 @@ Result<Ok, LaunchError> MacProcessLauncher::DoFinishLaunch() {
#endif // XP_MACOSX
#ifdef XP_WIN
+void WindowsProcessLauncher::AddApplicationPrefetchArgument() {
+ // The Application Launch Prefetcher (ALPF) is an ill-documented Windows
+ // subsystem that's intended to speed up process launching, apparently mostly
+ // by assuming that a binary is going to want to load the same DLLs as it did
+ // the last time it launched, and getting those prepped for loading as well.
+ //
+ // For most applications, that's a good bet. For Firefox, it's less so, since
+ // we use the same binary with different arguments to do completely different
+ // things. Windows does allow applications to take up multiple slots in this
+ // cache, but the "which bucket does this invocation go in?" mechanism is
+ // highly unusual: the OS scans the command line and looks for a command-line
+ // switch of a particular form.
+ //
+ // (There is allegedly a way to do this without involving the command line,
+ // OVERRIDE_PREFETCH_PARAMETER, but it's even more poorly documented.)
+
+ // Applications' different prefetch-cache buckets are named with numbers from
+ // "1" to some OS-version-determined limit, with an additional implicit "0"
+ // cache bucket which is used when no valid prefetch cache slot is named.
+ //
+ // (The "0" bucket's existence and behavior is not documented, but has been
+ // confirmed by observing the creation and enumeration of cache files in the
+ // C:\Windows\Prefetch folder.)
+ static size_t const kMaxSlotNo = IsWin1122H2OrLater() ? 16 : 8;
+
+ // Determine the prefetch-slot number to be used for the process we're about
+ // to launch.
+ //
+ // This may be changed freely between Firefox versions, as a Firefox update
+ // will completely invalidate the prefetch cache anyway.
+ size_t const prefetchSlot = [&]() -> size_t {
+ switch (mProcessType) {
+ // This code path is not used when starting the main process...
+ case GeckoProcessType_Default:
+ // ...ForkServer is not used on Windows...
+ case GeckoProcessType_ForkServer:
+ // ..."End" isn't a process-type, just a limit...
+ case GeckoProcessType_End:
+ // ...and any new process-types should be considered explicitly here.
+ default:
+ MOZ_ASSERT_UNREACHABLE("Invalid process type");
+ return 0;
+
+ // We reserve 1 for the main process as started by the launcher process.
+ // (See LauncherProcessWin.cpp.) Otherwise, we mostly match the process-
+ // type enumeration.
+ case GeckoProcessType_Content:
+ return 2;
+ case GeckoProcessType_Socket:
+ return 3; // usurps IPDLUnitTest
+ case GeckoProcessType_GMPlugin:
+ return 4;
+ case GeckoProcessType_GPU:
+ return 5;
+ case GeckoProcessType_RemoteSandboxBroker:
+ return 6; // usurps VR
+ case GeckoProcessType_RDD:
+ return 7;
+
+ case GeckoProcessType_Utility: {
+ // Continue the enumeration, using the SandboxingKind as a
+ // probably-passably-precise proxy for the process's purpose.
+ //
+ // (On Win10 and earlier, or when sandboxing is not used, this will lump
+ // all utility processes into slot 8.)
+# ifndef MOZ_SANDBOX
+ size_t const val = 0;
+# else
+ size_t const val = static_cast<size_t>(mSandbox);
+# endif
+ return std::min(kMaxSlotNo, 8 + val);
+ }
+
+ // These process types are started so rarely that we're not concerned
+ // about their interaction with the prefetch cache. Lump them together at
+ // the end (possibly alongside other process types).
+ case GeckoProcessType_IPDLUnitTest:
+ case GeckoProcessType_VR:
+ return kMaxSlotNo;
+ }
+ }();
+ MOZ_ASSERT(prefetchSlot <= kMaxSlotNo);
+
+ if (prefetchSlot == 0) {
+ // default; no explicit argument needed
+ return;
+ }
+
+ mCmdLine->AppendLooseValue(StringPrintf(L"/prefetch:%zu", prefetchSlot));
+}
+
Result<Ok, LaunchError> WindowsProcessLauncher::DoSetup() {
Result<Ok, LaunchError> aError = BaseProcessLauncher::DoSetup();
if (aError.isErr()) {
@@ -1568,6 +1679,9 @@ Result<Ok, LaunchError> WindowsProcessLauncher::DoSetup() {
// Process type
mCmdLine->AppendLooseValue(UTF8ToWide(ChildProcessType()));
+ // Prefetch cache hint
+ AddApplicationPrefetchArgument();
+
# ifdef MOZ_SANDBOX
if (mUseSandbox) {
// Mark the handles to inherit as inheritable.
diff --git a/ipc/glue/IPCStreamUtils.cpp b/ipc/glue/IPCStreamUtils.cpp
index b884bf5d5d..7d73cfeace 100644
--- a/ipc/glue/IPCStreamUtils.cpp
+++ b/ipc/glue/IPCStreamUtils.cpp
@@ -131,7 +131,7 @@ bool SerializeIPCStream(already_AddRefed<nsIInputStream> aInputStream,
InputStreamHelper::SerializeInputStreamAsPipe(stream, aValue.stream());
if (aValue.stream().type() == InputStreamParams::T__None) {
- MOZ_ASSERT_UNREACHABLE("Serializing as a pipe failed");
+ // This can fail from OOM, etc. We will likely MOZ_CRASH now
return false;
}
return true;
diff --git a/ipc/glue/MessageChannel.cpp b/ipc/glue/MessageChannel.cpp
index a7fc135748..16eb897175 100644
--- a/ipc/glue/MessageChannel.cpp
+++ b/ipc/glue/MessageChannel.cpp
@@ -473,9 +473,8 @@ MessageChannel::~MessageChannel() {
// would be unsafe to invoke our listener's callbacks, and we may be being
// destroyed on a thread other than `mWorkerThread`.
if (!IsClosedLocked()) {
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::IPCFatalErrorProtocol,
- nsDependentCString(mName));
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::IPCFatalErrorProtocol, mName);
switch (mChannelState) {
case ChannelConnected:
MOZ_CRASH(
@@ -537,6 +536,12 @@ int32_t MessageChannel::CurrentNestedInsideSyncTransaction() const {
return mTransactionStack->TransactionID();
}
+bool MessageChannel::TestOnlyIsTransactionComplete() const {
+ AssertWorkerThread();
+ MonitorAutoLock lock(*mMonitor);
+ return !mTransactionStack || mTransactionStack->IsComplete();
+}
+
bool MessageChannel::AwaitingSyncReply() const {
mMonitor->AssertCurrentThreadOwns();
return mTransactionStack ? mTransactionStack->AwaitingSyncReply() : false;
diff --git a/ipc/glue/MessageChannel.h b/ipc/glue/MessageChannel.h
index 67540b4ac8..a1a5bad916 100644
--- a/ipc/glue/MessageChannel.h
+++ b/ipc/glue/MessageChannel.h
@@ -292,6 +292,11 @@ class MessageChannel : HasResultCodes {
void CancelCurrentTransaction() MOZ_EXCLUDES(*mMonitor);
+ // Return whether the current transaction is complete.
+ //
+ // This is intended only for tests.
+ bool TestOnlyIsTransactionComplete() const MOZ_EXCLUDES(*mMonitor);
+
// IsClosed and NumQueuedMessages are safe to call from any thread, but
// may provide an out-of-date value.
bool IsClosed() MOZ_EXCLUDES(*mMonitor) {
diff --git a/ipc/glue/MessageLink.cpp b/ipc/glue/MessageLink.cpp
index 5505322a2f..0937fde6bf 100644
--- a/ipc/glue/MessageLink.cpp
+++ b/ipc/glue/MessageLink.cpp
@@ -98,12 +98,10 @@ void PortLink::SendMessage(UniquePtr<Message> aMessage) {
mChan->mMonitor->AssertCurrentThreadOwns();
if (aMessage->size() > IPC::Channel::kMaximumMessageSize) {
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::IPCMessageName,
- nsDependentCString(aMessage->name()));
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::IPCMessageSize,
- static_cast<unsigned int>(aMessage->size()));
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::IPCMessageName, aMessage->name());
+ CrashReporter::RecordAnnotationU32(
+ CrashReporter::Annotation::IPCMessageSize, aMessage->size());
MOZ_CRASH("IPC message size is too large");
}
aMessage->AssertAsLargeAsHeader();
diff --git a/ipc/glue/NodeChannel.cpp b/ipc/glue/NodeChannel.cpp
index 70e67bc473..169aa91f9b 100644
--- a/ipc/glue/NodeChannel.cpp
+++ b/ipc/glue/NodeChannel.cpp
@@ -170,12 +170,10 @@ void NodeChannel::AcceptInvite(const NodeName& aRealName,
void NodeChannel::SendMessage(UniquePtr<IPC::Message> aMessage) {
if (aMessage->size() > IPC::Channel::kMaximumMessageSize) {
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::IPCMessageName,
- nsDependentCString(aMessage->name()));
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::IPCMessageSize,
- static_cast<unsigned int>(aMessage->size()));
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::IPCMessageName, aMessage->name());
+ CrashReporter::RecordAnnotationU32(
+ CrashReporter::Annotation::IPCMessageSize, aMessage->size());
MOZ_CRASH("IPC message size is too large");
}
aMessage->AssertAsLargeAsHeader();
diff --git a/ipc/glue/PBackground.ipdl b/ipc/glue/PBackground.ipdl
index 94b0079ff7..d0fe4b1731 100644
--- a/ipc/glue/PBackground.ipdl
+++ b/ipc/glue/PBackground.ipdl
@@ -129,7 +129,8 @@ parent:
// Only called at startup during mochitests to check the basic infrastructure.
async PBackgroundTest(nsCString testArg);
- async PBackgroundIDBFactory(LoggingInfo loggingInfo);
+ async PBackgroundIDBFactory(LoggingInfo loggingInfo,
+ nsCString systemLocale);
async PBackgroundIndexedDBUtils();
diff --git a/ipc/glue/PUtilityAudioDecoder.ipdl b/ipc/glue/PUtilityAudioDecoder.ipdl
index 74dbbd2c54..5b4b8711f2 100644
--- a/ipc/glue/PUtilityAudioDecoder.ipdl
+++ b/ipc/glue/PUtilityAudioDecoder.ipdl
@@ -30,7 +30,6 @@ parent:
#ifdef MOZ_WMF_MEDIA_ENGINE
async InitVideoBridge(Endpoint<PVideoBridgeChild> endpoint,
- GfxVarUpdate[] updates,
ContentDeviceData contentDeviceData);
async UpdateVar(GfxVarUpdate var);
diff --git a/ipc/glue/PUtilityProcess.ipdl b/ipc/glue/PUtilityProcess.ipdl
index 585590799f..be8b439514 100644
--- a/ipc/glue/PUtilityProcess.ipdl
+++ b/ipc/glue/PUtilityProcess.ipdl
@@ -21,6 +21,8 @@ include protocol PSandboxTesting;
include "mozilla/ipc/ByteBufUtils.h";
+include GraphicsMessages;
+
using mozilla::dom::NativeThreadId from "mozilla/dom/NativeThreadId.h";
// Telemetry
@@ -98,7 +100,7 @@ child:
async TestTelemetryProbes();
- async StartUtilityAudioDecoderService(Endpoint<PUtilityAudioDecoderParent> aEndpoint);
+ async StartUtilityAudioDecoderService(Endpoint<PUtilityAudioDecoderParent> aEndpoint, GfxVarUpdate[] updates);
async StartJSOracleService(Endpoint<PJSOracleChild> aEndpoint);
diff --git a/ipc/glue/ProcessChild.cpp b/ipc/glue/ProcessChild.cpp
index 724d2b09bf..fe727ffa66 100644
--- a/ipc/glue/ProcessChild.cpp
+++ b/ipc/glue/ProcessChild.cpp
@@ -21,7 +21,6 @@
#include "nsAppRunner.h"
#include "mozilla/AppShutdown.h"
-#include "mozilla/ipc/CrashReporterClient.h"
#include "mozilla/ipc/IOThreadChild.h"
#include "mozilla/GeckoArgs.h"
@@ -29,6 +28,8 @@ namespace mozilla {
namespace ipc {
ProcessChild* ProcessChild::gProcessChild;
+StaticMutex ProcessChild::gIPCShutdownStateLock;
+nsCString ProcessChild::gIPCShutdownStateAnnotation;
static Atomic<bool> sExpectingShutdown(false);
@@ -39,6 +40,9 @@ ProcessChild::ProcessChild(ProcessId aParentPid, const nsID& aMessageChannelId)
mMessageChannelId(aMessageChannelId) {
MOZ_ASSERT(mUILoop, "UILoop should be created by now");
MOZ_ASSERT(!gProcessChild, "should only be one ProcessChild");
+ CrashReporter::RegisterAnnotationNSCString(
+ CrashReporter::Annotation::IPCShutdownState,
+ &gIPCShutdownStateAnnotation);
gProcessChild = this;
}
@@ -101,14 +105,14 @@ ProcessChild::~ProcessChild() {
// we'll get into late IPC shutdown with processes still running.
SleepIfEnv("MOZ_TEST_CHILD_EXIT_HANG");
#endif
+ gIPCShutdownStateAnnotation = ""_ns;
gProcessChild = nullptr;
}
/* static */
void ProcessChild::NotifiedImpendingShutdown() {
sExpectingShutdown = true;
- CrashReporter::AppendToCrashReportAnnotation(
- CrashReporter::Annotation::IPCShutdownState,
+ ProcessChild::AppendToIPCShutdownStateAnnotation(
"NotifiedImpendingShutdown"_ns);
}
diff --git a/ipc/glue/ProcessChild.h b/ipc/glue/ProcessChild.h
index 29948a9127..f881b316cf 100644
--- a/ipc/glue/ProcessChild.h
+++ b/ipc/glue/ProcessChild.h
@@ -48,6 +48,12 @@ class ProcessChild : public ChildProcess {
static bool ExpectingShutdown();
+ static void AppendToIPCShutdownStateAnnotation(const nsCString& aStr) {
+ StaticMutexAutoLock lock(gIPCShutdownStateLock);
+ gIPCShutdownStateAnnotation.Append(" - "_ns);
+ gIPCShutdownStateAnnotation.Append(aStr);
+ }
+
/**
* Exit *now*. Do not shut down XPCOM, do not pass Go, do not run
* static destructors, do not collect $200.
@@ -63,6 +69,9 @@ class ProcessChild : public ChildProcess {
private:
static ProcessChild* gProcessChild;
+ static StaticMutex gIPCShutdownStateLock;
+ static nsCString gIPCShutdownStateAnnotation
+ MOZ_GUARDED_BY(gIPCShutdownStateLock);
MessageLoop* mUILoop;
ProcessId mParentPid;
diff --git a/ipc/glue/ProtocolUtils.cpp b/ipc/glue/ProtocolUtils.cpp
index bd78dce607..b29221d476 100644
--- a/ipc/glue/ProtocolUtils.cpp
+++ b/ipc/glue/ProtocolUtils.cpp
@@ -73,23 +73,28 @@ IPCResult IPCResult::FailImpl(NotNull<IProtocol*> actor, const char* where,
#endif
}
+/* static */
+IPCResult IPCResult::FailForTesting(NotNull<IProtocol*> actor,
+ const char* where, const char* why) {
+ return IPCResult(false);
+}
+
void AnnotateSystemError() {
- int64_t error = 0;
+ uint32_t error = 0;
#if defined(XP_WIN)
error = ::GetLastError();
#else
error = errno;
#endif
if (error) {
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::IPCSystemError,
- nsPrintfCString("%" PRId64, error));
+ CrashReporter::RecordAnnotationU32(
+ CrashReporter::Annotation::IPCSystemError, error);
}
}
#if defined(XP_MACOSX)
void AnnotateCrashReportWithErrno(CrashReporter::Annotation tag, int error) {
- CrashReporter::AnnotateCrashReport(tag, error);
+ CrashReporter::RecordAnnotationU32(tag, static_cast<uint32_t>(error));
}
#endif // defined(XP_MACOSX)
@@ -191,8 +196,8 @@ void FatalError(const char* aMsg, bool aIsParent) {
// this process if we're off the main thread.
formattedMessage.AppendLiteral("\". Intentionally crashing.");
NS_ERROR(formattedMessage.get());
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::IPCFatalErrorMsg, nsDependentCString(aMsg));
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::IPCFatalErrorMsg, aMsg);
AnnotateSystemError();
#ifndef FUZZING
MOZ_CRASH("IPC FatalError in the parent process!");
diff --git a/ipc/glue/ProtocolUtils.h b/ipc/glue/ProtocolUtils.h
index 2a0c64de20..7edce9612b 100644
--- a/ipc/glue/ProtocolUtils.h
+++ b/ipc/glue/ProtocolUtils.h
@@ -341,6 +341,9 @@ class IProtocol : public HasResultCodes {
mozilla::ipc::IPCResult::FailUnsafePrintfImpl( \
WrapNotNull(actor), __func__, nsPrintfCString(format, ##__VA_ARGS__))
+#define IPC_TEST_FAIL(actor) \
+ mozilla::ipc::IPCResult::FailForTesting(WrapNotNull(actor), __func__, "")
+
/**
* All message deserializers and message handlers should return this type via
* the above macros. We use a less generic name here to avoid conflict with
@@ -379,6 +382,10 @@ class IPCResult {
return FailImpl(aActor, aWhere, aWhy.get());
}
+ // Only used in testing.
+ static IPCResult FailForTesting(NotNull<IProtocol*> aActor,
+ const char* aWhere, const char* aWhy);
+
private:
static IPCResult FailImpl(NotNull<IProtocol*> aActor, const char* aWhere,
const char* aWhy);
diff --git a/ipc/glue/UtilityAudioDecoder.cpp b/ipc/glue/UtilityAudioDecoder.cpp
index 0b28fd601e..0a294d95f5 100644
--- a/ipc/glue/UtilityAudioDecoder.cpp
+++ b/ipc/glue/UtilityAudioDecoder.cpp
@@ -6,6 +6,7 @@
#include "mozilla/ProcInfo.h"
#include "mozilla/ipc/UtilityAudioDecoder.h"
+#include "mozilla/dom/BindingUtils.h"
#include "mozilla/ipc/UtilityProcessChild.h"
namespace mozilla::ipc {
@@ -34,8 +35,7 @@ UtilityActorName GetAudioActorName(const SandboxingKind aSandbox) {
nsCString GetChildAudioActorName() {
RefPtr<ipc::UtilityProcessChild> s = ipc::UtilityProcessChild::Get();
MOZ_ASSERT(s, "Has UtilityProcessChild");
- return nsCString(dom::WebIDLUtilityActorNameValues::GetString(
- GetAudioActorName(s->mSandbox)));
+ return dom::GetEnumString(GetAudioActorName(s->mSandbox));
}
} // namespace mozilla::ipc
diff --git a/ipc/glue/UtilityAudioDecoderChild.cpp b/ipc/glue/UtilityAudioDecoderChild.cpp
index 88124a1f8b..cc3560e05b 100644
--- a/ipc/glue/UtilityAudioDecoderChild.cpp
+++ b/ipc/glue/UtilityAudioDecoderChild.cpp
@@ -42,8 +42,8 @@ NS_IMETHODIMP UtilityAudioDecoderChildShutdownObserver::Observe(
NS_IMPL_ISUPPORTS(UtilityAudioDecoderChildShutdownObserver, nsIObserver);
-static EnumeratedArray<SandboxingKind, SandboxingKind::COUNT,
- StaticRefPtr<UtilityAudioDecoderChild>>
+static EnumeratedArray<SandboxingKind, StaticRefPtr<UtilityAudioDecoderChild>,
+ size_t(SandboxingKind::COUNT)>
sAudioDecoderChilds;
UtilityAudioDecoderChild::UtilityAudioDecoderChild(SandboxingKind aKind)
@@ -56,6 +56,40 @@ UtilityAudioDecoderChild::UtilityAudioDecoderChild(SandboxingKind aKind)
}
}
+nsresult UtilityAudioDecoderChild::BindToUtilityProcess(
+ RefPtr<UtilityProcessParent> aUtilityParent) {
+ Endpoint<PUtilityAudioDecoderChild> utilityAudioDecoderChildEnd;
+ Endpoint<PUtilityAudioDecoderParent> utilityAudioDecoderParentEnd;
+ nsresult rv = PUtilityAudioDecoder::CreateEndpoints(
+ aUtilityParent->OtherPid(), base::GetCurrentProcId(),
+ &utilityAudioDecoderParentEnd, &utilityAudioDecoderChildEnd);
+
+ if (NS_FAILED(rv)) {
+ MOZ_ASSERT(false, "Protocol endpoints failure");
+ return NS_ERROR_FAILURE;
+ }
+
+ nsTArray<gfx::GfxVarUpdate> updates;
+#ifdef MOZ_WMF_MEDIA_ENGINE
+ // Only MFCDM process needs gfxVars
+ if (mSandbox == SandboxingKind::MF_MEDIA_ENGINE_CDM) {
+ updates = gfx::gfxVars::FetchNonDefaultVars();
+ }
+#endif
+ if (!aUtilityParent->SendStartUtilityAudioDecoderService(
+ std::move(utilityAudioDecoderParentEnd), std::move(updates))) {
+ MOZ_ASSERT(false, "StartUtilityAudioDecoder service failure");
+ return NS_ERROR_FAILURE;
+ }
+
+ Bind(std::move(utilityAudioDecoderChildEnd));
+
+ PROFILER_MARKER_UNTYPED("UtilityAudioDecoderChild::BindToUtilityProcess", IPC,
+ MarkerOptions(MarkerTiming::IntervalUntilNowFrom(
+ mAudioDecoderChildStart)));
+ return NS_OK;
+}
+
void UtilityAudioDecoderChild::ActorDestroy(ActorDestroyReason aReason) {
MOZ_ASSERT(NS_IsMainThread());
#ifdef MOZ_WMF_MEDIA_ENGINE
@@ -110,15 +144,10 @@ mozilla::ipc::IPCResult
UtilityAudioDecoderChild::RecvCompleteCreatedVideoBridge() {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(mSandbox == SandboxingKind::MF_MEDIA_ENGINE_CDM);
- mHasCreatedVideoBridge = true;
+ mHasCreatedVideoBridge = State::Created;
return IPC_OK();
}
-bool UtilityAudioDecoderChild::HasCreatedVideoBridge() const {
- MOZ_ASSERT(NS_IsMainThread());
- return mHasCreatedVideoBridge;
-}
-
void UtilityAudioDecoderChild::OnVarChanged(const gfx::GfxVarUpdate& aVar) {
MOZ_ASSERT(mSandbox == SandboxingKind::MF_MEDIA_ENGINE_CDM);
SendUpdateVar(aVar);
@@ -127,7 +156,7 @@ void UtilityAudioDecoderChild::OnVarChanged(const gfx::GfxVarUpdate& aVar) {
void UtilityAudioDecoderChild::OnCompositorUnexpectedShutdown() {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(mSandbox == SandboxingKind::MF_MEDIA_ENGINE_CDM);
- mHasCreatedVideoBridge = false;
+ mHasCreatedVideoBridge = State::None;
CreateVideoBridge();
}
@@ -135,9 +164,11 @@ bool UtilityAudioDecoderChild::CreateVideoBridge() {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(mSandbox == SandboxingKind::MF_MEDIA_ENGINE_CDM);
- if (HasCreatedVideoBridge()) {
+ // Creating or already created, avoiding reinit a bridge.
+ if (mHasCreatedVideoBridge != State::None) {
return true;
}
+ mHasCreatedVideoBridge = State::Creating;
// Build content device data first; this ensure that the GPU process is fully
// ready.
@@ -170,11 +201,10 @@ bool UtilityAudioDecoderChild::CreateVideoBridge() {
return false;
}
- nsTArray<gfx::GfxVarUpdate> updates = gfx::gfxVars::FetchNonDefaultVars();
gpuManager->InitVideoBridge(
std::move(parentPipe),
layers::VideoBridgeSource::MFMediaEngineCDMProcess);
- SendInitVideoBridge(std::move(childPipe), updates, contentDeviceData);
+ SendInitVideoBridge(std::move(childPipe), contentDeviceData);
return true;
}
#endif
diff --git a/ipc/glue/UtilityAudioDecoderChild.h b/ipc/glue/UtilityAudioDecoderChild.h
index 4e6a7792b0..0a27cb4ea3 100644
--- a/ipc/glue/UtilityAudioDecoderChild.h
+++ b/ipc/glue/UtilityAudioDecoderChild.h
@@ -58,32 +58,7 @@ class UtilityAudioDecoderChild final : public PUtilityAudioDecoderChild
UtilityActorName GetActorName() { return GetAudioActorName(mSandbox); }
- nsresult BindToUtilityProcess(RefPtr<UtilityProcessParent> aUtilityParent) {
- Endpoint<PUtilityAudioDecoderChild> utilityAudioDecoderChildEnd;
- Endpoint<PUtilityAudioDecoderParent> utilityAudioDecoderParentEnd;
- nsresult rv = PUtilityAudioDecoder::CreateEndpoints(
- aUtilityParent->OtherPid(), base::GetCurrentProcId(),
- &utilityAudioDecoderParentEnd, &utilityAudioDecoderChildEnd);
-
- if (NS_FAILED(rv)) {
- MOZ_ASSERT(false, "Protocol endpoints failure");
- return NS_ERROR_FAILURE;
- }
-
- if (!aUtilityParent->SendStartUtilityAudioDecoderService(
- std::move(utilityAudioDecoderParentEnd))) {
- MOZ_ASSERT(false, "StartUtilityAudioDecoder service failure");
- return NS_ERROR_FAILURE;
- }
-
- Bind(std::move(utilityAudioDecoderChildEnd));
-
- PROFILER_MARKER_UNTYPED(
- "UtilityAudioDecoderChild::BindToUtilityProcess", IPC,
- MarkerOptions(
- MarkerTiming::IntervalUntilNowFrom(mAudioDecoderChildStart)));
- return NS_OK;
- }
+ nsresult BindToUtilityProcess(RefPtr<UtilityProcessParent> aUtilityParent);
void ActorDestroy(ActorDestroyReason aReason) override;
@@ -96,8 +71,6 @@ class UtilityAudioDecoderChild final : public PUtilityAudioDecoderChild
#ifdef MOZ_WMF_MEDIA_ENGINE
mozilla::ipc::IPCResult RecvCompleteCreatedVideoBridge();
- bool HasCreatedVideoBridge() const;
-
void OnVarChanged(const gfx::GfxVarUpdate& aVar) override;
void OnCompositorUnexpectedShutdown() override;
@@ -120,7 +93,8 @@ class UtilityAudioDecoderChild final : public PUtilityAudioDecoderChild
#ifdef MOZ_WMF_MEDIA_ENGINE
// True if the utility process has created a video bridge with the GPU prcess.
// Currently only used for media egine cdm. Main thread only.
- bool mHasCreatedVideoBridge = false;
+ enum class State { None, Creating, Created };
+ State mHasCreatedVideoBridge = State::None;
#endif
TimeStamp mAudioDecoderChildStart;
diff --git a/ipc/glue/UtilityAudioDecoderParent.cpp b/ipc/glue/UtilityAudioDecoderParent.cpp
index 2eb0936a38..ed6327061b 100644
--- a/ipc/glue/UtilityAudioDecoderParent.cpp
+++ b/ipc/glue/UtilityAudioDecoderParent.cpp
@@ -42,7 +42,8 @@
namespace mozilla::ipc {
-UtilityAudioDecoderParent::UtilityAudioDecoderParent()
+UtilityAudioDecoderParent::UtilityAudioDecoderParent(
+ nsTArray<gfx::GfxVarUpdate>&& aUpdates)
: mKind(GetCurrentSandboxingKind()),
mAudioDecoderParentStart(TimeStamp::Now()) {
#ifdef MOZ_WMF_MEDIA_ENGINE
@@ -51,6 +52,9 @@ UtilityAudioDecoderParent::UtilityAudioDecoderParent()
profiler_set_process_name(nsCString("MF Media Engine CDM"));
gfx::gfxConfig::Init();
gfx::gfxVars::Initialize();
+ for (auto& update : aUpdates) {
+ gfx::gfxVars::ApplyUpdate(update);
+ }
gfx::DeviceManagerDx::Init();
return;
}
@@ -78,12 +82,12 @@ UtilityAudioDecoderParent::~UtilityAudioDecoderParent() {
/* static */
void UtilityAudioDecoderParent::GenericPreloadForSandbox() {
-#if defined(MOZ_SANDBOX) && defined(XP_WIN) && defined(MOZ_FFVPX)
+#if defined(MOZ_SANDBOX) && defined(XP_WIN)
// Preload AV dlls so we can enable Binary Signature Policy
// to restrict further dll loads.
UtilityProcessImpl::LoadLibraryOrCrash(L"mozavcodec.dll");
UtilityProcessImpl::LoadLibraryOrCrash(L"mozavutil.dll");
-#endif // defined(MOZ_SANDBOX) && defined(XP_WIN) && defined(MOZ_FFVPX)
+#endif // defined(MOZ_SANDBOX) && defined(XP_WIN)
}
/* static */
@@ -141,7 +145,6 @@ UtilityAudioDecoderParent::RecvNewContentRemoteDecoderManager(
#ifdef MOZ_WMF_MEDIA_ENGINE
mozilla::ipc::IPCResult UtilityAudioDecoderParent::RecvInitVideoBridge(
Endpoint<PVideoBridgeChild>&& aEndpoint,
- nsTArray<gfx::GfxVarUpdate>&& aUpdates,
const ContentDeviceData& aContentDeviceData) {
MOZ_ASSERT(mKind == SandboxingKind::MF_MEDIA_ENGINE_CDM);
if (!RemoteDecoderManagerParent::CreateVideoBridgeToOtherProcess(
@@ -149,10 +152,6 @@ mozilla::ipc::IPCResult UtilityAudioDecoderParent::RecvInitVideoBridge(
return IPC_FAIL_NO_REASON(this);
}
- for (const auto& update : aUpdates) {
- gfx::gfxVars::ApplyUpdate(update);
- }
-
gfx::gfxConfig::Inherit(
{
gfx::Feature::HW_COMPOSITING,
@@ -175,6 +174,17 @@ mozilla::ipc::IPCResult UtilityAudioDecoderParent::RecvInitVideoBridge(
IPCResult UtilityAudioDecoderParent::RecvUpdateVar(
const GfxVarUpdate& aUpdate) {
MOZ_ASSERT(mKind == SandboxingKind::MF_MEDIA_ENGINE_CDM);
+ auto scopeExit = MakeScopeExit(
+ [self = RefPtr<UtilityAudioDecoderParent>{this},
+ location = GetRemoteDecodeInFromKind(mKind),
+ couldUseHWDecoder = gfx::gfxVars::CanUseHardwareVideoDecoding()] {
+ if (couldUseHWDecoder != gfx::gfxVars::CanUseHardwareVideoDecoding()) {
+ // The capabilities of the system may have changed, force a refresh by
+ // re-initializing the PDM.
+ Unused << self->SendUpdateMediaCodecsSupported(
+ location, PDMFactory::Supported(true /* force refresh */));
+ }
+ });
gfx::gfxVars::ApplyUpdate(aUpdate);
return IPC_OK();
}
diff --git a/ipc/glue/UtilityAudioDecoderParent.h b/ipc/glue/UtilityAudioDecoderParent.h
index 6996fa0538..7279582fdc 100644
--- a/ipc/glue/UtilityAudioDecoderParent.h
+++ b/ipc/glue/UtilityAudioDecoderParent.h
@@ -25,7 +25,8 @@ class UtilityAudioDecoderParent final : public PUtilityAudioDecoderParent {
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(UtilityAudioDecoderParent, override);
- UtilityAudioDecoderParent();
+ explicit UtilityAudioDecoderParent(
+ nsTArray<mozilla::gfx::GfxVarUpdate>&& aUpdates);
static void GenericPreloadForSandbox();
static void WMFPreloadForSandbox();
@@ -39,7 +40,6 @@ class UtilityAudioDecoderParent final : public PUtilityAudioDecoderParent {
#ifdef MOZ_WMF_MEDIA_ENGINE
mozilla::ipc::IPCResult RecvInitVideoBridge(
Endpoint<PVideoBridgeChild>&& aEndpoint,
- nsTArray<mozilla::gfx::GfxVarUpdate>&& aUpdates,
const ContentDeviceData& aContentDeviceData);
IPCResult RecvUpdateVar(const mozilla::gfx::GfxVarUpdate& aUpdate);
diff --git a/ipc/glue/UtilityProcessChild.cpp b/ipc/glue/UtilityProcessChild.cpp
index cda3dbc817..d99c2fb361 100644
--- a/ipc/glue/UtilityProcessChild.cpp
+++ b/ipc/glue/UtilityProcessChild.cpp
@@ -261,11 +261,13 @@ mozilla::ipc::IPCResult UtilityProcessChild::RecvTestTelemetryProbes() {
mozilla::ipc::IPCResult
UtilityProcessChild::RecvStartUtilityAudioDecoderService(
- Endpoint<PUtilityAudioDecoderParent>&& aEndpoint) {
+ Endpoint<PUtilityAudioDecoderParent>&& aEndpoint,
+ nsTArray<gfx::GfxVarUpdate>&& aUpdates) {
PROFILER_MARKER_UNTYPED(
"UtilityProcessChild::RecvStartUtilityAudioDecoderService", MEDIA,
MarkerOptions(MarkerTiming::IntervalUntilNowFrom(mChildStartTime)));
- mUtilityAudioDecoderInstance = new UtilityAudioDecoderParent();
+ mUtilityAudioDecoderInstance =
+ new UtilityAudioDecoderParent(std::move(aUpdates));
if (!mUtilityAudioDecoderInstance) {
return IPC_FAIL(this, "Failed to create UtilityAudioDecoderParent");
}
diff --git a/ipc/glue/UtilityProcessChild.h b/ipc/glue/UtilityProcessChild.h
index db6db6bba6..42bfc421d0 100644
--- a/ipc/glue/UtilityProcessChild.h
+++ b/ipc/glue/UtilityProcessChild.h
@@ -63,7 +63,8 @@ class UtilityProcessChild final : public PUtilityProcessChild {
mozilla::ipc::IPCResult RecvTestTelemetryProbes();
mozilla::ipc::IPCResult RecvStartUtilityAudioDecoderService(
- Endpoint<PUtilityAudioDecoderParent>&& aEndpoint);
+ Endpoint<PUtilityAudioDecoderParent>&& aEndpoint,
+ nsTArray<gfx::GfxVarUpdate>&& aUpdates);
mozilla::ipc::IPCResult RecvStartJSOracleService(
Endpoint<dom::PJSOracleChild>&& aEndpoint);
diff --git a/ipc/glue/UtilityProcessHost.cpp b/ipc/glue/UtilityProcessHost.cpp
index 6b8a84966e..5f33fac81b 100644
--- a/ipc/glue/UtilityProcessHost.cpp
+++ b/ipc/glue/UtilityProcessHost.cpp
@@ -107,10 +107,6 @@ bool UtilityProcessHost::Launch(StringVector aExtraOpts) {
}
mPrefSerializer->AddSharedPrefCmdLineArgs(*this, aExtraOpts);
-#if defined(XP_WIN) && defined(MOZ_SANDBOX)
- mSandboxLevel = Preferences::GetInt("security.sandbox.utility.level");
-#endif
-
#ifdef MOZ_WMF_CDM_LPAC_SANDBOX
EnsureWidevineL1PathForSandbox(aExtraOpts);
#endif
diff --git a/ipc/glue/UtilityProcessManager.cpp b/ipc/glue/UtilityProcessManager.cpp
index e24fed476b..b4cc4687a3 100644
--- a/ipc/glue/UtilityProcessManager.cpp
+++ b/ipc/glue/UtilityProcessManager.cpp
@@ -214,8 +214,8 @@ RefPtr<GenericNonExclusivePromise> UtilityProcessManager::LaunchProcess(
}
p->mQueuedPrefs.Clear();
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::UtilityProcessStatus, "Running"_ns);
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::UtilityProcessStatus, "Running");
return GenericNonExclusivePromise::CreateAndResolve(true, __func__);
},
@@ -592,8 +592,8 @@ void UtilityProcessManager::DestroyProcess(SandboxingKind aSandbox) {
mProcesses[aSandbox] = nullptr;
- CrashReporter::AnnotateCrashReport(
- CrashReporter::Annotation::UtilityProcessStatus, "Destroyed"_ns);
+ CrashReporter::RecordAnnotationCString(
+ CrashReporter::Annotation::UtilityProcessStatus, "Destroyed");
if (NoMoreProcesses()) {
sSingleton = nullptr;
diff --git a/ipc/glue/UtilityProcessManager.h b/ipc/glue/UtilityProcessManager.h
index 60cea016c9..64b0f6504f 100644
--- a/ipc/glue/UtilityProcessManager.h
+++ b/ipc/glue/UtilityProcessManager.h
@@ -228,7 +228,8 @@ class UtilityProcessManager final : public UtilityProcessHost::Listener {
~ProcessFields() = default;
};
- EnumeratedArray<SandboxingKind, SandboxingKind::COUNT, RefPtr<ProcessFields>>
+ EnumeratedArray<SandboxingKind, RefPtr<ProcessFields>,
+ size_t(SandboxingKind::COUNT)>
mProcesses;
RefPtr<ProcessFields> GetProcess(SandboxingKind);
diff --git a/ipc/glue/UtilityProcessParent.cpp b/ipc/glue/UtilityProcessParent.cpp
index 2860b4704b..ea499eaee8 100644
--- a/ipc/glue/UtilityProcessParent.cpp
+++ b/ipc/glue/UtilityProcessParent.cpp
@@ -148,7 +148,7 @@ void UtilityProcessParent::ActorDestroy(ActorDestroyReason aWhy) {
actorsName += ", "_ns + GetUtilityActorName(actor);
}
}
- mCrashReporter->AddAnnotation(
+ mCrashReporter->AddAnnotationNSCString(
CrashReporter::Annotation::UtilityActorsName, actorsName);
}
#endif
diff --git a/ipc/glue/moz.build b/ipc/glue/moz.build
index bb23b29a45..7aa29612b8 100644
--- a/ipc/glue/moz.build
+++ b/ipc/glue/moz.build
@@ -138,7 +138,7 @@ elif CONFIG["OS_ARCH"] in ("DragonFly", "FreeBSD", "NetBSD", "OpenBSD"):
EXPORTS.mozilla.ipc += [
"SetProcessTitle.h",
]
-elif CONFIG["OS_ARCH"] == "Darwin":
+elif CONFIG["TARGET_OS"] == "OSX":
UNIFIED_SOURCES += ["ProcessUtils_mac.mm"]
else:
UNIFIED_SOURCES += [
diff --git a/ipc/glue/test/browser/browser_audio_fallback.toml b/ipc/glue/test/browser/browser_audio_fallback.toml
index 0de2a1c9e7..ab2b783e9a 100644
--- a/ipc/glue/test/browser/browser_audio_fallback.toml
+++ b/ipc/glue/test/browser/browser_audio_fallback.toml
@@ -1,9 +1,14 @@
[DEFAULT]
+subsuite = "media-bc"
+tags = "media-engine-compatible"
support-files = [
"head.js",
"head-multiple.js",
]
-prefs = ["media.allow-audio-non-utility=true"]
+prefs = [
+ "media.allow-audio-non-utility=true",
+ "media.wmf.media-engine.channel-decoder.enabled=false"
+]
# Set this since we want to continue monitoring the disabling of pref since we
# still allow it a little bit.
environment = "MOZ_DONT_LOCK_UTILITY_PLZ_FILE_A_BUG=1"
diff --git a/ipc/glue/test/browser/browser_audio_fallback_content.toml b/ipc/glue/test/browser/browser_audio_fallback_content.toml
index 3efc6409ac..f074ac743d 100644
--- a/ipc/glue/test/browser/browser_audio_fallback_content.toml
+++ b/ipc/glue/test/browser/browser_audio_fallback_content.toml
@@ -1,4 +1,6 @@
[DEFAULT]
+subsuite = "media-bc"
+tags = "media-engine-compatible"
support-files = [
"head.js",
"head-multiple.js",
@@ -6,6 +8,7 @@ support-files = [
prefs = [
"media.allow-audio-non-utility=true",
"media.rdd-process.enabled=false",
+ "media.wmf.media-engine.channel-decoder.enabled=false"
]
["browser_utility_multipleAudio_fallback_content.js"]
diff --git a/ipc/glue/test/browser/browser_audio_locked.toml b/ipc/glue/test/browser/browser_audio_locked.toml
index 9f0607bf5f..82a42ff935 100644
--- a/ipc/glue/test/browser/browser_audio_locked.toml
+++ b/ipc/glue/test/browser/browser_audio_locked.toml
@@ -1,3 +1,6 @@
[DEFAULT]
+subsuite = "media-bc"
+tags = "media-engine-compatible"
+prefs = ["media.wmf.media-engine.channel-decoder.enabled=false"]
["browser_utility_audio_locked.js"]
diff --git a/ipc/glue/test/browser/browser_audio_shutdown.toml b/ipc/glue/test/browser/browser_audio_shutdown.toml
index f99fff7830..6dbb8cdf49 100644
--- a/ipc/glue/test/browser/browser_audio_shutdown.toml
+++ b/ipc/glue/test/browser/browser_audio_shutdown.toml
@@ -1,5 +1,8 @@
[DEFAULT]
+subsuite = "media-bc"
+tags = "media-engine-compatible"
support-files = ["head.js"]
+prefs = ["media.wmf.media-engine.channel-decoder.enabled=false"]
["browser_utility_audio_shutdown.js"]
support-files = ["../../../../dom/media/test/small-shot.ogg"]
diff --git a/ipc/glue/test/browser/browser_child_hang.js b/ipc/glue/test/browser/browser_child_hang.js
index cf890a6c61..e74517fbdd 100644
--- a/ipc/glue/test/browser/browser_child_hang.js
+++ b/ipc/glue/test/browser/browser_child_hang.js
@@ -24,7 +24,7 @@ add_task(async function () {
url: "https://example.com/",
forceNewProcess: true,
},
- async function (browser) {
+ async function () {
// browser.frameLoader.remoteTab.osPid is the child pid; once we
// have a way to get notifications about child process termination
// events, that could be useful.
diff --git a/ipc/glue/test/browser/browser_utility_audioDecodeCrash.js b/ipc/glue/test/browser/browser_utility_audioDecodeCrash.js
index 1c7551c623..1662ba06f3 100644
--- a/ipc/glue/test/browser/browser_utility_audioDecodeCrash.js
+++ b/ipc/glue/test/browser/browser_utility_audioDecodeCrash.js
@@ -22,7 +22,7 @@ async function getAudioDecoderPid(expectation) {
async function crashDecoder(expectation) {
const audioPid = await getAudioDecoderPid(expectation);
- ok(audioPid > 0, `Found an audio decoder ${audioPid}`);
+ Assert.greater(audioPid, 0, `Found an audio decoder ${audioPid}`);
const actorIsAudioDecoder = actorNames => {
return actorNames
.split(",")
diff --git a/ipc/glue/test/browser/browser_utility_audio_shutdown.js b/ipc/glue/test/browser/browser_utility_audio_shutdown.js
index a0a4be63f6..046b6914a8 100644
--- a/ipc/glue/test/browser/browser_utility_audio_shutdown.js
+++ b/ipc/glue/test/browser/browser_utility_audio_shutdown.js
@@ -31,7 +31,7 @@ async function findGenericAudioDecoder() {
);
}
);
- ok(audioDecoders.length === 1, "Only one audio decoder present");
+ Assert.strictEqual(audioDecoders.length, 1, "Only one audio decoder present");
return audioDecoders[0].pid;
}
@@ -50,7 +50,7 @@ add_task(async function testKill() {
);
info("Waiting 15s to trigger mShutdownBlockers assertions");
- await new Promise((resolve, reject) => {
+ await new Promise(resolve => {
/* eslint-disable mozilla/no-arbitrary-setTimeout */
setTimeout(resolve, 15 * 1000);
});
@@ -62,12 +62,12 @@ add_task(async function testShutdown() {
await runTest("small-shot.ogg", "Utility Generic", "ffvpx audio decoder");
const audioDecoderPid = await findGenericAudioDecoder();
- ok(audioDecoderPid > 0, `Valid PID found: ${audioDecoderPid}`);
+ Assert.greater(audioDecoderPid, 0, `Valid PID found: ${audioDecoderPid}`);
await cleanUtilityProcessShutdown("audioDecoder_Generic");
info("Waiting 15s to trigger mShutdownBlockers assertions");
- await new Promise((resolve, reject) => {
+ await new Promise(resolve => {
/* eslint-disable mozilla/no-arbitrary-setTimeout */
setTimeout(resolve, 15 * 1000);
});
diff --git a/ipc/glue/test/browser/browser_utility_filepicker_crashed.js b/ipc/glue/test/browser/browser_utility_filepicker_crashed.js
index e8eb83cf30..1cfbb9e591 100644
--- a/ipc/glue/test/browser/browser_utility_filepicker_crashed.js
+++ b/ipc/glue/test/browser/browser_utility_filepicker_crashed.js
@@ -57,13 +57,18 @@ function openFileDialog() {
return pid;
})();
- const file = new Promise((resolve, reject) => {
+ const file = new Promise(resolve => {
info("Opening Windows file dialog");
let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
- fp.init(window, "Test: browser_utility_filepicker_crashed.js", fp.modeOpen);
+ fp.init(
+ window.browsingContext,
+ "Test: browser_utility_filepicker_crashed.js",
+ fp.modeOpen
+ );
fp.open(result => {
- ok(
- result == fp.returnCancel,
+ Assert.equal(
+ result,
+ fp.returnCancel,
"filepicker should resolve to cancellation"
);
resolve();
diff --git a/ipc/glue/test/browser/browser_utility_memoryReport.js b/ipc/glue/test/browser/browser_utility_memoryReport.js
index 8cec61b8be..55bc8fbffe 100644
--- a/ipc/glue/test/browser/browser_utility_memoryReport.js
+++ b/ipc/glue/test/browser/browser_utility_memoryReport.js
@@ -15,11 +15,15 @@ add_task(async () => {
const gMgr = Cc["@mozilla.org/memory-reporter-manager;1"].getService(
Ci.nsIMemoryReporterManager
);
- ok(utilityPid !== undefined, `Utility process is running as ${utilityPid}`);
+ Assert.notStrictEqual(
+ utilityPid,
+ undefined,
+ `Utility process is running as ${utilityPid}`
+ );
var utilityReports = [];
- const performCollection = new Promise((resolve, reject) => {
+ const performCollection = new Promise(resolve => {
// Record the reports from the live memory reporters then process them.
let handleReport = function (
aProcess,
@@ -56,13 +60,14 @@ add_task(async () => {
`Collected ${utilityReports.length} reports from utility process ${utilityPid}`
);
ok(!!utilityReports.length, "Collected some reports");
- ok(
- utilityReports.filter(r => r.path === "vsize" && r.amount > 0).length === 1,
+ Assert.strictEqual(
+ utilityReports.filter(r => r.path === "vsize" && r.amount > 0).length,
+ 1,
"Collected vsize report"
);
- ok(
- utilityReports.filter(r => r.path === "resident" && r.amount > 0).length ===
- 1,
+ Assert.strictEqual(
+ utilityReports.filter(r => r.path === "resident" && r.amount > 0).length,
+ 1,
"Collected resident report"
);
ok(
diff --git a/ipc/glue/test/browser/head.js b/ipc/glue/test/browser/head.js
index 8acff88273..7520049cd0 100644
--- a/ipc/glue/test/browser/head.js
+++ b/ipc/glue/test/browser/head.js
@@ -39,7 +39,11 @@ async function getUtilityProcesses(actor = undefined, options = {}) {
async function tryGetUtilityPid(actor, options = {}) {
let process = await getUtilityProcesses(actor, options);
if (!options?.quiet) {
- ok(process.length <= 1, `at most one ${actor} process exists`);
+ Assert.lessOrEqual(
+ process.length,
+ 1,
+ `at most one ${actor} process exists`
+ );
}
return process[0]?.pid;
}
@@ -47,7 +51,7 @@ async function tryGetUtilityPid(actor, options = {}) {
async function checkUtilityExists(actor) {
info(`Looking for a running ${actor} utility process`);
const utilityPid = await tryGetUtilityPid(actor);
- ok(utilityPid > 0, `Found ${actor} utility process ${utilityPid}`);
+ Assert.greater(utilityPid, 0, `Found ${actor} utility process ${utilityPid}`);
return utilityPid;
}
@@ -60,7 +64,11 @@ async function cleanUtilityProcessShutdown(actor, preferKill = false) {
info(`${preferKill ? "Kill" : "Clean shutdown"} Utility Process ${actor}`);
const utilityPid = await tryGetUtilityPid(actor);
- ok(utilityPid !== undefined, `Must have PID for ${actor} utility process`);
+ Assert.notStrictEqual(
+ utilityPid,
+ undefined,
+ `Must have PID for ${actor} utility process`
+ );
const utilityProcessGone = TestUtils.topicObserved(
"ipc:utility-shutdown",
@@ -332,7 +340,7 @@ async function checkAudioDecoder(
const doc = typeof content !== "undefined" ? content.document : document;
let audio = doc.querySelector("audio");
const checkPromise = new Promise((resolve, reject) => {
- const timeUpdateHandler = async ev => {
+ const timeUpdateHandler = async () => {
const debugInfo = await SpecialPowers.wrap(audio).mozRequestDebugInfo();
const audioDecoderName = debugInfo.decoder.reader.audioDecoderName;
@@ -363,7 +371,7 @@ async function checkAudioDecoder(
}
};
- const startPlaybackHandler = async ev => {
+ const startPlaybackHandler = async () => {
ok(
await audio.play().then(
_ => true,
@@ -375,7 +383,7 @@ async function checkAudioDecoder(
audio.addEventListener("timeupdate", timeUpdateHandler, { once: true });
};
- audio.addEventListener("error", async err => {
+ audio.addEventListener("error", async () => {
info(
`Received HTML media error: ${audio.error.code}: ${audio.error.message}`
);
@@ -483,8 +491,9 @@ async function crashSomeUtility(utilityPid, actorsCheck) {
info(`Waiting for utility process ${utilityPid} to go away.`);
let [subject, data] = await utilityProcessGone;
- ok(
- parseInt(data, 10) === utilityPid,
+ Assert.strictEqual(
+ parseInt(data, 10),
+ utilityPid,
`Should match the crashed PID ${utilityPid} with ${data}`
);
ok(
@@ -510,7 +519,7 @@ async function crashSomeUtility(utilityPid, actorsCheck) {
),
"Record should be a utility process crash"
);
- ok(crash.id === dumpID, "Record should have an ID");
+ Assert.strictEqual(crash.id, dumpID, "Record should have an ID");
ok(
actorsCheck(crash.metadata.UtilityActorsName),
`Record should have the correct actors name for: ${crash.metadata.UtilityActorsName}`
@@ -546,8 +555,9 @@ async function crashSomeUtilityActor(
) {
// Get PID for utility type
const procInfos = await getUtilityProcesses(actor);
- ok(
- procInfos.length == 1,
+ Assert.equal(
+ procInfos.length,
+ 1,
`exactly one ${actor} utility process should be found`
);
const utilityPid = procInfos[0].pid;
diff --git a/ipc/glue/test/browser/mochitest_audio_off.toml b/ipc/glue/test/browser/mochitest_audio_off.toml
index d174ea3939..767be0a4b3 100644
--- a/ipc/glue/test/browser/mochitest_audio_off.toml
+++ b/ipc/glue/test/browser/mochitest_audio_off.toml
@@ -1,4 +1,6 @@
[DEFAULT]
+subsuite = "media"
+tags = "media-engine-compatible"
run-if = ["os == 'android' && !isolated_process"] # Bug 1771452
support-files = [
"head.js",
@@ -7,6 +9,9 @@ support-files = [
"../../../../dom/media/test/small-shot.m4a",
"../../../../dom/media/test/small-shot.flac",
]
-prefs = ["media.utility-process.enabled=false"]
+prefs = [
+ "media.utility-process.enabled=false",
+ "media.wmf.media-engine.channel-decoder.enabled=false"
+]
["test_utility_audio_off.html"]
diff --git a/ipc/glue/test/browser/mochitest_audio_on.toml b/ipc/glue/test/browser/mochitest_audio_on.toml
index 908f4005f1..a06930401e 100644
--- a/ipc/glue/test/browser/mochitest_audio_on.toml
+++ b/ipc/glue/test/browser/mochitest_audio_on.toml
@@ -1,4 +1,6 @@
[DEFAULT]
+subsuite = "media"
+tags = "media-engine-compatible"
run-if = ["os == 'android' && !isolated_process"] # Bug 1771452
support-files = [
"head.js",
@@ -7,6 +9,9 @@ support-files = [
"../../../../dom/media/test/small-shot.m4a",
"../../../../dom/media/test/small-shot.flac",
]
-prefs = ["media.utility-process.enabled=true"]
+prefs = [
+ "media.utility-process.enabled=true",
+ "media.wmf.media-engine.channel-decoder.enabled=false"
+]
["test_utility_audio_on.html"]
diff --git a/ipc/glue/test/gtest/TestUtilityProcessSandboxing.cpp b/ipc/glue/test/gtest/TestUtilityProcessSandboxing.cpp
index fff17d63ef..cbb8d30b03 100644
--- a/ipc/glue/test/gtest/TestUtilityProcessSandboxing.cpp
+++ b/ipc/glue/test/gtest/TestUtilityProcessSandboxing.cpp
@@ -30,8 +30,10 @@ TEST(UtilityProcessSandboxing, ParseEnvVar_DisableGenericOnly)
#if defined(XP_DARWIN)
TEST(UtilityProcessSandboxing, ParseEnvVar_DisableAppleAudioOnly)
{
+# if defined(MOZ_APPLEMEDIA)
EXPECT_FALSE(IsUtilitySandboxEnabled(
"utility:1", SandboxingKind::UTILITY_AUDIO_DECODING_APPLE_MEDIA));
+# endif
EXPECT_TRUE(
IsUtilitySandboxEnabled("utility:1", SandboxingKind::GENERIC_UTILITY));
}
@@ -51,11 +53,11 @@ TEST(UtilityProcessSandboxing, ParseEnvVar_DisableGenericOnly_Multiples)
{
EXPECT_FALSE(IsUtilitySandboxEnabled("utility:1,utility:0,utility:2",
SandboxingKind::GENERIC_UTILITY));
-#if defined(XP_DARWIN)
+#if defined(MOZ_APPLEMEDIA)
EXPECT_FALSE(IsUtilitySandboxEnabled(
"utility:1,utility:0,utility:2",
SandboxingKind::UTILITY_AUDIO_DECODING_APPLE_MEDIA));
-#endif // XP_DARWIN
+#endif // MOZ_APPLEMEDIA
#if defined(XP_WIN)
EXPECT_FALSE(
IsUtilitySandboxEnabled("utility:1,utility:0,utility:2",
diff --git a/ipc/glue/test/utility_process_xpcom/UtilityProcessTest.cpp b/ipc/glue/test/utility_process_xpcom/UtilityProcessTest.cpp
index 6c084a3153..9d22d60d0f 100644
--- a/ipc/glue/test/utility_process_xpcom/UtilityProcessTest.cpp
+++ b/ipc/glue/test/utility_process_xpcom/UtilityProcessTest.cpp
@@ -7,6 +7,7 @@
#if defined(ENABLE_TESTS)
# include "mozilla/ipc/UtilityProcessManager.h"
# include "mozilla/ipc/UtilityProcessTest.h"
+# include "mozilla/dom/ChromeUtilsBinding.h"
# include "mozilla/dom/Promise.h"
# include "mozilla/ProcInfo.h"
# include "mozilla/IntentionalCrash.h"
@@ -26,23 +27,17 @@ namespace mozilla::ipc {
static UtilityActorName UtilityActorNameFromString(
const nsACString& aStringName) {
using namespace mozilla::dom;
-
- // We use WebIDLUtilityActorNames because UtilityActorNames is not designed
- // for iteration.
- for (size_t i = 0; i < WebIDLUtilityActorNameValues::Count; ++i) {
- auto idlName = static_cast<UtilityActorName>(i);
- const nsDependentCSubstring idlNameString(
- WebIDLUtilityActorNameValues::GetString(idlName));
- if (idlNameString.Equals(aStringName)) {
- return idlName;
- }
+ auto idlName = StringToEnum<UtilityActorName>(aStringName);
+ if (idlName.isSome()) {
+ return idlName.value();
}
MOZ_CRASH("Unknown utility actor name");
}
// Find the utility process with the given actor or any utility process if
-// the actor is UtilityActorName::EndGuard_.
-static SandboxingKind FindUtilityProcessWithActor(UtilityActorName aActorName) {
+// aActorName is Nothing().
+static SandboxingKind FindUtilityProcessWithActor(
+ const Maybe<UtilityActorName>& aActorName) {
RefPtr<UtilityProcessManager> utilityProc =
UtilityProcessManager::GetSingleton();
MOZ_ASSERT(utilityProc, "No UtilityprocessManager?");
@@ -52,11 +47,11 @@ static SandboxingKind FindUtilityProcessWithActor(UtilityActorName aActorName) {
if (!utilityProc->Process(sbKind)) {
continue;
}
- if (aActorName == UtilityActorName::EndGuard_) {
+ if (aActorName.isNothing()) {
return sbKind;
}
for (auto actor : utilityProc->GetActors(sbKind)) {
- if (actor == aActorName) {
+ if (actor == aActorName.ref()) {
return sbKind;
}
}
@@ -236,9 +231,9 @@ UtilityProcessTest::StopProcess(const char* aActorName) {
if (aActorName) {
const nsDependentCString actorStringName(aActorName);
UtilityActorName actorName = UtilityActorNameFromString(actorStringName);
- sbKind = FindUtilityProcessWithActor(actorName);
+ sbKind = FindUtilityProcessWithActor(Some(actorName));
} else {
- sbKind = FindUtilityProcessWithActor(UtilityActorName::EndGuard_);
+ sbKind = FindUtilityProcessWithActor(Nothing());
}
if (sbKind == SandboxingKind::COUNT) {
diff --git a/ipc/ipdl/ipdl.py b/ipc/ipdl/ipdl.py
index 230e0a213f..befaacca45 100644
--- a/ipc/ipdl/ipdl.py
+++ b/ipc/ipdl/ipdl.py
@@ -8,6 +8,7 @@ from configparser import RawConfigParser
from io import StringIO
import ipdl
+from ipdl.ast import SYNC
def log(minv, fmt, *args):
@@ -96,6 +97,7 @@ log(2, 'Generated C++ headers will be generated relative to "%s"', headersdir)
log(2, 'Generated C++ sources will be generated in "%s"', cppdir)
allmessages = {}
+allsyncmessages = []
allmessageprognames = []
allprotocols = []
@@ -172,10 +174,16 @@ for f in files:
if ast.protocol:
allmessages[ast.protocol.name] = ipdl.genmsgenum(ast)
allprotocols.append(ast.protocol.name)
+
# e.g. PContent::RequestMemoryReport (not prefixed or suffixed.)
for md in ast.protocol.messageDecls:
allmessageprognames.append("%s::%s" % (md.namespace, md.decl.progname))
+ if md.sendSemantics is SYNC:
+ allsyncmessages.append(
+ "%s__%s" % (ast.protocol.name, md.prettyMsgName())
+ )
+
allprotocols.sort()
# Check if we have undefined message names in segmentCapacityDict.
@@ -248,6 +256,23 @@ print(
namespace IPC {
+bool IPCMessageTypeIsSync(uint32_t aMessageType)
+{
+ switch (aMessageType) {
+""",
+ file=ipc_msgtype_name,
+)
+
+for msg in allsyncmessages:
+ print(" case %s:" % msg, file=ipc_msgtype_name)
+
+print(
+ """ return true;
+ default:
+ return false;
+ }
+}
+
const char* StringFromIPCMessageType(uint32_t aMessageType)
{
switch (aMessageType) {
diff --git a/ipc/ipdl/ipdl/__init__.py b/ipc/ipdl/ipdl/__init__.py
index 50ceb4f953..c042c16444 100644
--- a/ipc/ipdl/ipdl/__init__.py
+++ b/ipc/ipdl/ipdl/__init__.py
@@ -75,7 +75,7 @@ def gencxx(ipdlfilename, ast, outheadersdir, outcppdir, segmentcapacitydict):
def genipdl(ast, outdir):
- return IPDLCodeGen().cgen(ast)
+ return ast.accept(IPDLCodeGen())
def genmsgenum(ast):
diff --git a/ipc/ipdl/ipdl/ast.py b/ipc/ipdl/ipdl/ast.py
index ff083cf628..9329bd3d23 100644
--- a/ipc/ipdl/ipdl/ast.py
+++ b/ipc/ipdl/ipdl/ast.py
@@ -254,37 +254,35 @@ class UsingStmt(Node):
# "singletons"
-class PrettyPrinted:
- @classmethod
+class PrettyPrinted(type):
def __hash__(cls):
return hash_str(cls.pretty)
- @classmethod
def __str__(cls):
return cls.pretty
-class ASYNC(PrettyPrinted):
+class ASYNC(metaclass=PrettyPrinted):
pretty = "async"
-class INTR(PrettyPrinted):
+class INTR(metaclass=PrettyPrinted):
pretty = "intr"
-class SYNC(PrettyPrinted):
+class SYNC(metaclass=PrettyPrinted):
pretty = "sync"
-class INOUT(PrettyPrinted):
+class INOUT(metaclass=PrettyPrinted):
pretty = "inout"
-class IN(PrettyPrinted):
+class IN(metaclass=PrettyPrinted):
pretty = "in"
-class OUT(PrettyPrinted):
+class OUT(metaclass=PrettyPrinted):
pretty = "out"
diff --git a/ipc/ipdl/ipdl/cgen.py b/ipc/ipdl/ipdl/cgen.py
index 8ed8da4d81..fbf0448f33 100644
--- a/ipc/ipdl/ipdl/cgen.py
+++ b/ipc/ipdl/ipdl/cgen.py
@@ -44,7 +44,7 @@ class IPDLCodeGen(CodePrinter, Visitor):
def visitTranslationUnit(self, tu):
self.printed.add(tu.filename)
self.println("//\n// Automatically generated by ipdlc\n//")
- CodeGen.visitTranslationUnit(self, tu) # NOQA: F821
+ Visitor.visitTranslationUnit(self, tu) # NOQA: F821
def visitCxxInclude(self, inc):
self.println('include "' + inc.file + '";')
@@ -64,7 +64,7 @@ class IPDLCodeGen(CodePrinter, Visitor):
for namespace in p.namespaces:
namespace.accept(self)
- self.println("%s protocol %s\n{" % (p.sendSemantics[0], p.name))
+ self.println("%s protocol %s\n{" % (p.sendSemantics, p.name))
self.indent()
for mgs in p.managesStmts:
@@ -87,7 +87,7 @@ class IPDLCodeGen(CodePrinter, Visitor):
self.printdentln("manages " + mgs.name + ";")
def visitMessageDecl(self, msg):
- self.printdent("%s %s %s(" % (msg.sendSemantics[0], msg.direction[0], msg.name))
+ self.printdent("%s %s %s(" % (msg.sendSemantics, msg.direction, msg.name))
for i, inp in enumerate(msg.inParams):
inp.accept(self)
if i != (len(msg.inParams) - 1):
diff --git a/ipc/ipdl/ipdl/lower.py b/ipc/ipdl/ipdl/lower.py
index aac8ebaf36..94699fdcab 100644
--- a/ipc/ipdl/ipdl/lower.py
+++ b/ipc/ipdl/ipdl/lower.py
@@ -4590,10 +4590,9 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
sendmethod, (recvlbl, recvcase) = self.genAsyncCtor(md)
elif isctor:
sendmethod = self.genBlockingCtorMethod(md)
- elif isdtor and isasync:
- sendmethod, (recvlbl, recvcase) = self.genAsyncDtor(md)
elif isdtor:
- sendmethod = self.genBlockingDtorMethod(md)
+ assert isasync
+ sendmethod, (recvlbl, recvcase) = self.genDtor(md)
elif isasync:
(
sendmethod,
@@ -4781,7 +4780,7 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
)
return helper
- def genAsyncDtor(self, md):
+ def genDtor(self, md):
actorvar = ExprVar("actor")
method = MethodDefn(self.makeDtorMethodDecl(md, actorvar))
@@ -4805,39 +4804,6 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
return method, (lbl, case)
- def genBlockingDtorMethod(self, md):
- actorvar = ExprVar("actor")
- method = MethodDefn(self.makeDtorMethodDecl(md, actorvar))
-
- method.addstmt(self.dtorPrologue(actorvar))
-
- msgvar, stmts = self.makeMessage(md, errfnSendDtor, actorvar)
-
- replyvar = self.replyvar
- sendok, sendstmts = self.sendBlocking(md, msgvar, replyvar, actorvar)
- method.addstmts(
- stmts
- + [Whitespace.NL, StmtDecl(Decl(Type("UniquePtr<Message>"), replyvar.name))]
- + sendstmts
- )
-
- destmts = self.deserializeReply(
- md, replyvar, self.side, errfnSend, errfnSentinel(), actorvar
- )
- ifsendok = StmtIf(ExprLiteral.FALSE)
- ifsendok.addifstmts(destmts)
- ifsendok.addifstmts(
- [Whitespace.NL, StmtExpr(ExprAssn(sendok, ExprLiteral.FALSE, "&="))]
- )
-
- method.addstmt(ifsendok)
-
- method.addstmts(
- self.dtorEpilogue(md, actorvar) + [Whitespace.NL, StmtReturn(sendok)]
- )
-
- return method
-
def destroyActor(self, md, actorexpr, why=_DestroyReason.Deletion):
if md and md.decl.type.isCtor():
destroyedType = md.decl.type.constructedType()
diff --git a/ipc/ipdl/ipdl/type.py b/ipc/ipdl/ipdl/type.py
index 3f091f0dd6..d8e893ddf5 100644
--- a/ipc/ipdl/ipdl/type.py
+++ b/ipc/ipdl/ipdl/type.py
@@ -1424,6 +1424,10 @@ class GatherDecls(TcheckVisitor):
# if we error here, no big deal; move on to find more
if _DELETE_MSG == msgname:
+ if md.sendSemantics is not ASYNC:
+ self.error(loc, "destructor must be async")
+ if md.outParams:
+ self.error(loc, "destructors cannot return values")
isdtor = True
cdtype = self.currentProtocolDecl.type
diff --git a/ipc/ipdl/sync-messages.ini b/ipc/ipdl/sync-messages.ini
index 63fac60c8d..9fdb216859 100644
--- a/ipc/ipdl/sync-messages.ini
+++ b/ipc/ipdl/sync-messages.ini
@@ -18,6 +18,90 @@ description = Only used by gtests
description = Only used by gtests
[PQuotaTest::TryInspect_Success_CustomErr_IpcFail]
description = Only used by gtests
+[PTestCancel::ImmediateCancel]
+description = Only used by gtests
+[PTestCancel::NestedCancel]
+description = Only used by gtests
+[PTestCancel::CallNestedCancel]
+description = Only used by gtests
+[PTestCancel::StartNestedCancelParent]
+description = Only used by gtests
+[PTestCancel::NestedCancelParent]
+description = Only used by gtests
+[PTestCancel::CheckChild]
+description = Only used by gtests
+[PTestCancel::CheckParent]
+description = Only used by gtests
+[PTestDataStructures::TestArrayOfInt]
+description = Only used by gtests
+[PTestDataStructures::TestArrayOfActor]
+description = Only used by gtests
+[PTestDataStructures::TestUnion]
+description = Only used by gtests
+[PTestDataStructures::TestArrayOfUnion]
+description = Only used by gtests
+[PTestDataStructures::TestUnionWithArray]
+description = Only used by gtests
+[PTestDataStructures::TestArrayOfUnionWithArray]
+description = Only used by gtests
+[PTestDataStructures::TestStructWithActor]
+description = Only used by gtests
+[PTestDataStructures::TestUnionWithActors]
+description = Only used by gtests
+[PTestDataStructures::TestArrayOfUnionWithActors]
+description = Only used by gtests
+[PTestDataStructures::TestUnions]
+description = Only used by gtests
+[PTestDataStructures::TestArrayOfUnions]
+description = Only used by gtests
+[PTestDataStructures::TestStruct]
+description = Only used by gtests
+[PTestDataStructures::TestStructWithArrays]
+description = Only used by gtests
+[PTestDataStructures::TestStructWithActors]
+description = Only used by gtests
+[PTestDataStructures::TestStructs]
+description = Only used by gtests
+[PTestDataStructures::TestUnionWithStructs]
+description = Only used by gtests
+[PTestDataStructures::TestStructWithUnions]
+description = Only used by gtests
+[PTestDataStructures::TestUnionWithCxx]
+description = Only used by gtests
+[PTestDataStructures::TestNsIntRegion]
+description = Only used by gtests
+[PTestEndpointOpensOpened::HelloSync]
+description = Only used by gtests
+[PTestHangs::Hang]
+description = Only used by gtests
+[PTestJSON::Test]
+description = Only used by gtests
+[PTestMostNested::Msg2]
+description = Only used by gtests
+[PTestMostNested::Msg4]
+description = Only used by gtests
+[PTestMostNested::StartInner]
+description = Only used by gtests
+[PTestSyncError::Error]
+description = Only used by gtests
+[PTestUrgency::Test1]
+description = Only used by gtests
+[PTestUrgency::Test3]
+description = Only used by gtests
+[PTestUrgency::FinalTest_Begin]
+description = Only used by gtests
+[PTestUrgency::Reply1]
+description = Only used by gtests
+[PTestUrgency::Reply2]
+description = Only used by gtests
+
+# Clipboard
+[PContent::GetClipboard]
+description = Legacy synchronous clipboard API
+[PContent::ClipboardHasType]
+description = Legacy synchronous clipboard API
+[PContent::GetClipboardDataSnapshotSync]
+description = Legacy synchronous clipboard API
# The rest
[PHeapSnapshotTempFileHelper::OpenHeapSnapshotTempFile]
@@ -56,12 +140,6 @@ description = JS MessageManager implementation
description = legacy sync IPC - please add detailed description
[PContent::PURLClassifier]
description = legacy sync IPC - please add detailed description
-[PContent::GetClipboard]
-description = Legacy synchronous clipboard API
-[PContent::ClipboardHasType]
-description = Legacy synchronous clipboard API
-[PContent::GetExternalClipboardFormats]
-description = Retrieve supported clipboard formats synchronously
[PContent::GetIconForExtension]
description = legacy sync IPC - please add detailed description
[PContent::BeginDriverCrashGuard]
diff --git a/ipc/ipdl/test/cxx/PTestActorPunning.ipdl b/ipc/ipdl/test/cxx/PTestActorPunning.ipdl
deleted file mode 100644
index 0aec430d9f..0000000000
--- a/ipc/ipdl/test/cxx/PTestActorPunning.ipdl
+++ /dev/null
@@ -1,28 +0,0 @@
-
-include protocol PTestActorPunningPunned;
-include protocol PTestActorPunningSub;
-include "mozilla/_ipdltest/IPDLUnitTestUtils.h";
-include "mozilla/_ipdltest/TestActorPunning.h";
-
-using struct mozilla::_ipdltest::Bad from "mozilla/_ipdltest/IPDLUnitTestUtils.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestActorPunningChild", ParentImpl="TestActorPunningParent"]
-protocol PTestActorPunning {
- manages PTestActorPunningPunned;
- manages PTestActorPunningSub;
-
-child:
- async Start();
-
-parent:
- async PTestActorPunningPunned();
- async PTestActorPunningSub();
- async Pun(PTestActorPunningSub a, Bad bad);
- async __delete__();
-};
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestActorPunningPunned.ipdl b/ipc/ipdl/test/cxx/PTestActorPunningPunned.ipdl
deleted file mode 100644
index 5cca8a8ab5..0000000000
--- a/ipc/ipdl/test/cxx/PTestActorPunningPunned.ipdl
+++ /dev/null
@@ -1,18 +0,0 @@
-
-include protocol PTestActorPunning;
-
-include "mozilla/_ipdltest/TestActorPunning.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestActorPunningPunnedChild", ParentImpl="TestActorPunningPunnedParent"]
-protocol PTestActorPunningPunned {
- manager PTestActorPunning;
-
-child:
- async __delete__();
-};
-
-} // namespace mozilla
-} // namespace _ipdltes
diff --git a/ipc/ipdl/test/cxx/PTestActorPunningSub.ipdl b/ipc/ipdl/test/cxx/PTestActorPunningSub.ipdl
deleted file mode 100644
index 0cb522255c..0000000000
--- a/ipc/ipdl/test/cxx/PTestActorPunningSub.ipdl
+++ /dev/null
@@ -1,19 +0,0 @@
-
-include protocol PTestActorPunning;
-
-include "mozilla/_ipdltest/TestActorPunning.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestActorPunningSubChild", ParentImpl="TestActorPunningSubParent"]
-protocol PTestActorPunningSub {
- manager PTestActorPunning;
-
-child:
- async Bad();
- async __delete__();
-};
-
-} // namespace mozilla
-} // namespace _ipdltes
diff --git a/ipc/ipdl/test/cxx/PTestBadActor.ipdl b/ipc/ipdl/test/cxx/PTestBadActor.ipdl
deleted file mode 100644
index 991e6eb945..0000000000
--- a/ipc/ipdl/test/cxx/PTestBadActor.ipdl
+++ /dev/null
@@ -1,21 +0,0 @@
-include protocol PTestBadActorSub;
-
-include "mozilla/_ipdltest/TestBadActor.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-// Test that a parent sending a reentrant __delete__ message
-// is not killed if a child's message races with the reply.
-
-[ManualDealloc, ChildImpl="TestBadActorChild", ParentImpl="TestBadActorParent"]
-intr protocol PTestBadActor {
- manages PTestBadActorSub;
-
-child:
- async PTestBadActorSub();
- async __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestBadActorSub.ipdl b/ipc/ipdl/test/cxx/PTestBadActorSub.ipdl
deleted file mode 100644
index aadd8b6739..0000000000
--- a/ipc/ipdl/test/cxx/PTestBadActorSub.ipdl
+++ /dev/null
@@ -1,20 +0,0 @@
-include protocol PTestBadActor;
-
-include "mozilla/_ipdltest/TestBadActor.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestBadActorSubChild", ParentImpl="TestBadActorSubParent"]
-intr protocol PTestBadActorSub {
- manager PTestBadActor;
-
-child:
- [LegacyIntr] intr __delete__();
-
-parent:
- async Ping();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestCancel.ipdl b/ipc/ipdl/test/cxx/PTestCancel.ipdl
deleted file mode 100644
index 4ad902e8e1..0000000000
--- a/ipc/ipdl/test/cxx/PTestCancel.ipdl
+++ /dev/null
@@ -1,39 +0,0 @@
-include "mozilla/_ipdltest/TestCancel.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, NestedUpTo=inside_sync, ChildImpl="TestCancelChild", ParentImpl="TestCancelParent"]
-sync protocol PTestCancel
-{
-// Test1
-child:
- [Nested=inside_sync] sync Test1_1();
-parent:
- async Done1();
-
-// Test2
-child:
- async Start2();
- [Nested=inside_sync] sync Test2_2();
-parent:
- sync Test2_1();
-
-// Test3
-child:
- [Nested=inside_sync] sync Test3_1();
-parent:
- async Start3();
- [Nested=inside_sync] sync Test3_2();
-
-parent:
- async Done();
-
-child:
- [Nested=inside_sync] sync CheckChild() returns (uint32_t reply);
-parent:
- [Nested=inside_sync] sync CheckParent() returns (uint32_t reply);
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestCrashCleanup.ipdl b/ipc/ipdl/test/cxx/PTestCrashCleanup.ipdl
deleted file mode 100644
index 43d955f1c7..0000000000
--- a/ipc/ipdl/test/cxx/PTestCrashCleanup.ipdl
+++ /dev/null
@@ -1,20 +0,0 @@
-include "mozilla/_ipdltest/TestCrashCleanup.h";
-
-// See bug 538586: if the top-level protocol's actor is deleted before
-// the "connection error" notification comes in from the IO thread,
-// IPDL teardown never occurs, even if Channel::Close() is called
-// after the error.
-
-namespace mozilla {
-namespace _ipdltest {
-
-// NB: needs to be RPC so that the parent blocks on the child's crash.
-[ManualDealloc, ChildImpl="TestCrashCleanupChild", ParentImpl="TestCrashCleanupParent"]
-intr protocol PTestCrashCleanup {
-child:
- [LegacyIntr] intr DIEDIEDIE();
- async __delete__();
-};
-
-}
-}
diff --git a/ipc/ipdl/test/cxx/PTestDataStructuresSub.ipdl b/ipc/ipdl/test/cxx/PTestDataStructuresSub.ipdl
deleted file mode 100644
index 4f546a8d29..0000000000
--- a/ipc/ipdl/test/cxx/PTestDataStructuresSub.ipdl
+++ /dev/null
@@ -1,18 +0,0 @@
-include PTestDataStructuresCommon;
-include protocol PTestDataStructures;
-
-include "mozilla/_ipdltest/TestDataStructures.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestDataStructuresSub", ParentImpl="TestDataStructuresSub"]
-sync protocol PTestDataStructuresSub {
- manager PTestDataStructures;
-
-parent:
- sync __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestDemon.ipdl b/ipc/ipdl/test/cxx/PTestDemon.ipdl
deleted file mode 100644
index f5af2396e6..0000000000
--- a/ipc/ipdl/test/cxx/PTestDemon.ipdl
+++ /dev/null
@@ -1,24 +0,0 @@
-include "mozilla/_ipdltest/TestDemon.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, NestedUpTo=inside_cpow, ChildImpl="TestDemonChild", ParentImpl="TestDemonParent"]
-sync protocol PTestDemon
-{
-child:
- async Start();
-
-both:
- async AsyncMessage(int n);
- [Nested=inside_sync] sync HiPrioSyncMessage();
-
-parent:
- sync SyncMessage(int n);
-
- [Nested=inside_cpow] async UrgentAsyncMessage(int n);
- [Nested=inside_cpow] sync UrgentSyncMessage(int n);
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestDesc.ipdl b/ipc/ipdl/test/cxx/PTestDesc.ipdl
deleted file mode 100644
index d18d2d8598..0000000000
--- a/ipc/ipdl/test/cxx/PTestDesc.ipdl
+++ /dev/null
@@ -1,24 +0,0 @@
-include protocol PTestDescSub;
-include protocol PTestDescSubsub;
-
-include "mozilla/_ipdltest/TestDesc.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestDescChild", ParentImpl="TestDescParent"]
-intr protocol PTestDesc {
- manages PTestDescSub;
-child:
- [LegacyIntr] intr PTestDescSub(nullable PTestDescSubsub dummy);
-
- async Test(PTestDescSubsub a);
-
- async __delete__();
-
-parent:
- async Ok(PTestDescSubsub a);
-};
-
-}
-}
diff --git a/ipc/ipdl/test/cxx/PTestDescSub.ipdl b/ipc/ipdl/test/cxx/PTestDescSub.ipdl
deleted file mode 100644
index a05451c639..0000000000
--- a/ipc/ipdl/test/cxx/PTestDescSub.ipdl
+++ /dev/null
@@ -1,21 +0,0 @@
-include protocol PTestDesc;
-include protocol PTestDescSubsub;
-
-include "mozilla/_ipdltest/TestDesc.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestDescSubChild", ParentImpl="TestDescSubParent"]
-intr protocol PTestDescSub {
- manager PTestDesc;
- manages PTestDescSubsub;
-
-child:
- async __delete__();
-
- [LegacyIntr] intr PTestDescSubsub();
-};
-
-}
-}
diff --git a/ipc/ipdl/test/cxx/PTestDescSubsub.ipdl b/ipc/ipdl/test/cxx/PTestDescSubsub.ipdl
deleted file mode 100644
index 542a03e2d2..0000000000
--- a/ipc/ipdl/test/cxx/PTestDescSubsub.ipdl
+++ /dev/null
@@ -1,18 +0,0 @@
-
-include protocol PTestDescSub;
-
-include "mozilla/_ipdltest/TestDesc.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestDescSubsubChild", ParentImpl="TestDescSubsubParent"]
-intr protocol PTestDescSubsub {
- manager PTestDescSub;
-
-child:
- [LegacyIntr] intr __delete__();
-};
-
-}
-}
diff --git a/ipc/ipdl/test/cxx/PTestEndpointBridgeMain.ipdl b/ipc/ipdl/test/cxx/PTestEndpointBridgeMain.ipdl
deleted file mode 100644
index c51967b1fa..0000000000
--- a/ipc/ipdl/test/cxx/PTestEndpointBridgeMain.ipdl
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-
-include protocol PTestEndpointBridgeMainSub;
-include protocol PTestEndpointBridgeSub;
-
-include "mozilla/_ipdltest/TestEndpointBridgeMain.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-
-[ManualDealloc, ChildImpl="TestEndpointBridgeMainChild", ParentImpl="TestEndpointBridgeMainParent"]
-protocol PTestEndpointBridgeMain {
-
-child:
- async Start();
-
-parent:
- async Bridged(Endpoint<PTestEndpointBridgeMainSubParent> endpoint);
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestEndpointBridgeMainSub.ipdl b/ipc/ipdl/test/cxx/PTestEndpointBridgeMainSub.ipdl
deleted file mode 100644
index e899fca7aa..0000000000
--- a/ipc/ipdl/test/cxx/PTestEndpointBridgeMainSub.ipdl
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-
-include protocol PTestEndpointBridgeMain;
-include protocol PTestEndpointBridgeSub;
-
-include "mozilla/_ipdltest/TestEndpointBridgeMain.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-// (Bridge protocols can have different semantics than the endpoints
-// they bridge)
-[ManualDealloc, ChildImpl="TestEndpointBridgeMainSubChild", ParentImpl="TestEndpointBridgeMainSubParent"]
-intr protocol PTestEndpointBridgeMainSub {
-child:
- async Hi();
- [LegacyIntr] intr HiRpc();
-
-parent:
- async Hello();
- sync HelloSync();
- [LegacyIntr] intr HelloRpc();
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestEndpointBridgeSub.ipdl b/ipc/ipdl/test/cxx/PTestEndpointBridgeSub.ipdl
deleted file mode 100644
index ab12e3bdb5..0000000000
--- a/ipc/ipdl/test/cxx/PTestEndpointBridgeSub.ipdl
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-
-include protocol PTestEndpointBridgeMainSub;
-
-include "mozilla/_ipdltest/TestEndpointBridgeMain.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-
-[ManualDealloc, ChildImpl="TestEndpointBridgeSubChild", ParentImpl="TestEndpointBridgeSubParent"]
-protocol PTestEndpointBridgeSub {
-child:
- async Ping();
-
- async Bridged(Endpoint<PTestEndpointBridgeMainSubChild> endpoint);
-
-parent:
- async BridgeEm();
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestEndpointOpens.ipdl b/ipc/ipdl/test/cxx/PTestEndpointOpens.ipdl
deleted file mode 100644
index 6cb20bf8eb..0000000000
--- a/ipc/ipdl/test/cxx/PTestEndpointOpens.ipdl
+++ /dev/null
@@ -1,22 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-include protocol PTestEndpointOpensOpened;
-
-include "mozilla/_ipdltest/TestEndpointOpens.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestEndpointOpensChild", ParentImpl="TestEndpointOpensParent"]
-protocol PTestEndpointOpens {
-child:
- async Start();
-
-parent:
- async StartSubprotocol(Endpoint<PTestEndpointOpensOpenedParent> endpoint);
-
- async __delete__();
-};
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestEndpointOpensOpened.ipdl b/ipc/ipdl/test/cxx/PTestEndpointOpensOpened.ipdl
deleted file mode 100644
index 7f72828c30..0000000000
--- a/ipc/ipdl/test/cxx/PTestEndpointOpensOpened.ipdl
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-include "mozilla/_ipdltest/TestEndpointOpens.h";
-
-namespace mozilla {
-namespace _ipdltest2 {
-
-// (Opens protocols can have different semantics than the endpoints
-// that opened them)
-[ManualDealloc, ChildImpl="TestEndpointOpensOpenedChild", ParentImpl="TestEndpointOpensOpenedParent"]
-intr protocol PTestEndpointOpensOpened {
-child:
- async Hi();
- [LegacyIntr] intr HiRpc();
-
-parent:
- async Hello();
- sync HelloSync();
- [LegacyIntr] intr HelloRpc();
- async __delete__();
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest2
diff --git a/ipc/ipdl/test/cxx/PTestFailedCtor.ipdl b/ipc/ipdl/test/cxx/PTestFailedCtor.ipdl
deleted file mode 100644
index 0144f66dba..0000000000
--- a/ipc/ipdl/test/cxx/PTestFailedCtor.ipdl
+++ /dev/null
@@ -1,17 +0,0 @@
-include protocol PTestFailedCtorSub;
-
-include "mozilla/_ipdltest/TestFailedCtor.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestFailedCtorChild", ParentImpl="TestFailedCtorParent"]
-intr protocol PTestFailedCtor {
- manages PTestFailedCtorSub;
-child:
- [LegacyIntr] intr PTestFailedCtorSub();
- async __delete__();
-};
-
-}
-}
diff --git a/ipc/ipdl/test/cxx/PTestFailedCtorSub.ipdl b/ipc/ipdl/test/cxx/PTestFailedCtorSub.ipdl
deleted file mode 100644
index 97bc4d4bf8..0000000000
--- a/ipc/ipdl/test/cxx/PTestFailedCtorSub.ipdl
+++ /dev/null
@@ -1,21 +0,0 @@
-include protocol PTestFailedCtor;
-include protocol PTestFailedCtorSubsub;
-
-include "mozilla/_ipdltest/TestFailedCtor.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestFailedCtorSubChild", ParentImpl="TestFailedCtorSubParent"]
-intr protocol PTestFailedCtorSub {
- manager PTestFailedCtor;
- manages PTestFailedCtorSubsub;
-
-parent:
- async PTestFailedCtorSubsub();
- sync Sync();
- async __delete__();
-};
-
-}
-}
diff --git a/ipc/ipdl/test/cxx/PTestFailedCtorSubsub.ipdl b/ipc/ipdl/test/cxx/PTestFailedCtorSubsub.ipdl
deleted file mode 100644
index 84cb2a0eb8..0000000000
--- a/ipc/ipdl/test/cxx/PTestFailedCtorSubsub.ipdl
+++ /dev/null
@@ -1,18 +0,0 @@
-
-include protocol PTestFailedCtorSub;
-
-include "mozilla/_ipdltest/TestFailedCtor.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestFailedCtorSubsub", ParentImpl="TestFailedCtorSubsub"]
-intr protocol PTestFailedCtorSubsub {
- manager PTestFailedCtorSub;
-
-parent:
- async __delete__();
-};
-
-}
-}
diff --git a/ipc/ipdl/test/cxx/PTestHangs.ipdl b/ipc/ipdl/test/cxx/PTestHangs.ipdl
deleted file mode 100644
index cadc1eda2e..0000000000
--- a/ipc/ipdl/test/cxx/PTestHangs.ipdl
+++ /dev/null
@@ -1,22 +0,0 @@
-
-include "mozilla/_ipdltest/TestHangs.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestHangsChild", ParentImpl="TestHangsParent"]
-intr protocol PTestHangs {
-both:
- [LegacyIntr] intr StackFrame();
-
-parent:
- async Nonce();
-
-child:
- async Start();
- [LegacyIntr] intr Hang();
- async __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestHighestPrio.ipdl b/ipc/ipdl/test/cxx/PTestHighestPrio.ipdl
deleted file mode 100644
index 877ba427b6..0000000000
--- a/ipc/ipdl/test/cxx/PTestHighestPrio.ipdl
+++ /dev/null
@@ -1,21 +0,0 @@
-include "mozilla/_ipdltest/TestHighestPrio.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, NestedUpTo=inside_cpow, ChildImpl="TestHighestPrioChild", ParentImpl="TestHighestPrioParent"]
-sync protocol PTestHighestPrio
-{
-parent:
- [Nested=inside_cpow] async Msg1();
- [Nested=inside_sync] sync Msg2();
- [Nested=inside_cpow] async Msg3();
- [Nested=inside_cpow] sync Msg4();
-
-child:
- async Start();
- [Nested=inside_sync] sync StartInner();
-};
-
-}
-}
diff --git a/ipc/ipdl/test/cxx/PTestInterruptErrorCleanup.ipdl b/ipc/ipdl/test/cxx/PTestInterruptErrorCleanup.ipdl
deleted file mode 100644
index ab6754cc1b..0000000000
--- a/ipc/ipdl/test/cxx/PTestInterruptErrorCleanup.ipdl
+++ /dev/null
@@ -1,14 +0,0 @@
-include "mozilla/_ipdltest/TestInterruptErrorCleanup.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestInterruptErrorCleanupChild", ParentImpl="TestInterruptErrorCleanupParent"]
-intr protocol PTestInterruptErrorCleanup {
-child:
- [LegacyIntr] intr Error();
- [LegacyIntr] intr __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestInterruptRaces.ipdl b/ipc/ipdl/test/cxx/PTestInterruptRaces.ipdl
deleted file mode 100644
index aa66966938..0000000000
--- a/ipc/ipdl/test/cxx/PTestInterruptRaces.ipdl
+++ /dev/null
@@ -1,27 +0,0 @@
-include "mozilla/_ipdltest/TestInterruptRaces.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestInterruptRacesChild", ParentImpl="TestInterruptRacesParent"]
-intr protocol PTestInterruptRaces {
-both:
- [LegacyIntr] intr Race() returns (bool hasReply);
- [LegacyIntr] intr StackFrame() returns ();
- [LegacyIntr] intr StackFrame3() returns ();
-
-parent:
- sync StartRace();
- [LegacyIntr] intr Parent();
- sync GetAnsweredParent() returns (bool answeredParent);
-
-child:
- async Start();
- async Wakeup();
- async Wakeup3();
- [LegacyIntr] intr Child();
- async __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestInterruptShutdownRace.ipdl b/ipc/ipdl/test/cxx/PTestInterruptShutdownRace.ipdl
deleted file mode 100644
index 84bc6f0a97..0000000000
--- a/ipc/ipdl/test/cxx/PTestInterruptShutdownRace.ipdl
+++ /dev/null
@@ -1,19 +0,0 @@
-include "mozilla/_ipdltest/TestInterruptShutdownRace.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestInterruptShutdownRaceChild", ParentImpl="TestInterruptShutdownRaceParent"]
-intr protocol PTestInterruptShutdownRace {
-parent:
- sync StartDeath();
- async Orphan();
-
-child:
- async Start();
- [LegacyIntr] intr Exit();
- async __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestLatency.ipdl b/ipc/ipdl/test/cxx/PTestLatency.ipdl
deleted file mode 100644
index d868d119a2..0000000000
--- a/ipc/ipdl/test/cxx/PTestLatency.ipdl
+++ /dev/null
@@ -1,28 +0,0 @@
-include "mozilla/_ipdltest/TestLatency.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-
-[ManualDealloc, ChildImpl="TestLatencyChild", ParentImpl="TestLatencyParent"]
-intr protocol PTestLatency {
-
-child:
- async __delete__();
- async Ping();
- async Ping5();
- [LegacyIntr] intr Rpc();
- async Spam();
- [LegacyIntr] intr Synchro();
- [Compress] async CompressedSpam(uint32_t seqno);
- [LegacyIntr] intr Synchro2() returns (uint32_t lastSeqno,
- uint32_t numMessagesDispatched);
-
-parent:
- async Pong();
- async Pong5();
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestNestedLoops.ipdl b/ipc/ipdl/test/cxx/PTestNestedLoops.ipdl
deleted file mode 100644
index 168461ab41..0000000000
--- a/ipc/ipdl/test/cxx/PTestNestedLoops.ipdl
+++ /dev/null
@@ -1,22 +0,0 @@
-
-include "mozilla/_ipdltest/TestNestedLoops.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-
-[ManualDealloc, ChildImpl="TestNestedLoopsChild", ParentImpl="TestNestedLoopsParent"]
-intr protocol PTestNestedLoops {
-
-child:
- async Start();
- [LegacyIntr] intr R();
- async __delete__();
-
-parent:
- async Nonce();
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestRPC.ipdl b/ipc/ipdl/test/cxx/PTestRPC.ipdl
deleted file mode 100644
index 4d459eeb03..0000000000
--- a/ipc/ipdl/test/cxx/PTestRPC.ipdl
+++ /dev/null
@@ -1,24 +0,0 @@
-include "mozilla/_ipdltest/TestRPC.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, NestedUpTo=inside_sync, ChildImpl="TestRPCChild", ParentImpl="TestRPCParent"]
-sync protocol PTestRPC
-{
-parent:
- [Nested=inside_sync] sync Test1_Start() returns (uint32_t result);
- [Nested=inside_sync] sync Test1_InnerEvent() returns (uint32_t result);
- async Test2_Start();
- [Nested=inside_sync] sync Test2_OutOfOrder();
-
-child:
- async Start();
- [Nested=inside_sync] sync Test1_InnerQuery() returns (uint32_t result);
- [Nested=inside_sync] sync Test1_NoReenter() returns (uint32_t result);
- [Nested=inside_sync] sync Test2_FirstUrgent();
- [Nested=inside_sync] sync Test2_SecondUrgent();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestRaceDeadlock.ipdl b/ipc/ipdl/test/cxx/PTestRaceDeadlock.ipdl
deleted file mode 100644
index 125919f9af..0000000000
--- a/ipc/ipdl/test/cxx/PTestRaceDeadlock.ipdl
+++ /dev/null
@@ -1,23 +0,0 @@
-include "mozilla/_ipdltest/TestRaceDeadlock.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestRaceDeadlockChild", ParentImpl="TestRaceDeadlockParent"]
-intr protocol PTestRaceDeadlock {
-both:
- async StartRace();
-
-parent:
- [LegacyIntr] intr Lose();
-
-child:
- [LegacyIntr] intr Win();
- [LegacyIntr] intr Rpc();
- async __delete__();
-
-/* Tests that race resolution does not cause deadlocks */
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestRaceDeferral.ipdl b/ipc/ipdl/test/cxx/PTestRaceDeferral.ipdl
deleted file mode 100644
index f165fa1cea..0000000000
--- a/ipc/ipdl/test/cxx/PTestRaceDeferral.ipdl
+++ /dev/null
@@ -1,22 +0,0 @@
-include "mozilla/_ipdltest/TestRaceDeferral.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestRaceDeferralChild", ParentImpl="TestRaceDeferralParent"]
-intr protocol PTestRaceDeferral {
-parent:
- [LegacyIntr] intr Lose();
-
-child:
- async StartRace();
- [LegacyIntr] intr Win();
- [LegacyIntr] intr Rpc();
- async __delete__();
-
-// Test that messages deferred due to race resolution are
-// re-considered when the winner makes later RPCs
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestRacyInterruptReplies.ipdl b/ipc/ipdl/test/cxx/PTestRacyInterruptReplies.ipdl
deleted file mode 100644
index 37b7973e6d..0000000000
--- a/ipc/ipdl/test/cxx/PTestRacyInterruptReplies.ipdl
+++ /dev/null
@@ -1,20 +0,0 @@
-include "mozilla/_ipdltest/TestRacyInterruptReplies.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestRacyInterruptRepliesChild", ParentImpl="TestRacyInterruptRepliesParent"]
-intr protocol PTestRacyInterruptReplies {
-child:
- [LegacyIntr] intr R_() returns (int replyNum);
- async _A();
- async ChildTest();
- async __delete__();
-
-parent:
- [LegacyIntr] intr _R() returns (int replyNum);
- async A_();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestRacyReentry.ipdl b/ipc/ipdl/test/cxx/PTestRacyReentry.ipdl
deleted file mode 100644
index b9579cef24..0000000000
--- a/ipc/ipdl/test/cxx/PTestRacyReentry.ipdl
+++ /dev/null
@@ -1,23 +0,0 @@
-include "mozilla/_ipdltest/TestRacyReentry.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-
-[ManualDealloc, ChildImpl="TestRacyReentryChild", ParentImpl="TestRacyReentryParent"]
-intr protocol PTestRacyReentry {
-
-parent:
- [LegacyIntr] intr E();
- async __delete__();
-
-child:
- async Start();
-
- async N();
- [LegacyIntr] intr H();
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestRacyUndefer.ipdl b/ipc/ipdl/test/cxx/PTestRacyUndefer.ipdl
deleted file mode 100644
index 6256eca9db..0000000000
--- a/ipc/ipdl/test/cxx/PTestRacyUndefer.ipdl
+++ /dev/null
@@ -1,30 +0,0 @@
-include "mozilla/_ipdltest/TestRacyUndefer.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-
-[ManualDealloc, ChildImpl="TestRacyUndeferChild", ParentImpl="TestRacyUndeferParent"]
-intr protocol PTestRacyUndefer {
-
-child:
- async Start();
-
- async AwakenSpam();
- async AwakenRaceWinTwice();
-
- [LegacyIntr] intr Race();
-
- async __delete__();
-
-parent:
-
- [LegacyIntr] intr Spam();
- [LegacyIntr] intr RaceWinTwice();
-
- async Done();
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestSanity.ipdl b/ipc/ipdl/test/cxx/PTestSanity.ipdl
deleted file mode 100644
index 3b3e130d4a..0000000000
--- a/ipc/ipdl/test/cxx/PTestSanity.ipdl
+++ /dev/null
@@ -1,21 +0,0 @@
-
-include "mozilla/_ipdltest/TestSanity.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-
-[ManualDealloc, ChildImpl="TestSanityChild", ParentImpl="TestSanityParent"]
-protocol PTestSanity {
-
-child:
- async Ping(int zero, float zeroPtFive, int8_t dummy);
- async __delete__();
-
-parent:
- async Pong(int one, float zeroPtTwoFive, uint8_t dummy);
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestShutdown.ipdl b/ipc/ipdl/test/cxx/PTestShutdown.ipdl
deleted file mode 100644
index e57defa46a..0000000000
--- a/ipc/ipdl/test/cxx/PTestShutdown.ipdl
+++ /dev/null
@@ -1,29 +0,0 @@
-include protocol PTestShutdownSub;
-
-include "mozilla/_ipdltest/TestShutdown.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestShutdownChild", ParentImpl="TestShutdownParent"]
-intr protocol PTestShutdown {
- manages PTestShutdownSub;
-
-child:
- async Start();
-
-parent:
- // NB: we test deletion and crashing only, not shutdown, because
- // crashing is the same code path as shutdown, and other IPDL unit
- // tests check shutdown semantics
- async PTestShutdownSub(bool expectCrash);
-
- // Used to synchronize between parent and child, to avoid races
- // around flushing socket write queues
- sync Sync();
-
- async __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestShutdownSub.ipdl b/ipc/ipdl/test/cxx/PTestShutdownSub.ipdl
deleted file mode 100644
index e91caca740..0000000000
--- a/ipc/ipdl/test/cxx/PTestShutdownSub.ipdl
+++ /dev/null
@@ -1,23 +0,0 @@
-include protocol PTestShutdown;
-include protocol PTestShutdownSubsub;
-
-include "mozilla/_ipdltest/TestShutdown.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestShutdownSubChild", ParentImpl="TestShutdownSubParent"]
-intr protocol PTestShutdownSub {
- manager PTestShutdown;
- manages PTestShutdownSubsub;
-
-both:
- [LegacyIntr] intr StackFrame();
-
-parent:
- async PTestShutdownSubsub(bool expectParentDeleted);
- sync __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestShutdownSubsub.ipdl b/ipc/ipdl/test/cxx/PTestShutdownSubsub.ipdl
deleted file mode 100644
index 3b1cc5cb6b..0000000000
--- a/ipc/ipdl/test/cxx/PTestShutdownSubsub.ipdl
+++ /dev/null
@@ -1,17 +0,0 @@
-include protocol PTestShutdownSub;
-
-include "mozilla/_ipdltest/TestShutdown.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestShutdownSubsubChild", ParentImpl="TestShutdownSubsubParent"]
-sync protocol PTestShutdownSubsub {
- manager PTestShutdownSub;
-
-parent:
- sync __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestStackHooks.ipdl b/ipc/ipdl/test/cxx/PTestStackHooks.ipdl
deleted file mode 100644
index 3026dfbfbe..0000000000
--- a/ipc/ipdl/test/cxx/PTestStackHooks.ipdl
+++ /dev/null
@@ -1,28 +0,0 @@
-include "mozilla/_ipdltest/TestStackHooks.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-
-[ManualDealloc, ChildImpl="TestStackHooksChild", ParentImpl="TestStackHooksParent"]
-intr protocol PTestStackHooks {
-child:
- async Start();
-
- // These tests are more fruitful running child->parent, because
- // children can send |sync| messages
-parent:
- async Async();
- sync Sync();
- [LegacyIntr] intr Rpc();
-
-both:
- [LegacyIntr] intr StackFrame();
-
-parent:
- async __delete__();
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestSyncHang.ipdl b/ipc/ipdl/test/cxx/PTestSyncHang.ipdl
deleted file mode 100644
index 05521d6ed2..0000000000
--- a/ipc/ipdl/test/cxx/PTestSyncHang.ipdl
+++ /dev/null
@@ -1,16 +0,0 @@
-include "mozilla/_ipdltest/TestSyncHang.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-
-[ManualDealloc, ChildImpl="TestSyncHangChild", ParentImpl="TestSyncHangParent"]
-protocol PTestSyncHang {
-
-child:
- async UnusedMessage();
-};
-
-
-} // namespace mozilla
-} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestSyncWakeup.ipdl b/ipc/ipdl/test/cxx/PTestSyncWakeup.ipdl
deleted file mode 100644
index 807f558dfa..0000000000
--- a/ipc/ipdl/test/cxx/PTestSyncWakeup.ipdl
+++ /dev/null
@@ -1,23 +0,0 @@
-include "mozilla/_ipdltest/TestSyncWakeup.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestSyncWakeupChild", ParentImpl="TestSyncWakeupParent"]
-intr protocol PTestSyncWakeup {
-both:
- [LegacyIntr] intr StackFrame();
-
-child:
- async Start();
- async Note1();
- async Note2();
-
-parent:
- sync Sync1();
- sync Sync2();
- async __delete__();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestUniquePtrIPC.ipdl b/ipc/ipdl/test/cxx/PTestUniquePtrIPC.ipdl
deleted file mode 100644
index b436dcbbb3..0000000000
--- a/ipc/ipdl/test/cxx/PTestUniquePtrIPC.ipdl
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*- 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/. */
-
-include "mozilla/_ipdltest/TestUniquePtrIPC.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-struct DummyStruct {
- int x;
-};
-
-[ManualDealloc, ChildImpl="TestUniquePtrIPCChild", ParentImpl="TestUniquePtrIPCParent"]
-protocol PTestUniquePtrIPC
-{
-child:
- async TestMessage(UniquePtr<int> a1, UniquePtr<DummyStruct> a2,
- DummyStruct a3, UniquePtr<int> a4);
- async TestSendReference(UniquePtr<DummyStruct> a);
-};
-
-}
-}
diff --git a/ipc/ipdl/test/cxx/PTestUrgentHangs.ipdl b/ipc/ipdl/test/cxx/PTestUrgentHangs.ipdl
deleted file mode 100644
index 2c19a7afe1..0000000000
--- a/ipc/ipdl/test/cxx/PTestUrgentHangs.ipdl
+++ /dev/null
@@ -1,31 +0,0 @@
-include "mozilla/_ipdltest/TestUrgentHangs.h";
-
-namespace mozilla {
-namespace _ipdltest {
-
-[ManualDealloc, NestedUpTo=inside_sync, ChildImpl="TestUrgentHangsChild", ParentImpl="TestUrgentHangsParent"]
-sync protocol PTestUrgentHangs
-{
-parent:
- [Nested=inside_sync] sync Test1_2();
-
- [Nested=inside_sync] sync TestInner();
- [Nested=inside_cpow] sync TestInnerUrgent();
-
-child:
- [Nested=inside_sync] sync Test1_1();
- [Nested=inside_sync] sync Test1_3();
-
- [Nested=inside_sync] sync Test2();
-
- [Nested=inside_sync] sync Test3();
-
- async Test4();
- [Nested=inside_sync] sync Test4_1();
-
- async Test5();
- [Nested=inside_sync] sync Test5_1();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestActorPunning.cpp b/ipc/ipdl/test/cxx/TestActorPunning.cpp
deleted file mode 100644
index 5825796f54..0000000000
--- a/ipc/ipdl/test/cxx/TestActorPunning.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-#include "TestActorPunning.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-#include "mozilla/Unused.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-void TestActorPunningParent::Main() {
- if (!SendStart()) fail("sending Start");
-}
-
-mozilla::ipc::IPCResult TestActorPunningParent::RecvPun(
- PTestActorPunningSubParent* a, const Bad& bad) {
- if (a->SendBad()) fail("bad!");
- fail("shouldn't have received this message in the first place");
- return IPC_OK();
-}
-
-// By default, fatal errors kill the parent process, but this makes it
-// hard to test, so instead we use the previous behavior and kill the
-// child process.
-void TestActorPunningParent::HandleFatalError(const char* aErrorMsg) {
- if (!!strcmp(aErrorMsg, "Error deserializing 'PTestActorPunningSubParent'")) {
- fail("wrong fatal error");
- }
-
- ipc::ScopedProcessHandle otherProcessHandle;
- if (!base::OpenProcessHandle(OtherPid(), &otherProcessHandle.rwget())) {
- fail("couldn't open child process");
- } else {
- if (!base::KillProcess(otherProcessHandle, 0, false)) {
- fail("terminating child process");
- }
- }
-}
-
-PTestActorPunningPunnedParent*
-TestActorPunningParent::AllocPTestActorPunningPunnedParent() {
- return new TestActorPunningPunnedParent();
-}
-
-bool TestActorPunningParent::DeallocPTestActorPunningPunnedParent(
- PTestActorPunningPunnedParent* a) {
- delete a;
- return true;
-}
-
-PTestActorPunningSubParent*
-TestActorPunningParent::AllocPTestActorPunningSubParent() {
- return new TestActorPunningSubParent();
-}
-
-bool TestActorPunningParent::DeallocPTestActorPunningSubParent(
- PTestActorPunningSubParent* a) {
- delete a;
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-PTestActorPunningPunnedChild*
-TestActorPunningChild::AllocPTestActorPunningPunnedChild() {
- return new TestActorPunningPunnedChild();
-}
-
-bool TestActorPunningChild::DeallocPTestActorPunningPunnedChild(
- PTestActorPunningPunnedChild*) {
- fail("should have died by now");
- return true;
-}
-
-PTestActorPunningSubChild*
-TestActorPunningChild::AllocPTestActorPunningSubChild() {
- return new TestActorPunningSubChild();
-}
-
-bool TestActorPunningChild::DeallocPTestActorPunningSubChild(
- PTestActorPunningSubChild*) {
- fail("should have died by now");
- return true;
-}
-
-mozilla::ipc::IPCResult TestActorPunningChild::RecvStart() {
- SendPTestActorPunningSubConstructor();
- SendPTestActorPunningPunnedConstructor();
- PTestActorPunningSubChild* a = SendPTestActorPunningSubConstructor();
- // We can't assert whether this succeeds or fails, due to race
- // conditions.
- SendPun(a, Bad());
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestActorPunningSubChild::RecvBad() {
- fail("things are going really badly right now");
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-namespace IPC {
-using namespace mozilla::_ipdltest;
-using namespace mozilla::ipc;
-
-/*static*/ void ParamTraits<Bad>::Write(MessageWriter* aWriter,
- const paramType& aParam) {
- // Skip past the sentinel for the actor as well as the actor.
- int32_t* ptr = aWriter->GetInt32PtrForTest(2 * sizeof(int32_t));
- ActorHandle* ah = reinterpret_cast<ActorHandle*>(ptr);
- if (ah->mId != -3)
- fail("guessed wrong offset (value is %d, should be -3)", ah->mId);
- ah->mId = -2;
-}
-
-/*static*/ bool ParamTraits<Bad>::Read(MessageReader* aReader,
- paramType* aResult) {
- return true;
-}
-
-} // namespace IPC
diff --git a/ipc/ipdl/test/cxx/TestActorPunning.h b/ipc/ipdl/test/cxx/TestActorPunning.h
deleted file mode 100644
index cd88106c0c..0000000000
--- a/ipc/ipdl/test/cxx/TestActorPunning.h
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef mozilla__ipdltest_TestActorPunning_h
-#define mozilla__ipdltest_TestActorPunning_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestActorPunningParent.h"
-#include "mozilla/_ipdltest/PTestActorPunningPunnedParent.h"
-#include "mozilla/_ipdltest/PTestActorPunningSubParent.h"
-#include "mozilla/_ipdltest/PTestActorPunningChild.h"
-#include "mozilla/_ipdltest/PTestActorPunningPunnedChild.h"
-#include "mozilla/_ipdltest/PTestActorPunningSubChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestActorPunningParent : public PTestActorPunningParent {
- friend class PTestActorPunningParent;
-
- public:
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- PTestActorPunningPunnedParent* AllocPTestActorPunningPunnedParent();
- bool DeallocPTestActorPunningPunnedParent(PTestActorPunningPunnedParent* a);
-
- PTestActorPunningSubParent* AllocPTestActorPunningSubParent();
- bool DeallocPTestActorPunningSubParent(PTestActorPunningSubParent* a);
-
- mozilla::ipc::IPCResult RecvPun(PTestActorPunningSubParent* a,
- const Bad& bad);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown == why) fail("should have died from error!");
- passed("ok");
- QuitParent();
- }
-
- virtual void HandleFatalError(const char* aErrorMsg) override;
-};
-
-class TestActorPunningPunnedParent : public PTestActorPunningPunnedParent {
- public:
- TestActorPunningPunnedParent() {}
- virtual ~TestActorPunningPunnedParent() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
-};
-
-class TestActorPunningSubParent : public PTestActorPunningSubParent {
- public:
- TestActorPunningSubParent() {}
- virtual ~TestActorPunningSubParent() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
-};
-
-class TestActorPunningChild : public PTestActorPunningChild {
- friend class PTestActorPunningChild;
-
- public:
- TestActorPunningChild() {}
- virtual ~TestActorPunningChild() {}
-
- protected:
- PTestActorPunningPunnedChild* AllocPTestActorPunningPunnedChild();
- bool DeallocPTestActorPunningPunnedChild(PTestActorPunningPunnedChild* a);
-
- PTestActorPunningSubChild* AllocPTestActorPunningSubChild();
- bool DeallocPTestActorPunningSubChild(PTestActorPunningSubChild* a);
-
- mozilla::ipc::IPCResult RecvStart();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- fail("should have been killed off!");
- }
-};
-
-class TestActorPunningPunnedChild : public PTestActorPunningPunnedChild {
- public:
- TestActorPunningPunnedChild() {}
- virtual ~TestActorPunningPunnedChild() {}
-};
-
-class TestActorPunningSubChild : public PTestActorPunningSubChild {
- public:
- TestActorPunningSubChild() {}
- virtual ~TestActorPunningSubChild() {}
-
- mozilla::ipc::IPCResult RecvBad();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestActorPunning_h
diff --git a/ipc/ipdl/test/cxx/TestAsyncReturns.cpp b/ipc/ipdl/test/cxx/TestAsyncReturns.cpp
deleted file mode 100644
index 76597143c0..0000000000
--- a/ipc/ipdl/test/cxx/TestAsyncReturns.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-#include "TestAsyncReturns.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-#include "mozilla/AbstractThread.h"
-#include "mozilla/Unused.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-static uint32_t sMagic1 = 0x105b59fb;
-static uint32_t sMagic2 = 0x09b6f5e3;
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestAsyncReturnsParent::TestAsyncReturnsParent() {
- MOZ_COUNT_CTOR(TestAsyncReturnsParent);
-}
-
-TestAsyncReturnsParent::~TestAsyncReturnsParent() {
- MOZ_COUNT_DTOR(TestAsyncReturnsParent);
-}
-
-void TestAsyncReturnsParent::Main() {
- SendNoReturn()->Then(
- MessageLoop::current()->SerialEventTarget(), __func__,
- [](bool unused) { fail("resolve handler should not be called"); },
- [](ResponseRejectReason&& aReason) {
- // MozPromise asserts in debug build if the
- // handler is not called
- if (aReason != ResponseRejectReason::ChannelClosed) {
- fail("reject with wrong reason");
- }
- passed("reject handler called on channel close");
- });
- SendPing()->Then(
- MessageLoop::current()->SerialEventTarget(), __func__,
- [this](bool one) {
- if (one) {
- passed("take one argument");
- } else {
- fail("get one argument but has wrong value");
- }
-
- // Also try with the callback-based API.
- SendPing(
- [this](bool one) {
- if (one) {
- passed("take one argument");
- } else {
- fail("get one argument but has wrong value");
- }
- Close();
- },
- [](ResponseRejectReason&& aReason) { fail("sending Ping"); });
- },
- [](ResponseRejectReason&& aReason) { fail("sending Ping"); });
-}
-
-mozilla::ipc::IPCResult TestAsyncReturnsParent::RecvPong(
- PongResolver&& aResolve) {
- aResolve(std::tuple<const uint32_t&, const uint32_t&>(sMagic1, sMagic2));
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestAsyncReturnsChild::TestAsyncReturnsChild() {
- MOZ_COUNT_CTOR(TestAsyncReturnsChild);
-}
-
-TestAsyncReturnsChild::~TestAsyncReturnsChild() {
- MOZ_COUNT_DTOR(TestAsyncReturnsChild);
-}
-
-mozilla::ipc::IPCResult TestAsyncReturnsChild::RecvNoReturn(
- NoReturnResolver&& aResolve) {
- // Not resolving the promise intentionally
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestAsyncReturnsChild::RecvPing(
- PingResolver&& aResolve) {
- SendPong()->Then(
- MessageLoop::current()->SerialEventTarget(), __func__,
- [aResolve](const std::tuple<uint32_t, uint32_t>& aParam) {
- if (std::get<0>(aParam) == sMagic1 && std::get<1>(aParam) == sMagic2) {
- passed("take two arguments");
- } else {
- fail("get two argument but has wrong value");
- }
- aResolve(true);
- },
- [](ResponseRejectReason&& aReason) { fail("sending Pong"); });
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestAsyncReturns.h b/ipc/ipdl/test/cxx/TestAsyncReturns.h
deleted file mode 100644
index 5dad3da0ab..0000000000
--- a/ipc/ipdl/test/cxx/TestAsyncReturns.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef mozilla__ipdltest_TestAsyncReturns_h
-#define mozilla__ipdltest_TestAsyncReturns_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestAsyncReturnsParent.h"
-#include "mozilla/_ipdltest/PTestAsyncReturnsChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestAsyncReturnsParent : public PTestAsyncReturnsParent {
- friend class PTestAsyncReturnsParent;
-
- public:
- TestAsyncReturnsParent();
- virtual ~TestAsyncReturnsParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvPong(PongResolver&& aResolve);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestAsyncReturnsChild : public PTestAsyncReturnsChild {
- friend class PTestAsyncReturnsChild;
-
- public:
- TestAsyncReturnsChild();
- virtual ~TestAsyncReturnsChild();
-
- protected:
- mozilla::ipc::IPCResult RecvPing(PingResolver&& aResolve);
- mozilla::ipc::IPCResult RecvNoReturn(NoReturnResolver&& aResolve);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestAsyncReturns_h
diff --git a/ipc/ipdl/test/cxx/TestBadActor.cpp b/ipc/ipdl/test/cxx/TestBadActor.cpp
deleted file mode 100644
index 6c6991dbb2..0000000000
--- a/ipc/ipdl/test/cxx/TestBadActor.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#include "TestBadActor.h"
-#include "IPDLUnitTests.h"
-#include "mozilla/Unused.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-void TestBadActorParent::Main() {
- // This test is designed to test a race condition where the child sends us
- // a message on an actor that we've already destroyed. The child process
- // should die, and the parent process should not abort.
-
- PTestBadActorSubParent* child = SendPTestBadActorSubConstructor();
- if (!child) fail("Sending constructor");
-
- Unused << child->Call__delete__(child);
-}
-
-// By default, fatal errors kill the parent process, but this makes it
-// hard to test, so instead we use the previous behavior and kill the
-// child process.
-void TestBadActorParent::HandleFatalError(const char* aErrorMsg) {
- if (!!strcmp(aErrorMsg, "incoming message racing with actor deletion")) {
- fail("wrong fatal error");
- }
-
- ipc::ScopedProcessHandle otherProcessHandle;
- if (!base::OpenProcessHandle(OtherPid(), &otherProcessHandle.rwget())) {
- fail("couldn't open child process");
- } else {
- if (!base::KillProcess(otherProcessHandle, 0, false)) {
- fail("terminating child process");
- }
- }
-}
-
-PTestBadActorSubParent* TestBadActorParent::AllocPTestBadActorSubParent() {
- return new TestBadActorSubParent();
-}
-
-mozilla::ipc::IPCResult TestBadActorSubParent::RecvPing() {
- fail("Shouldn't have received ping.");
- return IPC_FAIL_NO_REASON(this);
-}
-
-PTestBadActorSubChild* TestBadActorChild::AllocPTestBadActorSubChild() {
- return new TestBadActorSubChild();
-}
-
-mozilla::ipc::IPCResult TestBadActorChild::RecvPTestBadActorSubConstructor(
- PTestBadActorSubChild* actor) {
- if (!actor->SendPing()) {
- fail("Couldn't send ping to an actor which supposedly isn't dead yet.");
- }
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestBadActor.h b/ipc/ipdl/test/cxx/TestBadActor.h
deleted file mode 100644
index cefe0288f4..0000000000
--- a/ipc/ipdl/test/cxx/TestBadActor.h
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef mozilla__ipdltest_TestBadActor_h
-#define mozilla__ipdltest_TestBadActor_h
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestBadActorParent.h"
-#include "mozilla/_ipdltest/PTestBadActorChild.h"
-
-#include "mozilla/_ipdltest/PTestBadActorSubParent.h"
-#include "mozilla/_ipdltest/PTestBadActorSubChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestBadActorParent : public PTestBadActorParent {
- friend class PTestBadActorParent;
-
- public:
- TestBadActorParent() {}
- virtual ~TestBadActorParent() {}
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (AbnormalShutdown != why) fail("unexpected destruction");
- passed("ok");
- QuitParent();
- }
-
- virtual void HandleFatalError(const char* aErrorMsg) override;
-
- PTestBadActorSubParent* AllocPTestBadActorSubParent();
-
- bool DeallocPTestBadActorSubParent(PTestBadActorSubParent* actor) {
- delete actor;
- return true;
- }
-};
-
-class TestBadActorSubParent : public PTestBadActorSubParent {
- friend class PTestBadActorSubParent;
-
- public:
- TestBadActorSubParent() {}
- virtual ~TestBadActorSubParent() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
- mozilla::ipc::IPCResult RecvPing();
-};
-
-class TestBadActorChild : public PTestBadActorChild {
- friend class PTestBadActorChild;
-
- public:
- TestBadActorChild() {}
- virtual ~TestBadActorChild() {}
-
- protected:
- virtual PTestBadActorSubChild* AllocPTestBadActorSubChild();
-
- virtual bool DeallocPTestBadActorSubChild(PTestBadActorSubChild* actor) {
- delete actor;
- return true;
- }
-
- virtual mozilla::ipc::IPCResult RecvPTestBadActorSubConstructor(
- PTestBadActorSubChild* actor);
-};
-
-class TestBadActorSubChild : public PTestBadActorSubChild {
- public:
- TestBadActorSubChild() {}
- virtual ~TestBadActorSubChild() {}
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // mozilla__ipdltest_TestBadActor_h
diff --git a/ipc/ipdl/test/cxx/TestCancel.cpp b/ipc/ipdl/test/cxx/TestCancel.cpp
deleted file mode 100644
index 2f97aa2e93..0000000000
--- a/ipc/ipdl/test/cxx/TestCancel.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-#include "TestCancel.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestCancelParent::TestCancelParent() { MOZ_COUNT_CTOR(TestCancelParent); }
-
-TestCancelParent::~TestCancelParent() { MOZ_COUNT_DTOR(TestCancelParent); }
-
-void TestCancelParent::Main() {
- if (SendTest1_1()) fail("sending Test1_1");
-
- uint32_t value = 0;
- if (!SendCheckChild(&value)) fail("Test1 CheckChild");
-
- if (value != 12) fail("Test1 CheckChild reply");
-}
-
-mozilla::ipc::IPCResult TestCancelParent::RecvDone1() {
- if (!SendStart2()) fail("sending Start2");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestCancelParent::RecvTest2_1() {
- if (SendTest2_2()) fail("sending Test2_2");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestCancelParent::RecvStart3() {
- if (SendTest3_1()) fail("sending Test3_1");
-
- uint32_t value = 0;
- if (!SendCheckChild(&value)) fail("Test1 CheckChild");
-
- if (value != 12) fail("Test1 CheckChild reply");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestCancelParent::RecvTest3_2() {
- GetIPCChannel()->CancelCurrentTransaction();
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestCancelParent::RecvDone() {
- MessageLoop::current()->PostTask(NewNonOwningRunnableMethod(
- "ipc::IToplevelProtocol::Close", this, &TestCancelParent::Close));
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestCancelParent::RecvCheckParent(uint32_t* reply) {
- *reply = 12;
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-mozilla::ipc::IPCResult TestCancelChild::RecvTest1_1() {
- GetIPCChannel()->CancelCurrentTransaction();
-
- uint32_t value = 0;
- if (!SendCheckParent(&value)) fail("Test1 CheckParent");
-
- if (value != 12) fail("Test1 CheckParent reply");
-
- if (!SendDone1()) fail("Test1 CheckParent");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestCancelChild::RecvStart2() {
- if (!SendTest2_1()) fail("sending Test2_1");
-
- if (!SendStart3()) fail("sending Start3");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestCancelChild::RecvTest2_2() {
- GetIPCChannel()->CancelCurrentTransaction();
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestCancelChild::RecvTest3_1() {
- if (SendTest3_2()) fail("sending Test3_2");
-
- uint32_t value = 0;
- if (!SendCheckParent(&value)) fail("Test1 CheckParent");
-
- if (value != 12) fail("Test1 CheckParent reply");
-
- if (!SendDone()) fail("sending Done");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestCancelChild::RecvCheckChild(uint32_t* reply) {
- *reply = 12;
- return IPC_OK();
-}
-
-TestCancelChild::TestCancelChild() { MOZ_COUNT_CTOR(TestCancelChild); }
-
-TestCancelChild::~TestCancelChild() { MOZ_COUNT_DTOR(TestCancelChild); }
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestCancel.h b/ipc/ipdl/test/cxx/TestCancel.h
deleted file mode 100644
index 7d944d6a69..0000000000
--- a/ipc/ipdl/test/cxx/TestCancel.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef mozilla__ipdltest_TestCancel_h
-#define mozilla__ipdltest_TestCancel_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestCancelParent.h"
-#include "mozilla/_ipdltest/PTestCancelChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestCancelParent : public PTestCancelParent {
- public:
- TestCancelParent();
- virtual ~TestCancelParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- mozilla::ipc::IPCResult RecvDone1();
- mozilla::ipc::IPCResult RecvTest2_1();
- mozilla::ipc::IPCResult RecvStart3();
- mozilla::ipc::IPCResult RecvTest3_2();
- mozilla::ipc::IPCResult RecvDone();
-
- mozilla::ipc::IPCResult RecvCheckParent(uint32_t* reply);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- passed("ok");
- QuitParent();
- }
-};
-
-class TestCancelChild : public PTestCancelChild {
- public:
- TestCancelChild();
- virtual ~TestCancelChild();
-
- mozilla::ipc::IPCResult RecvTest1_1();
- mozilla::ipc::IPCResult RecvStart2();
- mozilla::ipc::IPCResult RecvTest2_2();
- mozilla::ipc::IPCResult RecvTest3_1();
-
- mozilla::ipc::IPCResult RecvCheckChild(uint32_t* reply);
-
- virtual void ActorDestroy(ActorDestroyReason why) override { QuitChild(); }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestCancel_h
diff --git a/ipc/ipdl/test/cxx/TestCrashCleanup.cpp b/ipc/ipdl/test/cxx/TestCrashCleanup.cpp
deleted file mode 100644
index 6a19cc0f65..0000000000
--- a/ipc/ipdl/test/cxx/TestCrashCleanup.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#include "TestCrashCleanup.h"
-
-#include "base/task.h"
-#include "mozilla/CondVar.h"
-#include "mozilla/Mutex.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-#include "IPDLUnitTestSubprocess.h"
-
-using mozilla::CondVar;
-using mozilla::Mutex;
-using mozilla::MutexAutoLock;
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-namespace {
-
-// NB: this test does its own shutdown, rather than going through
-// QuitParent(), because it's testing degenerate edge cases
-
-void DeleteSubprocess(Mutex* mutex, CondVar* cvar) {
- MutexAutoLock lock(*mutex);
-
- gSubprocess->Destroy();
- gSubprocess = nullptr;
-
- cvar->Notify();
-}
-
-void DeleteTheWorld() {
- delete static_cast<TestCrashCleanupParent*>(gParentActor);
- gParentActor = nullptr;
-
- // needs to be synchronous to avoid affecting event ordering on
- // the main thread
- Mutex mutex MOZ_UNANNOTATED("TestCrashCleanup.DeleteTheWorld.mutex");
- CondVar cvar(mutex, "TestCrashCleanup.DeleteTheWorld.cvar");
-
- MutexAutoLock lock(mutex);
-
- XRE_GetIOMessageLoop()->PostTask(
- NewRunnableFunction("DeleteSubprocess", DeleteSubprocess, &mutex, &cvar));
-
- cvar.Wait();
-}
-
-void Done() {
- static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID);
- nsCOMPtr<nsIAppShell> appShell(do_GetService(kAppShellCID));
- appShell->Exit();
-
- passed(__FILE__);
-}
-
-} // namespace
-
-TestCrashCleanupParent::TestCrashCleanupParent() : mCleanedUp(false) {
- MOZ_COUNT_CTOR(TestCrashCleanupParent);
-}
-
-TestCrashCleanupParent::~TestCrashCleanupParent() {
- MOZ_COUNT_DTOR(TestCrashCleanupParent);
-
- if (!mCleanedUp) fail("should have been ActorDestroy()d!");
-}
-
-void TestCrashCleanupParent::Main() {
- // NB: has to be enqueued before IO thread's error notification
- MessageLoop::current()->PostTask(
- NewRunnableFunction("DeleteTheWorld", DeleteTheWorld));
-
- if (CallDIEDIEDIE()) fail("expected an error!");
-
- Close();
-
- MessageLoop::current()->PostTask(NewRunnableFunction("Done", Done));
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestCrashCleanupChild::TestCrashCleanupChild() {
- MOZ_COUNT_CTOR(TestCrashCleanupChild);
-}
-
-TestCrashCleanupChild::~TestCrashCleanupChild() {
- MOZ_COUNT_DTOR(TestCrashCleanupChild);
-}
-
-mozilla::ipc::IPCResult TestCrashCleanupChild::AnswerDIEDIEDIE() {
- _exit(0);
- MOZ_CRASH("unreached");
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestCrashCleanup.h b/ipc/ipdl/test/cxx/TestCrashCleanup.h
deleted file mode 100644
index 30371264e6..0000000000
--- a/ipc/ipdl/test/cxx/TestCrashCleanup.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef mozilla__ipdltest_TestCrashCleanup_h
-#define mozilla__ipdltest_TestCrashCleanup_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestCrashCleanupParent.h"
-#include "mozilla/_ipdltest/PTestCrashCleanupChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestCrashCleanupParent : public PTestCrashCleanupParent {
- public:
- TestCrashCleanupParent();
- virtual ~TestCrashCleanupParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (AbnormalShutdown != why) fail("unexpected destruction!");
- mCleanedUp = true;
- }
-
- bool mCleanedUp;
-};
-
-class TestCrashCleanupChild : public PTestCrashCleanupChild {
- friend class PTestCrashCleanupChild;
-
- public:
- TestCrashCleanupChild();
- virtual ~TestCrashCleanupChild();
-
- protected:
- mozilla::ipc::IPCResult AnswerDIEDIEDIE();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- fail("should have 'crashed'!");
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestCrashCleanup_h
diff --git a/ipc/ipdl/test/cxx/TestDataStructures.cpp b/ipc/ipdl/test/cxx/TestDataStructures.cpp
deleted file mode 100644
index 5b1cabfe7d..0000000000
--- a/ipc/ipdl/test/cxx/TestDataStructures.cpp
+++ /dev/null
@@ -1,888 +0,0 @@
-#include "TestDataStructures.h"
-
-#include "mozilla/Unused.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-typedef nsTArray<nsIntRegion> RegionArray;
-
-namespace mozilla {
-namespace _ipdltest {
-
-static const uint32_t nactors = 10;
-
-#define test_assert(_cond, _msg) \
- if (!(_cond)) fail(_msg)
-
-template <typename T>
-static void assert_arrays_equal(const nsTArray<T>& a, const nsTArray<T>& b) {
- test_assert(a == b, "arrays equal");
-}
-
-inline static TestDataStructuresSub& Cast(PTestDataStructuresSubParent* a) {
- return *static_cast<TestDataStructuresSub*>(a);
-}
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestDataStructuresParent::TestDataStructuresParent() {
- MOZ_COUNT_CTOR(TestDataStructuresParent);
-}
-
-TestDataStructuresParent::~TestDataStructuresParent() {
- MOZ_COUNT_DTOR(TestDataStructuresParent);
-}
-
-void TestDataStructuresParent::Main() {
- for (uint32_t i = 0; i < nactors; ++i)
- if (!SendPTestDataStructuresSubConstructor(i)) fail("can't alloc actor");
-
- if (!SendStart()) fail("can't send Start()");
-}
-
-bool TestDataStructuresParent::DeallocPTestDataStructuresSubParent(
- PTestDataStructuresSubParent* actor) {
- test_assert(Cast(actor).mI == Cast(mKids[0]).mI, "dtor sent to wrong actor");
- mKids.RemoveElementAt(0);
- delete actor;
- if (mKids.Length() > 0) return true;
-
- return true;
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest1(nsTArray<int>&& ia,
- nsTArray<int>* oa) {
- test_assert(5 == ia.Length(), "wrong length");
- for (int i = 0; i < 5; ++i) test_assert(i == ia[i], "wrong value");
-
- *oa = ia;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest2(
- nsTArray<PTestDataStructuresSubParent*>&& i1,
- nsTArray<PTestDataStructuresSubParent*>* o1) {
- test_assert(nactors == i1.Length(), "wrong #actors");
- for (uint32_t i = 0; i < i1.Length(); ++i)
- test_assert(i == Cast(i1[i]).mI, "wrong mI value");
- *o1 = i1;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest3(const IntDouble& i1,
- const IntDouble& i2,
- IntDouble* o1,
- IntDouble* o2) {
- test_assert(42 == i1.get_int(), "wrong value");
- test_assert(4.0 == i2.get_double(), "wrong value");
-
- *o1 = i1;
- *o2 = i2;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest4(
- nsTArray<IntDouble>&& i1, nsTArray<IntDouble>* o1) {
- test_assert(4 == i1.Length(), "wrong length");
- test_assert(1 == i1[0].get_int(), "wrong value");
- test_assert(2.0 == i1[1].get_double(), "wrong value");
- test_assert(3 == i1[2].get_int(), "wrong value");
- test_assert(4.0 == i1[3].get_double(), "wrong value");
-
- *o1 = i1;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest5(
- const IntDoubleArrays& i1, const IntDoubleArrays& i2,
- const IntDoubleArrays& i3, IntDoubleArrays* o1, IntDoubleArrays* o2,
- IntDoubleArrays* o3) {
- test_assert(42 == i1.get_int(), "wrong value");
-
- const nsTArray<int>& i2a = i2.get_ArrayOfint();
- test_assert(3 == i2a.Length(), "wrong length");
- test_assert(1 == i2a[0], "wrong value");
- test_assert(2 == i2a[1], "wrong value");
- test_assert(3 == i2a[2], "wrong value");
-
- const nsTArray<double>& i3a = i3.get_ArrayOfdouble();
- test_assert(3 == i3a.Length(), "wrong length");
- test_assert(1.0 == i3a[0], "wrong value");
- test_assert(2.0 == i3a[1], "wrong value");
- test_assert(3.0 == i3a[2], "wrong value");
-
- *o1 = i1;
- *o2 = i2a;
- *o3 = i3a;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest7_0(
- const ActorWrapper& i1, ActorWrapper* o1) {
- if (i1.actorChild() != nullptr)
- fail("child side actor should always be null");
-
- if (i1.actorParent() != mKids[0])
- fail("should have got back same actor on parent side");
-
- o1->actorParent() = mKids[0];
- // malicious behavior
- o1->actorChild() =
- reinterpret_cast<PTestDataStructuresSubChild*>(uintptr_t(0xdeadbeef));
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest6(
- nsTArray<IntDoubleArrays>&& i1, nsTArray<IntDoubleArrays>* o1) {
- test_assert(3 == i1.Length(), "wrong length");
-
- IntDoubleArrays id1(i1[0]);
- test_assert(42 == id1.get_int(), "wrong value");
-
- nsTArray<int> i2a(i1[1].get_ArrayOfint());
- test_assert(3 == i2a.Length(), "wrong length");
- test_assert(1 == i2a[0], "wrong value");
- test_assert(2 == i2a[1], "wrong value");
- test_assert(3 == i2a[2], "wrong value");
-
- nsTArray<double> i3a(i1[2].get_ArrayOfdouble());
- test_assert(3 == i3a.Length(), "wrong length");
- test_assert(1.0 == i3a[0], "wrong value");
- test_assert(2.0 == i3a[1], "wrong value");
- test_assert(3.0 == i3a[2], "wrong value");
-
- o1->AppendElement(id1);
- o1->AppendElement(IntDoubleArrays(i2a));
- o1->AppendElement(IntDoubleArrays(i3a));
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest7(
- const Actors& i1, const Actors& i2, const Actors& i3, Actors* o1,
- Actors* o2, Actors* o3) {
- test_assert(42 == i1.get_int(), "wrong value");
-
- nsTArray<int> i2a(i2.get_ArrayOfint());
- test_assert(3 == i2a.Length(), "wrong length");
- test_assert(1 == i2a[0], "wrong value");
- test_assert(2 == i2a[1], "wrong value");
- test_assert(3 == i2a[2], "wrong value");
-
- assert_arrays_equal(mKids, i3.get_ArrayOfPTestDataStructuresSubParent());
-
- *o1 = 42;
- *o2 = i2a;
- *o3 = mKids;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest8(
- nsTArray<Actors>&& i1, nsTArray<Actors>* o1) {
- test_assert(3 == i1.Length(), "wrong length");
- test_assert(42 == i1[0].get_int(), "wrong value");
-
- const nsTArray<int>& i2a = i1[1].get_ArrayOfint();
- test_assert(3 == i2a.Length(), "wrong length");
- test_assert(1 == i2a[0], "wrong value");
- test_assert(2 == i2a[1], "wrong value");
- test_assert(3 == i2a[2], "wrong value");
-
- assert_arrays_equal(mKids, i1[2].get_ArrayOfPTestDataStructuresSubParent());
-
- *o1 = i1;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest9(
- const Unions& i1, const Unions& i2, const Unions& i3, const Unions& i4,
- Unions* o1, Unions* o2, Unions* o3, Unions* o4) {
- test_assert(42 == i1.get_int(), "wrong value");
-
- const nsTArray<int>& i2a = i2.get_ArrayOfint();
- test_assert(3 == i2a.Length(), "wrong length");
- test_assert(1 == i2a[0], "wrong value");
- test_assert(2 == i2a[1], "wrong value");
- test_assert(3 == i2a[2], "wrong value");
-
- assert_arrays_equal(mKids, i3.get_ArrayOfPTestDataStructuresSubParent());
-
- const nsTArray<PTestDataStructuresSubParent*>& i4a =
- i4.get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSubParent();
- assert_arrays_equal(mKids, i4a);
-
- *o1 = i1;
- *o2 = i2;
- *o3 = i3;
- *o4 = i4;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest10(
- nsTArray<Unions>&& i1, nsTArray<Unions>* o1) {
- test_assert(42 == i1[0].get_int(), "wrong value");
-
- const nsTArray<int>& i2a = i1[1].get_ArrayOfint();
- test_assert(3 == i2a.Length(), "wrong length");
- test_assert(1 == i2a[0], "wrong value");
- test_assert(2 == i2a[1], "wrong value");
- test_assert(3 == i2a[2], "wrong value");
-
- assert_arrays_equal(mKids, i1[2].get_ArrayOfPTestDataStructuresSubParent());
-
- const nsTArray<PTestDataStructuresSubParent*>& i4a =
- i1[3].get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSubParent();
- assert_arrays_equal(mKids, i4a);
-
- *o1 = i1;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest11(
- const SIntDouble& i, SIntDouble* o) {
- test_assert(1 == i.i(), "wrong value");
- test_assert(2.0 == i.d(), "wrong value");
- *o = i;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest12(
- const SIntDoubleArrays& i, SIntDoubleArrays* o) {
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
-
- nsTArray<double> ad;
- ad.AppendElement(.5);
- ad.AppendElement(1.0);
- ad.AppendElement(2.0);
-
- test_assert(42 == i.i(), "wrong value");
- assert_arrays_equal(ai, i.ai());
- assert_arrays_equal(ad, i.ad());
-
- *o = i;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest13(const SActors& i,
- SActors* o) {
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
-
- test_assert(42 == i.i(), "wrong value");
- assert_arrays_equal(ai, i.ai());
- assert_arrays_equal(mKids, i.apParent());
-
- *o = i;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest14(const Structs& i,
- Structs* o) {
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
-
- test_assert(42 == i.i(), "wrong value");
- assert_arrays_equal(ai, i.ai());
- assert_arrays_equal(mKids, i.apParent());
-
- const SActors& ia = i.aa()[0];
- test_assert(42 == ia.i(), "wrong value");
- assert_arrays_equal(ai, ia.ai());
- assert_arrays_equal(mKids, ia.apParent());
-
- *o = i;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest15(
- const WithStructs& i1, const WithStructs& i2, const WithStructs& i3,
- const WithStructs& i4, const WithStructs& i5, WithStructs* o1,
- WithStructs* o2, WithStructs* o3, WithStructs* o4, WithStructs* o5) {
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
-
- test_assert(i1 == int(42), "wrong value");
- assert_arrays_equal(i2.get_ArrayOfint(), ai);
- assert_arrays_equal(i3.get_ArrayOfPTestDataStructuresSubParent(), mKids);
-
- const SActors& ia = i4.get_ArrayOfSActors()[0];
- test_assert(42 == ia.i(), "wrong value");
- assert_arrays_equal(ai, ia.ai());
- assert_arrays_equal(mKids, ia.apParent());
-
- const Structs& is = i5.get_ArrayOfStructs()[0];
- test_assert(42 == is.i(), "wrong value");
- assert_arrays_equal(ai, is.ai());
- assert_arrays_equal(mKids, is.apParent());
-
- const SActors& isa = is.aa()[0];
- test_assert(42 == isa.i(), "wrong value");
- assert_arrays_equal(ai, isa.ai());
- assert_arrays_equal(mKids, isa.apParent());
-
- *o1 = i1;
- *o2 = i2;
- *o3 = i3;
- *o4 = i4;
- *o5 = i5;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest16(
- const WithUnions& i, WithUnions* o) {
- test_assert(i.i() == 42, "wrong value");
-
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
- assert_arrays_equal(ai, i.ai());
-
- assert_arrays_equal(i.apParent(), mKids);
-
- assert_arrays_equal(mKids,
- i.aa()[0].get_ArrayOfPTestDataStructuresSubParent());
-
- const nsTArray<Unions>& iau = i.au();
- test_assert(iau[0] == 42, "wrong value");
- assert_arrays_equal(ai, iau[1].get_ArrayOfint());
- assert_arrays_equal(mKids, iau[2].get_ArrayOfPTestDataStructuresSubParent());
- assert_arrays_equal(
- mKids,
- iau[3].get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSubParent());
-
- *o = i;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest17(
- nsTArray<Op>&& sa) {
- test_assert(sa.Length() == 1 && Op::TSetAttrs == sa[0].type(), "wrong value");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDataStructuresParent::RecvTest18(RegionArray&& ra) {
- for (RegionArray::index_type i = 0; i < ra.Length(); ++i) {
- // if |ra| has been realloc()d and given a different allocator
- // chunk, this loop will nondeterministically crash or iloop.
- for (auto iter = ra[i].RectIter(); !iter.Done(); iter.Next()) {
- Unused << iter.Get();
- }
- }
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestDataStructuresChild::TestDataStructuresChild() {
- MOZ_COUNT_CTOR(TestDataStructuresChild);
-}
-
-TestDataStructuresChild::~TestDataStructuresChild() {
- MOZ_COUNT_DTOR(TestDataStructuresChild);
-}
-
-mozilla::ipc::IPCResult TestDataStructuresChild::RecvStart() {
- puts("[TestDataStructuresChild] starting");
-
- Test1();
- Test2();
- Test3();
- Test4();
- Test5();
- Test6();
- Test7_0();
- Test7();
- Test8();
- Test9();
- Test10();
- Test11();
- Test12();
- Test13();
- Test14();
- Test15();
- Test16();
- Test17();
- if (OtherPid() != base::GetCurrentProcId()) {
- // FIXME/bug 703317 allocation of nsIntRegion uses a global
- // region pool which breaks threads
- Test18();
- }
-
- for (uint32_t i = 0; i < nactors; ++i)
- if (!PTestDataStructuresSubChild::Send__delete__(mKids[i]))
- fail("can't send dtor");
-
- Close();
-
- return IPC_OK();
-}
-
-void TestDataStructuresChild::Test1() {
- nsTArray<int> ia;
-
- for (int i = 0; i < 5; ++i) ia.AppendElement(i);
-
- nsTArray<int> oa;
- if (!SendTest1(ia, &oa)) fail("can't send Test1");
-
- assert_arrays_equal(ia, oa);
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test2() {
- nsTArray<PTestDataStructuresSubChild*> oa;
- if (!SendTest2(mKids, &oa)) fail("can't send Test2");
- assert_arrays_equal(mKids, oa);
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test3() {
- int i1i = 42;
- double i2d = 4.0;
- IntDouble i1(i1i);
- IntDouble i2(i2d);
- IntDouble o1, o2;
-
- SendTest3(i1, i2, &o1, &o2);
-
- test_assert(i1i == o1.get_int(), "wrong value");
- test_assert(i2d == o2.get_double(), "wrong value");
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test4() {
- nsTArray<IntDouble> i1;
- i1.AppendElement(IntDouble(int(1)));
- i1.AppendElement(IntDouble(2.0));
- i1.AppendElement(IntDouble(int(3)));
- i1.AppendElement(IntDouble(4.0));
-
- nsTArray<IntDouble> o1;
- if (!SendTest4(i1, &o1)) fail("can't send Test4");
-
- // TODO Union::operator==()
- test_assert(i1.Length() == o1.Length(), "wrong length");
- test_assert(1 == o1[0].get_int(), "wrong value");
- test_assert(2.0 == o1[1].get_double(), "wrong value");
- test_assert(3 == o1[2].get_int(), "wrong value");
- test_assert(4.0 == o1[3].get_double(), "wrong value");
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test5() {
- IntDoubleArrays i1(int(42));
- nsTArray<int> i2;
- i2.AppendElement(1);
- i2.AppendElement(2);
- i2.AppendElement(3);
- nsTArray<double> i3;
- i3.AppendElement(1.0);
- i3.AppendElement(2.0);
- i3.AppendElement(3.0);
-
- IntDoubleArrays o1, o2, o3;
- if (!SendTest5(i1, IntDoubleArrays(i2), IntDoubleArrays(i3), &o1, &o2, &o3))
- fail("can't send Test5");
-
- test_assert(42 == o1.get_int(), "wrong value");
- assert_arrays_equal(i2, o2.get_ArrayOfint());
- assert_arrays_equal(i3, o3.get_ArrayOfdouble());
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test6() {
- IntDoubleArrays id1(int(42));
- nsTArray<int> id2;
- id2.AppendElement(1);
- id2.AppendElement(2);
- id2.AppendElement(3);
- nsTArray<double> id3;
- id3.AppendElement(1.0);
- id3.AppendElement(2.0);
- id3.AppendElement(3.0);
-
- nsTArray<IntDoubleArrays> i1;
- i1.AppendElement(id1);
- i1.AppendElement(IntDoubleArrays(id2));
- i1.AppendElement(IntDoubleArrays(id3));
-
- nsTArray<IntDoubleArrays> o1;
- if (!SendTest6(i1, &o1)) fail("can't send Test6");
-
- test_assert(3 == o1.Length(), "wrong length");
- IntDoubleArrays od1(o1[0]);
- nsTArray<int> od2(o1[1].get_ArrayOfint());
- nsTArray<double> od3(o1[2].get_ArrayOfdouble());
-
- test_assert(42 == od1.get_int(), "wrong value");
- assert_arrays_equal(id2, od2);
- assert_arrays_equal(id3, od3);
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test7_0() {
- ActorWrapper iaw;
- if (iaw.actorChild() != nullptr || iaw.actorParent() != nullptr)
- fail("actor members should be null initially");
-
- iaw.actorChild() = mKids[0];
- if (iaw.actorParent() != nullptr)
- fail("parent should be null on child side after set");
-
- ActorWrapper oaw;
- if (!SendTest7_0(iaw, &oaw)) fail("sending Test7_0");
-
- if (oaw.actorParent() != nullptr)
- fail(
- "parent accessor on actor-struct members should always be null in "
- "child");
-
- if (oaw.actorChild() != mKids[0])
- fail("should have got back same child-side actor");
-}
-
-void TestDataStructuresChild::Test7() {
- Actors i1(42);
- nsTArray<int> i2a;
- i2a.AppendElement(1);
- i2a.AppendElement(2);
- i2a.AppendElement(3);
-
- Actors o1, o2, o3;
- if (!SendTest7(i1, Actors(i2a), Actors(mKids), &o1, &o2, &o3))
- fail("can't send Test7");
-
- test_assert(42 == o1.get_int(), "wrong value");
- assert_arrays_equal(i2a, o2.get_ArrayOfint());
- assert_arrays_equal(mKids, o3.get_ArrayOfPTestDataStructuresSubChild());
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test8() {
- Actors i1e(42);
- nsTArray<int> i2a;
- i2a.AppendElement(1);
- i2a.AppendElement(2);
- i2a.AppendElement(3);
-
- nsTArray<Actors> i1;
- i1.AppendElement(i1e);
- i1.AppendElement(i2a);
- i1.AppendElement(mKids);
-
- nsTArray<Actors> o1;
- if (!SendTest8(i1, &o1)) fail("can't send Test8");
-
- test_assert(3 == o1.Length(), "wrong length");
- test_assert(42 == o1[0].get_int(), "wrong value");
- assert_arrays_equal(i2a, o1[1].get_ArrayOfint());
- assert_arrays_equal(mKids, o1[2].get_ArrayOfPTestDataStructuresSubChild());
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test9() {
- Unions i1(int(42));
-
- nsTArray<int> i2a;
- i2a.AppendElement(1);
- i2a.AppendElement(2);
- i2a.AppendElement(3);
-
- nsTArray<Actors> i4a;
- i4a.AppendElement(mKids);
-
- Unions o1, o2, o3, o4;
- if (!SendTest9(i1, Unions(i2a), Unions(mKids), Unions(i4a), &o1, &o2, &o3,
- &o4))
- fail("can't send Test9");
-
- test_assert(42 == o1.get_int(), "wrong value");
- assert_arrays_equal(i2a, o2.get_ArrayOfint());
- assert_arrays_equal(mKids, o3.get_ArrayOfPTestDataStructuresSubChild());
- assert_arrays_equal(
- mKids,
- o4.get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSubChild());
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test10() {
- Unions i1a(int(42));
-
- nsTArray<int> i2a;
- i2a.AppendElement(1);
- i2a.AppendElement(2);
- i2a.AppendElement(3);
-
- nsTArray<Actors> i4a;
- i4a.AppendElement(mKids);
-
- nsTArray<Unions> i1;
- i1.AppendElement(i1a);
- i1.AppendElement(Unions(i2a));
- i1.AppendElement(Unions(mKids));
- i1.AppendElement(Unions(i4a));
-
- nsTArray<Unions> o1;
- if (!SendTest10(i1, &o1)) fail("can't send Test10");
-
- test_assert(4 == o1.Length(), "wrong length");
- test_assert(42 == o1[0].get_int(), "wrong value");
- assert_arrays_equal(i2a, o1[1].get_ArrayOfint());
- assert_arrays_equal(mKids, o1[2].get_ArrayOfPTestDataStructuresSubChild());
- assert_arrays_equal(
- mKids,
- o1[3].get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSubChild());
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test11() {
- SIntDouble i(1, 2.0);
- SIntDouble o;
-
- if (!SendTest11(i, &o)) fail("sending Test11");
-
- test_assert(1 == o.i() && 2.0 == o.d(), "wrong values");
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test12() {
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
-
- nsTArray<double> ad;
- ad.AppendElement(.5);
- ad.AppendElement(1.0);
- ad.AppendElement(2.0);
-
- SIntDoubleArrays i(42, ai, ad);
- SIntDoubleArrays o;
-
- if (!SendTest12(i, &o)) fail("sending Test12");
-
- test_assert(42 == o.i(), "wrong value");
- assert_arrays_equal(ai, o.ai());
- assert_arrays_equal(ad, o.ad());
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test13() {
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
-
- SActors i;
- i.i() = 42;
- i.ai() = ai;
- i.apChild() = mKids;
-
- SActors o;
- if (!SendTest13(i, &o)) fail("can't send Test13");
-
- test_assert(42 == o.i(), "wrong value");
- assert_arrays_equal(ai, o.ai());
- assert_arrays_equal(mKids, o.apChild());
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test14() {
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
-
- SActors ia;
- ia.i() = 42;
- ia.ai() = ai;
- ia.apChild() = mKids;
- nsTArray<SActors> aa;
- aa.AppendElement(ia);
-
- Structs i;
- i.i() = 42;
- i.ai() = ai;
- i.apChild() = mKids;
- i.aa() = aa;
-
- Structs o;
- if (!SendTest14(i, &o)) fail("can't send Test14");
-
- test_assert(42 == o.i(), "wrong value");
- assert_arrays_equal(ai, o.ai());
- assert_arrays_equal(mKids, o.apChild());
-
- const SActors& os = o.aa()[0];
- test_assert(42 == os.i(), "wrong value");
- assert_arrays_equal(ai, os.ai());
- assert_arrays_equal(mKids, os.apChild());
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test15() {
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
-
- SActors ia;
- ia.i() = 42;
- ia.ai() = ai;
- ia.apChild() = mKids;
- nsTArray<SActors> iaa;
- iaa.AppendElement(ia);
-
- Structs is;
- is.i() = 42;
- is.ai() = ai;
- is.apChild() = mKids;
- is.aa() = iaa;
- nsTArray<Structs> isa;
- isa.AppendElement(is);
-
- WithStructs o1, o2, o3, o4, o5;
- if (!SendTest15(WithStructs(42), WithStructs(ai), WithStructs(mKids),
- WithStructs(iaa), WithStructs(isa), &o1, &o2, &o3, &o4, &o5))
- fail("sending Test15");
-
- test_assert(o1 == int(42), "wrong value");
- assert_arrays_equal(o2.get_ArrayOfint(), ai);
- assert_arrays_equal(o3.get_ArrayOfPTestDataStructuresSubChild(), mKids);
-
- const SActors& oa = o4.get_ArrayOfSActors()[0];
- test_assert(42 == oa.i(), "wrong value");
- assert_arrays_equal(ai, oa.ai());
- assert_arrays_equal(mKids, oa.apChild());
-
- const Structs& os = o5.get_ArrayOfStructs()[0];
- test_assert(42 == os.i(), "wrong value");
- assert_arrays_equal(ai, os.ai());
- assert_arrays_equal(mKids, os.apChild());
-
- const SActors& osa = os.aa()[0];
- test_assert(42 == osa.i(), "wrong value");
- assert_arrays_equal(ai, osa.ai());
- assert_arrays_equal(mKids, osa.apChild());
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test16() {
- WithUnions i;
-
- i.i() = 42;
-
- nsTArray<int> ai;
- ai.AppendElement(1);
- ai.AppendElement(2);
- ai.AppendElement(3);
- i.ai() = ai;
-
- i.apChild() = mKids;
-
- nsTArray<Actors> iaa;
- iaa.AppendElement(mKids);
- i.aa() = iaa;
-
- nsTArray<Unions> iau;
- iau.AppendElement(int(42));
- iau.AppendElement(ai);
- iau.AppendElement(mKids);
- iau.AppendElement(iaa);
- i.au() = iau;
-
- WithUnions o;
- if (!SendTest16(i, &o)) fail("sending Test16");
-
- test_assert(42 == o.i(), "wrong value");
- assert_arrays_equal(o.ai(), ai);
- assert_arrays_equal(o.apChild(), mKids);
-
- const Actors& oaa = o.aa()[0];
- assert_arrays_equal(oaa.get_ArrayOfPTestDataStructuresSubChild(), mKids);
-
- const nsTArray<Unions>& oau = o.au();
- test_assert(oau[0] == 42, "wrong value");
- assert_arrays_equal(oau[1].get_ArrayOfint(), ai);
- assert_arrays_equal(oau[2].get_ArrayOfPTestDataStructuresSubChild(), mKids);
- assert_arrays_equal(
- oau[3].get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSubChild(),
- mKids);
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test17() {
- Attrs attrs;
- attrs.common() = CommonAttrs(true);
- attrs.specific() = BarAttrs(1.0f);
-
- nsTArray<Op> ops;
- ops.AppendElement(SetAttrs(nullptr, mKids[0], attrs));
-
- if (!SendTest17(ops)) fail("sending Test17");
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-void TestDataStructuresChild::Test18() {
- const int nelements = 1000;
- RegionArray ra;
- // big enough to hopefully force a realloc to a different chunk of
- // memory on the receiving side, if the workaround isn't working
- // correctly. But SetCapacity() here because we don't want to
- // crash on the sending side.
- ra.SetCapacity(nelements);
- for (int i = 0; i < nelements; ++i) {
- nsIntRegion r;
- r.Or(nsIntRect(0, 0, 10, 10), nsIntRect(10, 10, 10, 10));
- ra.AppendElement(r);
- }
-
- if (!SendTest18(ra)) fail("sending Test18");
-
- printf(" passed %s\n", __FUNCTION__);
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestDataStructures.h b/ipc/ipdl/test/cxx/TestDataStructures.h
deleted file mode 100644
index dc25b5282c..0000000000
--- a/ipc/ipdl/test/cxx/TestDataStructures.h
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef mozilla__ipdltest_TestDataStructures_h
-#define mozilla__ipdltest_TestDataStructures_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestDataStructuresParent.h"
-#include "mozilla/_ipdltest/PTestDataStructuresChild.h"
-
-#include "mozilla/_ipdltest/PTestDataStructuresSubParent.h"
-#include "mozilla/_ipdltest/PTestDataStructuresSubChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// Subprotocol actors
-
-class TestDataStructuresSub : public PTestDataStructuresSubParent,
- public PTestDataStructuresSubChild {
- public:
- explicit TestDataStructuresSub(uint32_t i) : mI(i) {}
- virtual ~TestDataStructuresSub() {}
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (Deletion != why) fail("unexpected destruction!");
- }
- uint32_t mI;
-};
-
-//-----------------------------------------------------------------------------
-// Main actors
-
-class TestDataStructuresParent : public PTestDataStructuresParent {
- friend class PTestDataStructuresParent;
-
- public:
- TestDataStructuresParent();
- virtual ~TestDataStructuresParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- PTestDataStructuresSubParent* AllocPTestDataStructuresSubParent(
- const int& i) {
- PTestDataStructuresSubParent* actor = new TestDataStructuresSub(i);
- mKids.AppendElement(actor);
- return actor;
- }
-
- bool DeallocPTestDataStructuresSubParent(PTestDataStructuresSubParent* actor);
-
- mozilla::ipc::IPCResult RecvTest1(nsTArray<int>&& i1, nsTArray<int>* o1);
-
- mozilla::ipc::IPCResult RecvTest2(
- nsTArray<PTestDataStructuresSubParent*>&& i1,
- nsTArray<PTestDataStructuresSubParent*>* o1);
-
- mozilla::ipc::IPCResult RecvTest3(const IntDouble& i1, const IntDouble& i2,
- IntDouble* o1, IntDouble* o2);
-
- mozilla::ipc::IPCResult RecvTest4(nsTArray<IntDouble>&& i1,
- nsTArray<IntDouble>* o1);
-
- mozilla::ipc::IPCResult RecvTest5(const IntDoubleArrays& i1,
- const IntDoubleArrays& i2,
- const IntDoubleArrays& i3,
- IntDoubleArrays* o1, IntDoubleArrays* o2,
- IntDoubleArrays* o3);
-
- mozilla::ipc::IPCResult RecvTest6(nsTArray<IntDoubleArrays>&& i1,
- nsTArray<IntDoubleArrays>* o1);
-
- mozilla::ipc::IPCResult RecvTest7_0(const ActorWrapper& i1, ActorWrapper* o1);
-
- mozilla::ipc::IPCResult RecvTest7(const Actors& i1, const Actors& i2,
- const Actors& i3, Actors* o1, Actors* o2,
- Actors* o3);
-
- mozilla::ipc::IPCResult RecvTest8(nsTArray<Actors>&& i1,
- nsTArray<Actors>* o1);
-
- mozilla::ipc::IPCResult RecvTest9(const Unions& i1, const Unions& i2,
- const Unions& i3, const Unions& i4,
- Unions* o1, Unions* o2, Unions* o3,
- Unions* o4);
-
- mozilla::ipc::IPCResult RecvTest10(nsTArray<Unions>&& i1,
- nsTArray<Unions>* o1);
-
- mozilla::ipc::IPCResult RecvTest11(const SIntDouble& i, SIntDouble* o);
-
- mozilla::ipc::IPCResult RecvTest12(const SIntDoubleArrays& i,
- SIntDoubleArrays* o);
-
- mozilla::ipc::IPCResult RecvTest13(const SActors& i, SActors* o);
-
- mozilla::ipc::IPCResult RecvTest14(const Structs& i, Structs* o);
-
- mozilla::ipc::IPCResult RecvTest15(
- const WithStructs& i1, const WithStructs& i2, const WithStructs& i3,
- const WithStructs& i4, const WithStructs& i5, WithStructs* o1,
- WithStructs* o2, WithStructs* o3, WithStructs* o4, WithStructs* o5);
-
- mozilla::ipc::IPCResult RecvTest16(const WithUnions& i, WithUnions* o);
-
- mozilla::ipc::IPCResult RecvTest17(nsTArray<Op>&& sa);
-
- mozilla::ipc::IPCResult RecvTest18(nsTArray<nsIntRegion>&& ra);
-
- mozilla::ipc::IPCResult RecvDummy(const ShmemUnion& su, ShmemUnion* rsu) {
- *rsu = su;
- return IPC_OK();
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-
- private:
- nsTArray<PTestDataStructuresSubParent*> mKids;
-};
-
-class TestDataStructuresChild : public PTestDataStructuresChild {
- friend class PTestDataStructuresChild;
-
- public:
- TestDataStructuresChild();
- virtual ~TestDataStructuresChild();
-
- protected:
- PTestDataStructuresSubChild* AllocPTestDataStructuresSubChild(const int& i) {
- PTestDataStructuresSubChild* actor = new TestDataStructuresSub(i);
- mKids.AppendElement(actor);
- return actor;
- }
-
- bool DeallocPTestDataStructuresSubChild(PTestDataStructuresSubChild* actor) {
- delete actor;
- return true;
- }
-
- mozilla::ipc::IPCResult RecvStart();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-
- private:
- void Test1();
- void Test2();
- void Test3();
- void Test4();
- void Test5();
- void Test6();
- void Test7_0();
- void Test7();
- void Test8();
- void Test9();
- void Test10();
- void Test11();
- void Test12();
- void Test13();
- void Test14();
- void Test15();
- void Test16();
- void Test17();
- void Test18();
-
- nsTArray<PTestDataStructuresSubChild*> mKids;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestDataStructures_h
diff --git a/ipc/ipdl/test/cxx/TestDemon.cpp b/ipc/ipdl/test/cxx/TestDemon.cpp
deleted file mode 100644
index 396974bb56..0000000000
--- a/ipc/ipdl/test/cxx/TestDemon.cpp
+++ /dev/null
@@ -1,362 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim: sw=2 ts=4 et :
- */
-#include "TestDemon.h"
-
-#include <stdlib.h>
-
-#include "IPDLUnitTests.h" // fail etc.
-#if defined(XP_UNIX)
-# include <sys/time.h>
-# include <unistd.h>
-#else
-# include <time.h>
-# include <windows.h>
-#endif
-
-namespace mozilla {
-namespace _ipdltest {
-
-const int kMaxStackHeight = 4;
-
-static LazyLogModule sLogModule("demon");
-
-#define DEMON_LOG(...) MOZ_LOG(sLogModule, LogLevel::Debug, (__VA_ARGS__))
-
-static int gStackHeight = 0;
-static bool gFlushStack = false;
-
-static int Choose(int count) {
-#if defined(XP_UNIX)
- return random() % count;
-#else
- return rand() % count;
-#endif
-}
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestDemonParent::TestDemonParent() : mDone(false), mIncoming(), mOutgoing() {
- MOZ_COUNT_CTOR(TestDemonParent);
-}
-
-TestDemonParent::~TestDemonParent() { MOZ_COUNT_DTOR(TestDemonParent); }
-
-void TestDemonParent::Main() {
- if (!getenv("MOZ_TEST_IPC_DEMON")) {
- QuitParent();
- return;
- }
-#if defined(XP_UNIX)
- srandom(time(nullptr));
-#else
- srand(time(nullptr));
-#endif
-
- DEMON_LOG("Start demon");
-
- if (!SendStart()) fail("sending Start");
-
- RunUnlimitedSequence();
-}
-
-#ifdef DEBUG
-bool TestDemonParent::ShouldContinueFromReplyTimeout() {
- return Choose(2) == 0;
-}
-
-bool TestDemonParent::ArtificialTimeout() { return Choose(5) == 0; }
-
-void TestDemonParent::ArtificialSleep() {
- if (Choose(2) == 0) {
- // Sleep for anywhere from 0 to 100 milliseconds.
- unsigned micros = Choose(100) * 1000;
-# ifdef XP_UNIX
- usleep(micros);
-# else
- Sleep(micros / 1000);
-# endif
- }
-}
-#endif
-
-mozilla::ipc::IPCResult TestDemonParent::RecvAsyncMessage(const int& n) {
- DEMON_LOG("Start RecvAsync [%d]", n);
-
- MOZ_ASSERT(n == mIncoming[0]);
- mIncoming[0]++;
-
- RunLimitedSequence();
-
- DEMON_LOG("End RecvAsync [%d]", n);
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDemonParent::RecvHiPrioSyncMessage() {
- DEMON_LOG("Start RecvHiPrioSyncMessage");
- RunLimitedSequence();
- DEMON_LOG("End RecvHiPrioSyncMessage");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDemonParent::RecvSyncMessage(const int& n) {
- DEMON_LOG("Start RecvSync [%d]", n);
-
- MOZ_ASSERT(n == mIncoming[0]);
- mIncoming[0]++;
-
- RunLimitedSequence(ASYNC_ONLY);
-
- DEMON_LOG("End RecvSync [%d]", n);
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDemonParent::RecvUrgentAsyncMessage(const int& n) {
- DEMON_LOG("Start RecvUrgentAsyncMessage [%d]", n);
-
- MOZ_ASSERT(n == mIncoming[2]);
- mIncoming[2]++;
-
- RunLimitedSequence(ASYNC_ONLY);
-
- DEMON_LOG("End RecvUrgentAsyncMessage [%d]", n);
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDemonParent::RecvUrgentSyncMessage(const int& n) {
- DEMON_LOG("Start RecvUrgentSyncMessage [%d]", n);
-
- MOZ_ASSERT(n == mIncoming[2]);
- mIncoming[2]++;
-
- RunLimitedSequence(ASYNC_ONLY);
-
- DEMON_LOG("End RecvUrgentSyncMessage [%d]", n);
- return IPC_OK();
-}
-
-void TestDemonParent::RunUnlimitedSequence() {
- if (mDone) {
- return;
- }
-
- gFlushStack = false;
- DoAction();
-
- MessageLoop::current()->PostTask(NewNonOwningRunnableMethod(
- "_ipdltest::TestDemonParent::RunUnlimitedSequence", this,
- &TestDemonParent::RunUnlimitedSequence));
-}
-
-void TestDemonParent::RunLimitedSequence(int flags) {
- if (gStackHeight >= kMaxStackHeight) {
- return;
- }
- gStackHeight++;
-
- int count = Choose(20);
- for (int i = 0; i < count; i++) {
- if (!DoAction(flags)) {
- gFlushStack = true;
- }
- if (gFlushStack) {
- gStackHeight--;
- return;
- }
- }
-
- gStackHeight--;
-}
-
-static bool AllowAsync(int outgoing, int incoming) {
- return incoming >= outgoing - 5;
-}
-
-bool TestDemonParent::DoAction(int flags) {
- if (flags & ASYNC_ONLY) {
- if (AllowAsync(mOutgoing[0], mIncoming[0])) {
- DEMON_LOG("SendAsyncMessage [%d]", mOutgoing[0]);
- return SendAsyncMessage(mOutgoing[0]++);
- } else {
- return true;
- }
- } else {
- switch (Choose(3)) {
- case 0:
- if (AllowAsync(mOutgoing[0], mIncoming[0])) {
- DEMON_LOG("SendAsyncMessage [%d]", mOutgoing[0]);
- return SendAsyncMessage(mOutgoing[0]++);
- } else {
- return true;
- }
-
- case 1: {
- DEMON_LOG("Start SendHiPrioSyncMessage");
- bool r = SendHiPrioSyncMessage();
- DEMON_LOG("End SendHiPrioSyncMessage result=%d", r);
- return r;
- }
-
- case 2:
- DEMON_LOG("Cancel");
- GetIPCChannel()->CancelCurrentTransaction();
- return true;
- }
- }
- MOZ_CRASH();
- return false;
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestDemonChild::TestDemonChild() : mIncoming(), mOutgoing() {
- MOZ_COUNT_CTOR(TestDemonChild);
-}
-
-TestDemonChild::~TestDemonChild() { MOZ_COUNT_DTOR(TestDemonChild); }
-
-mozilla::ipc::IPCResult TestDemonChild::RecvStart() {
-#ifdef XP_UNIX
- srandom(time(nullptr));
-#else
- srand(time(nullptr));
-#endif
-
- DEMON_LOG("RecvStart");
-
- RunUnlimitedSequence();
- return IPC_OK();
-}
-
-#ifdef DEBUG
-void TestDemonChild::ArtificialSleep() {
- if (Choose(2) == 0) {
- // Sleep for anywhere from 0 to 100 milliseconds.
- unsigned micros = Choose(100) * 1000;
-# ifdef XP_UNIX
- usleep(micros);
-# else
- Sleep(micros / 1000);
-# endif
- }
-}
-#endif
-
-mozilla::ipc::IPCResult TestDemonChild::RecvAsyncMessage(const int& n) {
- DEMON_LOG("Start RecvAsyncMessage [%d]", n);
-
- MOZ_ASSERT(n == mIncoming[0]);
- mIncoming[0]++;
-
- RunLimitedSequence();
-
- DEMON_LOG("End RecvAsyncMessage [%d]", n);
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestDemonChild::RecvHiPrioSyncMessage() {
- DEMON_LOG("Start RecvHiPrioSyncMessage");
- RunLimitedSequence();
- DEMON_LOG("End RecvHiPrioSyncMessage");
- return IPC_OK();
-}
-
-void TestDemonChild::RunUnlimitedSequence() {
- gFlushStack = false;
- DoAction();
-
- MessageLoop::current()->PostTask(NewNonOwningRunnableMethod(
- "_ipdltest::TestDemonChild::RunUnlimitedSequence", this,
- &TestDemonChild::RunUnlimitedSequence));
-}
-
-void TestDemonChild::RunLimitedSequence() {
- if (gStackHeight >= kMaxStackHeight) {
- return;
- }
- gStackHeight++;
-
- int count = Choose(20);
- for (int i = 0; i < count; i++) {
- if (!DoAction()) {
- gFlushStack = true;
- }
- if (gFlushStack) {
- gStackHeight--;
- return;
- }
- }
-
- gStackHeight--;
-}
-
-bool TestDemonChild::DoAction() {
- switch (Choose(6)) {
- case 0:
- if (AllowAsync(mOutgoing[0], mIncoming[0])) {
- DEMON_LOG("SendAsyncMessage [%d]", mOutgoing[0]);
- return SendAsyncMessage(mOutgoing[0]++);
- } else {
- return true;
- }
-
- case 1: {
- DEMON_LOG("Start SendHiPrioSyncMessage");
- bool r = SendHiPrioSyncMessage();
- DEMON_LOG("End SendHiPrioSyncMessage result=%d", r);
- return r;
- }
-
- case 2: {
- DEMON_LOG("Start SendSyncMessage [%d]", mOutgoing[0]);
- bool r = SendSyncMessage(mOutgoing[0]++);
- switch (GetIPCChannel()->LastSendError()) {
- case SyncSendError::PreviousTimeout:
- case SyncSendError::SendingCPOWWhileDispatchingSync:
- case SyncSendError::SendingCPOWWhileDispatchingUrgent:
- case SyncSendError::NotConnectedBeforeSend:
- case SyncSendError::CancelledBeforeSend:
- mOutgoing[0]--;
- break;
- default:
- break;
- }
- DEMON_LOG("End SendSyncMessage result=%d", r);
- return r;
- }
-
- case 3:
- DEMON_LOG("SendUrgentAsyncMessage [%d]", mOutgoing[2]);
- return SendUrgentAsyncMessage(mOutgoing[2]++);
-
- case 4: {
- DEMON_LOG("Start SendUrgentSyncMessage [%d]", mOutgoing[2]);
- bool r = SendUrgentSyncMessage(mOutgoing[2]++);
- switch (GetIPCChannel()->LastSendError()) {
- case SyncSendError::PreviousTimeout:
- case SyncSendError::SendingCPOWWhileDispatchingSync:
- case SyncSendError::SendingCPOWWhileDispatchingUrgent:
- case SyncSendError::NotConnectedBeforeSend:
- case SyncSendError::CancelledBeforeSend:
- mOutgoing[2]--;
- break;
- default:
- break;
- }
- DEMON_LOG("End SendUrgentSyncMessage result=%d", r);
- return r;
- }
-
- case 5:
- DEMON_LOG("Cancel");
- GetIPCChannel()->CancelCurrentTransaction();
- return true;
- }
- MOZ_CRASH();
- return false;
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestDemon.h b/ipc/ipdl/test/cxx/TestDemon.h
deleted file mode 100644
index ba5b003436..0000000000
--- a/ipc/ipdl/test/cxx/TestDemon.h
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef mozilla__ipdltest_TestDemon_h
-#define mozilla__ipdltest_TestDemon_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestDemonParent.h"
-#include "mozilla/_ipdltest/PTestDemonChild.h"
-
-using namespace mozilla::ipc;
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestDemonParent : public PTestDemonParent {
- public:
- TestDemonParent();
- virtual ~TestDemonParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
-#ifdef DEBUG
- bool ShouldContinueFromReplyTimeout() override;
- bool ArtificialTimeout() override;
-
- bool NeedArtificialSleep() override { return true; }
- void ArtificialSleep() override;
-#endif
-
- mozilla::ipc::IPCResult RecvAsyncMessage(const int& n);
- mozilla::ipc::IPCResult RecvHiPrioSyncMessage();
-
- mozilla::ipc::IPCResult RecvSyncMessage(const int& n);
- mozilla::ipc::IPCResult RecvUrgentAsyncMessage(const int& n);
- mozilla::ipc::IPCResult RecvUrgentSyncMessage(const int& n);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- mDone = true;
- printf("Parent ActorDestroy\n");
- passed("ok");
- QuitParent();
- }
-
- private:
- bool mDone;
- int mIncoming[3];
- int mOutgoing[3];
-
- enum {
- ASYNC_ONLY = 1,
- };
-
- void RunUnlimitedSequence();
- void RunLimitedSequence(int flags = 0);
- bool DoAction(int flags = 0);
-};
-
-class TestDemonChild : public PTestDemonChild {
- public:
- TestDemonChild();
- virtual ~TestDemonChild();
-
- mozilla::ipc::IPCResult RecvStart();
-
-#ifdef DEBUG
- bool NeedArtificialSleep() override { return true; }
- void ArtificialSleep() override;
-#endif
-
- mozilla::ipc::IPCResult RecvAsyncMessage(const int& n);
- mozilla::ipc::IPCResult RecvHiPrioSyncMessage();
-
- virtual void ActorDestroy(ActorDestroyReason why) override { _exit(0); }
-
- virtual void IntentionalCrash() override { _exit(0); }
-
- private:
- int mIncoming[3];
- int mOutgoing[3];
-
- void RunUnlimitedSequence();
- void RunLimitedSequence();
- bool DoAction();
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestDemon_h
diff --git a/ipc/ipdl/test/cxx/TestDesc.cpp b/ipc/ipdl/test/cxx/TestDesc.cpp
deleted file mode 100644
index 2ae199457d..0000000000
--- a/ipc/ipdl/test/cxx/TestDesc.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#include "TestDesc.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-void TestDescParent::Main() {
- PTestDescSubParent* p = CallPTestDescSubConstructor(0);
- if (!p) fail("can't allocate Sub");
-
- PTestDescSubsubParent* pp = p->CallPTestDescSubsubConstructor();
- if (!pp) fail("can't allocate Subsub");
-
- if (!SendTest(pp)) fail("can't send Subsub");
-}
-
-mozilla::ipc::IPCResult TestDescParent::RecvOk(PTestDescSubsubParent* a) {
- if (!a) fail("didn't receive Subsub");
-
- if (!PTestDescSubsubParent::Call__delete__(a)) fail("deleting Subsub");
-
- Close();
-
- return IPC_OK();
-}
-
-PTestDescSubParent* TestDescParent::AllocPTestDescSubParent(
- PTestDescSubsubParent* dummy) {
- if (dummy) fail("actor supposed to be null");
- return new TestDescSubParent();
-}
-bool TestDescParent::DeallocPTestDescSubParent(PTestDescSubParent* actor) {
- delete actor;
- return true;
-}
-
-PTestDescSubsubParent* TestDescSubParent::AllocPTestDescSubsubParent() {
- return new TestDescSubsubParent();
-}
-bool TestDescSubParent::DeallocPTestDescSubsubParent(
- PTestDescSubsubParent* actor) {
- delete actor;
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-mozilla::ipc::IPCResult TestDescChild::RecvTest(PTestDescSubsubChild* a) {
- if (!a) fail("didn't receive Subsub");
- if (!SendOk(a)) fail("couldn't send Ok()");
- return IPC_OK();
-}
-
-PTestDescSubChild* TestDescChild::AllocPTestDescSubChild(
- PTestDescSubsubChild* dummy) {
- if (dummy) fail("actor supposed to be null");
- return new TestDescSubChild();
-}
-bool TestDescChild::DeallocPTestDescSubChild(PTestDescSubChild* actor) {
- delete actor;
- return true;
-}
-
-PTestDescSubsubChild* TestDescSubChild::AllocPTestDescSubsubChild() {
- return new TestDescSubsubChild();
-}
-bool TestDescSubChild::DeallocPTestDescSubsubChild(
- PTestDescSubsubChild* actor) {
- delete actor;
- return true;
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestDesc.h b/ipc/ipdl/test/cxx/TestDesc.h
deleted file mode 100644
index c9fa04f89c..0000000000
--- a/ipc/ipdl/test/cxx/TestDesc.h
+++ /dev/null
@@ -1,115 +0,0 @@
-#ifndef mozilla_ipdltest_TestDesc_h
-#define mozilla_ipdltest_TestDesc_h
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestDescParent.h"
-#include "mozilla/_ipdltest/PTestDescChild.h"
-
-#include "mozilla/_ipdltest/PTestDescSubParent.h"
-#include "mozilla/_ipdltest/PTestDescSubChild.h"
-
-#include "mozilla/_ipdltest/PTestDescSubsubParent.h"
-#include "mozilla/_ipdltest/PTestDescSubsubChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// Top-level
-//
-class TestDescParent : public PTestDescParent {
- friend class PTestDescParent;
-
- public:
- TestDescParent() {}
- virtual ~TestDescParent() {}
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- mozilla::ipc::IPCResult RecvOk(PTestDescSubsubParent* a);
-
- protected:
- PTestDescSubParent* AllocPTestDescSubParent(PTestDescSubsubParent*);
- bool DeallocPTestDescSubParent(PTestDescSubParent* actor);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestDescChild : public PTestDescChild {
- friend class PTestDescChild;
-
- public:
- TestDescChild() {}
- virtual ~TestDescChild() {}
-
- protected:
- PTestDescSubChild* AllocPTestDescSubChild(PTestDescSubsubChild*);
-
- bool DeallocPTestDescSubChild(PTestDescSubChild* actor);
-
- mozilla::ipc::IPCResult RecvTest(PTestDescSubsubChild* a);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-//-----------------------------------------------------------------------------
-// First descendent
-//
-class TestDescSubParent : public PTestDescSubParent {
- friend class PTestDescSubParent;
-
- public:
- TestDescSubParent() {}
- virtual ~TestDescSubParent() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
- PTestDescSubsubParent* AllocPTestDescSubsubParent();
- bool DeallocPTestDescSubsubParent(PTestDescSubsubParent* actor);
-};
-
-class TestDescSubChild : public PTestDescSubChild {
- friend class PTestDescSubChild;
-
- public:
- TestDescSubChild() {}
- virtual ~TestDescSubChild() {}
-
- protected:
- PTestDescSubsubChild* AllocPTestDescSubsubChild();
- bool DeallocPTestDescSubsubChild(PTestDescSubsubChild* actor);
-};
-
-//-----------------------------------------------------------------------------
-// Grand-descendent
-//
-class TestDescSubsubParent : public PTestDescSubsubParent {
- public:
- TestDescSubsubParent() {}
- virtual ~TestDescSubsubParent() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
-};
-
-class TestDescSubsubChild : public PTestDescSubsubChild {
- public:
- TestDescSubsubChild() {}
- virtual ~TestDescSubsubChild() {}
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla_ipdltest_TestDesc_h
diff --git a/ipc/ipdl/test/cxx/TestEndpointBridgeMain.cpp b/ipc/ipdl/test/cxx/TestEndpointBridgeMain.cpp
deleted file mode 100644
index 4a4366f0ba..0000000000
--- a/ipc/ipdl/test/cxx/TestEndpointBridgeMain.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-
-#include "TestEndpointBridgeMain.h"
-
-#include "base/task.h"
-#include "IPDLUnitTests.h" // fail etc.
-#include "IPDLUnitTestSubprocess.h"
-
-using namespace std;
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// main process
-void TestEndpointBridgeMainParent::Main() {
- if (!SendStart()) {
- fail("sending Start");
- }
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeMainParent::RecvBridged(
- Endpoint<PTestEndpointBridgeMainSubParent>&& endpoint) {
- TestEndpointBridgeMainSubParent* a = new TestEndpointBridgeMainSubParent();
- if (!endpoint.Bind(a)) {
- fail("Bind failed");
- }
- return IPC_OK();
-}
-
-void TestEndpointBridgeMainParent::ActorDestroy(ActorDestroyReason why) {
- if (NormalShutdown != why) {
- fail("unexpected destruction!");
- }
- passed("ok");
- QuitParent();
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeMainSubParent::RecvHello() {
- if (!SendHi()) {
- return IPC_FAIL_NO_REASON(this);
- }
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeMainSubParent::RecvHelloSync() {
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeMainSubParent::AnswerHelloRpc() {
- if (!CallHiRpc()) {
- return IPC_FAIL_NO_REASON(this);
- }
- return IPC_OK();
-}
-
-void TestEndpointBridgeMainSubParent::ActorDestroy(ActorDestroyReason why) {
- if (NormalShutdown != why) {
- fail("unexpected destruction!");
- }
-
- // ActorDestroy() is just a callback from IPDL-generated code,
- // which needs the top-level actor (this) to stay alive a little
- // longer so other things can be cleaned up.
- MessageLoop::current()->PostTask(
- do_AddRef(new DeleteTask<TestEndpointBridgeMainSubParent>(this)));
-}
-
-//-----------------------------------------------------------------------------
-// sub process --- child of main
-TestEndpointBridgeMainChild* gEndpointBridgeMainChild;
-
-TestEndpointBridgeMainChild::TestEndpointBridgeMainChild()
- : mSubprocess(nullptr) {
- gEndpointBridgeMainChild = this;
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeMainChild::RecvStart() {
- vector<string> subsubArgs;
- subsubArgs.push_back("TestEndpointBridgeSub");
-
- mSubprocess = new IPDLUnitTestSubprocess();
- if (!mSubprocess->SyncLaunch(subsubArgs)) {
- fail("problem launching subprocess");
- }
-
- IPC::Channel* transport = mSubprocess->GetChannel();
- if (!transport) {
- fail("no transport");
- }
-
- TestEndpointBridgeSubParent* bsp = new TestEndpointBridgeSubParent();
- bsp->Open(transport, base::GetProcId(mSubprocess->GetChildProcessHandle()));
-
- bsp->Main();
- return IPC_OK();
-}
-
-void TestEndpointBridgeMainChild::ActorDestroy(ActorDestroyReason why) {
- if (NormalShutdown != why) {
- fail("unexpected destruction!");
- }
- // NB: this is kosher because QuitChild() joins with the IO thread
- mSubprocess->Destroy();
- mSubprocess = nullptr;
- QuitChild();
-}
-
-void TestEndpointBridgeSubParent::Main() {
- if (!SendPing()) {
- fail("sending Ping");
- }
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeSubParent::RecvBridgeEm() {
- Endpoint<PTestEndpointBridgeMainSubParent> parent;
- Endpoint<PTestEndpointBridgeMainSubChild> child;
- nsresult rv;
- rv = PTestEndpointBridgeMainSub::CreateEndpoints(
- gEndpointBridgeMainChild->OtherPid(), OtherPid(), &parent, &child);
- if (NS_FAILED(rv)) {
- fail("opening PTestEndpointOpensOpened");
- }
-
- if (!gEndpointBridgeMainChild->SendBridged(std::move(parent))) {
- fail("SendBridge failed for parent");
- }
- if (!SendBridged(std::move(child))) {
- fail("SendBridge failed for child");
- }
-
- return IPC_OK();
-}
-
-void TestEndpointBridgeSubParent::ActorDestroy(ActorDestroyReason why) {
- if (NormalShutdown != why) {
- fail("unexpected destruction!");
- }
- gEndpointBridgeMainChild->Close();
-
- // ActorDestroy() is just a callback from IPDL-generated code,
- // which needs the top-level actor (this) to stay alive a little
- // longer so other things can be cleaned up.
- MessageLoop::current()->PostTask(
- do_AddRef(new DeleteTask<TestEndpointBridgeSubParent>(this)));
-}
-
-//-----------------------------------------------------------------------------
-// subsub process --- child of sub
-
-static TestEndpointBridgeSubChild* gBridgeSubChild;
-
-TestEndpointBridgeSubChild::TestEndpointBridgeSubChild() {
- gBridgeSubChild = this;
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeSubChild::RecvPing() {
- if (!SendBridgeEm()) {
- fail("sending BridgeEm");
- }
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeSubChild::RecvBridged(
- Endpoint<PTestEndpointBridgeMainSubChild>&& endpoint) {
- TestEndpointBridgeMainSubChild* a = new TestEndpointBridgeMainSubChild();
-
- if (!endpoint.Bind(a)) {
- fail("failed to Bind");
- }
-
- if (!a->SendHello()) {
- fail("sending Hello");
- }
-
- return IPC_OK();
-}
-
-void TestEndpointBridgeSubChild::ActorDestroy(ActorDestroyReason why) {
- if (NormalShutdown != why) {
- fail("unexpected destruction!");
- }
- QuitChild();
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeMainSubChild::RecvHi() {
- if (!SendHelloSync()) {
- fail("sending HelloSync");
- }
- if (!CallHelloRpc()) {
- fail("calling HelloRpc");
- }
- if (!mGotHi) {
- fail("didn't answer HiRpc");
- }
-
- // Need to close the channel without message-processing frames on
- // the C++ stack
- MessageLoop::current()->PostTask(
- NewNonOwningRunnableMethod("ipc::IToplevelProtocol::Close", this,
- &TestEndpointBridgeMainSubChild::Close));
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestEndpointBridgeMainSubChild::AnswerHiRpc() {
- mGotHi = true; // d00d
- return IPC_OK();
-}
-
-void TestEndpointBridgeMainSubChild::ActorDestroy(ActorDestroyReason why) {
- if (NormalShutdown != why) {
- fail("unexpected destruction!");
- }
-
- gBridgeSubChild->Close();
-
- // ActorDestroy() is just a callback from IPDL-generated code,
- // which needs the top-level actor (this) to stay alive a little
- // longer so other things can be cleaned up.
- MessageLoop::current()->PostTask(
- do_AddRef(new DeleteTask<TestEndpointBridgeMainSubChild>(this)));
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestEndpointBridgeMain.h b/ipc/ipdl/test/cxx/TestEndpointBridgeMain.h
deleted file mode 100644
index 88ac12d71b..0000000000
--- a/ipc/ipdl/test/cxx/TestEndpointBridgeMain.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-
-#ifndef mozilla__ipdltest_TestEndpointBridgeMain_h
-#define mozilla__ipdltest_TestEndpointBridgeMain_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestEndpointBridgeMainParent.h"
-#include "mozilla/_ipdltest/PTestEndpointBridgeMainChild.h"
-
-#include "mozilla/_ipdltest/PTestEndpointBridgeSubParent.h"
-#include "mozilla/_ipdltest/PTestEndpointBridgeSubChild.h"
-
-#include "mozilla/_ipdltest/PTestEndpointBridgeMainSubParent.h"
-#include "mozilla/_ipdltest/PTestEndpointBridgeMainSubChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// "Main" process
-//
-class TestEndpointBridgeMainParent : public PTestEndpointBridgeMainParent {
- friend class PTestEndpointBridgeMainParent;
-
- public:
- TestEndpointBridgeMainParent() {}
- virtual ~TestEndpointBridgeMainParent() {}
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvBridged(
- mozilla::ipc::Endpoint<PTestEndpointBridgeMainSubParent>&& endpoint);
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-class TestEndpointBridgeMainSubParent
- : public PTestEndpointBridgeMainSubParent {
- friend class PTestEndpointBridgeMainSubParent;
-
- public:
- explicit TestEndpointBridgeMainSubParent() {}
- virtual ~TestEndpointBridgeMainSubParent() {}
-
- protected:
- mozilla::ipc::IPCResult RecvHello();
- mozilla::ipc::IPCResult RecvHelloSync();
- mozilla::ipc::IPCResult AnswerHelloRpc();
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-//-----------------------------------------------------------------------------
-// "Sub" process --- child of "main"
-//
-class TestEndpointBridgeSubParent;
-
-class TestEndpointBridgeMainChild : public PTestEndpointBridgeMainChild {
- friend class PTestEndpointBridgeMainChild;
-
- public:
- TestEndpointBridgeMainChild();
- virtual ~TestEndpointBridgeMainChild() {}
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-
- IPDLUnitTestSubprocess* mSubprocess;
-};
-
-class TestEndpointBridgeSubParent : public PTestEndpointBridgeSubParent {
- friend class PTestEndpointBridgeSubParent;
-
- public:
- TestEndpointBridgeSubParent() {}
- virtual ~TestEndpointBridgeSubParent() {}
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvBridgeEm();
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-//-----------------------------------------------------------------------------
-// "Subsub" process --- child of "sub"
-//
-class TestEndpointBridgeSubChild : public PTestEndpointBridgeSubChild {
- friend class PTestEndpointBridgeSubChild;
-
- public:
- TestEndpointBridgeSubChild();
- virtual ~TestEndpointBridgeSubChild() {}
-
- protected:
- mozilla::ipc::IPCResult RecvPing();
-
- mozilla::ipc::IPCResult RecvBridged(
- Endpoint<PTestEndpointBridgeMainSubChild>&& endpoint);
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-class TestEndpointBridgeMainSubChild : public PTestEndpointBridgeMainSubChild {
- friend class PTestEndpointBridgeMainSubChild;
-
- public:
- explicit TestEndpointBridgeMainSubChild() : mGotHi(false) {}
- virtual ~TestEndpointBridgeMainSubChild() {}
-
- protected:
- mozilla::ipc::IPCResult RecvHi();
- mozilla::ipc::IPCResult AnswerHiRpc();
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-
- bool mGotHi;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestEndpointBridgeMain_h
diff --git a/ipc/ipdl/test/cxx/TestEndpointOpens.cpp b/ipc/ipdl/test/cxx/TestEndpointOpens.cpp
deleted file mode 100644
index ca141f7b58..0000000000
--- a/ipc/ipdl/test/cxx/TestEndpointOpens.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-
-#include "base/task.h"
-#include "base/thread.h"
-
-#include "TestEndpointOpens.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-using namespace mozilla::ipc;
-
-using base::ProcessHandle;
-using base::Thread;
-
-namespace mozilla {
-// NB: this is generally bad style, but I am lazy.
-using namespace _ipdltest;
-using namespace _ipdltest2;
-
-static MessageLoop* gMainThread;
-
-static void AssertNotMainThread() {
- if (!gMainThread) {
- fail("gMainThread is not initialized");
- }
- if (MessageLoop::current() == gMainThread) {
- fail("unexpectedly called on the main thread");
- }
-}
-
-//-----------------------------------------------------------------------------
-// parent
-
-// Thread on which TestEndpointOpensOpenedParent runs
-static Thread* gParentThread;
-
-void TestEndpointOpensParent::Main() {
- if (!SendStart()) {
- fail("sending Start");
- }
-}
-
-static void OpenParent(TestEndpointOpensOpenedParent* aParent,
- Endpoint<PTestEndpointOpensOpenedParent>&& aEndpoint) {
- AssertNotMainThread();
-
- // Open the actor on the off-main thread to park it there.
- // Messages will be delivered to this thread's message loop
- // instead of the main thread's.
- if (!aEndpoint.Bind(aParent)) {
- fail("binding Parent");
- }
-}
-
-mozilla::ipc::IPCResult TestEndpointOpensParent::RecvStartSubprotocol(
- mozilla::ipc::Endpoint<PTestEndpointOpensOpenedParent>&& endpoint) {
- gMainThread = MessageLoop::current();
-
- gParentThread = new Thread("ParentThread");
- if (!gParentThread->Start()) {
- fail("starting parent thread");
- }
-
- TestEndpointOpensOpenedParent* a = new TestEndpointOpensOpenedParent();
- gParentThread->message_loop()->PostTask(
- NewRunnableFunction("OpenParent", OpenParent, a, std::move(endpoint)));
-
- return IPC_OK();
-}
-
-void TestEndpointOpensParent::ActorDestroy(ActorDestroyReason why) {
- // Stops the thread and joins it
- delete gParentThread;
-
- if (NormalShutdown != why) {
- fail("unexpected destruction A!");
- }
- passed("ok");
- QuitParent();
-}
-
-mozilla::ipc::IPCResult TestEndpointOpensOpenedParent::RecvHello() {
- AssertNotMainThread();
- if (!SendHi()) {
- return IPC_FAIL_NO_REASON(this);
- }
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestEndpointOpensOpenedParent::RecvHelloSync() {
- AssertNotMainThread();
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestEndpointOpensOpenedParent::AnswerHelloRpc() {
- AssertNotMainThread();
- if (!CallHiRpc()) {
- return IPC_FAIL_NO_REASON(this);
- }
- return IPC_OK();
-}
-
-static void ShutdownTestEndpointOpensOpenedParent(
- TestEndpointOpensOpenedParent* parent, Transport* transport) {
- delete parent;
-}
-
-void TestEndpointOpensOpenedParent::ActorDestroy(ActorDestroyReason why) {
- AssertNotMainThread();
-
- if (NormalShutdown != why) {
- fail("unexpected destruction B!");
- }
-
- // ActorDestroy() is just a callback from IPDL-generated code,
- // which needs the top-level actor (this) to stay alive a little
- // longer so other things can be cleaned up.
- gParentThread->message_loop()->PostTask(NewRunnableFunction(
- "ShutdownTestEndpointOpensOpenedParent",
- ShutdownTestEndpointOpensOpenedParent, this, GetTransport()));
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-static TestEndpointOpensChild* gOpensChild;
-// Thread on which TestEndpointOpensOpenedChild runs
-static Thread* gChildThread;
-
-TestEndpointOpensChild::TestEndpointOpensChild() { gOpensChild = this; }
-
-static void OpenChild(TestEndpointOpensOpenedChild* aChild,
- Endpoint<PTestEndpointOpensOpenedChild>&& endpoint) {
- AssertNotMainThread();
-
- // Open the actor on the off-main thread to park it there.
- // Messages will be delivered to this thread's message loop
- // instead of the main thread's.
- if (!endpoint.Bind(aChild)) {
- fail("binding child endpoint");
- }
-
- // Kick off the unit tests
- if (!aChild->SendHello()) {
- fail("sending Hello");
- }
-}
-
-mozilla::ipc::IPCResult TestEndpointOpensChild::RecvStart() {
- Endpoint<PTestEndpointOpensOpenedParent> parent;
- Endpoint<PTestEndpointOpensOpenedChild> child;
- nsresult rv;
- rv = PTestEndpointOpensOpened::CreateEndpoints(
- OtherPid(), base::GetCurrentProcId(), &parent, &child);
- if (NS_FAILED(rv)) {
- fail("opening PTestEndpointOpensOpened");
- }
-
- gMainThread = MessageLoop::current();
-
- gChildThread = new Thread("ChildThread");
- if (!gChildThread->Start()) {
- fail("starting child thread");
- }
-
- TestEndpointOpensOpenedChild* a = new TestEndpointOpensOpenedChild();
- gChildThread->message_loop()->PostTask(
- NewRunnableFunction("OpenChild", OpenChild, a, std::move(child)));
-
- if (!SendStartSubprotocol(std::move(parent))) {
- fail("send StartSubprotocol");
- }
-
- return IPC_OK();
-}
-
-void TestEndpointOpensChild::ActorDestroy(ActorDestroyReason why) {
- // Stops the thread and joins it
- delete gChildThread;
-
- if (NormalShutdown != why) {
- fail("unexpected destruction C!");
- }
- QuitChild();
-}
-
-mozilla::ipc::IPCResult TestEndpointOpensOpenedChild::RecvHi() {
- AssertNotMainThread();
-
- if (!SendHelloSync()) {
- fail("sending HelloSync");
- }
- if (!CallHelloRpc()) {
- fail("calling HelloRpc");
- }
- if (!mGotHi) {
- fail("didn't answer HiRpc");
- }
-
- // Need to close the channel without message-processing frames on
- // the C++ stack
- MessageLoop::current()->PostTask(
- NewNonOwningRunnableMethod("ipc::IToplevelProtocol::Close", this,
- &TestEndpointOpensOpenedChild::Close));
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestEndpointOpensOpenedChild::AnswerHiRpc() {
- AssertNotMainThread();
-
- mGotHi = true; // d00d
- return IPC_OK();
-}
-
-static void ShutdownTestEndpointOpensOpenedChild(
- TestEndpointOpensOpenedChild* child, Transport* transport) {
- delete child;
-
- // Kick off main-thread shutdown.
- gMainThread->PostTask(
- NewNonOwningRunnableMethod("ipc::IToplevelProtocol::Close", gOpensChild,
- &TestEndpointOpensChild::Close));
-}
-
-void TestEndpointOpensOpenedChild::ActorDestroy(ActorDestroyReason why) {
- AssertNotMainThread();
-
- if (NormalShutdown != why) {
- fail("unexpected destruction D!");
- }
-
- // ActorDestroy() is just a callback from IPDL-generated code,
- // which needs the top-level actor (this) to stay alive a little
- // longer so other things can be cleaned up. Defer shutdown to
- // let cleanup finish.
- gChildThread->message_loop()->PostTask(NewRunnableFunction(
- "ShutdownTestEndpointOpensOpenedChild",
- ShutdownTestEndpointOpensOpenedChild, this, GetTransport()));
-}
-
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestEndpointOpens.h b/ipc/ipdl/test/cxx/TestEndpointOpens.h
deleted file mode 100644
index 6721274937..0000000000
--- a/ipc/ipdl/test/cxx/TestEndpointOpens.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-
-#ifndef mozilla__ipdltest_TestEndpointOpens_h
-#define mozilla__ipdltest_TestEndpointOpens_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestEndpointOpensParent.h"
-#include "mozilla/_ipdltest/PTestEndpointOpensChild.h"
-
-#include "mozilla/_ipdltest2/PTestEndpointOpensOpenedParent.h"
-#include "mozilla/_ipdltest2/PTestEndpointOpensOpenedChild.h"
-
-namespace mozilla {
-
-// parent process
-
-namespace _ipdltest {
-
-class TestEndpointOpensParent : public PTestEndpointOpensParent {
- friend class PTestEndpointOpensParent;
-
- public:
- TestEndpointOpensParent() {}
- virtual ~TestEndpointOpensParent() {}
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvStartSubprotocol(
- mozilla::ipc::Endpoint<PTestEndpointOpensOpenedParent>&& endpoint);
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-} // namespace _ipdltest
-
-namespace _ipdltest2 {
-
-class TestEndpointOpensOpenedParent : public PTestEndpointOpensOpenedParent {
- friend class PTestEndpointOpensOpenedParent;
-
- public:
- explicit TestEndpointOpensOpenedParent() {}
- virtual ~TestEndpointOpensOpenedParent() {}
-
- protected:
- mozilla::ipc::IPCResult RecvHello();
- mozilla::ipc::IPCResult RecvHelloSync();
- mozilla::ipc::IPCResult AnswerHelloRpc();
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-} // namespace _ipdltest2
-
-// child process
-
-namespace _ipdltest {
-
-class TestEndpointOpensChild : public PTestEndpointOpensChild {
- friend class PTestEndpointOpensChild;
-
- public:
- TestEndpointOpensChild();
- virtual ~TestEndpointOpensChild() {}
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-} // namespace _ipdltest
-
-namespace _ipdltest2 {
-
-class TestEndpointOpensOpenedChild : public PTestEndpointOpensOpenedChild {
- friend class PTestEndpointOpensOpenedChild;
-
- public:
- explicit TestEndpointOpensOpenedChild() : mGotHi(false) {}
- virtual ~TestEndpointOpensOpenedChild() {}
-
- protected:
- mozilla::ipc::IPCResult RecvHi();
- mozilla::ipc::IPCResult AnswerHiRpc();
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-
- bool mGotHi;
-};
-
-} // namespace _ipdltest2
-
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestEndpointOpens_h
diff --git a/ipc/ipdl/test/cxx/TestFailedCtor.cpp b/ipc/ipdl/test/cxx/TestFailedCtor.cpp
deleted file mode 100644
index 2f08d2eeb0..0000000000
--- a/ipc/ipdl/test/cxx/TestFailedCtor.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-#include "TestFailedCtor.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-void TestFailedCtorParent::Main() {
- PTestFailedCtorSubParent* p = CallPTestFailedCtorSubConstructor();
- if (p) fail("expected ctor to fail");
-
- Close();
-}
-
-PTestFailedCtorSubParent*
-TestFailedCtorParent::AllocPTestFailedCtorSubParent() {
- return new TestFailedCtorSubParent();
-}
-bool TestFailedCtorParent::DeallocPTestFailedCtorSubParent(
- PTestFailedCtorSubParent* actor) {
- delete actor;
- return true;
-}
-
-PTestFailedCtorSubsubParent*
-TestFailedCtorSubParent::AllocPTestFailedCtorSubsubParent() {
- TestFailedCtorSubsub* a = new TestFailedCtorSubsub();
- if (!mOne) {
- return mOne = a;
- } else if (!mTwo) {
- return mTwo = a;
- } else if (!mThree) {
- return mThree = a;
- } else {
- fail("unexpected Alloc()");
- return nullptr;
- }
-}
-bool TestFailedCtorSubParent::DeallocPTestFailedCtorSubsubParent(
- PTestFailedCtorSubsubParent* actor) {
- static_cast<TestFailedCtorSubsub*>(actor)->mDealloced = true;
- return true;
-}
-
-void TestFailedCtorSubParent::ActorDestroy(ActorDestroyReason why) {
- if (mOne->mWhy != Deletion) fail("Subsub one got wrong ActorDestroyReason");
- if (mTwo->mWhy != AncestorDeletion)
- fail("Subsub two got wrong ActorDestroyReason");
- if (mThree->mWhy != AncestorDeletion)
- fail("Subsub three got wrong ActorDestroyReason");
-
- if (FailedConstructor != why) fail("unexpected destruction!");
-}
-
-TestFailedCtorSubParent::~TestFailedCtorSubParent() {
- if (!(mOne->mDealloced && mTwo->mDealloced && mThree->mDealloced))
- fail("Not all subsubs were Dealloc'd");
- delete mOne;
- delete mTwo;
- delete mThree;
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-PTestFailedCtorSubChild* TestFailedCtorChild::AllocPTestFailedCtorSubChild() {
- return new TestFailedCtorSubChild();
-}
-
-mozilla::ipc::IPCResult
-TestFailedCtorChild::AnswerPTestFailedCtorSubConstructor(
- PTestFailedCtorSubChild* actor) {
- PTestFailedCtorSubsubChild* c1 =
- actor->SendPTestFailedCtorSubsubConstructor();
- PTestFailedCtorSubsubChild::Send__delete__(c1);
-
- if (!actor->SendPTestFailedCtorSubsubConstructor() ||
- !actor->SendPTestFailedCtorSubsubConstructor() || !actor->SendSync())
- fail("setting up test");
-
- // This causes our process to die
- return IPC_FAIL_NO_REASON(this);
-}
-
-bool TestFailedCtorChild::DeallocPTestFailedCtorSubChild(
- PTestFailedCtorSubChild* actor) {
- delete actor;
- return true;
-}
-
-void TestFailedCtorChild::ProcessingError(Result aCode, const char* aReason) {
- if (OtherPid() != base::GetCurrentProcId()) // thread-mode
- _exit(0);
-}
-
-PTestFailedCtorSubsubChild*
-TestFailedCtorSubChild::AllocPTestFailedCtorSubsubChild() {
- return new TestFailedCtorSubsub();
-}
-
-bool TestFailedCtorSubChild::DeallocPTestFailedCtorSubsubChild(
- PTestFailedCtorSubsubChild* actor) {
- delete actor;
- return true;
-}
-
-void TestFailedCtorSubChild::ActorDestroy(ActorDestroyReason why) {}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestFailedCtor.h b/ipc/ipdl/test/cxx/TestFailedCtor.h
deleted file mode 100644
index 6fac4eb278..0000000000
--- a/ipc/ipdl/test/cxx/TestFailedCtor.h
+++ /dev/null
@@ -1,127 +0,0 @@
-#ifndef mozilla_ipdltest_TestFailedCtor_h
-#define mozilla_ipdltest_TestFailedCtor_h
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestFailedCtorParent.h"
-#include "mozilla/_ipdltest/PTestFailedCtorChild.h"
-
-#include "mozilla/_ipdltest/PTestFailedCtorSubParent.h"
-#include "mozilla/_ipdltest/PTestFailedCtorSubChild.h"
-
-#include "mozilla/_ipdltest/PTestFailedCtorSubsubParent.h"
-#include "mozilla/_ipdltest/PTestFailedCtorSubsubChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// Top-level
-//
-class TestFailedCtorParent : public PTestFailedCtorParent {
- friend class PTestFailedCtorParent;
-
- public:
- TestFailedCtorParent() {}
- virtual ~TestFailedCtorParent() {}
-
- static bool RunTestInProcesses() { return true; }
-
- // FIXME/bug 703322 Disabled because child calls exit() to end
- // test, not clear how to handle failed ctor in
- // threaded mode.
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- PTestFailedCtorSubParent* AllocPTestFailedCtorSubParent();
- bool DeallocPTestFailedCtorSubParent(PTestFailedCtorSubParent* actor);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (AbnormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestFailedCtorChild : public PTestFailedCtorChild {
- friend class PTestFailedCtorChild;
-
- public:
- TestFailedCtorChild() {}
- virtual ~TestFailedCtorChild() {}
-
- protected:
- PTestFailedCtorSubChild* AllocPTestFailedCtorSubChild();
-
- mozilla::ipc::IPCResult AnswerPTestFailedCtorSubConstructor(
- PTestFailedCtorSubChild* actor) override;
-
- bool DeallocPTestFailedCtorSubChild(PTestFailedCtorSubChild* actor);
-
- virtual void ProcessingError(Result aCode, const char* aReason) override;
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- fail("should have _exit()ed");
- }
-};
-
-//-----------------------------------------------------------------------------
-// First descendent
-//
-class TestFailedCtorSubsub;
-
-class TestFailedCtorSubParent : public PTestFailedCtorSubParent {
- friend class PTestFailedCtorSubParent;
-
- public:
- TestFailedCtorSubParent() : mOne(nullptr), mTwo(nullptr), mThree(nullptr) {}
- virtual ~TestFailedCtorSubParent();
-
- protected:
- PTestFailedCtorSubsubParent* AllocPTestFailedCtorSubsubParent();
-
- bool DeallocPTestFailedCtorSubsubParent(PTestFailedCtorSubsubParent* actor);
- mozilla::ipc::IPCResult RecvSync() { return IPC_OK(); }
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-
- TestFailedCtorSubsub* mOne;
- TestFailedCtorSubsub* mTwo;
- TestFailedCtorSubsub* mThree;
-};
-
-class TestFailedCtorSubChild : public PTestFailedCtorSubChild {
- friend class PTestFailedCtorSubChild;
-
- public:
- TestFailedCtorSubChild() {}
- virtual ~TestFailedCtorSubChild() {}
-
- protected:
- PTestFailedCtorSubsubChild* AllocPTestFailedCtorSubsubChild();
- bool DeallocPTestFailedCtorSubsubChild(PTestFailedCtorSubsubChild* actor);
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-//-----------------------------------------------------------------------------
-// Grand-descendent
-//
-class TestFailedCtorSubsub : public PTestFailedCtorSubsubParent,
- public PTestFailedCtorSubsubChild {
- public:
- TestFailedCtorSubsub() : mWhy(ActorDestroyReason(-1)), mDealloced(false) {}
- virtual ~TestFailedCtorSubsub() {}
-
- virtual void ActorDestroy(ActorDestroyReason why) override { mWhy = why; }
-
- ActorDestroyReason mWhy;
- bool mDealloced;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla_ipdltest_TestFailedCtor_h
diff --git a/ipc/ipdl/test/cxx/TestHangs.cpp b/ipc/ipdl/test/cxx/TestHangs.cpp
deleted file mode 100644
index 2694cbfdab..0000000000
--- a/ipc/ipdl/test/cxx/TestHangs.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-#include "base/process_util.h"
-
-#include "TestHangs.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-using base::KillProcess;
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestHangsParent::TestHangsParent()
- : mDetectedHang(false), mNumAnswerStackFrame(0) {
- MOZ_COUNT_CTOR(TestHangsParent);
-}
-
-TestHangsParent::~TestHangsParent() { MOZ_COUNT_DTOR(TestHangsParent); }
-
-void TestHangsParent::Main() {
- // Here we try to set things up to test the following sequence of events:
- //
- // - subprocess causes an OnMaybeDequeueOne() task to be posted to
- // this thread
- //
- // - subprocess hangs just long enough for the hang timer to expire
- //
- // - hang-kill code in the parent starts running
- //
- // - subprocess replies to message while hang code runs
- //
- // - reply is processed in OnMaybeDequeueOne() before Close() has
- // been called or the channel error notification has been posted
-
- // this tells the subprocess to send us Nonce()
- if (!SendStart()) fail("sending Start");
-
- // now we sleep here for a while awaiting the Nonce() message from
- // the child. since we're not blocked on anything, the IO thread
- // will enqueue an OnMaybeDequeueOne() task to process that
- // message
- //
- // NB: PR_Sleep is exactly what we want, only the current thread
- // sleeping
- PR_Sleep(5000);
-
- // when we call into this, we'll pull the Nonce() message out of
- // the mPending queue, but that doesn't matter ... the
- // OnMaybeDequeueOne() event will remain
- if (CallStackFrame() && mDetectedHang) fail("should have timed out!");
-
- // the Close() task in the queue will shut us down
-}
-
-bool TestHangsParent::ShouldContinueFromReplyTimeout() {
- mDetectedHang = true;
-
- // so we've detected a timeout after 2 ms ... now we cheat and
- // sleep for a long time, to allow the subprocess's reply to come
- // in
-
- PR_Sleep(5000);
-
- // reply should be here; we'll post a task to shut things down.
- // This must be after OnMaybeDequeueOne() in the event queue.
- MessageLoop::current()->PostTask(NewNonOwningRunnableMethod(
- "_ipdltest::TestHangsParent::CleanUp", this, &TestHangsParent::CleanUp));
-
- GetIPCChannel()->CloseWithTimeout();
-
- return false;
-}
-
-mozilla::ipc::IPCResult TestHangsParent::AnswerStackFrame() {
- ++mNumAnswerStackFrame;
-
- if (mNumAnswerStackFrame == 1) {
- if (CallStackFrame()) {
- fail("should have timed out!");
- }
- } else if (mNumAnswerStackFrame == 2) {
- // minimum possible, 2 ms. We want to detecting a hang to race
- // with the reply coming in, as reliably as possible
- SetReplyTimeoutMs(2);
-
- if (CallHang()) fail("should have timed out!");
- } else {
- fail("unexpected state");
- }
-
- return IPC_OK();
-}
-
-void TestHangsParent::CleanUp() {
- ipc::ScopedProcessHandle otherProcessHandle;
- if (!base::OpenProcessHandle(OtherPid(), &otherProcessHandle.rwget())) {
- fail("couldn't open child process");
- } else {
- if (!KillProcess(otherProcessHandle, 0, false)) {
- fail("terminating child process");
- }
- }
- Close();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestHangsChild::TestHangsChild() { MOZ_COUNT_CTOR(TestHangsChild); }
-
-TestHangsChild::~TestHangsChild() { MOZ_COUNT_DTOR(TestHangsChild); }
-
-mozilla::ipc::IPCResult TestHangsChild::AnswerHang() {
- puts(" (child process is 'hanging' now)");
-
- // just sleep until we're reasonably confident the 1ms hang
- // detector fired in the parent process and it's sleeping in
- // ShouldContinueFromReplyTimeout()
- PR_Sleep(1000);
-
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestHangs.h b/ipc/ipdl/test/cxx/TestHangs.h
deleted file mode 100644
index a3dfb991f5..0000000000
--- a/ipc/ipdl/test/cxx/TestHangs.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef mozilla__ipdltest_TestHangs_h
-#define mozilla__ipdltest_TestHangs_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestHangsParent.h"
-#include "mozilla/_ipdltest/PTestHangsChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestHangsParent : public PTestHangsParent {
- friend class PTestHangsParent;
-
- public:
- TestHangsParent();
- virtual ~TestHangsParent();
-
- static bool RunTestInProcesses() { return true; }
-
- // FIXME/bug 703320 Disabled because parent kills child proc, not
- // clear how that should work in threads.
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- virtual bool ShouldContinueFromReplyTimeout() override;
-
- mozilla::ipc::IPCResult RecvNonce() { return IPC_OK(); }
-
- mozilla::ipc::IPCResult AnswerStackFrame();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (AbnormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-
- void CleanUp();
-
- bool mDetectedHang;
- int32_t mNumAnswerStackFrame;
-};
-
-class TestHangsChild : public PTestHangsChild {
- friend class PTestHangsChild;
-
- public:
- TestHangsChild();
- virtual ~TestHangsChild();
-
- protected:
- mozilla::ipc::IPCResult RecvStart() {
- if (!SendNonce()) fail("sending Nonce");
- return IPC_OK();
- }
-
- mozilla::ipc::IPCResult AnswerStackFrame() {
- if (CallStackFrame()) fail("should have failed");
- return IPC_OK();
- }
-
- mozilla::ipc::IPCResult AnswerHang();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (AbnormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestHangs_h
diff --git a/ipc/ipdl/test/cxx/TestHighestPrio.cpp b/ipc/ipdl/test/cxx/TestHighestPrio.cpp
deleted file mode 100644
index 499c352a5a..0000000000
--- a/ipc/ipdl/test/cxx/TestHighestPrio.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- * vim: sw=2 ts=4 et :
- */
-/* 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 "TestHighestPrio.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-#if defined(XP_UNIX)
-# include <unistd.h>
-#else
-# include <windows.h>
-#endif
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestHighestPrioParent::TestHighestPrioParent() : msg_num_(0) {
- MOZ_COUNT_CTOR(TestHighestPrioParent);
-}
-
-TestHighestPrioParent::~TestHighestPrioParent() {
- MOZ_COUNT_DTOR(TestHighestPrioParent);
-}
-
-void TestHighestPrioParent::Main() {
- if (!SendStart()) fail("sending Start");
-}
-
-mozilla::ipc::IPCResult TestHighestPrioParent::RecvMsg1() {
- MOZ_ASSERT(msg_num_ == 0);
- msg_num_ = 1;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestHighestPrioParent::RecvMsg2() {
- MOZ_ASSERT(msg_num_ == 1);
- msg_num_ = 2;
-
- if (!SendStartInner()) fail("sending StartInner");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestHighestPrioParent::RecvMsg3() {
- MOZ_ASSERT(msg_num_ == 2);
- msg_num_ = 3;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestHighestPrioParent::RecvMsg4() {
- MOZ_ASSERT(msg_num_ == 3);
- msg_num_ = 4;
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestHighestPrioChild::TestHighestPrioChild() {
- MOZ_COUNT_CTOR(TestHighestPrioChild);
-}
-
-TestHighestPrioChild::~TestHighestPrioChild() {
- MOZ_COUNT_DTOR(TestHighestPrioChild);
-}
-
-mozilla::ipc::IPCResult TestHighestPrioChild::RecvStart() {
- if (!SendMsg1()) fail("sending Msg1");
-
- if (!SendMsg2()) fail("sending Msg2");
-
- Close();
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestHighestPrioChild::RecvStartInner() {
- if (!SendMsg3()) fail("sending Msg3");
-
- if (!SendMsg4()) fail("sending Msg4");
-
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestHighestPrio.h b/ipc/ipdl/test/cxx/TestHighestPrio.h
deleted file mode 100644
index 34563d7708..0000000000
--- a/ipc/ipdl/test/cxx/TestHighestPrio.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef mozilla__ipdltest_TestHighestPrio_h
-#define mozilla__ipdltest_TestHighestPrio_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestHighestPrioParent.h"
-#include "mozilla/_ipdltest/PTestHighestPrioChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestHighestPrioParent : public PTestHighestPrioParent {
- public:
- TestHighestPrioParent();
- virtual ~TestHighestPrioParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- mozilla::ipc::IPCResult RecvMsg1();
- mozilla::ipc::IPCResult RecvMsg2();
- mozilla::ipc::IPCResult RecvMsg3();
- mozilla::ipc::IPCResult RecvMsg4();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- if (msg_num_ != 4) fail("missed IPC call");
- passed("ok");
- QuitParent();
- }
-
- private:
- int msg_num_;
-};
-
-class TestHighestPrioChild : public PTestHighestPrioChild {
- public:
- TestHighestPrioChild();
- virtual ~TestHighestPrioChild();
-
- mozilla::ipc::IPCResult RecvStart();
- mozilla::ipc::IPCResult RecvStartInner();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestHighestPrio_h
diff --git a/ipc/ipdl/test/cxx/TestInterruptErrorCleanup.cpp b/ipc/ipdl/test/cxx/TestInterruptErrorCleanup.cpp
deleted file mode 100644
index 3af7ad620d..0000000000
--- a/ipc/ipdl/test/cxx/TestInterruptErrorCleanup.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-#include "TestInterruptErrorCleanup.h"
-
-#include "base/task.h"
-#include "mozilla/CondVar.h"
-#include "mozilla/Mutex.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-#include "IPDLUnitTestSubprocess.h"
-
-using mozilla::CondVar;
-using mozilla::Mutex;
-using mozilla::MutexAutoLock;
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-namespace {
-
-// NB: this test does its own shutdown, rather than going through
-// QuitParent(), because it's testing degenerate edge cases
-
-void DeleteSubprocess(Mutex* mutex, CondVar* cvar) {
- MutexAutoLock lock(*mutex);
-
- gSubprocess->Destroy();
- gSubprocess = nullptr;
-
- cvar->Notify();
-}
-
-void DeleteTheWorld() {
- delete static_cast<TestInterruptErrorCleanupParent*>(gParentActor);
- gParentActor = nullptr;
-
- // needs to be synchronous to avoid affecting event ordering on
- // the main thread
- Mutex mutex MOZ_UNANNOTATED("TestInterruptErrorCleanup.DeleteTheWorld.mutex");
- CondVar cvar(mutex, "TestInterruptErrorCleanup.DeleteTheWorld.cvar");
-
- MutexAutoLock lock(mutex);
-
- XRE_GetIOMessageLoop()->PostTask(
- NewRunnableFunction("DeleteSubprocess", DeleteSubprocess, &mutex, &cvar));
-
- cvar.Wait();
-}
-
-void Done() {
- static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID);
- nsCOMPtr<nsIAppShell> appShell(do_GetService(kAppShellCID));
- appShell->Exit();
-
- passed(__FILE__);
-}
-
-} // namespace
-
-TestInterruptErrorCleanupParent::TestInterruptErrorCleanupParent()
- : mGotProcessingError(false) {
- MOZ_COUNT_CTOR(TestInterruptErrorCleanupParent);
-}
-
-TestInterruptErrorCleanupParent::~TestInterruptErrorCleanupParent() {
- MOZ_COUNT_DTOR(TestInterruptErrorCleanupParent);
-}
-
-void TestInterruptErrorCleanupParent::Main() {
- // This test models the following sequence of events
- //
- // (1) Parent: Interrupt out-call
- // (2) Child: crash
- // --[Parent-only hereafter]--
- // (3) Interrupt out-call return false
- // (4) Close()
- // --[event loop]--
- // (5) delete parentActor
- // (6) delete childProcess
- // --[event loop]--
- // (7) Channel::OnError notification
- // --[event loop]--
- // (8) Done, quit
- //
- // See bug 535298 and friends; this seqeunce of events captures
- // three differnent potential errors
- // - Close()-after-error (semantic error previously)
- // - use-after-free of parentActor
- // - use-after-free of channel
- //
- // Because of legacy constraints related to nsNPAPI* code, we need
- // to ensure that this sequence of events can occur without
- // errors/crashes.
-
- MessageLoop::current()->PostTask(
- NewRunnableFunction("DeleteTheWorld", DeleteTheWorld));
-
- // it's a failure if this *succeeds*
- if (CallError()) fail("expected an error!");
-
- if (!mGotProcessingError) fail("expected a ProcessingError() notification");
-
- // it's OK to Close() a channel after an error, because nsNPAPI*
- // wants to do this
- Close();
-
- // we know that this event *must* be after the MaybeError
- // notification enqueued by AsyncChannel, because that event is
- // enqueued within the same mutex that ends up signaling the
- // wakeup-on-error of |CallError()| above
- MessageLoop::current()->PostTask(NewRunnableFunction("Done", Done));
-}
-
-void TestInterruptErrorCleanupParent::ProcessingError(Result aCode,
- const char* aReason) {
- if (aCode != MsgDropped) fail("unexpected processing error");
- mGotProcessingError = true;
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestInterruptErrorCleanupChild::TestInterruptErrorCleanupChild() {
- MOZ_COUNT_CTOR(TestInterruptErrorCleanupChild);
-}
-
-TestInterruptErrorCleanupChild::~TestInterruptErrorCleanupChild() {
- MOZ_COUNT_DTOR(TestInterruptErrorCleanupChild);
-}
-
-mozilla::ipc::IPCResult TestInterruptErrorCleanupChild::AnswerError() {
- _exit(0);
- MOZ_CRASH("unreached");
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestInterruptErrorCleanup.h b/ipc/ipdl/test/cxx/TestInterruptErrorCleanup.h
deleted file mode 100644
index 9ae0493cf0..0000000000
--- a/ipc/ipdl/test/cxx/TestInterruptErrorCleanup.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef mozilla__ipdltest_TestInterruptErrorCleanup_h
-#define mozilla__ipdltest_TestInterruptErrorCleanup_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestInterruptErrorCleanupParent.h"
-#include "mozilla/_ipdltest/PTestInterruptErrorCleanupChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestInterruptErrorCleanupParent
- : public PTestInterruptErrorCleanupParent {
- public:
- TestInterruptErrorCleanupParent();
- virtual ~TestInterruptErrorCleanupParent();
-
- static bool RunTestInProcesses() { return true; }
- // FIXME/bug 703323 Could work if modified
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (AbnormalShutdown != why) fail("unexpected destruction!");
- }
-
- virtual void ProcessingError(Result aCode, const char* aReason) override;
-
- bool mGotProcessingError;
-};
-
-class TestInterruptErrorCleanupChild : public PTestInterruptErrorCleanupChild {
- friend class PTestInterruptErrorCleanupChild;
-
- public:
- TestInterruptErrorCleanupChild();
- virtual ~TestInterruptErrorCleanupChild();
-
- protected:
- mozilla::ipc::IPCResult AnswerError();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- fail("should have 'crashed'!");
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestInterruptErrorCleanup_h
diff --git a/ipc/ipdl/test/cxx/TestInterruptRaces.cpp b/ipc/ipdl/test/cxx/TestInterruptRaces.cpp
deleted file mode 100644
index 02b42cfbc3..0000000000
--- a/ipc/ipdl/test/cxx/TestInterruptRaces.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-#include "TestInterruptRaces.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-using mozilla::ipc::MessageChannel;
-
-namespace mozilla {
-namespace _ipdltest {
-
-ipc::RacyInterruptPolicy MediateRace(const MessageChannel::MessageInfo& parent,
- const MessageChannel::MessageInfo& child) {
- return (PTestInterruptRaces::Msg_Child__ID == parent.type())
- ? ipc::RIPParentWins
- : ipc::RIPChildWins;
-}
-
-//-----------------------------------------------------------------------------
-// parent
-void TestInterruptRacesParent::Main() {
- if (!SendStart()) fail("sending Start()");
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesParent::RecvStartRace() {
- MessageLoop::current()->PostTask(NewNonOwningRunnableMethod(
- "_ipdltest::TestInterruptRacesParent::OnRaceTime", this,
- &TestInterruptRacesParent::OnRaceTime));
- return IPC_OK();
-}
-
-void TestInterruptRacesParent::OnRaceTime() {
- if (!CallRace(&mChildHasReply)) fail("problem calling Race()");
-
- if (!mChildHasReply) fail("child should have got a reply already");
-
- mHasReply = true;
-
- MessageLoop::current()->PostTask(
- NewNonOwningRunnableMethod("_ipdltest::TestInterruptRacesParent::Test2",
- this, &TestInterruptRacesParent::Test2));
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesParent::AnswerRace(bool* hasReply) {
- if (mHasReply) fail("apparently the parent won the Interrupt race!");
- *hasReply = hasReply;
- return IPC_OK();
-}
-
-void TestInterruptRacesParent::Test2() {
- puts(" passed");
- puts("Test 2");
-
- mHasReply = false;
- mChildHasReply = false;
-
- if (!CallStackFrame()) fail("can't set up a stack frame");
-
- puts(" passed");
-
- MessageLoop::current()->PostTask(
- NewNonOwningRunnableMethod("_ipdltest::TestInterruptRacesParent::Test3",
- this, &TestInterruptRacesParent::Test3));
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesParent::AnswerStackFrame() {
- if (!SendWakeup()) fail("can't wake up the child");
-
- if (!CallRace(&mChildHasReply)) fail("can't set up race condition");
- mHasReply = true;
-
- if (!mChildHasReply) fail("child should have got a reply already");
-
- return IPC_OK();
-}
-
-void TestInterruptRacesParent::Test3() {
- puts("Test 3");
-
- if (!CallStackFrame3()) fail("can't set up a stack frame");
-
- puts(" passed");
-
- Close();
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesParent::AnswerStackFrame3() {
- if (!SendWakeup3()) fail("can't wake up the child");
-
- if (!CallChild()) fail("can't set up race condition");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesParent::AnswerParent() {
- mAnsweredParent = true;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesParent::RecvGetAnsweredParent(
- bool* answeredParent) {
- *answeredParent = mAnsweredParent;
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-mozilla::ipc::IPCResult TestInterruptRacesChild::RecvStart() {
- puts("Test 1");
-
- if (!SendStartRace()) fail("problem sending StartRace()");
-
- bool dontcare;
- if (!CallRace(&dontcare)) fail("problem calling Race()");
-
- mHasReply = true;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesChild::AnswerRace(bool* hasReply) {
- if (!mHasReply) fail("apparently the child lost the Interrupt race!");
-
- *hasReply = mHasReply;
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesChild::AnswerStackFrame() {
- // reset for the second test
- mHasReply = false;
-
- if (!CallStackFrame()) fail("can't set up stack frame");
-
- if (!mHasReply) fail("should have had reply by now");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesChild::RecvWakeup() {
- bool dontcare;
- if (!CallRace(&dontcare)) fail("can't set up race condition");
-
- mHasReply = true;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesChild::AnswerStackFrame3() {
- if (!CallStackFrame3()) fail("can't set up stack frame");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesChild::RecvWakeup3() {
- if (!CallParent()) fail("can't set up race condition");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestInterruptRacesChild::AnswerChild() {
- bool parentAnsweredParent;
- // the parent is supposed to win the race, which means its
- // message, Child(), is supposed to be processed before the
- // child's message, Parent()
- if (!SendGetAnsweredParent(&parentAnsweredParent))
- fail("sending GetAnsweredParent");
-
- if (parentAnsweredParent) fail("parent was supposed to win the race!");
-
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestInterruptRaces.h b/ipc/ipdl/test/cxx/TestInterruptRaces.h
deleted file mode 100644
index 6fa184da1a..0000000000
--- a/ipc/ipdl/test/cxx/TestInterruptRaces.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#ifndef mozilla__ipdltest_TestInterruptRaces_h
-#define mozilla__ipdltest_TestInterruptRaces_h
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestInterruptRacesParent.h"
-#include "mozilla/_ipdltest/PTestInterruptRacesChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-mozilla::ipc::RacyInterruptPolicy MediateRace(
- const mozilla::ipc::MessageChannel::MessageInfo& parent,
- const mozilla::ipc::MessageChannel::MessageInfo& child);
-
-class TestInterruptRacesParent : public PTestInterruptRacesParent {
- friend class PTestInterruptRacesParent;
-
- public:
- TestInterruptRacesParent()
- : mHasReply(false), mChildHasReply(false), mAnsweredParent(false) {}
- virtual ~TestInterruptRacesParent() {}
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvStartRace();
-
- mozilla::ipc::IPCResult AnswerRace(bool* hasRace);
-
- mozilla::ipc::IPCResult AnswerStackFrame();
-
- mozilla::ipc::IPCResult AnswerStackFrame3();
-
- mozilla::ipc::IPCResult AnswerParent();
-
- mozilla::ipc::IPCResult RecvGetAnsweredParent(bool* answeredParent);
-
- mozilla::ipc::RacyInterruptPolicy MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) override {
- return MediateRace(parent, child);
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- if (!(mHasReply && mChildHasReply)) fail("both sides should have replies!");
- passed("ok");
- QuitParent();
- }
-
- private:
- void OnRaceTime();
-
- void Test2();
- void Test3();
-
- bool mHasReply;
- bool mChildHasReply;
- bool mAnsweredParent;
-};
-
-class TestInterruptRacesChild : public PTestInterruptRacesChild {
- friend class PTestInterruptRacesChild;
-
- public:
- TestInterruptRacesChild() : mHasReply(false) {}
- virtual ~TestInterruptRacesChild() {}
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- mozilla::ipc::IPCResult AnswerRace(bool* hasRace);
-
- mozilla::ipc::IPCResult AnswerStackFrame();
-
- mozilla::ipc::IPCResult AnswerStackFrame3();
-
- mozilla::ipc::IPCResult RecvWakeup();
-
- mozilla::ipc::IPCResult RecvWakeup3();
-
- mozilla::ipc::IPCResult AnswerChild();
-
- virtual mozilla::ipc::RacyInterruptPolicy MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) override {
- return MediateRace(parent, child);
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-
- private:
- bool mHasReply;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestInterruptRaces_h
diff --git a/ipc/ipdl/test/cxx/TestInterruptShutdownRace.cpp b/ipc/ipdl/test/cxx/TestInterruptShutdownRace.cpp
deleted file mode 100644
index 5482893995..0000000000
--- a/ipc/ipdl/test/cxx/TestInterruptShutdownRace.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-#include "TestInterruptShutdownRace.h"
-
-#include "base/task.h"
-#include "IPDLUnitTests.h" // fail etc.
-#include "IPDLUnitTestSubprocess.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-namespace {
-
-// NB: this test does its own shutdown, rather than going through
-// QuitParent(), because it's testing degenerate edge cases
-
-void DeleteSubprocess() {
- gSubprocess->Destroy();
- gSubprocess = nullptr;
-}
-
-void Done() {
- passed(__FILE__);
- QuitParent();
-}
-
-} // namespace
-
-TestInterruptShutdownRaceParent::TestInterruptShutdownRaceParent() {
- MOZ_COUNT_CTOR(TestInterruptShutdownRaceParent);
-}
-
-TestInterruptShutdownRaceParent::~TestInterruptShutdownRaceParent() {
- MOZ_COUNT_DTOR(TestInterruptShutdownRaceParent);
-}
-
-void TestInterruptShutdownRaceParent::Main() {
- if (!SendStart()) fail("sending Start");
-}
-
-mozilla::ipc::IPCResult TestInterruptShutdownRaceParent::RecvStartDeath() {
- // this will be ordered before the OnMaybeDequeueOne event of
- // Orphan in the queue
- MessageLoop::current()->PostTask(NewNonOwningRunnableMethod(
- "_ipdltest::TestInterruptShutdownRaceParent::StartShuttingDown", this,
- &TestInterruptShutdownRaceParent::StartShuttingDown));
- return IPC_OK();
-}
-
-void TestInterruptShutdownRaceParent::StartShuttingDown() {
- // NB: we sleep here to try and avoid receiving the Orphan message
- // while waiting for the CallExit() reply. if we fail at that, it
- // will cause the test to pass spuriously, because there won't be
- // an OnMaybeDequeueOne task for Orphan
- PR_Sleep(2000);
-
- if (CallExit()) fail("connection was supposed to be interrupted");
-
- Close();
-
- delete static_cast<TestInterruptShutdownRaceParent*>(gParentActor);
- gParentActor = nullptr;
-
- XRE_GetIOMessageLoop()->PostTask(
- NewRunnableFunction("DeleteSubprocess", DeleteSubprocess));
-
- // this is ordered after the OnMaybeDequeueOne event in the queue
- MessageLoop::current()->PostTask(NewRunnableFunction("Done", Done));
-
- // |this| has been deleted, be mindful
-}
-
-mozilla::ipc::IPCResult TestInterruptShutdownRaceParent::RecvOrphan() {
- // it would be nice to fail() here, but we'll process this message
- // while waiting for the reply CallExit(). The OnMaybeDequeueOne
- // task will still be in the queue, it just wouldn't have had any
- // work to do, if we hadn't deleted ourself
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestInterruptShutdownRaceChild::TestInterruptShutdownRaceChild() {
- MOZ_COUNT_CTOR(TestInterruptShutdownRaceChild);
-}
-
-TestInterruptShutdownRaceChild::~TestInterruptShutdownRaceChild() {
- MOZ_COUNT_DTOR(TestInterruptShutdownRaceChild);
-}
-
-mozilla::ipc::IPCResult TestInterruptShutdownRaceChild::RecvStart() {
- if (!SendStartDeath()) fail("sending StartDeath");
-
- // See comment in StartShuttingDown(): we want to send Orphan()
- // while the parent is in its PR_Sleep()
- PR_Sleep(1000);
-
- if (!SendOrphan()) fail("sending Orphan");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestInterruptShutdownRaceChild::AnswerExit() {
- _exit(0);
- MOZ_CRASH("unreached");
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestInterruptShutdownRace.h b/ipc/ipdl/test/cxx/TestInterruptShutdownRace.h
deleted file mode 100644
index 17425fc06c..0000000000
--- a/ipc/ipdl/test/cxx/TestInterruptShutdownRace.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef mozilla__ipdltest_TestInterruptShutdownRace_h
-#define mozilla__ipdltest_TestInterruptShutdownRace_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestInterruptShutdownRaceParent.h"
-#include "mozilla/_ipdltest/PTestInterruptShutdownRaceChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestInterruptShutdownRaceParent
- : public PTestInterruptShutdownRaceParent {
- public:
- TestInterruptShutdownRaceParent();
- virtual ~TestInterruptShutdownRaceParent();
-
- static bool RunTestInProcesses() { return true; }
- // FIXME/bug 703323 Could work if modified
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- mozilla::ipc::IPCResult RecvStartDeath();
-
- mozilla::ipc::IPCResult RecvOrphan();
-
- protected:
- void StartShuttingDown();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (AbnormalShutdown != why) fail("unexpected destruction!");
- }
-};
-
-class TestInterruptShutdownRaceChild : public PTestInterruptShutdownRaceChild {
- friend class PTestInterruptShutdownRaceChild;
-
- public:
- TestInterruptShutdownRaceChild();
- virtual ~TestInterruptShutdownRaceChild();
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- mozilla::ipc::IPCResult AnswerExit();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- fail("should have 'crashed'!");
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestInterruptShutdownRace_h
diff --git a/ipc/ipdl/test/cxx/TestJSON.cpp b/ipc/ipdl/test/cxx/TestJSON.cpp
deleted file mode 100644
index 42fac919d1..0000000000
--- a/ipc/ipdl/test/cxx/TestJSON.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#include "TestJSON.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-#define test_assert(_cond, _msg) \
- if (!(_cond)) fail(_msg)
-
-namespace mozilla {
-namespace _ipdltest {
-
-static nsString String(const char* const str) {
- return NS_ConvertUTF8toUTF16(str);
-}
-
-static void Array123(nsTArray<JSONVariant>& a123) {
- a123.AppendElement(1);
- a123.AppendElement(2);
- a123.AppendElement(3);
-
- test_assert(a123 == a123, "operator== is broken");
-}
-
-template <class HandleT>
-JSONVariant MakeTestVariant(HandleT* handle) {
- // In JS syntax:
- //
- // return [
- // undefined, null, true, 1.25, "test string",
- // handle,
- // [ 1, 2, 3 ],
- // { "undefined" : undefined,
- // "null" : null,
- // "true" : true,
- // "1.25" : 1.25,
- // "string" : "string"
- // "handle" : handle,
- // "array" : [ 1, 2, 3 ]
- // }
- // ]
- //
- nsTArray<JSONVariant> outer;
-
- outer.AppendElement(void_t());
- outer.AppendElement(null_t());
- outer.AppendElement(true);
- outer.AppendElement(1.25);
- outer.AppendElement(String("test string"));
-
- outer.AppendElement(handle);
-
- nsTArray<JSONVariant> tmp;
- Array123(tmp);
- outer.AppendElement(tmp);
-
- nsTArray<KeyValue> obj;
- obj.AppendElement(KeyValue(String("undefined"), void_t()));
- obj.AppendElement(KeyValue(String("null"), null_t()));
- obj.AppendElement(KeyValue(String("true"), true));
- obj.AppendElement(KeyValue(String("1.25"), 1.25));
- obj.AppendElement(KeyValue(String("string"), String("value")));
- obj.AppendElement(KeyValue(String("handle"), handle));
- nsTArray<JSONVariant> tmp2;
- Array123(tmp2);
- obj.AppendElement(KeyValue(String("array"), tmp2));
-
- outer.AppendElement(obj);
-
- test_assert(outer == outer, "operator== is broken");
-
- return JSONVariant(outer);
-}
-
-//-----------------------------------------------------------------------------
-// parent
-
-void TestJSONParent::Main() {
- if (!SendStart()) fail("sending Start");
-}
-
-mozilla::ipc::IPCResult TestJSONParent::RecvTest(const JSONVariant& i,
- JSONVariant* o) {
- test_assert(i == i, "operator== is broken");
- test_assert(i == MakeTestVariant(mKid), "inparam mangled en route");
-
- *o = i;
-
- test_assert(i == *o, "operator= is broken");
-
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-mozilla::ipc::IPCResult TestJSONChild::RecvStart() {
- if (!SendPTestHandleConstructor()) fail("sending Handle ctor");
-
- JSONVariant i(MakeTestVariant(mKid));
- test_assert(i == i, "operator== is broken");
- test_assert(i == MakeTestVariant(mKid), "copy ctor is broken");
-
- JSONVariant o;
- if (!SendTest(i, &o)) fail("sending Test");
-
- test_assert(i == o, "round-trip mangled input data");
- test_assert(o == MakeTestVariant(mKid), "outparam mangled en route");
-
- Close();
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestJSON.h b/ipc/ipdl/test/cxx/TestJSON.h
deleted file mode 100644
index eaf7516525..0000000000
--- a/ipc/ipdl/test/cxx/TestJSON.h
+++ /dev/null
@@ -1,93 +0,0 @@
-#ifndef mozilla__ipdltest_TestJSON_h
-#define mozilla__ipdltest_TestJSON_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestJSONParent.h"
-#include "mozilla/_ipdltest/PTestJSONChild.h"
-
-#include "mozilla/_ipdltest/PTestHandleParent.h"
-#include "mozilla/_ipdltest/PTestHandleChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestHandleParent : public PTestHandleParent {
- public:
- TestHandleParent() {}
- virtual ~TestHandleParent() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
-};
-
-class TestJSONParent : public PTestJSONParent {
- friend class PTestJSONParent;
-
- public:
- TestJSONParent() {}
- virtual ~TestJSONParent() {}
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvTest(const JSONVariant& i, JSONVariant* o);
-
- PTestHandleParent* AllocPTestHandleParent() {
- return mKid = new TestHandleParent();
- }
-
- bool DeallocPTestHandleParent(PTestHandleParent* actor) {
- delete actor;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-
- PTestHandleParent* mKid;
-};
-
-class TestHandleChild : public PTestHandleChild {
- public:
- TestHandleChild() {}
- virtual ~TestHandleChild() {}
-};
-
-class TestJSONChild : public PTestJSONChild {
- friend class PTestJSONChild;
-
- public:
- TestJSONChild() {}
- virtual ~TestJSONChild() {}
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- PTestHandleChild* AllocPTestHandleChild() {
- return mKid = new TestHandleChild();
- }
-
- bool DeallocPTestHandleChild(PTestHandleChild* actor) {
- delete actor;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-
- PTestHandleChild* mKid;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestJSON_h
diff --git a/ipc/ipdl/test/cxx/TestLatency.cpp b/ipc/ipdl/test/cxx/TestLatency.cpp
deleted file mode 100644
index f88d8ea644..0000000000
--- a/ipc/ipdl/test/cxx/TestLatency.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-#include "TestLatency.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-// A ping/pong trial takes O(100us) or more, so if we don't have 10us
-// resolution or better, the results will not be terribly useful
-static const double kTimingResolutionCutoff = 0.00001; // 10us
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestLatencyParent::TestLatencyParent()
- : mStart(),
- mPPTimeTotal(),
- mPP5TimeTotal(),
- mRpcTimeTotal(),
- mPPTrialsToGo(NR_TRIALS),
- mPP5TrialsToGo(NR_TRIALS),
- mNumChildProcessedCompressedSpams(0),
- mWhichPong5(0) {
- MOZ_COUNT_CTOR(TestLatencyParent);
-}
-
-TestLatencyParent::~TestLatencyParent() { MOZ_COUNT_DTOR(TestLatencyParent); }
-
-void TestLatencyParent::Main() {
- TimeDuration resolution = TimeDuration::Resolution();
- if (resolution.ToSeconds() > kTimingResolutionCutoff) {
- puts(" (skipping TestLatency, timing resolution is too poor)");
- Close();
- return;
- }
-
- printf(" timing resolution: %g seconds\n", resolution.ToSecondsSigDigits());
-
- if (mozilla::ipc::LoggingEnabled())
- MOZ_CRASH(
- "you really don't want to log all IPC messages during this test, trust "
- "me");
-
- PingPongTrial();
-}
-
-void TestLatencyParent::PingPongTrial() {
- mStart = TimeStamp::Now();
- if (!SendPing()) fail("sending Ping()");
-}
-
-void TestLatencyParent::Ping5Pong5Trial() {
- mStart = TimeStamp::Now();
-
- if (!SendPing5() || !SendPing5() || !SendPing5() || !SendPing5() ||
- !SendPing5())
- fail("sending Ping5()");
-}
-
-mozilla::ipc::IPCResult TestLatencyParent::RecvPong() {
- TimeDuration thisTrial = (TimeStamp::Now() - mStart);
- mPPTimeTotal += thisTrial;
-
- if (0 == (mPPTrialsToGo % 1000))
- printf(" PP trial %d: %g\n", mPPTrialsToGo,
- thisTrial.ToSecondsSigDigits());
-
- if (--mPPTrialsToGo > 0)
- PingPongTrial();
- else
- Ping5Pong5Trial();
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestLatencyParent::RecvPong5() {
- ++mWhichPong5;
-
- if (mWhichPong5 < 5) {
- return IPC_OK();
- }
-
- mWhichPong5 = 0;
-
- TimeDuration thisTrial = (TimeStamp::Now() - mStart);
- mPP5TimeTotal += thisTrial;
-
- if (0 == (mPP5TrialsToGo % 1000))
- printf(" PP5 trial %d: %g\n", mPP5TrialsToGo,
- thisTrial.ToSecondsSigDigits());
-
- if (0 < --mPP5TrialsToGo)
- Ping5Pong5Trial();
- else
- RpcTrials();
-
- return IPC_OK();
-}
-
-void TestLatencyParent::RpcTrials() {
- TimeStamp start = TimeStamp::Now();
- for (int i = 0; i < NR_TRIALS; ++i) {
- if (!CallRpc()) fail("can't call Rpc()");
- if (0 == (i % 1000)) printf(" Rpc trial %d\n", i);
- }
- mRpcTimeTotal = (TimeStamp::Now() - start);
-
- SpamTrial();
-}
-
-void TestLatencyParent::SpamTrial() {
- TimeStamp start = TimeStamp::Now();
- for (int i = 0; i < NR_SPAMS - 1; ++i) {
- if (!SendSpam()) fail("sending Spam()");
- if (0 == (i % 10000)) printf(" Spam trial %d\n", i);
- }
-
- // Synchronize with the child process to ensure all messages have
- // been processed. This adds the overhead of a reply message from
- // child-->here, but should be insignificant compared to >>
- // NR_SPAMS.
- if (!CallSynchro()) fail("calling Synchro()");
-
- mSpamTimeTotal = (TimeStamp::Now() - start);
-
- CompressedSpamTrial();
-}
-
-void TestLatencyParent::CompressedSpamTrial() {
- for (int i = 0; i < NR_SPAMS; ++i) {
- if (!SendCompressedSpam(i + 1)) fail("sending CompressedSpam()");
- if (0 == (i % 10000)) printf(" CompressedSpam trial %d\n", i);
- }
-
- uint32_t lastSeqno;
- if (!CallSynchro2(&lastSeqno, &mNumChildProcessedCompressedSpams))
- fail("calling Synchro2()");
-
- if (lastSeqno != NR_SPAMS)
- fail("last seqno was %u, expected %u", lastSeqno, NR_SPAMS);
-
- // NB: since this is testing an optimization, it's somewhat bogus.
- // Need to make a warning if it actually intermittently fails in
- // practice, which is doubtful.
- if (!(mNumChildProcessedCompressedSpams < NR_SPAMS))
- fail("Didn't compress any messages?");
-
- Exit();
-}
-
-void TestLatencyParent::Exit() { Close(); }
-
-//-----------------------------------------------------------------------------
-// child
-
-TestLatencyChild::TestLatencyChild()
- : mLastSeqno(0), mNumProcessedCompressedSpams(0), mWhichPing5(0) {
- MOZ_COUNT_CTOR(TestLatencyChild);
-}
-
-TestLatencyChild::~TestLatencyChild() { MOZ_COUNT_DTOR(TestLatencyChild); }
-
-mozilla::ipc::IPCResult TestLatencyChild::RecvPing() {
- SendPong();
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestLatencyChild::RecvPing5() {
- ++mWhichPing5;
-
- if (mWhichPing5 < 5) {
- return IPC_OK();
- }
-
- mWhichPing5 = 0;
-
- if (!SendPong5() || !SendPong5() || !SendPong5() || !SendPong5() ||
- !SendPong5())
- fail("sending Pong5()");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestLatencyChild::AnswerRpc() { return IPC_OK(); }
-
-mozilla::ipc::IPCResult TestLatencyChild::RecvSpam() {
- // no-op
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestLatencyChild::AnswerSynchro() { return IPC_OK(); }
-
-mozilla::ipc::IPCResult TestLatencyChild::RecvCompressedSpam(
- const uint32_t& seqno) {
- if (seqno <= mLastSeqno)
- fail("compressed seqnos must monotonically increase");
-
- mLastSeqno = seqno;
- ++mNumProcessedCompressedSpams;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestLatencyChild::AnswerSynchro2(
- uint32_t* lastSeqno, uint32_t* numMessagesDispatched) {
- *lastSeqno = mLastSeqno;
- *numMessagesDispatched = mNumProcessedCompressedSpams;
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestLatency.h b/ipc/ipdl/test/cxx/TestLatency.h
deleted file mode 100644
index 687b107808..0000000000
--- a/ipc/ipdl/test/cxx/TestLatency.h
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef mozilla__ipdltest_TestLatency_h
-#define mozilla__ipdltest_TestLatency_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestLatencyParent.h"
-#include "mozilla/_ipdltest/PTestLatencyChild.h"
-
-#include "mozilla/TimeStamp.h"
-
-#define NR_TRIALS 10000
-#define NR_SPAMS 25000
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestLatencyParent : public PTestLatencyParent {
- friend class PTestLatencyParent;
-
- private:
- typedef mozilla::TimeStamp TimeStamp;
- typedef mozilla::TimeDuration TimeDuration;
-
- public:
- TestLatencyParent();
- virtual ~TestLatencyParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvPong();
- mozilla::ipc::IPCResult RecvPong5();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
-
- passed(
- "\n"
- " average #ping-pong/sec: %g\n"
- " average #ping5-pong5/sec: %g\n"
- " average #RPC call-answer/sec: %g\n"
- " average #spams/sec: %g\n"
- " pct. spams compressed away: %g\n",
- double(NR_TRIALS) / mPPTimeTotal.ToSecondsSigDigits(),
- double(NR_TRIALS) / mPP5TimeTotal.ToSecondsSigDigits(),
- double(NR_TRIALS) / mRpcTimeTotal.ToSecondsSigDigits(),
- double(NR_SPAMS) / mSpamTimeTotal.ToSecondsSigDigits(),
- 100.0 * (double(NR_SPAMS - mNumChildProcessedCompressedSpams) /
- double(NR_SPAMS)));
-
- QuitParent();
- }
-
- private:
- void PingPongTrial();
- void Ping5Pong5Trial();
- void RpcTrials();
- void SpamTrial();
- void CompressedSpamTrial();
- void Exit();
-
- TimeStamp mStart;
- TimeDuration mPPTimeTotal;
- TimeDuration mPP5TimeTotal;
- TimeDuration mRpcTimeTotal;
- TimeDuration mSpamTimeTotal;
-
- int mPPTrialsToGo;
- int mPP5TrialsToGo;
- uint32_t mNumChildProcessedCompressedSpams;
- uint32_t mWhichPong5;
-};
-
-class TestLatencyChild : public PTestLatencyChild {
- friend class PTestLatencyChild;
-
- public:
- TestLatencyChild();
- virtual ~TestLatencyChild();
-
- protected:
- mozilla::ipc::IPCResult RecvPing();
- mozilla::ipc::IPCResult RecvPing5();
- mozilla::ipc::IPCResult AnswerRpc();
- mozilla::ipc::IPCResult RecvSpam();
- mozilla::ipc::IPCResult AnswerSynchro();
- mozilla::ipc::IPCResult RecvCompressedSpam(const uint32_t& seqno);
- mozilla::ipc::IPCResult AnswerSynchro2(uint32_t* lastSeqno,
- uint32_t* numMessagesDispatched);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-
- uint32_t mLastSeqno;
- uint32_t mNumProcessedCompressedSpams;
- uint32_t mWhichPing5;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestLatency_h
diff --git a/ipc/ipdl/test/cxx/TestManyChildAllocs.cpp b/ipc/ipdl/test/cxx/TestManyChildAllocs.cpp
deleted file mode 100644
index 77d5786cfa..0000000000
--- a/ipc/ipdl/test/cxx/TestManyChildAllocs.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#include "TestManyChildAllocs.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-#define NALLOCS 10
-
-namespace mozilla {
-namespace _ipdltest {
-
-// parent code
-
-TestManyChildAllocsParent::TestManyChildAllocsParent() {
- MOZ_COUNT_CTOR(TestManyChildAllocsParent);
-}
-
-TestManyChildAllocsParent::~TestManyChildAllocsParent() {
- MOZ_COUNT_DTOR(TestManyChildAllocsParent);
-}
-
-void TestManyChildAllocsParent::Main() {
- if (!SendGo()) fail("can't send Go()");
-}
-
-mozilla::ipc::IPCResult TestManyChildAllocsParent::RecvDone() {
- // explicitly *not* cleaning up, so we can sanity-check IPDL's
- // auto-shutdown/cleanup handling
- Close();
-
- return IPC_OK();
-}
-
-bool TestManyChildAllocsParent::DeallocPTestManyChildAllocsSubParent(
- PTestManyChildAllocsSubParent* __a) {
- delete __a;
- return true;
-}
-
-PTestManyChildAllocsSubParent*
-TestManyChildAllocsParent::AllocPTestManyChildAllocsSubParent() {
- return new TestManyChildAllocsSubParent();
-}
-
-// child code
-
-TestManyChildAllocsChild::TestManyChildAllocsChild() {
- MOZ_COUNT_CTOR(TestManyChildAllocsChild);
-}
-
-TestManyChildAllocsChild::~TestManyChildAllocsChild() {
- MOZ_COUNT_DTOR(TestManyChildAllocsChild);
-}
-
-mozilla::ipc::IPCResult TestManyChildAllocsChild::RecvGo() {
- for (int i = 0; i < NALLOCS; ++i) {
- PTestManyChildAllocsSubChild* child =
- SendPTestManyChildAllocsSubConstructor();
-
- if (!child) fail("can't send ctor()");
-
- if (!child->SendHello()) fail("can't send Hello()");
- }
-
- size_t len = ManagedPTestManyChildAllocsSubChild().Count();
- if (NALLOCS != len) fail("expected %lu kids, got %lu", NALLOCS, len);
-
- if (!SendDone()) fail("can't send Done()");
-
- return IPC_OK();
-}
-
-bool TestManyChildAllocsChild::DeallocPTestManyChildAllocsSubChild(
- PTestManyChildAllocsSubChild* __a) {
- delete __a;
- return true;
-}
-
-PTestManyChildAllocsSubChild*
-TestManyChildAllocsChild::AllocPTestManyChildAllocsSubChild() {
- return new TestManyChildAllocsSubChild();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestManyChildAllocs.h b/ipc/ipdl/test/cxx/TestManyChildAllocs.h
deleted file mode 100644
index 3da6461810..0000000000
--- a/ipc/ipdl/test/cxx/TestManyChildAllocs.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifndef mozilla__ipdltest_TestManyChildAllocs_h
-#define mozilla__ipdltest_TestManyChildAllocs_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestManyChildAllocsParent.h"
-#include "mozilla/_ipdltest/PTestManyChildAllocsChild.h"
-
-#include "mozilla/_ipdltest/PTestManyChildAllocsSubParent.h"
-#include "mozilla/_ipdltest/PTestManyChildAllocsSubChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-// top-level protocol
-
-class TestManyChildAllocsParent : public PTestManyChildAllocsParent {
- friend class PTestManyChildAllocsParent;
-
- public:
- TestManyChildAllocsParent();
- virtual ~TestManyChildAllocsParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvDone();
- bool DeallocPTestManyChildAllocsSubParent(PTestManyChildAllocsSubParent* __a);
- PTestManyChildAllocsSubParent* AllocPTestManyChildAllocsSubParent();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestManyChildAllocsChild : public PTestManyChildAllocsChild {
- friend class PTestManyChildAllocsChild;
-
- public:
- TestManyChildAllocsChild();
- virtual ~TestManyChildAllocsChild();
-
- protected:
- mozilla::ipc::IPCResult RecvGo();
- bool DeallocPTestManyChildAllocsSubChild(PTestManyChildAllocsSubChild* __a);
- PTestManyChildAllocsSubChild* AllocPTestManyChildAllocsSubChild();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-// do-nothing sub-protocol actors
-
-class TestManyChildAllocsSubParent : public PTestManyChildAllocsSubParent {
- friend class PTestManyChildAllocsSubParent;
-
- public:
- TestManyChildAllocsSubParent() {}
- virtual ~TestManyChildAllocsSubParent() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
- mozilla::ipc::IPCResult RecvHello() { return IPC_OK(); }
-};
-
-class TestManyChildAllocsSubChild : public PTestManyChildAllocsSubChild {
- public:
- TestManyChildAllocsSubChild() {}
- virtual ~TestManyChildAllocsSubChild() {}
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestManyChildAllocs_h
diff --git a/ipc/ipdl/test/cxx/TestMultiMgrs.cpp b/ipc/ipdl/test/cxx/TestMultiMgrs.cpp
deleted file mode 100644
index f09bb9ca7b..0000000000
--- a/ipc/ipdl/test/cxx/TestMultiMgrs.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#include "TestMultiMgrs.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-#include "mozilla/ipc/ProtocolUtils.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-void TestMultiMgrsParent::Main() {
- TestMultiMgrsLeftParent* leftie = new TestMultiMgrsLeftParent();
- if (!SendPTestMultiMgrsLeftConstructor(leftie)) fail("error sending ctor");
-
- TestMultiMgrsRightParent* rightie = new TestMultiMgrsRightParent();
- if (!SendPTestMultiMgrsRightConstructor(rightie)) fail("error sending ctor");
-
- TestMultiMgrsBottomParent* bottomL = new TestMultiMgrsBottomParent();
- if (!leftie->SendPTestMultiMgrsBottomConstructor(bottomL))
- fail("error sending ctor");
-
- TestMultiMgrsBottomParent* bottomR = new TestMultiMgrsBottomParent();
- if (!rightie->SendPTestMultiMgrsBottomConstructor(bottomR))
- fail("error sending ctor");
-
- if (!leftie->HasChild(bottomL))
- fail("leftie didn't have a child it was supposed to!");
- if (leftie->HasChild(bottomR)) fail("leftie had rightie's child!");
-
- if (!rightie->HasChild(bottomR))
- fail("rightie didn't have a child it was supposed to!");
- if (rightie->HasChild(bottomL)) fail("rightie had rightie's child!");
-
- if (!SendCheck()) fail("couldn't kick off the child-side check");
-}
-
-mozilla::ipc::IPCResult TestMultiMgrsParent::RecvOK() {
- Close();
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-mozilla::ipc::IPCResult
-TestMultiMgrsLeftChild::RecvPTestMultiMgrsBottomConstructor(
- PTestMultiMgrsBottomChild* actor) {
- static_cast<TestMultiMgrsChild*>(Manager())->mBottomL = actor;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult
-TestMultiMgrsRightChild::RecvPTestMultiMgrsBottomConstructor(
- PTestMultiMgrsBottomChild* actor) {
- static_cast<TestMultiMgrsChild*>(Manager())->mBottomR = actor;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestMultiMgrsChild::RecvCheck() {
- if (1 != ManagedPTestMultiMgrsLeftChild().Count()) fail("where's leftie?");
- if (1 != ManagedPTestMultiMgrsRightChild().Count()) fail("where's rightie?");
-
- TestMultiMgrsLeftChild* leftie = static_cast<TestMultiMgrsLeftChild*>(
- LoneManagedOrNullAsserts(ManagedPTestMultiMgrsLeftChild()));
- TestMultiMgrsRightChild* rightie = static_cast<TestMultiMgrsRightChild*>(
- LoneManagedOrNullAsserts(ManagedPTestMultiMgrsRightChild()));
-
- if (!leftie->HasChild(mBottomL))
- fail("leftie didn't have a child it was supposed to!");
- if (leftie->HasChild(mBottomR)) fail("leftie had rightie's child!");
-
- if (!rightie->HasChild(mBottomR))
- fail("rightie didn't have a child it was supposed to!");
- if (rightie->HasChild(mBottomL)) fail("rightie had leftie's child!");
-
- if (!SendOK()) fail("couldn't send OK()");
-
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestMultiMgrs.h b/ipc/ipdl/test/cxx/TestMultiMgrs.h
deleted file mode 100644
index 71826d42a7..0000000000
--- a/ipc/ipdl/test/cxx/TestMultiMgrs.h
+++ /dev/null
@@ -1,222 +0,0 @@
-#ifndef mozilla__ipdltest_TestMultiMgrs_h
-#define mozilla__ipdltest_TestMultiMgrs_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestMultiMgrsParent.h"
-#include "mozilla/_ipdltest/PTestMultiMgrsChild.h"
-#include "mozilla/_ipdltest/PTestMultiMgrsBottomParent.h"
-#include "mozilla/_ipdltest/PTestMultiMgrsBottomChild.h"
-#include "mozilla/_ipdltest/PTestMultiMgrsLeftParent.h"
-#include "mozilla/_ipdltest/PTestMultiMgrsLeftChild.h"
-#include "mozilla/_ipdltest/PTestMultiMgrsRightParent.h"
-#include "mozilla/_ipdltest/PTestMultiMgrsRightChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// Parent side
-//
-
-class TestMultiMgrsBottomParent : public PTestMultiMgrsBottomParent {
- public:
- TestMultiMgrsBottomParent() {}
- virtual ~TestMultiMgrsBottomParent() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
-};
-
-class TestMultiMgrsLeftParent : public PTestMultiMgrsLeftParent {
- friend class PTestMultiMgrsLeftParent;
-
- public:
- TestMultiMgrsLeftParent() {}
- virtual ~TestMultiMgrsLeftParent() {}
-
- bool HasChild(TestMultiMgrsBottomParent* c) {
- return ManagedPTestMultiMgrsBottomParent().Contains(c);
- }
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
-
- PTestMultiMgrsBottomParent* AllocPTestMultiMgrsBottomParent() {
- return new TestMultiMgrsBottomParent();
- }
-
- bool DeallocPTestMultiMgrsBottomParent(PTestMultiMgrsBottomParent* actor) {
- delete actor;
- return true;
- }
-};
-
-class TestMultiMgrsRightParent : public PTestMultiMgrsRightParent {
- friend class PTestMultiMgrsRightParent;
-
- public:
- TestMultiMgrsRightParent() {}
- virtual ~TestMultiMgrsRightParent() {}
-
- bool HasChild(TestMultiMgrsBottomParent* c) {
- return ManagedPTestMultiMgrsBottomParent().Contains(c);
- }
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {}
-
- PTestMultiMgrsBottomParent* AllocPTestMultiMgrsBottomParent() {
- return new TestMultiMgrsBottomParent();
- }
-
- bool DeallocPTestMultiMgrsBottomParent(PTestMultiMgrsBottomParent* actor) {
- delete actor;
- return true;
- }
-};
-
-class TestMultiMgrsParent : public PTestMultiMgrsParent {
- friend class PTestMultiMgrsParent;
-
- public:
- TestMultiMgrsParent() {}
- virtual ~TestMultiMgrsParent() {}
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvOK();
-
- PTestMultiMgrsLeftParent* AllocPTestMultiMgrsLeftParent() {
- return new TestMultiMgrsLeftParent();
- }
-
- bool DeallocPTestMultiMgrsLeftParent(PTestMultiMgrsLeftParent* actor) {
- delete actor;
- return true;
- }
-
- PTestMultiMgrsRightParent* AllocPTestMultiMgrsRightParent() {
- return new TestMultiMgrsRightParent();
- }
-
- bool DeallocPTestMultiMgrsRightParent(PTestMultiMgrsRightParent* actor) {
- delete actor;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-//-----------------------------------------------------------------------------
-// Child side
-//
-
-class TestMultiMgrsBottomChild : public PTestMultiMgrsBottomChild {
- public:
- TestMultiMgrsBottomChild() {}
- virtual ~TestMultiMgrsBottomChild() {}
-};
-
-class TestMultiMgrsLeftChild : public PTestMultiMgrsLeftChild {
- friend class PTestMultiMgrsLeftChild;
-
- public:
- TestMultiMgrsLeftChild() {}
- virtual ~TestMultiMgrsLeftChild() {}
-
- bool HasChild(PTestMultiMgrsBottomChild* c) {
- return ManagedPTestMultiMgrsBottomChild().Contains(c);
- }
-
- protected:
- virtual mozilla::ipc::IPCResult RecvPTestMultiMgrsBottomConstructor(
- PTestMultiMgrsBottomChild* actor) override;
-
- PTestMultiMgrsBottomChild* AllocPTestMultiMgrsBottomChild() {
- return new TestMultiMgrsBottomChild();
- }
-
- bool DeallocPTestMultiMgrsBottomChild(PTestMultiMgrsBottomChild* actor) {
- delete actor;
- return true;
- }
-};
-
-class TestMultiMgrsRightChild : public PTestMultiMgrsRightChild {
- friend class PTestMultiMgrsRightChild;
-
- public:
- TestMultiMgrsRightChild() {}
- virtual ~TestMultiMgrsRightChild() {}
-
- bool HasChild(PTestMultiMgrsBottomChild* c) {
- return ManagedPTestMultiMgrsBottomChild().Contains(c);
- }
-
- protected:
- virtual mozilla::ipc::IPCResult RecvPTestMultiMgrsBottomConstructor(
- PTestMultiMgrsBottomChild* actor) override;
-
- PTestMultiMgrsBottomChild* AllocPTestMultiMgrsBottomChild() {
- return new TestMultiMgrsBottomChild();
- }
-
- bool DeallocPTestMultiMgrsBottomChild(PTestMultiMgrsBottomChild* actor) {
- delete actor;
- return true;
- }
-};
-
-class TestMultiMgrsChild : public PTestMultiMgrsChild {
- friend class PTestMultiMgrsChild;
-
- public:
- TestMultiMgrsChild() {}
- virtual ~TestMultiMgrsChild() {}
-
- void Main();
-
- PTestMultiMgrsBottomChild* mBottomL;
- PTestMultiMgrsBottomChild* mBottomR;
-
- protected:
- mozilla::ipc::IPCResult RecvCheck();
-
- PTestMultiMgrsLeftChild* AllocPTestMultiMgrsLeftChild() {
- return new TestMultiMgrsLeftChild();
- }
-
- bool DeallocPTestMultiMgrsLeftChild(PTestMultiMgrsLeftChild* actor) {
- delete actor;
- return true;
- }
-
- PTestMultiMgrsRightChild* AllocPTestMultiMgrsRightChild() {
- return new TestMultiMgrsRightChild();
- }
-
- bool DeallocPTestMultiMgrsRightChild(PTestMultiMgrsRightChild* actor) {
- delete actor;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestMultiMgrs_h
diff --git a/ipc/ipdl/test/cxx/TestNestedLoops.cpp b/ipc/ipdl/test/cxx/TestNestedLoops.cpp
deleted file mode 100644
index 3658d7dfb6..0000000000
--- a/ipc/ipdl/test/cxx/TestNestedLoops.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#include "base/basictypes.h"
-
-#include "nsThreadUtils.h"
-
-#include "TestNestedLoops.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestNestedLoopsParent::TestNestedLoopsParent() : mBreakNestedLoop(false) {
- MOZ_COUNT_CTOR(TestNestedLoopsParent);
-}
-
-TestNestedLoopsParent::~TestNestedLoopsParent() {
- MOZ_COUNT_DTOR(TestNestedLoopsParent);
-}
-
-void TestNestedLoopsParent::Main() {
- if (!SendStart()) fail("sending Start");
-
- // sigh ... spin for a while to let Nonce arrive
- puts(" (sleeping to wait for nonce ... sorry)");
- PR_Sleep(5000);
-
- // while waiting for the reply to R, we'll receive Nonce
- if (!CallR()) fail("calling R");
-
- Close();
-}
-
-mozilla::ipc::IPCResult TestNestedLoopsParent::RecvNonce() {
- // if we have an OnMaybeDequeueOne waiting for us (we may not, due
- // to the inherent race condition in this test, then this event
- // must be ordered after it in the queue
- MessageLoop::current()->PostTask(NewNonOwningRunnableMethod(
- "_ipdltest::TestNestedLoopsParent::BreakNestedLoop", this,
- &TestNestedLoopsParent::BreakNestedLoop));
-
- // sigh ... spin for a while to let the reply to R arrive
- puts(" (sleeping to wait for reply to R ... sorry)");
- PR_Sleep(5000);
-
- // sigh ... we have no idea when code might do this
- do {
- if (!NS_ProcessNextEvent(nullptr, false))
- fail("expected at least one pending event");
- } while (!mBreakNestedLoop);
-
- return IPC_OK();
-}
-
-void TestNestedLoopsParent::BreakNestedLoop() { mBreakNestedLoop = true; }
-
-//-----------------------------------------------------------------------------
-// child
-
-TestNestedLoopsChild::TestNestedLoopsChild() {
- MOZ_COUNT_CTOR(TestNestedLoopsChild);
-}
-
-TestNestedLoopsChild::~TestNestedLoopsChild() {
- MOZ_COUNT_DTOR(TestNestedLoopsChild);
-}
-
-mozilla::ipc::IPCResult TestNestedLoopsChild::RecvStart() {
- if (!SendNonce()) fail("sending Nonce");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestNestedLoopsChild::AnswerR() { return IPC_OK(); }
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestNestedLoops.h b/ipc/ipdl/test/cxx/TestNestedLoops.h
deleted file mode 100644
index 001b571494..0000000000
--- a/ipc/ipdl/test/cxx/TestNestedLoops.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef mozilla__ipdltest_TestNestedLoops_h
-#define mozilla__ipdltest_TestNestedLoops_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestNestedLoopsParent.h"
-#include "mozilla/_ipdltest/PTestNestedLoopsChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestNestedLoopsParent : public PTestNestedLoopsParent {
- friend class PTestNestedLoopsParent;
-
- public:
- TestNestedLoopsParent();
- virtual ~TestNestedLoopsParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvNonce();
-
- void BreakNestedLoop();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-
- bool mBreakNestedLoop;
-};
-
-class TestNestedLoopsChild : public PTestNestedLoopsChild {
- friend class PTestNestedLoopsChild;
-
- public:
- TestNestedLoopsChild();
- virtual ~TestNestedLoopsChild();
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- mozilla::ipc::IPCResult AnswerR();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestNestedLoops_h
diff --git a/ipc/ipdl/test/cxx/TestRPC.cpp b/ipc/ipdl/test/cxx/TestRPC.cpp
deleted file mode 100644
index cf7a1b6c36..0000000000
--- a/ipc/ipdl/test/cxx/TestRPC.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-#include "TestRPC.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-#if defined(XP_UNIX)
-# include <unistd.h>
-#else
-# include <windows.h>
-#endif
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestRPCParent::TestRPCParent()
- : reentered_(false), resolved_first_cpow_(false) {
- MOZ_COUNT_CTOR(TestRPCParent);
-}
-
-TestRPCParent::~TestRPCParent() { MOZ_COUNT_DTOR(TestRPCParent); }
-
-void TestRPCParent::Main() {
- if (!SendStart()) fail("sending Start");
-}
-
-mozilla::ipc::IPCResult TestRPCParent::RecvTest1_Start(uint32_t* aResult) {
- uint32_t result;
- if (!SendTest1_InnerQuery(&result)) fail("SendTest1_InnerQuery");
- if (result != 300) fail("Wrong result (expected 300)");
-
- *aResult = 100;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRPCParent::RecvTest1_InnerEvent(uint32_t* aResult) {
- uint32_t result;
- if (!SendTest1_NoReenter(&result)) fail("SendTest1_NoReenter");
- if (result != 400) fail("Wrong result (expected 400)");
-
- *aResult = 200;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRPCParent::RecvTest2_Start() {
- // Send a CPOW. During this time, we must NOT process the RPC message, as
- // we could start receiving CPOW replies out-of-order.
- if (!SendTest2_FirstUrgent()) fail("SendTest2_FirstUrgent");
-
- MOZ_ASSERT(!reentered_);
- resolved_first_cpow_ = true;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRPCParent::RecvTest2_OutOfOrder() {
- // Send a CPOW. If this RPC call was initiated while waiting for the first
- // CPOW to resolve, replies will be processed out of order, and we'll crash.
- if (!SendTest2_SecondUrgent()) fail("SendTest2_SecondUrgent");
-
- reentered_ = true;
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestRPCChild::TestRPCChild() { MOZ_COUNT_CTOR(TestRPCChild); }
-
-TestRPCChild::~TestRPCChild() { MOZ_COUNT_DTOR(TestRPCChild); }
-
-mozilla::ipc::IPCResult TestRPCChild::RecvStart() {
- uint32_t result;
- if (!SendTest1_Start(&result)) fail("SendTest1_Start");
- if (result != 100) fail("Wrong result (expected 100)");
-
- if (!SendTest2_Start()) fail("SendTest2_Start");
-
- if (!SendTest2_OutOfOrder()) fail("SendTest2_OutOfOrder");
-
- Close();
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRPCChild::RecvTest1_InnerQuery(uint32_t* aResult) {
- uint32_t result;
- if (!SendTest1_InnerEvent(&result)) fail("SendTest1_InnerEvent");
- if (result != 200) fail("Wrong result (expected 200)");
-
- *aResult = 300;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRPCChild::RecvTest1_NoReenter(uint32_t* aResult) {
- *aResult = 400;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRPCChild::RecvTest2_FirstUrgent() {
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRPCChild::RecvTest2_SecondUrgent() {
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestRPC.h b/ipc/ipdl/test/cxx/TestRPC.h
deleted file mode 100644
index 907d3fde36..0000000000
--- a/ipc/ipdl/test/cxx/TestRPC.h
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef mozilla__ipdltest_TestRPC_h
-#define mozilla__ipdltest_TestRPC_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestRPCParent.h"
-#include "mozilla/_ipdltest/PTestRPCChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestRPCParent : public PTestRPCParent {
- public:
- TestRPCParent();
- virtual ~TestRPCParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- mozilla::ipc::IPCResult RecvTest1_Start(uint32_t* aResult);
- mozilla::ipc::IPCResult RecvTest1_InnerEvent(uint32_t* aResult);
- mozilla::ipc::IPCResult RecvTest2_Start();
- mozilla::ipc::IPCResult RecvTest2_OutOfOrder();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- if (!reentered_) fail("never processed raced RPC call!");
- if (!resolved_first_cpow_) fail("never resolved first CPOW!");
- passed("ok");
- QuitParent();
- }
-
- private:
- bool reentered_;
- bool resolved_first_cpow_;
-};
-
-class TestRPCChild : public PTestRPCChild {
- public:
- TestRPCChild();
- virtual ~TestRPCChild();
-
- mozilla::ipc::IPCResult RecvStart();
- mozilla::ipc::IPCResult RecvTest1_InnerQuery(uint32_t* aResult);
- mozilla::ipc::IPCResult RecvTest1_NoReenter(uint32_t* aResult);
- mozilla::ipc::IPCResult RecvTest2_FirstUrgent();
- mozilla::ipc::IPCResult RecvTest2_SecondUrgent();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestRPC_h
diff --git a/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp b/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp
deleted file mode 100644
index 76defe97a5..0000000000
--- a/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#include "TestRaceDeadlock.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-// #define TEST_TIMEOUT 5000
-
-using namespace mozilla::ipc;
-typedef mozilla::ipc::MessageChannel::Message Message;
-typedef mozilla::ipc::MessageChannel::MessageInfo MessageInfo;
-
-namespace mozilla {
-namespace _ipdltest {
-
-static RacyInterruptPolicy MediateRace(const MessageInfo& parent,
- const MessageInfo& child) {
- return (PTestRaceDeadlock::Msg_Win__ID == parent.type()) ? RIPParentWins
- : RIPChildWins;
-}
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestRaceDeadlockParent::TestRaceDeadlockParent() {
- MOZ_COUNT_CTOR(TestRaceDeadlockParent);
-}
-
-TestRaceDeadlockParent::~TestRaceDeadlockParent() {
- MOZ_COUNT_DTOR(TestRaceDeadlockParent);
-}
-
-void TestRaceDeadlockParent::Main() {
- Test1();
-
- Close();
-}
-
-bool TestRaceDeadlockParent::ShouldContinueFromReplyTimeout() {
- fail("This test should not hang");
- GetIPCChannel()->CloseWithTimeout();
- return false;
-}
-
-void TestRaceDeadlockParent::Test1() {
-#if defined(TEST_TIMEOUT)
- SetReplyTimeoutMs(TEST_TIMEOUT);
-#endif
- if (!SendStartRace()) {
- fail("sending StartRace");
- }
- if (!CallRpc()) {
- fail("calling Rpc");
- }
-}
-
-mozilla::ipc::IPCResult TestRaceDeadlockParent::AnswerLose() {
- return IPC_OK();
-}
-
-RacyInterruptPolicy TestRaceDeadlockParent::MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) {
- return MediateRace(parent, child);
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestRaceDeadlockChild::TestRaceDeadlockChild() {
- MOZ_COUNT_CTOR(TestRaceDeadlockChild);
-}
-
-TestRaceDeadlockChild::~TestRaceDeadlockChild() {
- MOZ_COUNT_DTOR(TestRaceDeadlockChild);
-}
-
-mozilla::ipc::IPCResult TestRaceDeadlockParent::RecvStartRace() {
- if (!CallWin()) {
- fail("calling Win");
- }
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRaceDeadlockChild::RecvStartRace() {
- if (!SendStartRace()) {
- fail("calling SendStartRace");
- }
- if (!CallLose()) {
- fail("calling Lose");
- }
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRaceDeadlockChild::AnswerWin() { return IPC_OK(); }
-
-mozilla::ipc::IPCResult TestRaceDeadlockChild::AnswerRpc() { return IPC_OK(); }
-
-RacyInterruptPolicy TestRaceDeadlockChild::MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) {
- return MediateRace(parent, child);
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestRaceDeadlock.h b/ipc/ipdl/test/cxx/TestRaceDeadlock.h
deleted file mode 100644
index 2c5617130d..0000000000
--- a/ipc/ipdl/test/cxx/TestRaceDeadlock.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef mozilla__ipdltest_TestRaceDeadlock_h
-#define mozilla__ipdltest_TestRaceDeadlock_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestRaceDeadlockParent.h"
-#include "mozilla/_ipdltest/PTestRaceDeadlockChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestRaceDeadlockParent : public PTestRaceDeadlockParent {
- friend class PTestRaceDeadlockParent;
-
- public:
- TestRaceDeadlockParent();
- virtual ~TestRaceDeadlockParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- virtual bool ShouldContinueFromReplyTimeout() override;
-
- void Test1();
-
- mozilla::ipc::IPCResult RecvStartRace();
- mozilla::ipc::IPCResult AnswerLose();
-
- virtual mozilla::ipc::RacyInterruptPolicy MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) override;
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestRaceDeadlockChild : public PTestRaceDeadlockChild {
- friend class PTestRaceDeadlockChild;
-
- public:
- TestRaceDeadlockChild();
- virtual ~TestRaceDeadlockChild();
-
- protected:
- mozilla::ipc::IPCResult RecvStartRace();
-
- mozilla::ipc::IPCResult AnswerWin();
-
- mozilla::ipc::IPCResult AnswerRpc();
-
- virtual mozilla::ipc::RacyInterruptPolicy MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) override;
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestRaceDeadlock_h
diff --git a/ipc/ipdl/test/cxx/TestRaceDeferral.cpp b/ipc/ipdl/test/cxx/TestRaceDeferral.cpp
deleted file mode 100644
index c327b57c16..0000000000
--- a/ipc/ipdl/test/cxx/TestRaceDeferral.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#include "TestRaceDeferral.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-using namespace mozilla::ipc;
-typedef mozilla::ipc::MessageChannel::Message Message;
-typedef mozilla::ipc::MessageChannel::MessageInfo MessageInfo;
-
-namespace mozilla {
-namespace _ipdltest {
-
-static RacyInterruptPolicy MediateRace(const MessageInfo& parent,
- const MessageInfo& child) {
- return (PTestRaceDeferral::Msg_Win__ID == parent.type()) ? RIPParentWins
- : RIPChildWins;
-}
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestRaceDeferralParent::TestRaceDeferralParent() : mProcessedLose(false) {
- MOZ_COUNT_CTOR(TestRaceDeferralParent);
-}
-
-TestRaceDeferralParent::~TestRaceDeferralParent() {
- MOZ_COUNT_DTOR(TestRaceDeferralParent);
-
- if (!mProcessedLose) fail("never processed Lose");
-}
-
-void TestRaceDeferralParent::Main() {
- Test1();
-
- Close();
-}
-
-void TestRaceDeferralParent::Test1() {
- if (!SendStartRace()) fail("sending StartRace");
-
- if (!CallWin()) fail("calling Win");
- if (mProcessedLose) fail("Lose didn't lose");
-
- if (!CallRpc()) fail("calling Rpc");
- if (!mProcessedLose) fail("didn't resolve Rpc vs. Lose 'race' correctly");
-}
-
-mozilla::ipc::IPCResult TestRaceDeferralParent::AnswerLose() {
- if (mProcessedLose) fail("processed Lose twice");
- mProcessedLose = true;
- return IPC_OK();
-}
-
-RacyInterruptPolicy TestRaceDeferralParent::MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) {
- return MediateRace(parent, child);
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestRaceDeferralChild::TestRaceDeferralChild() {
- MOZ_COUNT_CTOR(TestRaceDeferralChild);
-}
-
-TestRaceDeferralChild::~TestRaceDeferralChild() {
- MOZ_COUNT_DTOR(TestRaceDeferralChild);
-}
-
-mozilla::ipc::IPCResult TestRaceDeferralChild::RecvStartRace() {
- if (!CallLose()) fail("calling Lose");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRaceDeferralChild::AnswerWin() { return IPC_OK(); }
-
-mozilla::ipc::IPCResult TestRaceDeferralChild::AnswerRpc() { return IPC_OK(); }
-
-RacyInterruptPolicy TestRaceDeferralChild::MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) {
- return MediateRace(parent, child);
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestRaceDeferral.h b/ipc/ipdl/test/cxx/TestRaceDeferral.h
deleted file mode 100644
index b30264fb64..0000000000
--- a/ipc/ipdl/test/cxx/TestRaceDeferral.h
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef mozilla__ipdltest_TestRaceDeferral_h
-#define mozilla__ipdltest_TestRaceDeferral_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestRaceDeferralParent.h"
-#include "mozilla/_ipdltest/PTestRaceDeferralChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestRaceDeferralParent : public PTestRaceDeferralParent {
- friend class PTestRaceDeferralParent;
-
- public:
- TestRaceDeferralParent();
- virtual ~TestRaceDeferralParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- void Test1();
-
- mozilla::ipc::IPCResult AnswerLose();
-
- virtual mozilla::ipc::RacyInterruptPolicy MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) override;
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-
- bool mProcessedLose;
-};
-
-class TestRaceDeferralChild : public PTestRaceDeferralChild {
- friend class PTestRaceDeferralChild;
-
- public:
- TestRaceDeferralChild();
- virtual ~TestRaceDeferralChild();
-
- protected:
- mozilla::ipc::IPCResult RecvStartRace();
-
- mozilla::ipc::IPCResult AnswerWin();
-
- mozilla::ipc::IPCResult AnswerRpc();
-
- virtual mozilla::ipc::RacyInterruptPolicy MediateInterruptRace(
- const MessageInfo& parent, const MessageInfo& child) override;
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestRaceDeferral_h
diff --git a/ipc/ipdl/test/cxx/TestRacyInterruptReplies.cpp b/ipc/ipdl/test/cxx/TestRacyInterruptReplies.cpp
deleted file mode 100644
index cda950b1a1..0000000000
--- a/ipc/ipdl/test/cxx/TestRacyInterruptReplies.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#include "TestRacyInterruptReplies.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestRacyInterruptRepliesParent::TestRacyInterruptRepliesParent()
- : mReplyNum(0) {
- MOZ_COUNT_CTOR(TestRacyInterruptRepliesParent);
-}
-
-TestRacyInterruptRepliesParent::~TestRacyInterruptRepliesParent() {
- MOZ_COUNT_DTOR(TestRacyInterruptRepliesParent);
-}
-
-void TestRacyInterruptRepliesParent::Main() {
- int replyNum = -1;
- if (!CallR_(&replyNum)) fail("calling R()");
-
- if (1 != replyNum) fail("this should have been the first reply to R()");
-
- if (!SendChildTest()) fail("sending ChildStart");
-}
-
-mozilla::ipc::IPCResult TestRacyInterruptRepliesParent::RecvA_() {
- int replyNum = -1;
- // this R() call races with the reply being generated by the other
- // side to the R() call from Main(). This is a pretty nasty edge
- // case for which one could argue we're breaking in-order message
- // delivery, since this side will process the second reply to R()
- // before the first.
- if (!CallR_(&replyNum)) fail("calling R()");
-
- if (2 != replyNum) fail("this should have been the second reply to R()");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyInterruptRepliesParent::Answer_R(
- int* replyNum) {
- *replyNum = ++mReplyNum;
-
- if (1 == *replyNum)
- if (!Send_A()) fail("sending _A()");
-
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestRacyInterruptRepliesChild::TestRacyInterruptRepliesChild() : mReplyNum(0) {
- MOZ_COUNT_CTOR(TestRacyInterruptRepliesChild);
-}
-
-TestRacyInterruptRepliesChild::~TestRacyInterruptRepliesChild() {
- MOZ_COUNT_DTOR(TestRacyInterruptRepliesChild);
-}
-
-mozilla::ipc::IPCResult TestRacyInterruptRepliesChild::AnswerR_(int* replyNum) {
- *replyNum = ++mReplyNum;
-
- if (1 == *replyNum) SendA_();
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyInterruptRepliesChild::RecvChildTest() {
- int replyNum = -1;
- if (!Call_R(&replyNum)) fail("calling R()");
-
- if (1 != replyNum) fail("this should have been the first reply to R()");
-
- Close();
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyInterruptRepliesChild::Recv_A() {
- int replyNum = -1;
-
- if (!Call_R(&replyNum)) fail("calling _R()");
-
- if (2 != replyNum) fail("this should have been the second reply to R()");
-
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestRacyInterruptReplies.h b/ipc/ipdl/test/cxx/TestRacyInterruptReplies.h
deleted file mode 100644
index 182c07f314..0000000000
--- a/ipc/ipdl/test/cxx/TestRacyInterruptReplies.h
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef mozilla__ipdltest_TestRacyInterruptReplies_h
-#define mozilla__ipdltest_TestRacyInterruptReplies_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestRacyInterruptRepliesParent.h"
-#include "mozilla/_ipdltest/PTestRacyInterruptRepliesChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestRacyInterruptRepliesParent : public PTestRacyInterruptRepliesParent {
- friend class PTestRacyInterruptRepliesParent;
-
- public:
- TestRacyInterruptRepliesParent();
- virtual ~TestRacyInterruptRepliesParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvA_();
-
- mozilla::ipc::IPCResult Answer_R(int* replyNum);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-
- private:
- int mReplyNum;
-};
-
-class TestRacyInterruptRepliesChild : public PTestRacyInterruptRepliesChild {
- friend class PTestRacyInterruptRepliesChild;
-
- public:
- TestRacyInterruptRepliesChild();
- virtual ~TestRacyInterruptRepliesChild();
-
- protected:
- mozilla::ipc::IPCResult AnswerR_(int* replyNum);
-
- mozilla::ipc::IPCResult RecvChildTest();
-
- mozilla::ipc::IPCResult Recv_A();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-
- private:
- int mReplyNum;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestRacyInterruptReplies_h
diff --git a/ipc/ipdl/test/cxx/TestRacyReentry.cpp b/ipc/ipdl/test/cxx/TestRacyReentry.cpp
deleted file mode 100644
index 4224018e11..0000000000
--- a/ipc/ipdl/test/cxx/TestRacyReentry.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#include "TestRacyReentry.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestRacyReentryParent::TestRacyReentryParent() : mRecvdE(false) {
- MOZ_COUNT_CTOR(TestRacyReentryParent);
-}
-
-TestRacyReentryParent::~TestRacyReentryParent() {
- MOZ_COUNT_DTOR(TestRacyReentryParent);
-}
-
-void TestRacyReentryParent::Main() {
- if (!SendStart()) fail("sending Start");
-
- if (!SendN()) fail("sending N");
-}
-
-mozilla::ipc::IPCResult TestRacyReentryParent::AnswerE() {
- if (!mRecvdE) {
- mRecvdE = true;
- return IPC_OK();
- }
-
- if (!CallH()) fail("calling H");
-
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestRacyReentryChild::TestRacyReentryChild() {
- MOZ_COUNT_CTOR(TestRacyReentryChild);
-}
-
-TestRacyReentryChild::~TestRacyReentryChild() {
- MOZ_COUNT_DTOR(TestRacyReentryChild);
-}
-
-mozilla::ipc::IPCResult TestRacyReentryChild::RecvStart() {
- if (!CallE()) fail("calling E");
-
- Close();
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyReentryChild::RecvN() {
- if (!CallE()) fail("calling E");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyReentryChild::AnswerH() { return IPC_OK(); }
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestRacyReentry.h b/ipc/ipdl/test/cxx/TestRacyReentry.h
deleted file mode 100644
index e31f90c0e3..0000000000
--- a/ipc/ipdl/test/cxx/TestRacyReentry.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef mozilla__ipdltest_TestRacyReentry_h
-#define mozilla__ipdltest_TestRacyReentry_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestRacyReentryParent.h"
-#include "mozilla/_ipdltest/PTestRacyReentryChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestRacyReentryParent : public PTestRacyReentryParent {
- friend class PTestRacyReentryParent;
-
- public:
- TestRacyReentryParent();
- virtual ~TestRacyReentryParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult AnswerE();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-
- bool mRecvdE;
-};
-
-class TestRacyReentryChild : public PTestRacyReentryChild {
- friend class PTestRacyReentryChild;
-
- public:
- TestRacyReentryChild();
- virtual ~TestRacyReentryChild();
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- mozilla::ipc::IPCResult RecvN();
-
- mozilla::ipc::IPCResult AnswerH();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestRacyReentry_h
diff --git a/ipc/ipdl/test/cxx/TestRacyUndefer.cpp b/ipc/ipdl/test/cxx/TestRacyUndefer.cpp
deleted file mode 100644
index a46db5618e..0000000000
--- a/ipc/ipdl/test/cxx/TestRacyUndefer.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#include "base/basictypes.h"
-
-#include "TestRacyUndefer.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestRacyUndeferParent::TestRacyUndeferParent() {
- MOZ_COUNT_CTOR(TestRacyUndeferParent);
-}
-
-TestRacyUndeferParent::~TestRacyUndeferParent() {
- MOZ_COUNT_DTOR(TestRacyUndeferParent);
-}
-
-void TestRacyUndeferParent::Main() {
- if (!SendStart()) fail("sending Start");
-}
-
-mozilla::ipc::IPCResult TestRacyUndeferParent::AnswerSpam() {
- static bool spammed = false;
- static bool raced = false;
- if (!spammed) {
- spammed = true;
-
- if (!SendAwakenSpam()) fail("sending AwakenSpam");
- } else if (!raced) {
- raced = true;
-
- if (!SendAwakenRaceWinTwice()) fail("sending WinRaceTwice");
-
- if (!CallRace()) fail("calling Race1");
- }
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyUndeferParent::AnswerRaceWinTwice() {
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyUndeferParent::RecvDone() {
- Close();
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestRacyUndeferChild::TestRacyUndeferChild() {
- MOZ_COUNT_CTOR(TestRacyUndeferChild);
-}
-
-TestRacyUndeferChild::~TestRacyUndeferChild() {
- MOZ_COUNT_DTOR(TestRacyUndeferChild);
-}
-
-mozilla::ipc::IPCResult TestRacyUndeferChild::RecvStart() {
- if (!CallSpam()) fail("calling Spam");
-
- if (!SendDone()) fail("sending Done");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyUndeferChild::RecvAwakenSpam() {
- if (!CallSpam()) fail("calling Spam");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyUndeferChild::RecvAwakenRaceWinTwice() {
- if (!CallRaceWinTwice()) fail("calling RaceWinTwice");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestRacyUndeferChild::AnswerRace() { return IPC_OK(); }
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestRacyUndefer.h b/ipc/ipdl/test/cxx/TestRacyUndefer.h
deleted file mode 100644
index 1e157a541b..0000000000
--- a/ipc/ipdl/test/cxx/TestRacyUndefer.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef mozilla__ipdltest_TestRacyUndefer_h
-#define mozilla__ipdltest_TestRacyUndefer_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestRacyUndeferParent.h"
-#include "mozilla/_ipdltest/PTestRacyUndeferChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestRacyUndeferParent : public PTestRacyUndeferParent {
- friend class PTestRacyUndeferParent;
-
- public:
- TestRacyUndeferParent();
- virtual ~TestRacyUndeferParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult AnswerSpam();
-
- mozilla::ipc::IPCResult AnswerRaceWinTwice();
-
- mozilla::ipc::IPCResult RecvDone();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestRacyUndeferChild : public PTestRacyUndeferChild {
- friend class PTestRacyUndeferChild;
-
- public:
- TestRacyUndeferChild();
- virtual ~TestRacyUndeferChild();
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- mozilla::ipc::IPCResult RecvAwakenSpam();
- mozilla::ipc::IPCResult RecvAwakenRaceWinTwice();
-
- mozilla::ipc::IPCResult AnswerRace();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestRacyUndefer_h
diff --git a/ipc/ipdl/test/cxx/TestSanity.cpp b/ipc/ipdl/test/cxx/TestSanity.cpp
deleted file mode 100644
index ba1920fdcc..0000000000
--- a/ipc/ipdl/test/cxx/TestSanity.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "TestSanity.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestSanityParent::TestSanityParent() { MOZ_COUNT_CTOR(TestSanityParent); }
-
-TestSanityParent::~TestSanityParent() { MOZ_COUNT_DTOR(TestSanityParent); }
-
-void TestSanityParent::Main() {
- if (!SendPing(0, 0.5f, 0)) fail("sending Ping");
-}
-
-mozilla::ipc::IPCResult TestSanityParent::RecvPong(const int& one,
- const float& zeroPtTwoFive,
- const uint8_t& /*unused*/) {
- if (1 != one) fail("invalid argument `%d', should have been `1'", one);
-
- if (0.25f != zeroPtTwoFive)
- fail("invalid argument `%g', should have been `0.25'", zeroPtTwoFive);
-
- Close();
-
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestSanityChild::TestSanityChild() { MOZ_COUNT_CTOR(TestSanityChild); }
-
-TestSanityChild::~TestSanityChild() { MOZ_COUNT_DTOR(TestSanityChild); }
-
-mozilla::ipc::IPCResult TestSanityChild::RecvPing(const int& zero,
- const float& zeroPtFive,
- const int8_t& /*unused*/) {
- if (0 != zero) fail("invalid argument `%d', should have been `0'", zero);
-
- if (0.5f != zeroPtFive)
- fail("invalid argument `%g', should have been `0.5'", zeroPtFive);
-
- if (!SendPong(1, 0.25f, 0)) fail("sending Pong");
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestSanity.h b/ipc/ipdl/test/cxx/TestSanity.h
deleted file mode 100644
index ca29d67672..0000000000
--- a/ipc/ipdl/test/cxx/TestSanity.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef mozilla__ipdltest_TestSanity_h
-#define mozilla__ipdltest_TestSanity_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestSanityParent.h"
-#include "mozilla/_ipdltest/PTestSanityChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestSanityParent : public PTestSanityParent {
- friend class PTestSanityParent;
-
- public:
- TestSanityParent();
- virtual ~TestSanityParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvPong(const int& one, const float& zeroPtTwoFive,
- const uint8_t& dummy);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestSanityChild : public PTestSanityChild {
- friend class PTestSanityChild;
-
- public:
- TestSanityChild();
- virtual ~TestSanityChild();
-
- protected:
- mozilla::ipc::IPCResult RecvPing(const int& zero, const float& zeroPtFive,
- const int8_t& dummy);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestSanity_h
diff --git a/ipc/ipdl/test/cxx/TestSelfManageRoot.cpp b/ipc/ipdl/test/cxx/TestSelfManageRoot.cpp
deleted file mode 100644
index 5e09aa4d7e..0000000000
--- a/ipc/ipdl/test/cxx/TestSelfManageRoot.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "TestSelfManageRoot.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-#define ASSERT(c) \
- do { \
- if (!(c)) fail(#c); \
- } while (0)
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-void TestSelfManageRootParent::Main() {
- TestSelfManageParent* a =
- static_cast<TestSelfManageParent*>(SendPTestSelfManageConstructor());
- if (!a) fail("constructing PTestSelfManage");
-
- ASSERT(1 == ManagedPTestSelfManageParent().Count());
-
- TestSelfManageParent* aa =
- static_cast<TestSelfManageParent*>(a->SendPTestSelfManageConstructor());
- if (!aa) fail("constructing PTestSelfManage");
-
- ASSERT(1 == ManagedPTestSelfManageParent().Count() &&
- 1 == a->ManagedPTestSelfManageParent().Count());
-
- if (!PTestSelfManageParent::Send__delete__(aa))
- fail("destroying PTestSelfManage");
- ASSERT(Deletion == aa->mWhy && 1 == ManagedPTestSelfManageParent().Count() &&
- 0 == a->ManagedPTestSelfManageParent().Count());
- delete aa;
-
- aa = static_cast<TestSelfManageParent*>(a->SendPTestSelfManageConstructor());
- if (!aa) fail("constructing PTestSelfManage");
-
- ASSERT(1 == ManagedPTestSelfManageParent().Count() &&
- 1 == a->ManagedPTestSelfManageParent().Count());
-
- if (!PTestSelfManageParent::Send__delete__(a))
- fail("destroying PTestSelfManage");
- ASSERT(Deletion == a->mWhy && AncestorDeletion == aa->mWhy &&
- 0 == ManagedPTestSelfManageParent().Count() &&
- 0 == a->ManagedPTestSelfManageParent().Count());
- delete a;
- delete aa;
-
- Close();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestSelfManageRoot.h b/ipc/ipdl/test/cxx/TestSelfManageRoot.h
deleted file mode 100644
index 5cea09b10d..0000000000
--- a/ipc/ipdl/test/cxx/TestSelfManageRoot.h
+++ /dev/null
@@ -1,117 +0,0 @@
-#ifndef mozilla__ipdltest_TestSelfManageRoot_h
-#define mozilla__ipdltest_TestSelfManageRoot_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestSelfManageRootParent.h"
-#include "mozilla/_ipdltest/PTestSelfManageRootChild.h"
-#include "mozilla/_ipdltest/PTestSelfManageParent.h"
-#include "mozilla/_ipdltest/PTestSelfManageChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// Parent side
-
-class TestSelfManageParent : public PTestSelfManageParent {
- friend class PTestSelfManageParent;
-
- public:
- MOZ_COUNTED_DEFAULT_CTOR(TestSelfManageParent)
- MOZ_COUNTED_DTOR_OVERRIDE(TestSelfManageParent)
-
- ActorDestroyReason mWhy;
-
- protected:
- PTestSelfManageParent* AllocPTestSelfManageParent() {
- return new TestSelfManageParent();
- }
-
- bool DeallocPTestSelfManageParent(PTestSelfManageParent* a) { return true; }
-
- virtual void ActorDestroy(ActorDestroyReason why) override { mWhy = why; }
-};
-
-class TestSelfManageRootParent : public PTestSelfManageRootParent {
- friend class PTestSelfManageRootParent;
-
- public:
- MOZ_COUNTED_DEFAULT_CTOR(TestSelfManageRootParent)
- virtual ~TestSelfManageRootParent() {
- MOZ_COUNT_DTOR(TestSelfManageRootParent);
- }
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- PTestSelfManageParent* AllocPTestSelfManageParent() {
- return new TestSelfManageParent();
- }
-
- bool DeallocPTestSelfManageParent(PTestSelfManageParent* a) { return true; }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-//-----------------------------------------------------------------------------
-// Child side
-
-class TestSelfManageChild : public PTestSelfManageChild {
- friend class PTestSelfManageChild;
-
- public:
- MOZ_COUNTED_DEFAULT_CTOR(TestSelfManageChild)
- MOZ_COUNTED_DTOR_OVERRIDE(TestSelfManageChild)
-
- protected:
- PTestSelfManageChild* AllocPTestSelfManageChild() {
- return new TestSelfManageChild();
- }
-
- bool DeallocPTestSelfManageChild(PTestSelfManageChild* a) {
- delete a;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {}
-};
-
-class TestSelfManageRootChild : public PTestSelfManageRootChild {
- friend class PTestSelfManageRootChild;
-
- public:
- MOZ_COUNTED_DEFAULT_CTOR(TestSelfManageRootChild)
- virtual ~TestSelfManageRootChild() {
- MOZ_COUNT_DTOR(TestSelfManageRootChild);
- }
-
- void Main();
-
- protected:
- PTestSelfManageChild* AllocPTestSelfManageChild() {
- return new TestSelfManageChild();
- }
-
- bool DeallocPTestSelfManageChild(PTestSelfManageChild* a) {
- delete a;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestSelfManageRoot_h
diff --git a/ipc/ipdl/test/cxx/TestShmem.cpp b/ipc/ipdl/test/cxx/TestShmem.cpp
deleted file mode 100644
index 0a778e5322..0000000000
--- a/ipc/ipdl/test/cxx/TestShmem.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-#include "TestShmem.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// Parent
-
-void TestShmemParent::Main() {
- Shmem mem;
- Shmem unsafe;
-
- size_t size = 12345;
- if (!AllocShmem(size, &mem)) fail("can't alloc shmem");
- if (!AllocUnsafeShmem(size, &unsafe)) fail("can't alloc shmem");
-
- if (mem.Size<char>() != size)
- fail("shmem is wrong size: expected %lu, got %lu", size, mem.Size<char>());
- if (unsafe.Size<char>() != size)
- fail("shmem is wrong size: expected %lu, got %lu", size,
- unsafe.Size<char>());
-
- char* ptr = mem.get<char>();
- memcpy(ptr, "Hello!", sizeof("Hello!"));
-
- char* unsafeptr = unsafe.get<char>();
- memcpy(unsafeptr, "Hello!", sizeof("Hello!"));
-
- Shmem unsafecopy = unsafe;
- if (!SendGive(std::move(mem), std::move(unsafe), size))
- fail("can't send Give()");
-
- // uncomment the following line for a (nondeterministic) surprise!
- // char c1 = *ptr; (void)c1;
-
- // uncomment the following line for a deterministic surprise!
- // char c2 = *mem.get<char>(); (void)c2;
-
- // unsafe shmem gets rid of those checks
- char uc1 = *unsafeptr;
- (void)uc1;
- char uc2 = *unsafecopy.get<char>();
- (void)uc2;
-}
-
-mozilla::ipc::IPCResult TestShmemParent::RecvTake(Shmem&& mem, Shmem&& unsafe,
- const size_t& expectedSize) {
- if (mem.Size<char>() != expectedSize)
- fail("expected shmem size %lu, but it has size %lu", expectedSize,
- mem.Size<char>());
- if (unsafe.Size<char>() != expectedSize)
- fail("expected shmem size %lu, but it has size %lu", expectedSize,
- unsafe.Size<char>());
-
- if (strcmp(mem.get<char>(), "And yourself!"))
- fail("expected message was not written");
- if (strcmp(unsafe.get<char>(), "And yourself!"))
- fail("expected message was not written");
-
- if (!DeallocShmem(mem)) fail("DeallocShmem");
- if (!DeallocShmem(unsafe)) fail("DeallocShmem");
-
- Close();
-
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// Child
-
-mozilla::ipc::IPCResult TestShmemChild::RecvGive(Shmem&& mem, Shmem&& unsafe,
- const size_t& expectedSize) {
- if (mem.Size<char>() != expectedSize)
- fail("expected shmem size %lu, but it has size %lu", expectedSize,
- mem.Size<char>());
- if (unsafe.Size<char>() != expectedSize)
- fail("expected shmem size %lu, but it has size %lu", expectedSize,
- unsafe.Size<char>());
-
- if (strcmp(mem.get<char>(), "Hello!"))
- fail("expected message was not written");
- if (strcmp(unsafe.get<char>(), "Hello!"))
- fail("expected message was not written");
-
- char* unsafeptr = unsafe.get<char>();
-
- memcpy(mem.get<char>(), "And yourself!", sizeof("And yourself!"));
- memcpy(unsafeptr, "And yourself!", sizeof("And yourself!"));
-
- Shmem unsafecopy = unsafe;
- if (!SendTake(std::move(mem), std::move(unsafe), expectedSize))
- fail("can't send Take()");
-
- // these checks also shouldn't fail in the child
- char uc1 = *unsafeptr;
- (void)uc1;
- char uc2 = *unsafecopy.get<char>();
- (void)uc2;
-
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestShmem.h b/ipc/ipdl/test/cxx/TestShmem.h
deleted file mode 100644
index 4ef1f4fd7b..0000000000
--- a/ipc/ipdl/test/cxx/TestShmem.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef mozilla__ipdltest_TestShmem_h
-#define mozilla__ipdltest_TestShmem_h
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestShmemParent.h"
-#include "mozilla/_ipdltest/PTestShmemChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestShmemParent : public PTestShmemParent {
- friend class PTestShmemParent;
-
- public:
- TestShmemParent() {}
- virtual ~TestShmemParent() {}
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvTake(Shmem&& mem, Shmem&& unsafe,
- const size_t& expectedSize);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestShmemChild : public PTestShmemChild {
- friend class PTestShmemChild;
-
- public:
- TestShmemChild() {}
- virtual ~TestShmemChild() {}
-
- protected:
- mozilla::ipc::IPCResult RecvGive(Shmem&& mem, Shmem&& unsafe,
- const size_t& expectedSize);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestShmem_h
diff --git a/ipc/ipdl/test/cxx/TestShutdown.cpp b/ipc/ipdl/test/cxx/TestShutdown.cpp
deleted file mode 100644
index 502695bd88..0000000000
--- a/ipc/ipdl/test/cxx/TestShutdown.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-#include "TestShutdown.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// Parent side
-void TestShutdownParent::Main() {
- if (!SendStart()) fail("sending Start()");
-}
-
-void TestShutdownParent::ActorDestroy(ActorDestroyReason why) {
- if (AbnormalShutdown != why) fail("should have ended test with crash!");
-
- passed("ok");
-
- QuitParent();
-}
-
-void TestShutdownSubParent::ActorDestroy(ActorDestroyReason why) {
- if (Manager()->ManagedPTestShutdownSubParent().Count() == 0)
- fail("manager should still have managees!");
-
- if (mExpectCrash && AbnormalShutdown != why)
- fail("expected crash!");
- else if (!mExpectCrash && AbnormalShutdown == why)
- fail("wasn't expecting crash!");
-
- if (mExpectCrash && 0 == ManagedPTestShutdownSubsubParent().Count())
- fail("expected to *still* have kids");
-}
-
-void TestShutdownSubsubParent::ActorDestroy(ActorDestroyReason why) {
- if (Manager()->ManagedPTestShutdownSubsubParent().Count() == 0)
- fail("manager should still have managees!");
-
- if (mExpectParentDeleted && AncestorDeletion != why)
- fail("expected ParentDeleted == why");
- else if (!mExpectParentDeleted && AncestorDeletion == why)
- fail("wasn't expecting parent delete");
-}
-
-//-----------------------------------------------------------------------------
-// Child side
-
-mozilla::ipc::IPCResult TestShutdownChild::RecvStart() {
- // test 1: alloc some actors and subactors, delete in
- // managee-before-manager order
- {
- bool expectCrash = false, expectParentDeleted = false;
-
- PTestShutdownSubChild* c1 = SendPTestShutdownSubConstructor(expectCrash);
- if (!c1) fail("problem sending ctor");
-
- PTestShutdownSubChild* c2 = SendPTestShutdownSubConstructor(expectCrash);
- if (!c2) fail("problem sending ctor");
-
- PTestShutdownSubsubChild* c1s1 =
- c1->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c1s1) fail("problem sending ctor");
- PTestShutdownSubsubChild* c1s2 =
- c1->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c1s2) fail("problem sending ctor");
-
- PTestShutdownSubsubChild* c2s1 =
- c2->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c2s1) fail("problem sending ctor");
- PTestShutdownSubsubChild* c2s2 =
- c2->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c2s2) fail("problem sending ctor");
-
- if (!PTestShutdownSubsubChild::Send__delete__(c1s1))
- fail("problem sending dtor");
- if (!PTestShutdownSubsubChild::Send__delete__(c1s2))
- fail("problem sending dtor");
- if (!PTestShutdownSubsubChild::Send__delete__(c2s1))
- fail("problem sending dtor");
- if (!PTestShutdownSubsubChild::Send__delete__(c2s2))
- fail("problem sending dtor");
-
- if (!c1->CallStackFrame()) fail("problem creating dummy stack frame");
- if (!c2->CallStackFrame()) fail("problem creating dummy stack frame");
- }
-
- // test 2: alloc some actors and subactors, delete managers first
- {
- bool expectCrash = false, expectParentDeleted = true;
-
- PTestShutdownSubChild* c1 = SendPTestShutdownSubConstructor(expectCrash);
- if (!c1) fail("problem sending ctor");
-
- PTestShutdownSubChild* c2 = SendPTestShutdownSubConstructor(expectCrash);
- if (!c2) fail("problem sending ctor");
-
- PTestShutdownSubsubChild* c1s1 =
- c1->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c1s1) fail("problem sending ctor");
- PTestShutdownSubsubChild* c1s2 =
- c1->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c1s2) fail("problem sending ctor");
-
- PTestShutdownSubsubChild* c2s1 =
- c2->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c2s1) fail("problem sending ctor");
- PTestShutdownSubsubChild* c2s2 =
- c2->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c2s2) fail("problem sending ctor");
-
- // delete parents without deleting kids
- if (!c1->CallStackFrame()) fail("problem creating dummy stack frame");
- if (!c2->CallStackFrame()) fail("problem creating dummy stack frame");
- }
-
- // test 3: alloc some actors and subactors, then crash
- {
- bool expectCrash = true, expectParentDeleted = false;
-
- PTestShutdownSubChild* c1 = SendPTestShutdownSubConstructor(expectCrash);
- if (!c1) fail("problem sending ctor");
-
- PTestShutdownSubChild* c2 = SendPTestShutdownSubConstructor(expectCrash);
- if (!c2) fail("problem sending ctor");
-
- PTestShutdownSubsubChild* c1s1 =
- c1->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c1s1) fail("problem sending ctor");
- PTestShutdownSubsubChild* c1s2 =
- c1->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c1s2) fail("problem sending ctor");
-
- PTestShutdownSubsubChild* c2s1 =
- c2->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c2s1) fail("problem sending ctor");
- PTestShutdownSubsubChild* c2s2 =
- c2->SendPTestShutdownSubsubConstructor(expectParentDeleted);
- if (!c2s2) fail("problem sending ctor");
-
- // make sure the ctors have been processed by the other side;
- // the write end of the socket may temporarily be unwriteable
- if (!SendSync()) fail("can't synchronize with parent");
-
- // "crash", but without tripping tinderbox assert/abort
- // detectors
- _exit(0);
- }
-}
-
-void TestShutdownChild::ActorDestroy(ActorDestroyReason why) {
- fail("hey wait ... we should have crashed!");
-}
-
-mozilla::ipc::IPCResult TestShutdownSubChild::AnswerStackFrame() {
- if (!PTestShutdownSubChild::Send__delete__(this))
- fail("problem sending dtor");
-
- // WATCH OUT! |this| has just deleted
-
- return IPC_OK();
-}
-
-void TestShutdownSubChild::ActorDestroy(ActorDestroyReason why) {
- if (Manager()->ManagedPTestShutdownSubChild().Count() == 0)
- fail("manager should still have managees!");
-
- if (mExpectCrash && AbnormalShutdown != why)
- fail("expected crash!");
- else if (!mExpectCrash && AbnormalShutdown == why)
- fail("wasn't expecting crash!");
-
- if (mExpectCrash && 0 == ManagedPTestShutdownSubsubChild().Count())
- fail("expected to *still* have kids");
-}
-
-void TestShutdownSubsubChild::ActorDestroy(ActorDestroyReason why) {
- if (Manager()->ManagedPTestShutdownSubsubChild().Count() == 0)
- fail("manager should still have managees!");
-
- if (mExpectParentDeleted && AncestorDeletion != why)
- fail("expected ParentDeleted == why");
- else if (!mExpectParentDeleted && AncestorDeletion == why)
- fail("wasn't expecting parent delete");
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestShutdown.h b/ipc/ipdl/test/cxx/TestShutdown.h
deleted file mode 100644
index 224e42496d..0000000000
--- a/ipc/ipdl/test/cxx/TestShutdown.h
+++ /dev/null
@@ -1,168 +0,0 @@
-#ifndef mozilla__ipdltest_TestShutdown_h
-#define mozilla__ipdltest_TestShutdown_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestShutdownParent.h"
-#include "mozilla/_ipdltest/PTestShutdownChild.h"
-
-#include "mozilla/_ipdltest/PTestShutdownSubParent.h"
-#include "mozilla/_ipdltest/PTestShutdownSubChild.h"
-
-#include "mozilla/_ipdltest/PTestShutdownSubsubParent.h"
-#include "mozilla/_ipdltest/PTestShutdownSubsubChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// Parent side
-
-class TestShutdownSubsubParent : public PTestShutdownSubsubParent {
- public:
- explicit TestShutdownSubsubParent(bool expectParentDeleted)
- : mExpectParentDeleted(expectParentDeleted) {}
-
- virtual ~TestShutdownSubsubParent() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override;
-
- private:
- bool mExpectParentDeleted;
-};
-
-class TestShutdownSubParent : public PTestShutdownSubParent {
- friend class PTestShutdownSubParent;
-
- public:
- explicit TestShutdownSubParent(bool expectCrash)
- : mExpectCrash(expectCrash), mDeletedCount(0) {}
-
- virtual ~TestShutdownSubParent() {
- if (2 != mDeletedCount) fail("managees outliving manager!");
- }
-
- protected:
- mozilla::ipc::IPCResult AnswerStackFrame() {
- if (!CallStackFrame()) {
- return IPC_FAIL_NO_REASON(this);
- }
- return IPC_OK();
- }
-
- PTestShutdownSubsubParent* AllocPTestShutdownSubsubParent(
- const bool& expectParentDelete) {
- return new TestShutdownSubsubParent(expectParentDelete);
- }
-
- bool DeallocPTestShutdownSubsubParent(PTestShutdownSubsubParent* actor) {
- delete actor;
- ++mDeletedCount;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-
- private:
- bool mExpectCrash;
- int mDeletedCount;
-};
-
-class TestShutdownParent : public PTestShutdownParent {
- friend class PTestShutdownParent;
-
- public:
- TestShutdownParent() {}
- virtual ~TestShutdownParent() {}
-
- static bool RunTestInProcesses() { return true; }
- // FIXME/bug 703323 Could work if modified
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvSync() { return IPC_OK(); }
-
- PTestShutdownSubParent* AllocPTestShutdownSubParent(const bool& expectCrash) {
- return new TestShutdownSubParent(expectCrash);
- }
-
- bool DeallocPTestShutdownSubParent(PTestShutdownSubParent* actor) {
- delete actor;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-//-----------------------------------------------------------------------------
-// Child side
-
-class TestShutdownSubsubChild : public PTestShutdownSubsubChild {
- public:
- explicit TestShutdownSubsubChild(bool expectParentDeleted)
- : mExpectParentDeleted(expectParentDeleted) {}
- virtual ~TestShutdownSubsubChild() {}
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override;
-
- private:
- bool mExpectParentDeleted;
-};
-
-class TestShutdownSubChild : public PTestShutdownSubChild {
- friend class PTestShutdownSubChild;
-
- public:
- explicit TestShutdownSubChild(bool expectCrash) : mExpectCrash(expectCrash) {}
-
- virtual ~TestShutdownSubChild() {}
-
- protected:
- mozilla::ipc::IPCResult AnswerStackFrame();
-
- PTestShutdownSubsubChild* AllocPTestShutdownSubsubChild(
- const bool& expectParentDelete) {
- return new TestShutdownSubsubChild(expectParentDelete);
- }
-
- bool DeallocPTestShutdownSubsubChild(PTestShutdownSubsubChild* actor) {
- delete actor;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-
- private:
- bool mExpectCrash;
-};
-
-class TestShutdownChild : public PTestShutdownChild {
- friend class PTestShutdownChild;
-
- public:
- TestShutdownChild() {}
- virtual ~TestShutdownChild() {}
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- PTestShutdownSubChild* AllocPTestShutdownSubChild(const bool& expectCrash) {
- return new TestShutdownSubChild(expectCrash);
- }
-
- bool DeallocPTestShutdownSubChild(PTestShutdownSubChild* actor) {
- delete actor;
- return true;
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestShutdown_h
diff --git a/ipc/ipdl/test/cxx/TestStackHooks.cpp b/ipc/ipdl/test/cxx/TestStackHooks.cpp
deleted file mode 100644
index 9800ac54e7..0000000000
--- a/ipc/ipdl/test/cxx/TestStackHooks.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-#include "TestStackHooks.h"
-
-#include "base/task.h"
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestStackHooksParent::TestStackHooksParent()
- : mOnStack(false), mIncallDepth(0) {
- MOZ_COUNT_CTOR(TestStackHooksParent);
-}
-
-TestStackHooksParent::~TestStackHooksParent() {
- MOZ_COUNT_DTOR(TestStackHooksParent);
-}
-
-void TestStackHooksParent::Main() {
- if (!SendStart()) fail("sending Start()");
-}
-
-mozilla::ipc::IPCResult TestStackHooksParent::AnswerStackFrame() {
- if (!mOnStack) fail("not on C++ stack?!");
-
- if (!CallStackFrame()) fail("calling StackFrame()");
-
- if (!mOnStack) fail("not on C++ stack?!");
-
- if (1 != mIncallDepth) fail("missed EnteredCall or ExitedCall hook");
-
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestStackHooksChild::TestStackHooksChild()
- : mOnStack(false),
- mEntered(0),
- mExited(0),
- mIncallDepth(0),
- mNumAnswerStackFrame(0) {
- MOZ_COUNT_CTOR(TestStackHooksChild);
-}
-
-TestStackHooksChild::~TestStackHooksChild() {
- MOZ_COUNT_DTOR(TestStackHooksChild);
-}
-
-namespace {
-void RunTestsFn() {
- static_cast<TestStackHooksChild*>(gChildActor)->RunTests();
-}
-} // namespace
-
-mozilla::ipc::IPCResult TestStackHooksChild::RecvStart() {
- if (!mOnStack) fail("missed stack notification");
-
- if (0 != mIncallDepth) fail("EnteredCall/ExitedCall malfunction");
-
- // kick off tests from a runnable so that we can start with
- // MessageChannel code on the C++ stack
- MessageLoop::current()->PostTask(
- NewRunnableFunction("RunTestsFn", RunTestsFn));
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestStackHooksChild::AnswerStackFrame() {
- ++mNumAnswerStackFrame;
-
- if (!mOnStack) fail("missed stack notification");
-
- if (1 != mIncallDepth) fail("missed EnteredCall or ExitedCall hook");
-
- if (mNumAnswerStackFrame == 1) {
- if (!SendAsync()) fail("sending Async()");
- } else if (mNumAnswerStackFrame == 2) {
- if (!SendSync()) fail("sending Sync()");
- } else {
- fail("unexpected state");
- }
-
- if (!mOnStack) fail("bad stack exit notification");
-
- return IPC_OK();
-}
-
-void TestStackHooksChild::RunTests() {
- // 1 because of RecvStart()
- if (1 != mEntered) fail("missed stack notification");
- if (mOnStack) fail("spurious stack notification");
- if (0 != mIncallDepth) fail("EnteredCall/ExitedCall malfunction");
-
- if (!SendAsync()) fail("sending Async()");
- if (mOnStack) fail("spurious stack notification");
- if (0 != mIncallDepth) fail("EnteredCall/ExitedCall malfunction");
- if (2 != mEntered) fail("missed stack notification");
-
- if (!SendSync()) fail("sending Sync()");
- if (mOnStack) fail("spurious stack notification");
- if (0 != mIncallDepth) fail("EnteredCall/ExitedCall malfunction");
- if (3 != mEntered) fail("missed stack notification");
-
- if (!CallRpc()) fail("calling RPC()");
- if (mOnStack) fail("spurious stack notification");
- if (0 != mIncallDepth) fail("EnteredCall/ExitedCall malfunction");
- if (4 != mEntered) fail("missed stack notification");
-
- if (!CallStackFrame()) fail("calling StackFrame()");
- if (mOnStack) fail("spurious stack notification");
- if (0 != mIncallDepth) fail("EnteredCall/ExitedCall malfunction");
- if (5 != mEntered) fail("missed stack notification");
-
- Close();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestStackHooks.h b/ipc/ipdl/test/cxx/TestStackHooks.h
deleted file mode 100644
index 315a3c1ae5..0000000000
--- a/ipc/ipdl/test/cxx/TestStackHooks.h
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef mozilla__ipdltest_TestStackHooks_h
-#define mozilla__ipdltest_TestStackHooks_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestStackHooksParent.h"
-#include "mozilla/_ipdltest/PTestStackHooksChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestStackHooksParent : public PTestStackHooksParent {
- friend class PTestStackHooksParent;
-
- public:
- TestStackHooksParent();
- virtual ~TestStackHooksParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvAsync() {
- if (!mOnStack) fail("not on C++ stack?!");
- return IPC_OK();
- }
-
- mozilla::ipc::IPCResult RecvSync() {
- if (!mOnStack) fail("not on C++ stack?!");
- return IPC_OK();
- }
-
- mozilla::ipc::IPCResult AnswerRpc() {
- if (!mOnStack) fail("not on C++ stack?!");
- return IPC_OK();
- }
-
- mozilla::ipc::IPCResult AnswerStackFrame();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-
- virtual void EnteredCxxStack() override { mOnStack = true; }
- virtual void ExitedCxxStack() override { mOnStack = false; }
-
- virtual void EnteredCall() override { ++mIncallDepth; }
- virtual void ExitedCall() override { --mIncallDepth; }
-
- private:
- bool mOnStack;
- int mIncallDepth;
-};
-
-class TestStackHooksChild : public PTestStackHooksChild {
- friend class PTestStackHooksChild;
-
- public:
- TestStackHooksChild();
- virtual ~TestStackHooksChild();
-
- void RunTests();
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- mozilla::ipc::IPCResult AnswerStackFrame();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
-
- if (mEntered != mExited) fail("unbalanced enter/exit notifications");
-
- if (mOnStack)
- fail("computing mOnStack went awry; should have failed above assertion");
-
- QuitChild();
- }
-
- virtual void EnteredCxxStack() override {
- ++mEntered;
- mOnStack = true;
- }
- virtual void ExitedCxxStack() override {
- ++mExited;
- mOnStack = false;
- }
-
- virtual void EnteredCall() override { ++mIncallDepth; }
- virtual void ExitedCall() override { --mIncallDepth; }
-
- private:
- bool mOnStack;
- int mEntered;
- int mExited;
- int mIncallDepth;
- int32_t mNumAnswerStackFrame;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestStackHooks_h
diff --git a/ipc/ipdl/test/cxx/TestSyncError.cpp b/ipc/ipdl/test/cxx/TestSyncError.cpp
deleted file mode 100644
index 6c21590a87..0000000000
--- a/ipc/ipdl/test/cxx/TestSyncError.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#include "TestSyncError.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestSyncErrorParent::TestSyncErrorParent() {
- MOZ_COUNT_CTOR(TestSyncErrorParent);
-}
-
-TestSyncErrorParent::~TestSyncErrorParent() {
- MOZ_COUNT_DTOR(TestSyncErrorParent);
-}
-
-void TestSyncErrorParent::Main() {
- if (!SendStart()) fail("sending Start");
-}
-
-mozilla::ipc::IPCResult TestSyncErrorParent::RecvError() {
- return IPC_FAIL_NO_REASON(this);
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestSyncErrorChild::TestSyncErrorChild() { MOZ_COUNT_CTOR(TestSyncErrorChild); }
-
-TestSyncErrorChild::~TestSyncErrorChild() {
- MOZ_COUNT_DTOR(TestSyncErrorChild);
-}
-
-mozilla::ipc::IPCResult TestSyncErrorChild::RecvStart() {
- if (SendError()) fail("Error() should have return false");
-
- Close();
-
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestSyncError.h b/ipc/ipdl/test/cxx/TestSyncError.h
deleted file mode 100644
index 8b84ed5e0b..0000000000
--- a/ipc/ipdl/test/cxx/TestSyncError.h
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef mozilla__ipdltest_TestSyncError_h
-#define mozilla__ipdltest_TestSyncError_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestSyncErrorParent.h"
-#include "mozilla/_ipdltest/PTestSyncErrorChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestSyncErrorParent : public PTestSyncErrorParent {
- friend class PTestSyncErrorParent;
-
- public:
- TestSyncErrorParent();
- virtual ~TestSyncErrorParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult RecvError();
-
- virtual void ProcessingError(Result aCode, const char* aReason) override {
- // Ignore errors
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestSyncErrorChild : public PTestSyncErrorChild {
- friend class PTestSyncErrorChild;
-
- public:
- TestSyncErrorChild();
- virtual ~TestSyncErrorChild();
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- virtual void ProcessingError(Result aCode, const char* aReason) override {
- // Ignore errors
- }
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestSyncError_h
diff --git a/ipc/ipdl/test/cxx/TestSyncHang.cpp b/ipc/ipdl/test/cxx/TestSyncHang.cpp
deleted file mode 100644
index f53054787b..0000000000
--- a/ipc/ipdl/test/cxx/TestSyncHang.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#include "TestSyncHang.h"
-#include "base/task.h"
-#include "mozilla/ipc/GeckoChildProcessHost.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-using std::string;
-using std::vector;
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-mozilla::ipc::GeckoChildProcessHost* gSyncHangSubprocess;
-
-TestSyncHangParent::TestSyncHangParent() { MOZ_COUNT_CTOR(TestSyncHangParent); }
-
-TestSyncHangParent::~TestSyncHangParent() {
- MOZ_COUNT_DTOR(TestSyncHangParent);
-}
-
-void DeleteSyncHangSubprocess(MessageLoop* uiLoop) {
- gSyncHangSubprocess->Destroy();
- gSyncHangSubprocess = nullptr;
-}
-
-void DeferredSyncHangParentShutdown() {
- // ping to DeleteSubprocess
- XRE_GetIOMessageLoop()->PostTask(
- NewRunnableFunction("DeleteSyncHangSubprocess", DeleteSyncHangSubprocess,
- MessageLoop::current()));
-}
-
-void TestSyncHangParent::Main() {
- vector<string> args;
- args.push_back("fake/path");
- gSyncHangSubprocess =
- new mozilla::ipc::GeckoChildProcessHost(GeckoProcessType_Plugin);
- bool launched = gSyncHangSubprocess->SyncLaunch(args, 2);
- if (launched)
- fail("Calling SyncLaunch with an invalid path should return false");
-
- MessageLoop::current()->PostTask(NewRunnableFunction(
- "DeferredSyncHangParentShutdown", DeferredSyncHangParentShutdown));
- Close();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestSyncHangChild::TestSyncHangChild() { MOZ_COUNT_CTOR(TestSyncHangChild); }
-
-TestSyncHangChild::~TestSyncHangChild() { MOZ_COUNT_DTOR(TestSyncHangChild); }
-
-mozilla::ipc::IPCResult TestSyncHangChild::RecvUnusedMessage() {
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestSyncHang.h b/ipc/ipdl/test/cxx/TestSyncHang.h
deleted file mode 100644
index 911f05cd31..0000000000
--- a/ipc/ipdl/test/cxx/TestSyncHang.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef mozilla__ipdltest_TestSyncHang_h
-#define mozilla__ipdltest_TestSyncHang_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestSyncHangParent.h"
-#include "mozilla/_ipdltest/PTestSyncHangChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestSyncHangParent : public PTestSyncHangParent {
- public:
- TestSyncHangParent();
- virtual ~TestSyncHangParent();
-
- static bool RunTestInProcesses() { return true; }
- // FIXME/bug 703323 Could work if modified
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- protected:
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestSyncHangChild : public PTestSyncHangChild {
- friend class PTestSyncHangChild;
-
- public:
- TestSyncHangChild();
- virtual ~TestSyncHangChild();
-
- protected:
- mozilla::ipc::IPCResult RecvUnusedMessage();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestSyncHang_h
diff --git a/ipc/ipdl/test/cxx/TestSyncWakeup.cpp b/ipc/ipdl/test/cxx/TestSyncWakeup.cpp
deleted file mode 100644
index 90875b702b..0000000000
--- a/ipc/ipdl/test/cxx/TestSyncWakeup.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-#if defined(XP_UNIX)
-# include <unistd.h> // sleep()
-#endif
-
-#include "TestSyncWakeup.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestSyncWakeupParent::TestSyncWakeupParent() {
- MOZ_COUNT_CTOR(TestSyncWakeupParent);
-}
-
-TestSyncWakeupParent::~TestSyncWakeupParent() {
- MOZ_COUNT_DTOR(TestSyncWakeupParent);
-}
-
-void TestSyncWakeupParent::Main() {
- if (!SendStart()) fail("sending Start()");
-}
-
-mozilla::ipc::IPCResult TestSyncWakeupParent::AnswerStackFrame() {
- if (!CallStackFrame()) fail("calling StackFrame()");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestSyncWakeupParent::RecvSync1() {
- if (!SendNote1()) fail("sending Note1()");
-
- // XXX ugh ... need to ensure that the async message and sync
- // reply come in "far enough" apart that this test doesn't pass on
- // accident
-#if defined(XP_UNIX)
- // NB: can't use PR_Sleep (i.e. Sleep() on windows) because it's
- // only spec'd to block the current thread, not the current
- // process. We need the IO thread to sleep as well.
- puts(" (sleeping for 5 seconds. sorry!)");
- sleep(5);
-#endif
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestSyncWakeupParent::RecvSync2() {
- if (!SendNote2()) fail("sending Note2()");
-
-#if defined(XP_UNIX)
- // see above
- sleep(5);
- puts(" (sleeping for 5 seconds. sorry!)");
-#endif
-
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-TestSyncWakeupChild::TestSyncWakeupChild() : mDone(false) {
- MOZ_COUNT_CTOR(TestSyncWakeupChild);
-}
-
-TestSyncWakeupChild::~TestSyncWakeupChild() {
- MOZ_COUNT_DTOR(TestSyncWakeupChild);
-}
-
-mozilla::ipc::IPCResult TestSyncWakeupChild::RecvStart() {
- // First test: the parent fires back an async message while
- // replying to a sync one
- if (!SendSync1()) fail("sending Sync()");
-
- // drop back into the event loop to get Note1(), then kick off the
- // second test
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestSyncWakeupChild::RecvNote1() {
- // Second test: the parent fires back an async message while
- // replying to a sync one, with a frame on the RPC stack
- if (!CallStackFrame()) fail("calling StackFrame()");
-
- if (!mDone) fail("should have received Note2()!");
-
- Close();
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestSyncWakeupChild::AnswerStackFrame() {
- if (!SendSync2()) fail("sending Sync()");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestSyncWakeupChild::RecvNote2() {
- mDone = true;
- return IPC_OK();
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestSyncWakeup.h b/ipc/ipdl/test/cxx/TestSyncWakeup.h
deleted file mode 100644
index 5666307929..0000000000
--- a/ipc/ipdl/test/cxx/TestSyncWakeup.h
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef mozilla__ipdltest_TestSyncWakeup_h
-#define mozilla__ipdltest_TestSyncWakeup_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestSyncWakeupParent.h"
-#include "mozilla/_ipdltest/PTestSyncWakeupChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestSyncWakeupParent : public PTestSyncWakeupParent {
- friend class PTestSyncWakeupParent;
-
- public:
- TestSyncWakeupParent();
- virtual ~TestSyncWakeupParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return true; }
-
- void Main();
-
- protected:
- mozilla::ipc::IPCResult AnswerStackFrame();
-
- mozilla::ipc::IPCResult RecvSync1();
-
- mozilla::ipc::IPCResult RecvSync2();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- passed("ok");
- QuitParent();
- }
-};
-
-class TestSyncWakeupChild : public PTestSyncWakeupChild {
- friend class PTestSyncWakeupChild;
-
- public:
- TestSyncWakeupChild();
- virtual ~TestSyncWakeupChild();
-
- protected:
- mozilla::ipc::IPCResult RecvStart();
-
- mozilla::ipc::IPCResult RecvNote1();
-
- mozilla::ipc::IPCResult AnswerStackFrame();
-
- mozilla::ipc::IPCResult RecvNote2();
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) fail("unexpected destruction!");
- QuitChild();
- }
-
- private:
- bool mDone;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestSyncWakeup_h
diff --git a/ipc/ipdl/test/cxx/TestUniquePtrIPC.cpp b/ipc/ipdl/test/cxx/TestUniquePtrIPC.cpp
deleted file mode 100644
index 7d0e8dd6ca..0000000000
--- a/ipc/ipdl/test/cxx/TestUniquePtrIPC.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- 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(std::move(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
diff --git a/ipc/ipdl/test/cxx/TestUniquePtrIPC.h b/ipc/ipdl/test/cxx/TestUniquePtrIPC.h
deleted file mode 100644
index 3c9de33df3..0000000000
--- a/ipc/ipdl/test/cxx/TestUniquePtrIPC.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- 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:
- MOZ_COUNTED_DEFAULT_CTOR(TestUniquePtrIPCParent)
- MOZ_COUNTED_DTOR_OVERRIDE(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:
- MOZ_COUNTED_DEFAULT_CTOR(TestUniquePtrIPCChild)
- MOZ_COUNTED_DTOR_OVERRIDE(TestUniquePtrIPCChild)
-
- mozilla::ipc::IPCResult RecvTestMessage(UniquePtr<int>&& aA1,
- UniquePtr<DummyStruct>&& aA2,
- const DummyStruct& aA3,
- UniquePtr<int>&& aA4);
-
- mozilla::ipc::IPCResult RecvTestSendReference(UniquePtr<DummyStruct>&& aA);
-
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (NormalShutdown != why) {
- fail("Abnormal shutdown of child");
- }
- QuitChild();
- }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // mozilla_TestUniquePtrIPC_h
diff --git a/ipc/ipdl/test/cxx/TestUrgency.cpp b/ipc/ipdl/test/cxx/TestUrgency.cpp
deleted file mode 100644
index 840b9d71e9..0000000000
--- a/ipc/ipdl/test/cxx/TestUrgency.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#include "TestUrgency.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-#if defined(XP_UNIX)
-# include <unistd.h>
-#else
-# include <windows.h>
-#endif
-
-namespace mozilla {
-namespace _ipdltest {
-
-#if defined(XP_UNIX)
-static void Sleep(int ms) { sleep(ms / 1000); }
-#endif
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestUrgencyParent::TestUrgencyParent() : inreply_(false) {
- MOZ_COUNT_CTOR(TestUrgencyParent);
-}
-
-TestUrgencyParent::~TestUrgencyParent() { MOZ_COUNT_DTOR(TestUrgencyParent); }
-
-void TestUrgencyParent::Main() {
- if (!SendStart()) fail("sending Start");
-}
-
-mozilla::ipc::IPCResult TestUrgencyParent::RecvTest1(uint32_t* value) {
- if (!SendReply1(value)) fail("sending Reply1");
- if (*value != 99) fail("bad value");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgencyParent::RecvTest2() {
- uint32_t value;
- inreply_ = true;
- if (!SendReply2(&value)) fail("sending Reply2");
- inreply_ = false;
- if (value != 500) fail("bad value");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgencyParent::RecvTest3(uint32_t* value) {
- if (inreply_) fail("nested non-urgent on top of urgent rpc");
- *value = 1000;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgencyParent::RecvFinalTest_Begin() {
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-enum {
- kFirstTestBegin = 1,
- kFirstTestGotReply,
- kSecondTestBegin,
- kSecondTestGotReply,
-};
-
-mozilla::ipc::IPCResult TestUrgencyChild::RecvStart() {
- uint32_t result;
-
- // Send a synchronous message, expect to get an urgent message while
- // blocked.
- test_ = kFirstTestBegin;
- if (!SendTest1(&result)) fail("calling SendTest1");
- if (result != 99) fail("bad result in RecvStart");
- if (test_ != kFirstTestGotReply) fail("never received urgent message");
-
- // Initiate the next test by sending an asynchronous message, then becoming
- // blocked. This tests that the urgent message is still delivered properly,
- // and that the parent does not try to service the sync
- test_ = kSecondTestBegin;
- if (!SendTest2()) fail("calling SendTest2");
- if (!SendTest3(&result)) fail("calling SendTest3");
- if (test_ != kSecondTestGotReply) fail("never received urgent message #2");
- if (result != 1000) fail("wrong value from test3");
-
- if (!SendFinalTest_Begin()) fail("Final test should have succeeded");
-
- Close();
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgencyChild::RecvReply1(uint32_t* reply) {
- if (test_ != kFirstTestBegin) fail("wrong test # in RecvReply1");
-
- *reply = 99;
- test_ = kFirstTestGotReply;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgencyChild::RecvReply2(uint32_t* reply) {
- if (test_ != kSecondTestBegin) fail("wrong test # in RecvReply2");
-
- // sleep for 5 seconds so the parent process tries to deliver more messages.
- Sleep(5000);
-
- *reply = 500;
- test_ = kSecondTestGotReply;
- return IPC_OK();
-}
-
-TestUrgencyChild::TestUrgencyChild() : test_(0) {
- MOZ_COUNT_CTOR(TestUrgencyChild);
-}
-
-TestUrgencyChild::~TestUrgencyChild() { MOZ_COUNT_DTOR(TestUrgencyChild); }
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestUrgency.h b/ipc/ipdl/test/cxx/TestUrgency.h
deleted file mode 100644
index 6af73177ee..0000000000
--- a/ipc/ipdl/test/cxx/TestUrgency.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef mozilla__ipdltest_TestUrgency_h
-#define mozilla__ipdltest_TestUrgency_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestUrgencyParent.h"
-#include "mozilla/_ipdltest/PTestUrgencyChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestUrgencyParent : public PTestUrgencyParent {
- public:
- TestUrgencyParent();
- virtual ~TestUrgencyParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
-
- mozilla::ipc::IPCResult RecvTest1(uint32_t* value);
- mozilla::ipc::IPCResult RecvTest2();
- mozilla::ipc::IPCResult RecvTest3(uint32_t* value);
- mozilla::ipc::IPCResult RecvTest4_Begin();
- mozilla::ipc::IPCResult RecvTest4_NestedSync();
- mozilla::ipc::IPCResult RecvFinalTest_Begin();
-
- bool ShouldContinueFromReplyTimeout() override { return false; }
- virtual void ActorDestroy(ActorDestroyReason why) override {
- passed("ok");
- QuitParent();
- }
-
- private:
- bool inreply_;
-};
-
-class TestUrgencyChild : public PTestUrgencyChild {
- public:
- TestUrgencyChild();
- virtual ~TestUrgencyChild();
-
- mozilla::ipc::IPCResult RecvStart();
- mozilla::ipc::IPCResult RecvReply1(uint32_t* reply);
- mozilla::ipc::IPCResult RecvReply2(uint32_t* reply);
-
- virtual void ActorDestroy(ActorDestroyReason why) override { QuitChild(); }
-
- private:
- uint32_t test_;
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestUrgency_h
diff --git a/ipc/ipdl/test/cxx/TestUrgentHangs.cpp b/ipc/ipdl/test/cxx/TestUrgentHangs.cpp
deleted file mode 100644
index 96227dd791..0000000000
--- a/ipc/ipdl/test/cxx/TestUrgentHangs.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
- * vim: sw=2 ts=4 et :
- */
-#include "TestUrgentHangs.h"
-
-#include "IPDLUnitTests.h" // fail etc.
-#include "prthread.h"
-#if defined(XP_UNIX)
-# include <unistd.h>
-#else
-# include <windows.h>
-#endif
-
-namespace mozilla {
-namespace _ipdltest {
-
-//-----------------------------------------------------------------------------
-// parent
-
-TestUrgentHangsParent::TestUrgentHangsParent()
- : mInnerCount(0), mInnerUrgentCount(0) {
- MOZ_COUNT_CTOR(TestUrgentHangsParent);
-}
-
-TestUrgentHangsParent::~TestUrgentHangsParent() {
- MOZ_COUNT_DTOR(TestUrgentHangsParent);
-}
-
-void TestUrgentHangsParent::Main() {
- SetReplyTimeoutMs(1000);
-
- // Should succeed despite the nested sleep call because the content process
- // responded to the transaction.
- if (!SendTest1_1()) fail("sending Test1_1");
-
- // Fails with a timeout.
- if (SendTest2()) fail("sending Test2");
-
- // Also fails since we haven't gotten a response for Test2 yet.
- if (SendTest3()) fail("sending Test3");
-
- // Do a second round of testing once the reply to Test2 comes back.
- MessageLoop::current()->PostDelayedTask(
- NewNonOwningRunnableMethod(
- "_ipdltest::TestUrgentHangsParent::SecondStage", this,
- &TestUrgentHangsParent::SecondStage),
- 3000);
-}
-
-void TestUrgentHangsParent::SecondStage() {
- // Send an async message that waits 2 seconds and then sends a sync message
- // (which should be processed).
- if (!SendTest4()) fail("sending Test4");
-
- // Send a sync message that will time out because the child is waiting
- // inside RecvTest4.
- if (SendTest4_1()) fail("sending Test4_1");
-
- MessageLoop::current()->PostDelayedTask(
- NewNonOwningRunnableMethod("_ipdltest::TestUrgentHangsParent::ThirdStage",
- this, &TestUrgentHangsParent::ThirdStage),
- 3000);
-}
-
-void TestUrgentHangsParent::ThirdStage() {
- // The third stage does the same thing as the second stage except that the
- // child sends an urgent message to us. In this case, we actually answer
- // that message unconditionally.
-
- // Send an async message that waits 2 seconds and then sends a sync message
- // (which should be processed).
- if (!SendTest5()) fail("sending Test5");
-
- // Send a sync message that will time out because the child is waiting
- // inside RecvTest5.
- if (SendTest5_1()) fail("sending Test5_1");
-
- // Close the channel after the child finishes its work in RecvTest5.
- MessageLoop::current()->PostDelayedTask(
- NewNonOwningRunnableMethod("ipc::IToplevelProtocol::Close", this,
- &TestUrgentHangsParent::Close),
- 3000);
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsParent::RecvTest1_2() {
- if (!SendTest1_3()) fail("sending Test1_3");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsParent::RecvTestInner() {
- mInnerCount++;
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsParent::RecvTestInnerUrgent() {
- mInnerUrgentCount++;
- return IPC_OK();
-}
-
-//-----------------------------------------------------------------------------
-// child
-
-mozilla::ipc::IPCResult TestUrgentHangsChild::RecvTest1_1() {
- if (!SendTest1_2()) fail("sending Test1_2");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsChild::RecvTest1_3() {
- PR_Sleep(PR_SecondsToInterval(2));
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsChild::RecvTest2() {
- PR_Sleep(PR_SecondsToInterval(2));
-
- // Should fail because of the timeout.
- if (SendTestInner()) fail("sending TestInner");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsChild::RecvTest3() {
- fail("RecvTest3 should never be called");
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsChild::RecvTest4() {
- PR_Sleep(PR_SecondsToInterval(2));
-
- // This won't fail because we should handle Test4_1 here before actually
- // sending TestInner to the parent.
- if (!SendTestInner()) fail("sending TestInner");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsChild::RecvTest4_1() {
- // This should fail because Test4_1 timed out and hasn't gotten a response
- // yet.
- if (SendTestInner()) fail("sending TestInner");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsChild::RecvTest5() {
- PR_Sleep(PR_SecondsToInterval(2));
-
- // This message will actually be handled by the parent even though it's in
- // the timeout state.
- if (!SendTestInnerUrgent()) fail("sending TestInner");
-
- return IPC_OK();
-}
-
-mozilla::ipc::IPCResult TestUrgentHangsChild::RecvTest5_1() {
- // This message will actually be handled by the parent even though it's in
- // the timeout state.
- if (!SendTestInnerUrgent()) fail("sending TestInner");
-
- return IPC_OK();
-}
-
-TestUrgentHangsChild::TestUrgentHangsChild() {
- MOZ_COUNT_CTOR(TestUrgentHangsChild);
-}
-
-TestUrgentHangsChild::~TestUrgentHangsChild() {
- MOZ_COUNT_DTOR(TestUrgentHangsChild);
-}
-
-} // namespace _ipdltest
-} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/TestUrgentHangs.h b/ipc/ipdl/test/cxx/TestUrgentHangs.h
deleted file mode 100644
index facda522bf..0000000000
--- a/ipc/ipdl/test/cxx/TestUrgentHangs.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef mozilla__ipdltest_TestUrgentHangs_h
-#define mozilla__ipdltest_TestUrgentHangs_h 1
-
-#include "mozilla/_ipdltest/IPDLUnitTests.h"
-
-#include "mozilla/_ipdltest/PTestUrgentHangsParent.h"
-#include "mozilla/_ipdltest/PTestUrgentHangsChild.h"
-
-namespace mozilla {
-namespace _ipdltest {
-
-class TestUrgentHangsParent : public PTestUrgentHangsParent {
- public:
- TestUrgentHangsParent();
- virtual ~TestUrgentHangsParent();
-
- static bool RunTestInProcesses() { return true; }
- static bool RunTestInThreads() { return false; }
-
- void Main();
- void SecondStage();
- void ThirdStage();
-
- mozilla::ipc::IPCResult RecvTest1_2();
- mozilla::ipc::IPCResult RecvTestInner();
- mozilla::ipc::IPCResult RecvTestInnerUrgent();
-
- bool ShouldContinueFromReplyTimeout() override { return false; }
- virtual void ActorDestroy(ActorDestroyReason why) override {
- if (mInnerCount != 1) {
- fail("wrong mInnerCount");
- }
- if (mInnerUrgentCount != 2) {
- fail("wrong mInnerUrgentCount");
- }
- passed("ok");
- QuitParent();
- }
-
- private:
- size_t mInnerCount, mInnerUrgentCount;
-};
-
-class TestUrgentHangsChild : public PTestUrgentHangsChild {
- public:
- TestUrgentHangsChild();
- virtual ~TestUrgentHangsChild();
-
- mozilla::ipc::IPCResult RecvTest1_1();
- mozilla::ipc::IPCResult RecvTest1_3();
- mozilla::ipc::IPCResult RecvTest2();
- mozilla::ipc::IPCResult RecvTest3();
- mozilla::ipc::IPCResult RecvTest4();
- mozilla::ipc::IPCResult RecvTest4_1();
- mozilla::ipc::IPCResult RecvTest5();
- mozilla::ipc::IPCResult RecvTest5_1();
-
- virtual void ActorDestroy(ActorDestroyReason why) override { QuitChild(); }
-};
-
-} // namespace _ipdltest
-} // namespace mozilla
-
-#endif // ifndef mozilla__ipdltest_TestUrgentHangs_h
diff --git a/ipc/ipdl/test/cxx/moz.build b/ipc/ipdl/test/cxx/moz.build
index e2650df0aa..196dc09add 100644
--- a/ipc/ipdl/test/cxx/moz.build
+++ b/ipc/ipdl/test/cxx/moz.build
@@ -11,87 +11,11 @@ EXPORTS.mozilla._ipdltest += [
"IPDLUnitTests.h",
"IPDLUnitTestTypes.h",
"IPDLUnitTestUtils.h",
- "TestActorPunning.h",
- "TestAsyncReturns.h",
- "TestBadActor.h",
- "TestCancel.h",
- "TestCrashCleanup.h",
- "TestDataStructures.h",
- "TestDemon.h",
- "TestDesc.h",
- "TestEndpointBridgeMain.h",
- "TestEndpointOpens.h",
- "TestFailedCtor.h",
- "TestHangs.h",
- "TestHighestPrio.h",
- "TestInterruptErrorCleanup.h",
- "TestInterruptRaces.h",
- "TestInterruptShutdownRace.h",
- "TestJSON.h",
- "TestLatency.h",
- "TestManyChildAllocs.h",
- "TestMultiMgrs.h",
- "TestNestedLoops.h",
"TestOffMainThreadPainting.h",
- "TestRaceDeadlock.h",
- "TestRaceDeferral.h",
- "TestRacyInterruptReplies.h",
- "TestRacyReentry.h",
- "TestRacyUndefer.h",
- "TestRPC.h",
- "TestSanity.h",
- "TestSelfManageRoot.h",
- "TestShmem.h",
- "TestShutdown.h",
- "TestStackHooks.h",
- "TestSyncError.h",
- "TestSyncHang.h",
- "TestSyncWakeup.h",
- "TestUniquePtrIPC.h",
- "TestUrgency.h",
- "TestUrgentHangs.h",
]
SOURCES += [
- "TestActorPunning.cpp",
- "TestAsyncReturns.cpp",
- "TestBadActor.cpp",
- "TestCancel.cpp",
- "TestCrashCleanup.cpp",
- "TestDataStructures.cpp",
- "TestDemon.cpp",
- "TestDesc.cpp",
- "TestEndpointBridgeMain.cpp",
- "TestEndpointOpens.cpp",
- "TestFailedCtor.cpp",
- "TestHangs.cpp",
- "TestHighestPrio.cpp",
- "TestInterruptErrorCleanup.cpp",
- "TestInterruptRaces.cpp",
- "TestInterruptShutdownRace.cpp",
- "TestJSON.cpp",
- "TestLatency.cpp",
- "TestManyChildAllocs.cpp",
- "TestMultiMgrs.cpp",
- "TestNestedLoops.cpp",
"TestOffMainThreadPainting.cpp",
- "TestRaceDeadlock.cpp",
- "TestRaceDeferral.cpp",
- "TestRacyInterruptReplies.cpp",
- "TestRacyReentry.cpp",
- "TestRacyUndefer.cpp",
- "TestRPC.cpp",
- "TestSanity.cpp",
- "TestSelfManageRoot.cpp",
- "TestShmem.cpp",
- "TestShutdown.cpp",
- "TestStackHooks.cpp",
- "TestSyncError.cpp",
- "TestSyncHang.cpp",
- "TestSyncWakeup.cpp",
- "TestUniquePtrIPC.cpp",
- "TestUrgency.cpp",
- "TestUrgentHangs.cpp",
]
SOURCES += [
@@ -101,70 +25,12 @@ SOURCES += [
]
IPDL_SOURCES += [
- "PTestActorPunning.ipdl",
- "PTestActorPunningPunned.ipdl",
- "PTestActorPunningSub.ipdl",
- "PTestAsyncReturns.ipdl",
- "PTestBadActor.ipdl",
- "PTestBadActorSub.ipdl",
- "PTestCancel.ipdl",
- "PTestCrashCleanup.ipdl",
- "PTestDataStructures.ipdl",
- "PTestDataStructuresCommon.ipdlh",
- "PTestDataStructuresSub.ipdl",
- "PTestDemon.ipdl",
- "PTestDesc.ipdl",
- "PTestDescSub.ipdl",
- "PTestDescSubsub.ipdl",
- "PTestEndpointBridgeMain.ipdl",
- "PTestEndpointBridgeMainSub.ipdl",
- "PTestEndpointBridgeSub.ipdl",
- "PTestEndpointOpens.ipdl",
- "PTestEndpointOpensOpened.ipdl",
- "PTestFailedCtor.ipdl",
- "PTestFailedCtorSub.ipdl",
- "PTestFailedCtorSubsub.ipdl",
- "PTestHandle.ipdl",
- "PTestHangs.ipdl",
- "PTestHighestPrio.ipdl",
"PTestIndirectProtocolParam.ipdlh",
"PTestIndirectProtocolParamFirst.ipdl",
"PTestIndirectProtocolParamManage.ipdl",
"PTestIndirectProtocolParamSecond.ipdl",
- "PTestInterruptErrorCleanup.ipdl",
- "PTestInterruptRaces.ipdl",
- "PTestInterruptShutdownRace.ipdl",
- "PTestJSON.ipdl",
- "PTestLatency.ipdl",
- "PTestManyChildAllocs.ipdl",
- "PTestManyChildAllocsSub.ipdl",
- "PTestMultiMgrs.ipdl",
- "PTestMultiMgrsBottom.ipdl",
- "PTestMultiMgrsLeft.ipdl",
- "PTestMultiMgrsRight.ipdl",
- "PTestNestedLoops.ipdl",
"PTestPaintThread.ipdl",
"PTestPriority.ipdl",
- "PTestRaceDeadlock.ipdl",
- "PTestRaceDeferral.ipdl",
- "PTestRacyInterruptReplies.ipdl",
- "PTestRacyReentry.ipdl",
- "PTestRacyUndefer.ipdl",
- "PTestRPC.ipdl",
- "PTestSanity.ipdl",
- "PTestSelfManage.ipdl",
- "PTestSelfManageRoot.ipdl",
- "PTestShmem.ipdl",
- "PTestShutdown.ipdl",
- "PTestShutdownSub.ipdl",
- "PTestShutdownSubsub.ipdl",
- "PTestStackHooks.ipdl",
- "PTestSyncError.ipdl",
- "PTestSyncHang.ipdl",
- "PTestSyncWakeup.ipdl",
- "PTestUniquePtrIPC.ipdl",
- "PTestUrgency.ipdl",
- "PTestUrgentHangs.ipdl",
]
include("/ipc/chromium/chromium-config.mozbuild")
diff --git a/ipc/ipdl/test/gtest/IPDLUnitTest.h b/ipc/ipdl/test/gtest/IPDLUnitTest.h
index f4548b508c..e2c44630b7 100644
--- a/ipc/ipdl/test/gtest/IPDLUnitTest.h
+++ b/ipc/ipdl/test/gtest/IPDLUnitTest.h
@@ -27,52 +27,75 @@ class IPDLTestHelper {
virtual void TestBody() = 0;
};
-#define IPDL_TEST_CLASS_NAME_(actorname) IPDL_TEST_##actorname
+#define IPDL_TEST_CLASS_NAME_(actorname, ...) IPDL_TEST_##actorname##__VA_ARGS__
-#define IPDL_TEST_HEAD_(actorname) \
- class IPDL_TEST_CLASS_NAME_(actorname) \
- : public ::mozilla::_ipdltest::IPDLTestHelper { \
- public: \
- IPDL_TEST_CLASS_NAME_(actorname)() : mActor(new actorname##Parent) {} \
- \
- private: \
- void TestBody() override; \
- const char* GetName() override { return sName; }; \
- actorname##Parent* GetActor() override { return mActor; }; \
- \
- RefPtr<actorname##Parent> mActor; \
- static const char* sName; \
- }; \
- const char* IPDL_TEST_CLASS_NAME_(actorname)::sName = \
- ::mozilla::_ipdltest::RegisterAllocChildActor( \
- #actorname, []() -> ::mozilla::ipc::IToplevelProtocol* { \
- return new actorname##Child; \
+#define IPDL_TEST_HEAD_(actorname, ...) \
+ class IPDL_TEST_CLASS_NAME_(actorname, ##__VA_ARGS__) \
+ : public ::mozilla::_ipdltest::IPDLTestHelper { \
+ public: \
+ IPDL_TEST_CLASS_NAME_(actorname, ##__VA_ARGS__) \
+ () : mActor(new actorname##Parent) {} \
+ \
+ private: \
+ void TestBody() override; \
+ const char* GetName() override { return sName; }; \
+ actorname##Parent* GetActor() override { return mActor; }; \
+ \
+ RefPtr<actorname##Parent> mActor; \
+ static const char* sName; \
+ }; \
+ const char* IPDL_TEST_CLASS_NAME_(actorname, ##__VA_ARGS__)::sName = \
+ ::mozilla::_ipdltest::RegisterAllocChildActor( \
+ #actorname, []() -> ::mozilla::ipc::IToplevelProtocol* { \
+ return new actorname##Child; \
});
-#define IPDL_TEST_DECL_(testgroup, actorname, crossprocess) \
- TEST(testgroup, actorname) \
- { \
- IPDL_TEST_CLASS_NAME_(actorname) test; \
- test.TestWrapper(crossprocess); \
+#define IPDL_TEST_DECL_CROSSPROCESS_(actorname, ...) \
+ TEST(IPDLTest_CrossProcess, actorname##__VA_ARGS__) \
+ { \
+ IPDL_TEST_CLASS_NAME_(actorname, ##__VA_ARGS__) test; \
+ test.TestWrapper(true); \
}
-#define IPDL_TEST_BODY_SEGUE_(actorname) \
- void IPDL_TEST_CLASS_NAME_(actorname)::TestBody()
+#define IPDL_TEST_DECL_CROSSTHREAD_(actorname, ...) \
+ TEST(IPDLTest_CrossThread, actorname##__VA_ARGS__) \
+ { \
+ IPDL_TEST_CLASS_NAME_(actorname, ##__VA_ARGS__) test; \
+ test.TestWrapper(false); \
+ }
+
+#define IPDL_TEST_DECL_ANY_(actorname, ...) \
+ IPDL_TEST_DECL_CROSSPROCESS_(actorname, ##__VA_ARGS__) \
+ IPDL_TEST_DECL_CROSSTHREAD_(actorname, ##__VA_ARGS__)
+
+#define IPDL_TEST_BODY_SEGUE_(actorname, ...) \
+ void IPDL_TEST_CLASS_NAME_(actorname, ##__VA_ARGS__)::TestBody()
-// Declare a basic IPDL unit test which will be run in both both cross-thread
-// and cross-process configurations. The actor `actorname` will be instantiated
-// by default-constructing the parent & child actors in the relevant processes,
-// and the test block will be executed, with `mActor` being a pointer to the
-// parent actor. The test is asynchronous, and will end when the IPDL connection
-// between the created actors is destroyed.
+// Declare an IPDL unit test. The `mode` should be set to either `CROSSTHREAD`,
+// `CROSSPROCESS`, or `ANY` to run in the selected configuration(s). The actor
+// `actorname` will be instantiated by default-constructing the parent & child
+// actors in the relevant processes, and the test block will be executed, with
+// `mActor` being a pointer to the parent actor. The test is asynchronous, and
+// will end when the IPDL connection between the created actors is destroyed.
+// `aCrossProcess` will indicate whether the test is running cross-process
+// (true) or cross-thread (false).
+//
+// You can optionally pass a single additional argument which provides a
+// `testname`, which will be appended to `actorname` as the full GTest test
+// name. It should be of the form usually passed to the `TEST` gtest macro (an
+// identifier).
//
// GTest assertions fired in the child process will be relayed to the parent
// process, and should generally function correctly.
-#define IPDL_TEST(actorname) \
- IPDL_TEST_HEAD_(actorname) \
- IPDL_TEST_DECL_(IPDLTest_CrossProcess, actorname, true) \
- IPDL_TEST_DECL_(IPDLTest_CrossThread, actorname, false) \
- IPDL_TEST_BODY_SEGUE_(actorname)
+#define IPDL_TEST_ON(mode, actorname, ...) \
+ IPDL_TEST_HEAD_(actorname, ##__VA_ARGS__) \
+ IPDL_TEST_DECL_##mode##_(actorname, ##__VA_ARGS__) \
+ IPDL_TEST_BODY_SEGUE_(actorname, ##__VA_ARGS__)
+
+// Declare an IPDL unit test that will run in both cross-thread and
+// cross-process configurations. See the documentation of IPDL_TEST_ON for more
+// info.
+#define IPDL_TEST(actorname, ...) IPDL_TEST_ON(ANY, actorname, ##__VA_ARGS__)
} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestAsyncReturns.ipdl b/ipc/ipdl/test/gtest/PTestAsyncReturns.ipdl
index 42ef17d1e8..5cae489b4a 100644
--- a/ipc/ipdl/test/cxx/PTestAsyncReturns.ipdl
+++ b/ipc/ipdl/test/gtest/PTestAsyncReturns.ipdl
@@ -1,12 +1,12 @@
-include "mozilla/_ipdltest/TestAsyncReturns.h";
+/* 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 {
-
-[ManualDealloc, ChildImpl="TestAsyncReturnsChild", ParentImpl="TestAsyncReturnsParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestAsyncReturns {
-
child:
async Ping() returns (bool one);
async NoReturn() returns (bool unused);
@@ -15,6 +15,5 @@ parent:
async Pong() returns (uint32_t param1, uint32_t param2);
};
-
} // namespace mozilla
} // namespace _ipdltest
diff --git a/ipc/ipdl/test/gtest/PTestCancel.ipdl b/ipc/ipdl/test/gtest/PTestCancel.ipdl
new file mode 100644
index 0000000000..b0af04bae7
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestCancel.ipdl
@@ -0,0 +1,39 @@
+/* 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 {
+
+[NestedUpTo=inside_sync, ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+sync protocol PTestCancel
+{
+ // Immediate Cancel: child sync function cancels immediately, both ends check after cancellation.
+child:
+ [Nested=inside_sync] sync ImmediateCancel();
+
+
+ // Nested Cancel: child nested sync function cancels
+child:
+ async StartNestedCancel();
+ [Nested=inside_sync] sync NestedCancel();
+parent:
+ [Nested=inside_sync] sync CallNestedCancel();
+
+
+ // Nested Cancel Parent: parent nested sync function cancels
+child:
+ [Nested=inside_sync] sync StartNestedCancelParent();
+parent:
+ [Nested=inside_sync] sync NestedCancelParent();
+
+
+// Common functions to check that sync messages still work.
+child:
+ [Nested=inside_sync] sync CheckChild() returns (uint32_t reply);
+parent:
+ [Nested=inside_sync] sync CheckParent() returns (uint32_t reply);
+};
+
+} // namespace _ipdltest
+} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestDataStructures.ipdl b/ipc/ipdl/test/gtest/PTestDataStructures.ipdl
index 64b6970666..7b2bdd3ced 100644
--- a/ipc/ipdl/test/cxx/PTestDataStructures.ipdl
+++ b/ipc/ipdl/test/gtest/PTestDataStructures.ipdl
@@ -2,12 +2,11 @@ include protocol PTestDataStructuresSub;
include PTestDataStructuresCommon;
include "mozilla/GfxMessageUtils.h";
-include "mozilla/_ipdltest/TestDataStructures.h";
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, ChildImpl="TestDataStructuresChild", ParentImpl="TestDataStructuresParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
sync protocol PTestDataStructures {
manages PTestDataStructuresSub;
@@ -19,44 +18,44 @@ child:
parent:
async __delete__();
- sync Test1(int[] i1)
+ sync TestArrayOfInt(int[] i1)
returns (int[] o1);
- sync Test2(PTestDataStructuresSub[] i1)
+ sync TestArrayOfActor(PTestDataStructuresSub[] i1)
returns (PTestDataStructuresSub[] o1);
- sync Test3(IntDouble i1,
+ sync TestUnion(IntDouble i1,
IntDouble i2)
returns (IntDouble o1,
IntDouble o2);
- sync Test4(IntDouble[] i1)
+ sync TestArrayOfUnion(IntDouble[] i1)
returns (IntDouble[] o1);
- sync Test5(IntDoubleArrays i1,
+ sync TestUnionWithArray(IntDoubleArrays i1,
IntDoubleArrays i2,
IntDoubleArrays i3)
returns (IntDoubleArrays o1,
IntDoubleArrays o2,
IntDoubleArrays o3);
- sync Test6(IntDoubleArrays[] i1)
+ sync TestArrayOfUnionWithArray(IntDoubleArrays[] i1)
returns (IntDoubleArrays[] o1);
- sync Test7_0(ActorWrapper a1)
+ sync TestStructWithActor(ActorWrapper a1)
returns (ActorWrapper o1);
- sync Test7(Actors i1,
+ sync TestUnionWithActors(Actors i1,
Actors i2,
Actors i3)
returns (Actors o1,
Actors o2,
Actors o3);
- sync Test8(Actors[] i1)
+ sync TestArrayOfUnionWithActors(Actors[] i1)
returns (Actors[] o1);
- sync Test9(Unions i1,
+ sync TestUnions(Unions i1,
Unions i2,
Unions i3,
Unions i4)
@@ -65,22 +64,22 @@ parent:
Unions o3,
Unions o4);
- sync Test10(Unions[] i1)
+ sync TestArrayOfUnions(Unions[] i1)
returns (Unions[] o1);
- sync Test11(SIntDouble i)
+ sync TestStruct(SIntDouble i)
returns (SIntDouble o);
- sync Test12(SIntDoubleArrays i)
+ sync TestStructWithArrays(SIntDoubleArrays i)
returns (SIntDoubleArrays o);
- sync Test13(SActors i)
+ sync TestStructWithActors(SActors i)
returns (SActors o);
- sync Test14(Structs i)
+ sync TestStructs(Structs i)
returns (Structs o);
- sync Test15(WithStructs i1,
+ sync TestUnionWithStructs(WithStructs i1,
WithStructs i2,
WithStructs i3,
WithStructs i4,
@@ -91,17 +90,15 @@ parent:
WithStructs o4,
WithStructs o5);
- sync Test16(WithUnions i)
+ sync TestStructWithUnions(WithUnions i)
returns (WithUnions o);
- sync Test17(Op[] ops);
+ sync TestUnionWithCxx(Op[] ops);
// test that the ParamTraits<nsTArray>::Read() workaround for
// nsTArray's incorrect memmove() semantics works properly
// (nsIntRegion isn't memmove()able)
- sync Test18(nsIntRegion[] ops);
-
- sync Dummy(ShmemUnion su) returns (ShmemUnion rsu);
+ sync TestNsIntRegion(nsIntRegion[] ops);
};
} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestDataStructuresCommon.ipdlh b/ipc/ipdl/test/gtest/PTestDataStructuresCommon.ipdlh
index 39d7f482b3..36549cc2c6 100644
--- a/ipc/ipdl/test/cxx/PTestDataStructuresCommon.ipdlh
+++ b/ipc/ipdl/test/gtest/PTestDataStructuresCommon.ipdlh
@@ -29,7 +29,7 @@ struct SIntDoubleArrays {
};
struct ActorWrapper {
- PTestDataStructuresSub actor;
+ nullable PTestDataStructuresSub actor;
};
union Actors {
diff --git a/ipc/ipdl/test/gtest/PTestDataStructuresSub.ipdl b/ipc/ipdl/test/gtest/PTestDataStructuresSub.ipdl
new file mode 100644
index 0000000000..f9f7d69411
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestDataStructuresSub.ipdl
@@ -0,0 +1,15 @@
+include protocol PTestDataStructures;
+
+namespace mozilla {
+namespace _ipdltest {
+
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+async protocol PTestDataStructuresSub {
+ manager PTestDataStructures;
+
+parent:
+ async __delete__();
+};
+
+} // namespace _ipdltest
+} // namespace mozilla
diff --git a/ipc/ipdl/test/gtest/PTestDescendant.ipdl b/ipc/ipdl/test/gtest/PTestDescendant.ipdl
new file mode 100644
index 0000000000..b8524babab
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestDescendant.ipdl
@@ -0,0 +1,22 @@
+include protocol PTestDescendantSub;
+include protocol PTestDescendantSubsub;
+
+namespace mozilla {
+namespace _ipdltest {
+
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+async protocol PTestDescendant {
+ manages PTestDescendantSub;
+child:
+ async PTestDescendantSub(nullable PTestDescendantSubsub dummy);
+
+ async Test(PTestDescendantSubsub a);
+
+ async __delete__();
+
+parent:
+ async Ok(PTestDescendantSubsub a);
+};
+
+}
+}
diff --git a/ipc/ipdl/test/gtest/PTestDescendantSub.ipdl b/ipc/ipdl/test/gtest/PTestDescendantSub.ipdl
new file mode 100644
index 0000000000..dd76801a43
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestDescendantSub.ipdl
@@ -0,0 +1,19 @@
+include protocol PTestDescendant;
+include protocol PTestDescendantSubsub;
+
+namespace mozilla {
+namespace _ipdltest {
+
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+async protocol PTestDescendantSub {
+ manager PTestDescendant;
+ manages PTestDescendantSubsub;
+
+child:
+ async __delete__();
+
+ async PTestDescendantSubsub();
+};
+
+}
+}
diff --git a/ipc/ipdl/test/gtest/PTestDescendantSubsub.ipdl b/ipc/ipdl/test/gtest/PTestDescendantSubsub.ipdl
new file mode 100644
index 0000000000..a2fac12d72
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestDescendantSubsub.ipdl
@@ -0,0 +1,14 @@
+include protocol PTestDescendantSub;
+
+namespace mozilla {
+namespace _ipdltest {
+
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+async protocol PTestDescendantSubsub {
+ manager PTestDescendantSub;
+child:
+ async __delete__();
+};
+
+}
+}
diff --git a/ipc/ipdl/test/gtest/PTestEndpointOpens.ipdl b/ipc/ipdl/test/gtest/PTestEndpointOpens.ipdl
new file mode 100644
index 0000000000..0ee1759b7f
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestEndpointOpens.ipdl
@@ -0,0 +1,22 @@
+/* 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 protocol PTestEndpointOpensOpened;
+
+namespace mozilla {
+namespace _ipdltest {
+
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+protocol PTestEndpointOpens {
+child:
+ async Start();
+
+parent:
+ async StartSubprotocol(Endpoint<PTestEndpointOpensOpenedParent> endpoint);
+
+ async __delete__();
+};
+
+} // namespace _ipdltest
+} // namespace mozilla
diff --git a/ipc/ipdl/test/gtest/PTestEndpointOpensOpened.ipdl b/ipc/ipdl/test/gtest/PTestEndpointOpensOpened.ipdl
new file mode 100644
index 0000000000..1baa662235
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestEndpointOpensOpened.ipdl
@@ -0,0 +1,22 @@
+/* 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 {
+
+// (Opens protocols can have different semantics than the endpoints
+// that opened them)
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+sync protocol PTestEndpointOpensOpened {
+child:
+ async Hi();
+
+parent:
+ async Hello();
+ sync HelloSync();
+ async __delete__();
+};
+
+} // namespace _ipdltest
+} // namespace mozilla
diff --git a/ipc/ipdl/test/gtest/PTestHangs.ipdl b/ipc/ipdl/test/gtest/PTestHangs.ipdl
new file mode 100644
index 0000000000..7df791cee6
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestHangs.ipdl
@@ -0,0 +1,20 @@
+/* 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/. */
+
+[MoveOnly] using mozilla::CrossProcessSemaphoreHandle from "mozilla/ipc/CrossProcessSemaphore.h";
+
+namespace mozilla {
+namespace _ipdltest {
+
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+sync protocol PTestHangs {
+parent:
+ sync Hang(uint32_t hangMode, CrossProcessSemaphoreHandle timeout);
+child:
+ async Start(uint32_t hangMode)
+ returns (bool detectedHang);
+};
+
+} // namespace _ipdltest
+} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestJSON.ipdl b/ipc/ipdl/test/gtest/PTestJSON.ipdl
index c785abe77a..2486e85378 100644
--- a/ipc/ipdl/test/cxx/PTestJSON.ipdl
+++ b/ipc/ipdl/test/gtest/PTestJSON.ipdl
@@ -1,6 +1,4 @@
-include protocol PTestHandle;
-
-include "mozilla/_ipdltest/TestJSON.h";
+include protocol PTestJSONHandle;
using struct mozilla::void_t from "mozilla/ipc/IPCCore.h";
using struct mozilla::null_t from "mozilla/ipc/IPCCore.h";
@@ -8,17 +6,13 @@ using struct mozilla::null_t from "mozilla/ipc/IPCCore.h";
namespace mozilla {
namespace _ipdltest {
-union Key {
-// int;
-// double;
- nsString;
-};
-
+[Comparable]
struct KeyValue {
- Key key;
+ nsString key;
JSONVariant value;
};
+[Comparable]
union JSONVariant {
void_t;
null_t;
@@ -26,20 +20,20 @@ union JSONVariant {
int;
double;
nsString;
- PTestHandle;
+ PTestJSONHandle;
KeyValue[];
JSONVariant[];
};
-[ManualDealloc, ChildImpl="TestJSONChild", ParentImpl="TestJSONParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
sync protocol PTestJSON {
- manages PTestHandle;
+ manages PTestJSONHandle;
child:
async Start();
parent:
- async PTestHandle();
+ async PTestJSONHandle();
sync Test(JSONVariant i)
returns (JSONVariant o);
async __delete__();
diff --git a/ipc/ipdl/test/cxx/PTestHandle.ipdl b/ipc/ipdl/test/gtest/PTestJSONHandle.ipdl
index b0a65f69c0..81bbb913b4 100644
--- a/ipc/ipdl/test/cxx/PTestHandle.ipdl
+++ b/ipc/ipdl/test/gtest/PTestJSONHandle.ipdl
@@ -1,12 +1,10 @@
include protocol PTestJSON;
-include "mozilla/_ipdltest/TestJSON.h";
-
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, ChildImpl="TestHandleChild", ParentImpl="TestHandleParent"]
-protocol PTestHandle {
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+protocol PTestJSONHandle {
manager PTestJSON;
child:
diff --git a/ipc/ipdl/test/cxx/PTestManyChildAllocs.ipdl b/ipc/ipdl/test/gtest/PTestManyChildAllocs.ipdl
index 6f8a0e1187..149e5aefab 100644
--- a/ipc/ipdl/test/cxx/PTestManyChildAllocs.ipdl
+++ b/ipc/ipdl/test/gtest/PTestManyChildAllocs.ipdl
@@ -1,20 +1,16 @@
include protocol PTestManyChildAllocsSub;
-include "mozilla/_ipdltest/TestManyChildAllocs.h";
-
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, ChildImpl="TestManyChildAllocsChild", ParentImpl="TestManyChildAllocsParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestManyChildAllocs {
manages PTestManyChildAllocsSub;
-
child:
async Go(); // start allocating
parent:
async Done();
-
async PTestManyChildAllocsSub();
};
diff --git a/ipc/ipdl/test/cxx/PTestManyChildAllocsSub.ipdl b/ipc/ipdl/test/gtest/PTestManyChildAllocsSub.ipdl
index e20c2badfd..4a34af2e52 100644
--- a/ipc/ipdl/test/cxx/PTestManyChildAllocsSub.ipdl
+++ b/ipc/ipdl/test/gtest/PTestManyChildAllocsSub.ipdl
@@ -1,11 +1,9 @@
include protocol PTestManyChildAllocs;
-include "mozilla/_ipdltest/TestManyChildAllocs.h";
-
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, ChildImpl="TestManyChildAllocsSubChild", ParentImpl="TestManyChildAllocsSubParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestManyChildAllocsSub {
manager PTestManyChildAllocs;
@@ -14,8 +12,6 @@ child:
parent:
async Hello();
-
- // empty
};
} // namespace _ipdltest
diff --git a/ipc/ipdl/test/gtest/PTestMostNested.ipdl b/ipc/ipdl/test/gtest/PTestMostNested.ipdl
new file mode 100644
index 0000000000..2c6750137c
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestMostNested.ipdl
@@ -0,0 +1,23 @@
+/* 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 {
+
+[ChildProc=any, NestedUpTo=inside_cpow, ChildImpl=virtual, ParentImpl=virtual]
+sync protocol PTestMostNested
+{
+parent:
+ [Nested=inside_cpow] async Msg1();
+ [Nested=inside_sync] sync Msg2();
+ [Nested=inside_cpow] async Msg3();
+ [Nested=inside_cpow] sync Msg4();
+
+child:
+ async Start();
+ [Nested=inside_sync] sync StartInner();
+};
+
+}
+}
diff --git a/ipc/ipdl/test/cxx/PTestMultiMgrs.ipdl b/ipc/ipdl/test/gtest/PTestMultiMgrs.ipdl
index 65272fa991..80de57459d 100644
--- a/ipc/ipdl/test/cxx/PTestMultiMgrs.ipdl
+++ b/ipc/ipdl/test/gtest/PTestMultiMgrs.ipdl
@@ -1,12 +1,10 @@
include protocol PTestMultiMgrsLeft;
include protocol PTestMultiMgrsRight;
-include "mozilla/_ipdltest/TestMultiMgrs.h";
-
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, ChildImpl="TestMultiMgrsChild", ParentImpl="TestMultiMgrsParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestMultiMgrs {
manages PTestMultiMgrsLeft;
manages PTestMultiMgrsRight;
diff --git a/ipc/ipdl/test/cxx/PTestMultiMgrsBottom.ipdl b/ipc/ipdl/test/gtest/PTestMultiMgrsBottom.ipdl
index be85b1547b..03bbc7f886 100644
--- a/ipc/ipdl/test/cxx/PTestMultiMgrsBottom.ipdl
+++ b/ipc/ipdl/test/gtest/PTestMultiMgrsBottom.ipdl
@@ -1,12 +1,10 @@
include protocol PTestMultiMgrsLeft;
include protocol PTestMultiMgrsRight;
-include "mozilla/_ipdltest/TestMultiMgrs.h";
-
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, ChildImpl="TestMultiMgrsBottomChild", ParentImpl="TestMultiMgrsBottomParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestMultiMgrsBottom {
manager PTestMultiMgrsLeft or PTestMultiMgrsRight;
diff --git a/ipc/ipdl/test/cxx/PTestMultiMgrsLeft.ipdl b/ipc/ipdl/test/gtest/PTestMultiMgrsLeft.ipdl
index 3796ff315e..ee62fc3487 100644
--- a/ipc/ipdl/test/cxx/PTestMultiMgrsLeft.ipdl
+++ b/ipc/ipdl/test/gtest/PTestMultiMgrsLeft.ipdl
@@ -1,12 +1,10 @@
include protocol PTestMultiMgrs;
include protocol PTestMultiMgrsBottom;
-include "mozilla/_ipdltest/TestMultiMgrs.h";
-
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, ChildImpl="TestMultiMgrsLeftChild", ParentImpl="TestMultiMgrsLeftParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestMultiMgrsLeft {
manager PTestMultiMgrs;
diff --git a/ipc/ipdl/test/cxx/PTestMultiMgrsRight.ipdl b/ipc/ipdl/test/gtest/PTestMultiMgrsRight.ipdl
index 174ada5ca3..202f60247e 100644
--- a/ipc/ipdl/test/cxx/PTestMultiMgrsRight.ipdl
+++ b/ipc/ipdl/test/gtest/PTestMultiMgrsRight.ipdl
@@ -1,12 +1,10 @@
include protocol PTestMultiMgrs;
include protocol PTestMultiMgrsBottom;
-include "mozilla/_ipdltest/TestMultiMgrs.h";
-
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, ChildImpl="TestMultiMgrsRightChild", ParentImpl="TestMultiMgrsRightParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestMultiMgrsRight {
manager PTestMultiMgrs;
diff --git a/ipc/ipdl/test/cxx/PTestSelfManage.ipdl b/ipc/ipdl/test/gtest/PTestSelfManage.ipdl
index 19f81a5ae7..e7dc077808 100644
--- a/ipc/ipdl/test/cxx/PTestSelfManage.ipdl
+++ b/ipc/ipdl/test/gtest/PTestSelfManage.ipdl
@@ -1,12 +1,9 @@
include protocol PTestSelfManageRoot;
-include "mozilla/_ipdltest/TestSelfManageRoot.h";
-
namespace mozilla {
namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestSelfManageChild", ParentImpl="TestSelfManageParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestSelfManage {
manager PTestSelfManageRoot or PTestSelfManage;
manages PTestSelfManage;
@@ -16,6 +13,5 @@ child:
async __delete__();
};
-
} // namespace mozilla
} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestSelfManageRoot.ipdl b/ipc/ipdl/test/gtest/PTestSelfManageRoot.ipdl
index 29953228af..37e8218720 100644
--- a/ipc/ipdl/test/cxx/PTestSelfManageRoot.ipdl
+++ b/ipc/ipdl/test/gtest/PTestSelfManageRoot.ipdl
@@ -1,12 +1,9 @@
include protocol PTestSelfManage;
-include "mozilla/_ipdltest/TestSelfManageRoot.h";
-
namespace mozilla {
namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestSelfManageRootChild", ParentImpl="TestSelfManageRootParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestSelfManageRoot {
manages PTestSelfManage;
@@ -15,6 +12,5 @@ child:
async __delete__();
};
-
} // namespace mozilla
} // namespace _ipdltest
diff --git a/ipc/ipdl/test/cxx/PTestShmem.ipdl b/ipc/ipdl/test/gtest/PTestShmem.ipdl
index 7eb6dfdc36..33eeabffdf 100644
--- a/ipc/ipdl/test/cxx/PTestShmem.ipdl
+++ b/ipc/ipdl/test/gtest/PTestShmem.ipdl
@@ -1,9 +1,7 @@
-include "mozilla/_ipdltest/TestShmem.h";
-
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, ChildImpl="TestShmemChild", ParentImpl="TestShmemParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
protocol PTestShmem {
child:
async Give(Shmem mem, Shmem unsafe, uint32_t expectedSize);
diff --git a/ipc/ipdl/test/cxx/PTestSyncError.ipdl b/ipc/ipdl/test/gtest/PTestSyncError.ipdl
index a4b6d428e8..e549bde919 100644
--- a/ipc/ipdl/test/cxx/PTestSyncError.ipdl
+++ b/ipc/ipdl/test/gtest/PTestSyncError.ipdl
@@ -1,10 +1,7 @@
-include "mozilla/_ipdltest/TestSyncError.h";
-
namespace mozilla {
namespace _ipdltest {
-
-[ManualDealloc, ChildImpl="TestSyncErrorChild", ParentImpl="TestSyncErrorParent"]
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
sync protocol PTestSyncError {
child:
@@ -15,6 +12,5 @@ parent:
async __delete__();
};
-
} // namespace mozilla
} // namespace _ipdltest
diff --git a/ipc/ipdl/test/gtest/PTestUniquePtrIPC.ipdl b/ipc/ipdl/test/gtest/PTestUniquePtrIPC.ipdl
new file mode 100644
index 0000000000..b55d8f19d1
--- /dev/null
+++ b/ipc/ipdl/test/gtest/PTestUniquePtrIPC.ipdl
@@ -0,0 +1,17 @@
+namespace mozilla {
+namespace _ipdltest {
+
+struct DummyStruct {
+ int x;
+};
+
+[ChildProc=any, ChildImpl=virtual, ParentImpl=virtual]
+protocol PTestUniquePtrIPC {
+child:
+ async TestMessage(UniquePtr<int> a1, UniquePtr<DummyStruct> a2,
+ DummyStruct a3, UniquePtr<int> a4);
+ async TestSendReference(UniquePtr<DummyStruct> a);
+};
+
+} // namespace _ipdltest
+} // namespace mozilla
diff --git a/ipc/ipdl/test/cxx/PTestUrgency.ipdl b/ipc/ipdl/test/gtest/PTestUrgency.ipdl
index 7653d12102..ee9b44b543 100644
--- a/ipc/ipdl/test/cxx/PTestUrgency.ipdl
+++ b/ipc/ipdl/test/gtest/PTestUrgency.ipdl
@@ -1,9 +1,7 @@
-include "mozilla/_ipdltest/TestUrgency.h";
-
namespace mozilla {
namespace _ipdltest {
-[ManualDealloc, NestedUpTo=inside_cpow, ChildImpl="TestUrgencyChild", ParentImpl="TestUrgencyParent"]
+[ChildProc=any, NestedUpTo=inside_cpow, ChildImpl=virtual, ParentImpl=virtual]
sync protocol PTestUrgency
{
parent:
diff --git a/ipc/ipdl/test/gtest/TestAsyncReturns.cpp b/ipc/ipdl/test/gtest/TestAsyncReturns.cpp
new file mode 100644
index 0000000000..960a2954db
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestAsyncReturns.cpp
@@ -0,0 +1,77 @@
+/* -*- 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/. */
+
+/*
+ * These tests ensure that async function return values work as expected.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestAsyncReturnsChild.h"
+#include "mozilla/_ipdltest/PTestAsyncReturnsParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+static uint32_t sMagic1 = 0x105b59fb;
+static uint32_t sMagic2 = 0x09b6f5e3;
+
+class TestAsyncReturnsChild : public PTestAsyncReturnsChild {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestAsyncReturnsChild, override)
+ private:
+ IPCResult RecvPing(PingResolver&& resolve) final override {
+ SendPong(
+ [resolve](const std::tuple<uint32_t, uint32_t>& aParam) {
+ EXPECT_EQ(std::get<0>(aParam), sMagic1);
+ EXPECT_EQ(std::get<1>(aParam), sMagic2);
+ resolve(true);
+ },
+ [](ResponseRejectReason&& aReason) { FAIL() << "sending Pong"; });
+ return IPC_OK();
+ }
+
+ IPCResult RecvNoReturn(NoReturnResolver&& resolve) final override {
+ // Not calling `resolve` intentionally
+ return IPC_OK();
+ }
+
+ ~TestAsyncReturnsChild() = default;
+};
+
+class TestAsyncReturnsParent : public PTestAsyncReturnsParent {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestAsyncReturnsParent, override)
+ private:
+ IPCResult RecvPong(PongResolver&& resolve) final override {
+ resolve(std::tuple<const uint32_t&, const uint32_t&>(sMagic1, sMagic2));
+ return IPC_OK();
+ }
+
+ ~TestAsyncReturnsParent() = default;
+};
+
+IPDL_TEST(TestAsyncReturns, NoReturn) {
+ mActor->SendNoReturn(
+ [](bool unused) { FAIL() << "resolve handler should not be called"; },
+ [=](ResponseRejectReason&& aReason) {
+ if (aReason != ResponseRejectReason::ResolverDestroyed) {
+ FAIL() << "reject with wrong reason";
+ }
+ mActor->Close();
+ });
+}
+
+IPDL_TEST(TestAsyncReturns, PingPong) {
+ mActor->SendPing(
+ [=](bool one) {
+ EXPECT_TRUE(one);
+ mActor->Close();
+ },
+ [](ResponseRejectReason&& aReason) { FAIL() << "sending Ping"; });
+}
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestCancel.cpp b/ipc/ipdl/test/gtest/TestCancel.cpp
new file mode 100644
index 0000000000..79f31751dd
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestCancel.cpp
@@ -0,0 +1,126 @@
+/* -*- 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 that IPC channel transaction cancellation (which applies to nested sync
+ * messages) works as expected.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestCancelChild.h"
+#include "mozilla/_ipdltest/PTestCancelParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+class TestCancelParent : public PTestCancelParent {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestCancelParent, override)
+ private:
+ IPCResult RecvCallNestedCancel() final override {
+ EXPECT_FALSE(SendNestedCancel()) << "SendNestedCancel should fail";
+ EXPECT_EQ(GetIPCChannel()->LastSendError(),
+ SyncSendError::CancelledAfterSend)
+ << "SendNestedCancel should be cancelled";
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvNestedCancelParent() final override {
+ GetIPCChannel()->CancelCurrentTransaction();
+ return IPC_OK();
+ }
+
+ IPCResult RecvCheckParent(uint32_t* reply) final override {
+ *reply = 42;
+ return IPC_OK();
+ }
+
+ ~TestCancelParent() = default;
+};
+
+class TestCancelChild : public PTestCancelChild {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestCancelChild, override)
+ private:
+ IPCResult RecvImmediateCancel() final override {
+ GetIPCChannel()->CancelCurrentTransaction();
+
+ uint32_t value = 0;
+ EXPECT_FALSE(SendCheckParent(&value)) << "channel should be closing";
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvStartNestedCancel() final override {
+ EXPECT_FALSE(SendCallNestedCancel());
+
+ Close();
+ return IPC_OK();
+ }
+
+ IPCResult RecvNestedCancel() final override {
+ GetIPCChannel()->CancelCurrentTransaction();
+
+ uint32_t value = 0;
+ EXPECT_TRUE(SendCheckParent(&value)) << "channel should be closing";
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvStartNestedCancelParent() final override {
+ EXPECT_FALSE(SendNestedCancelParent())
+ << "SendNestedCancelParent should fail";
+ EXPECT_EQ(GetIPCChannel()->LastSendError(),
+ SyncSendError::CancelledAfterSend)
+ << "SendNestedCancelParent should be cancelled";
+
+ uint32_t value = 0;
+ EXPECT_FALSE(SendCheckParent(&value));
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvCheckChild(uint32_t* reply) final override {
+ *reply = 42;
+ return IPC_OK();
+ }
+
+ ~TestCancelChild() = default;
+};
+
+// Nested sync messages can only be received on the main thread, so threaded
+// tests can't be run (the child actor won't be on the main thread).
+
+IPDL_TEST_ON(CROSSPROCESS, TestCancel, ImmediateCancel) {
+ EXPECT_FALSE(mActor->SendImmediateCancel()) << "should immediately cancel";
+ EXPECT_EQ(mActor->GetIPCChannel()->LastSendError(),
+ SyncSendError::CancelledAfterSend);
+
+ uint32_t value = 0;
+ EXPECT_TRUE(mActor->SendCheckChild(&value));
+ EXPECT_EQ(value, (uint32_t)42);
+
+ mActor->Close();
+}
+
+IPDL_TEST_ON(CROSSPROCESS, TestCancel, NestedCancel) {
+ EXPECT_TRUE(mActor->SendStartNestedCancel());
+}
+
+IPDL_TEST_ON(CROSSPROCESS, TestCancel, NestedCancelParent) {
+ EXPECT_FALSE(mActor->SendStartNestedCancelParent())
+ << "StartNestedCancelParent should be cancelled";
+
+ uint32_t value = 0;
+ EXPECT_TRUE(mActor->SendCheckChild(&value));
+ EXPECT_EQ(value, (uint32_t)42);
+
+ mActor->Close();
+}
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestDataStructures.cpp b/ipc/ipdl/test/gtest/TestDataStructures.cpp
new file mode 100644
index 0000000000..b7f6a7ae95
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestDataStructures.cpp
@@ -0,0 +1,864 @@
+/* -*- 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 many combinations of data structures (both in argument and return
+ * position) to ensure they are transmitted correctly.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestDataStructuresChild.h"
+#include "mozilla/_ipdltest/PTestDataStructuresParent.h"
+#include "mozilla/_ipdltest/PTestDataStructuresSubChild.h"
+#include "mozilla/_ipdltest/PTestDataStructuresSubParent.h"
+
+#include "mozilla/Unused.h"
+
+using namespace mozilla::ipc;
+
+using RegionArray = nsTArray<nsIntRegion>;
+
+namespace mozilla::_ipdltest {
+
+static const uint32_t nactors = 10;
+
+class TestDataStructuresSubParent : public PTestDataStructuresSubParent {
+ NS_INLINE_DECL_REFCOUNTING(TestDataStructuresSubParent, override)
+
+ public:
+ explicit TestDataStructuresSubParent(uint32_t i) : mI(i) {}
+ uint32_t mI;
+
+ private:
+ ~TestDataStructuresSubParent() = default;
+};
+
+class TestDataStructuresSubChild : public PTestDataStructuresSubChild {
+ NS_INLINE_DECL_REFCOUNTING(TestDataStructuresSubChild, override)
+
+ public:
+ explicit TestDataStructuresSubChild(uint32_t i) : mI(i) {}
+ uint32_t mI;
+
+ private:
+ ~TestDataStructuresSubChild() = default;
+};
+
+inline static TestDataStructuresSubParent& Cast(
+ PTestDataStructuresSubParent* a) {
+ return *static_cast<TestDataStructuresSubParent*>(a);
+}
+
+class TestDataStructuresParent : public PTestDataStructuresParent {
+ NS_INLINE_DECL_REFCOUNTING(TestDataStructuresParent, override)
+
+ public:
+ nsTArray<NotNull<
+ SideVariant<PTestDataStructuresSubParent*, PTestDataStructuresSubChild*>>>
+ kids;
+
+ private:
+ IPCResult RecvTestArrayOfInt(nsTArray<int>&& ia,
+ nsTArray<int>* oa) final override {
+ EXPECT_EQ(5u, ia.Length());
+ for (int i = 0; i < 5; ++i) EXPECT_EQ(i, ia[i]);
+
+ *oa = std::move(ia);
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestArrayOfActor(
+ nsTArray<NotNull<PTestDataStructuresSubParent*>>&& i1,
+ nsTArray<NotNull<PTestDataStructuresSubParent*>>* o1) final override {
+ EXPECT_EQ(nactors, i1.Length());
+ for (uint32_t i = 0; i < i1.Length(); ++i) EXPECT_EQ(i, Cast(i1[i]).mI);
+ *o1 = std::move(i1);
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestUnion(const IntDouble& i1, const IntDouble& i2,
+ IntDouble* o1, IntDouble* o2) final override {
+ EXPECT_EQ(42, i1.get_int());
+ EXPECT_EQ(4.0, i2.get_double());
+
+ *o1 = i1;
+ *o2 = i2;
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestArrayOfUnion(nsTArray<IntDouble>&& i1,
+ nsTArray<IntDouble>* o1) final override {
+ EXPECT_EQ(4u, i1.Length());
+ EXPECT_EQ(1, i1[0].get_int());
+ EXPECT_EQ(2.0, i1[1].get_double());
+ EXPECT_EQ(3, i1[2].get_int());
+ EXPECT_EQ(4.0, i1[3].get_double());
+
+ *o1 = std::move(i1);
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestUnionWithArray(const IntDoubleArrays& i1,
+ const IntDoubleArrays& i2,
+ const IntDoubleArrays& i3,
+ IntDoubleArrays* o1, IntDoubleArrays* o2,
+ IntDoubleArrays* o3) final override {
+ EXPECT_EQ(42, i1.get_int());
+
+ const nsTArray<int>& i2a = i2.get_ArrayOfint();
+ EXPECT_EQ(3u, i2a.Length());
+ EXPECT_EQ(1, i2a[0]);
+ EXPECT_EQ(2, i2a[1]);
+ EXPECT_EQ(3, i2a[2]);
+
+ const nsTArray<double>& i3a = i3.get_ArrayOfdouble();
+ EXPECT_EQ(3u, i3a.Length());
+ EXPECT_EQ(1.0, i3a[0]);
+ EXPECT_EQ(2.0, i3a[1]);
+ EXPECT_EQ(3.0, i3a[2]);
+
+ *o1 = i1;
+ *o2 = i2a;
+ *o3 = i3a;
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestArrayOfUnionWithArray(
+ nsTArray<IntDoubleArrays>&& i1,
+ nsTArray<IntDoubleArrays>* o1) final override {
+ EXPECT_EQ(3u, i1.Length());
+
+ IntDoubleArrays id1(i1[0]);
+ EXPECT_EQ(42, id1.get_int());
+
+ nsTArray<int> i2a = i1[1].get_ArrayOfint().Clone();
+ EXPECT_EQ(3u, i2a.Length());
+ EXPECT_EQ(1, i2a[0]);
+ EXPECT_EQ(2, i2a[1]);
+ EXPECT_EQ(3, i2a[2]);
+
+ nsTArray<double> i3a = i1[2].get_ArrayOfdouble().Clone();
+ EXPECT_EQ(3u, i3a.Length());
+ EXPECT_EQ(1.0, i3a[0]);
+ EXPECT_EQ(2.0, i3a[1]);
+ EXPECT_EQ(3.0, i3a[2]);
+
+ o1->AppendElement(id1);
+ o1->AppendElement(IntDoubleArrays(i2a));
+ o1->AppendElement(IntDoubleArrays(i3a));
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestStructWithActor(const ActorWrapper& i1,
+ ActorWrapper* o1) final override {
+ EXPECT_FALSE(i1.actor().IsChild()) << "child side should be empty";
+
+ EXPECT_EQ(i1.actor(), kids[0])
+ << "should have got back same actor on parent side";
+
+ o1->actor() = kids[0];
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestUnionWithActors(const Actors& i1, const Actors& i2,
+ const Actors& i3, Actors* o1, Actors* o2,
+ Actors* o3) final override {
+ EXPECT_EQ(42, i1.get_int());
+
+ nsTArray<int> i2a = i2.get_ArrayOfint().Clone();
+ EXPECT_EQ(3u, i2a.Length());
+ EXPECT_EQ(1, i2a[0]);
+ EXPECT_EQ(2, i2a[1]);
+ EXPECT_EQ(3, i2a[2]);
+
+ const auto& a = i3.get_ArrayOfPTestDataStructuresSub();
+ EXPECT_EQ(a.Length(), kids.Length());
+ for (size_t i = 0; i < a.Length(); ++i) {
+ EXPECT_EQ(a[i], kids[i]);
+ }
+
+ *o1 = 42;
+ *o2 = i2a;
+ *o3 = kids.Clone();
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestArrayOfUnionWithActors(
+ nsTArray<Actors>&& i1, nsTArray<Actors>* o1) final override {
+ EXPECT_EQ(3u, i1.Length());
+ EXPECT_EQ(42, i1[0].get_int());
+
+ const nsTArray<int>& i2a = i1[1].get_ArrayOfint();
+ EXPECT_EQ(3u, i2a.Length());
+ EXPECT_EQ(1, i2a[0]);
+ EXPECT_EQ(2, i2a[1]);
+ EXPECT_EQ(3, i2a[2]);
+
+ EXPECT_EQ(kids, i1[2].get_ArrayOfPTestDataStructuresSub());
+
+ *o1 = std::move(i1);
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestUnions(const Unions& i1, const Unions& i2, const Unions& i3,
+ const Unions& i4, Unions* o1, Unions* o2, Unions* o3,
+ Unions* o4) final override {
+ EXPECT_EQ(42, i1.get_int());
+
+ const nsTArray<int>& i2a = i2.get_ArrayOfint();
+ EXPECT_EQ(3u, i2a.Length());
+ EXPECT_EQ(1, i2a[0]);
+ EXPECT_EQ(2, i2a[1]);
+ EXPECT_EQ(3, i2a[2]);
+
+ EXPECT_EQ(kids, i3.get_ArrayOfPTestDataStructuresSub());
+
+ const auto& i4a =
+ i4.get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSub();
+ EXPECT_EQ(kids, i4a);
+
+ *o1 = i1;
+ *o2 = i2;
+ *o3 = i3;
+ *o4 = i4;
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestArrayOfUnions(nsTArray<Unions>&& i1,
+ nsTArray<Unions>* o1) final override {
+ EXPECT_EQ(42, i1[0].get_int());
+
+ const nsTArray<int>& i2a = i1[1].get_ArrayOfint();
+ EXPECT_EQ(3u, i2a.Length());
+ EXPECT_EQ(1, i2a[0]);
+ EXPECT_EQ(2, i2a[1]);
+ EXPECT_EQ(3, i2a[2]);
+
+ EXPECT_EQ(kids, i1[2].get_ArrayOfPTestDataStructuresSub());
+
+ const auto& i4a =
+ i1[3].get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSub();
+ EXPECT_EQ(kids, i4a);
+
+ *o1 = std::move(i1);
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestStruct(const SIntDouble& i, SIntDouble* o) final override {
+ EXPECT_EQ(1, i.i());
+ EXPECT_EQ(2.0, i.d());
+ *o = i;
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestStructWithArrays(const SIntDoubleArrays& i,
+ SIntDoubleArrays* o) final override {
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+
+ nsTArray<double> ad;
+ ad.AppendElement(.5);
+ ad.AppendElement(1.0);
+ ad.AppendElement(2.0);
+
+ EXPECT_EQ(42, i.i());
+ EXPECT_EQ(ai, i.ai());
+ EXPECT_EQ(ad, i.ad());
+
+ *o = i;
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestStructWithActors(const SActors& i,
+ SActors* o) final override {
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+
+ EXPECT_EQ(42, i.i());
+ EXPECT_EQ(ai, i.ai());
+ EXPECT_EQ(kids, i.ap());
+
+ *o = i;
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestStructs(const Structs& i, Structs* o) final override {
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+
+ EXPECT_EQ(42, i.i());
+ EXPECT_EQ(ai, i.ai());
+ EXPECT_EQ(kids, i.ap());
+
+ const SActors& ia = i.aa()[0];
+ EXPECT_EQ(42, ia.i());
+ EXPECT_EQ(ai, ia.ai());
+ EXPECT_EQ(kids, ia.ap());
+
+ *o = i;
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestUnionWithStructs(
+ const WithStructs& i1, const WithStructs& i2, const WithStructs& i3,
+ const WithStructs& i4, const WithStructs& i5, WithStructs* o1,
+ WithStructs* o2, WithStructs* o3, WithStructs* o4,
+ WithStructs* o5) final override {
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+
+ EXPECT_EQ(i1, int(42));
+ EXPECT_EQ(i2.get_ArrayOfint(), ai);
+ EXPECT_EQ(i3.get_ArrayOfPTestDataStructuresSub(), kids);
+
+ const SActors& ia = i4.get_ArrayOfSActors()[0];
+ EXPECT_EQ(42, ia.i());
+ EXPECT_EQ(ai, ia.ai());
+ EXPECT_EQ(kids, ia.ap());
+
+ const Structs& is = i5.get_ArrayOfStructs()[0];
+ EXPECT_EQ(42, is.i());
+ EXPECT_EQ(ai, is.ai());
+ EXPECT_EQ(kids, is.ap());
+
+ const SActors& isa = is.aa()[0];
+ EXPECT_EQ(42, isa.i());
+ EXPECT_EQ(ai, isa.ai());
+ EXPECT_EQ(kids, isa.ap());
+
+ *o1 = i1;
+ *o2 = i2;
+ *o3 = i3;
+ *o4 = i4;
+ *o5 = i5;
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestStructWithUnions(const WithUnions& i,
+ WithUnions* o) final override {
+ EXPECT_EQ(i.i(), 42);
+
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+ EXPECT_EQ(ai, i.ai());
+
+ EXPECT_EQ(i.ap(), kids);
+
+ EXPECT_EQ(kids, i.aa()[0].get_ArrayOfPTestDataStructuresSub());
+
+ const nsTArray<Unions>& iau = i.au();
+ EXPECT_EQ(iau[0], 42);
+ EXPECT_EQ(ai, iau[1].get_ArrayOfint());
+ EXPECT_EQ(kids, iau[2].get_ArrayOfPTestDataStructuresSub());
+ EXPECT_EQ(
+ kids,
+ iau[3].get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSub());
+
+ *o = i;
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestUnionWithCxx(nsTArray<Op>&& sa) final override {
+ EXPECT_EQ(sa.Length(), (size_t)1);
+ EXPECT_EQ(Op::TSetAttrs, sa[0].type());
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestNsIntRegion(RegionArray&& ra) final override {
+ for (RegionArray::index_type i = 0; i < ra.Length(); ++i) {
+ // if |ra| has been realloc()d and given a different allocator
+ // chunk, this loop will nondeterministically crash or iloop.
+ for (auto iter = ra[i].RectIter(); !iter.Done(); iter.Next()) {
+ Unused << iter.Get();
+ }
+ }
+ return IPC_OK();
+ }
+
+ ~TestDataStructuresParent() = default;
+};
+
+class TestDataStructuresChild : public PTestDataStructuresChild {
+ NS_INLINE_DECL_REFCOUNTING(TestDataStructuresChild, override)
+
+ private:
+ nsTArray<NotNull<
+ SideVariant<PTestDataStructuresSubParent*, PTestDataStructuresSubChild*>>>
+ kids;
+ nsTArray<NotNull<PTestDataStructuresSubChild*>> kidsDirect;
+
+ already_AddRefed<PTestDataStructuresSubChild>
+ AllocPTestDataStructuresSubChild(const int& i) final override {
+ auto child = MakeRefPtr<TestDataStructuresSubChild>(i);
+ kids.AppendElement(WrapNotNull(child));
+ kidsDirect.AppendElement(WrapNotNull(child));
+ return child.forget();
+ }
+
+ IPCResult RecvStart() final override {
+ TestArrayOfInt();
+ TestArrayOfActor();
+ TestUnion();
+ TestArrayOfUnion();
+ TestUnionWithArray();
+ TestArrayOfUnionWithArray();
+ TestStructWithActor();
+ TestUnionWithActors();
+ TestArrayOfUnionWithActors();
+ TestUnions();
+ TestArrayOfUnions();
+ TestStruct();
+ TestStructWithArrays();
+ TestStructWithActors();
+ TestStructs();
+ TestUnionWithStructs();
+ TestStructWithUnions();
+ TestUnionWithCxx();
+ TestNsIntRegion();
+
+ auto actors = kidsDirect.Clone();
+ for (auto& actor : actors) {
+ EXPECT_TRUE(PTestDataStructuresSubChild::Send__delete__(actor));
+ }
+
+ Close();
+
+ return IPC_OK();
+ }
+
+ void TestArrayOfInt() {
+ nsTArray<int> ia;
+
+ for (int i = 0; i < 5; ++i) ia.AppendElement(i);
+
+ nsTArray<int> oa;
+ EXPECT_TRUE(SendTestArrayOfInt(ia, &oa));
+
+ EXPECT_EQ(ia, oa);
+ }
+
+ void TestArrayOfActor() {
+ nsTArray<NotNull<PTestDataStructuresSubChild*>> oa;
+ EXPECT_TRUE(SendTestArrayOfActor(kidsDirect, &oa));
+ EXPECT_EQ(kidsDirect, oa);
+ }
+
+ void TestUnion() {
+ int i1i = 42;
+ double i2d = 4.0;
+ IntDouble i1(i1i);
+ IntDouble i2(i2d);
+ IntDouble o1, o2;
+
+ SendTestUnion(i1, i2, &o1, &o2);
+
+ EXPECT_EQ(i1i, o1.get_int());
+ EXPECT_EQ(i2d, o2.get_double());
+ }
+
+ void TestArrayOfUnion() {
+ nsTArray<IntDouble> i1;
+ i1.AppendElement(IntDouble(int(1)));
+ i1.AppendElement(IntDouble(2.0));
+ i1.AppendElement(IntDouble(int(3)));
+ i1.AppendElement(IntDouble(4.0));
+
+ nsTArray<IntDouble> o1;
+ EXPECT_TRUE(SendTestArrayOfUnion(i1, &o1));
+
+ // TODO Union::operator==()
+ EXPECT_EQ(i1.Length(), o1.Length());
+ EXPECT_EQ(1, o1[0].get_int());
+ EXPECT_EQ(2.0, o1[1].get_double());
+ EXPECT_EQ(3, o1[2].get_int());
+ EXPECT_EQ(4.0, o1[3].get_double());
+ }
+
+ void TestUnionWithArray() {
+ IntDoubleArrays i1(int(42));
+ nsTArray<int> i2;
+ i2.AppendElement(1);
+ i2.AppendElement(2);
+ i2.AppendElement(3);
+ nsTArray<double> i3;
+ i3.AppendElement(1.0);
+ i3.AppendElement(2.0);
+ i3.AppendElement(3.0);
+
+ IntDoubleArrays o1, o2, o3;
+ EXPECT_TRUE(SendTestUnionWithArray(i1, IntDoubleArrays(i2),
+ IntDoubleArrays(i3), &o1, &o2, &o3));
+
+ EXPECT_EQ(42, o1.get_int());
+ EXPECT_EQ(i2, o2.get_ArrayOfint());
+ EXPECT_EQ(i3, o3.get_ArrayOfdouble());
+ }
+
+ void TestArrayOfUnionWithArray() {
+ IntDoubleArrays id1(int(42));
+ nsTArray<int> id2;
+ id2.AppendElement(1);
+ id2.AppendElement(2);
+ id2.AppendElement(3);
+ nsTArray<double> id3;
+ id3.AppendElement(1.0);
+ id3.AppendElement(2.0);
+ id3.AppendElement(3.0);
+
+ nsTArray<IntDoubleArrays> i1;
+ i1.AppendElement(id1);
+ i1.AppendElement(IntDoubleArrays(id2));
+ i1.AppendElement(IntDoubleArrays(id3));
+
+ nsTArray<IntDoubleArrays> o1;
+ EXPECT_TRUE(SendTestArrayOfUnionWithArray(i1, &o1));
+
+ EXPECT_EQ(3u, o1.Length());
+ IntDoubleArrays od1(o1[0]);
+ nsTArray<int> od2 = o1[1].get_ArrayOfint().Clone();
+ nsTArray<double> od3 = o1[2].get_ArrayOfdouble().Clone();
+
+ EXPECT_EQ(42, od1.get_int());
+ EXPECT_EQ(id2, od2);
+ EXPECT_EQ(id3, od3);
+ }
+
+ void TestStructWithActor() {
+ ActorWrapper iaw(kidsDirect[0]);
+
+ ActorWrapper oaw;
+ EXPECT_TRUE(SendTestStructWithActor(iaw, &oaw));
+
+ EXPECT_TRUE(oaw.actor().IsChild());
+ EXPECT_EQ(oaw.actor().AsChild(), kidsDirect[0]);
+ }
+
+ void TestUnionWithActors() {
+ Actors i1(42);
+ nsTArray<int> i2a;
+ i2a.AppendElement(1);
+ i2a.AppendElement(2);
+ i2a.AppendElement(3);
+
+ Actors o1, o2, o3;
+ EXPECT_TRUE(
+ SendTestUnionWithActors(i1, Actors(i2a), Actors(kids), &o1, &o2, &o3));
+
+ EXPECT_EQ(42, o1.get_int());
+ EXPECT_EQ(i2a, o2.get_ArrayOfint());
+ EXPECT_EQ(kids, o3.get_ArrayOfPTestDataStructuresSub());
+ }
+
+ void TestArrayOfUnionWithActors() {
+ Actors i1e(42);
+ nsTArray<int> i2a;
+ i2a.AppendElement(1);
+ i2a.AppendElement(2);
+ i2a.AppendElement(3);
+
+ nsTArray<Actors> i1;
+ i1.AppendElement(i1e);
+ i1.AppendElement(i2a);
+ i1.AppendElement(kids);
+
+ nsTArray<Actors> o1;
+ EXPECT_TRUE(SendTestArrayOfUnionWithActors(i1, &o1));
+
+ EXPECT_EQ(3u, o1.Length());
+ EXPECT_EQ(42, o1[0].get_int());
+ EXPECT_EQ(i2a, o1[1].get_ArrayOfint());
+ EXPECT_EQ(kids, o1[2].get_ArrayOfPTestDataStructuresSub());
+ }
+
+ void TestUnions() {
+ Unions i1(int(42));
+
+ nsTArray<int> i2a;
+ i2a.AppendElement(1);
+ i2a.AppendElement(2);
+ i2a.AppendElement(3);
+
+ nsTArray<Actors> i4a;
+ i4a.AppendElement(kids);
+
+ Unions o1, o2, o3, o4;
+ EXPECT_TRUE(SendTestUnions(i1, Unions(i2a), Unions(kids), Unions(i4a), &o1,
+ &o2, &o3, &o4));
+
+ EXPECT_EQ(42, o1.get_int());
+ EXPECT_EQ(i2a, o2.get_ArrayOfint());
+ EXPECT_EQ(kids, o3.get_ArrayOfPTestDataStructuresSub());
+ EXPECT_EQ(kids,
+ o4.get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSub());
+ }
+
+ void TestArrayOfUnions() {
+ Unions i1a(int(42));
+
+ nsTArray<int> i2a;
+ i2a.AppendElement(1);
+ i2a.AppendElement(2);
+ i2a.AppendElement(3);
+
+ nsTArray<Actors> i4a;
+ i4a.AppendElement(kids);
+
+ nsTArray<Unions> i1;
+ i1.AppendElement(i1a);
+ i1.AppendElement(Unions(i2a));
+ i1.AppendElement(Unions(kids));
+ i1.AppendElement(Unions(i4a));
+
+ nsTArray<Unions> o1;
+ EXPECT_TRUE(SendTestArrayOfUnions(i1, &o1));
+
+ EXPECT_EQ(4u, o1.Length());
+ EXPECT_EQ(42, o1[0].get_int());
+ EXPECT_EQ(i2a, o1[1].get_ArrayOfint());
+ EXPECT_EQ(kids, o1[2].get_ArrayOfPTestDataStructuresSub());
+ EXPECT_EQ(kids,
+ o1[3].get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSub());
+ }
+
+ void TestStruct() {
+ SIntDouble i(1, 2.0);
+ SIntDouble o;
+
+ EXPECT_TRUE(SendTestStruct(i, &o));
+
+ EXPECT_EQ(o.i(), 1);
+ EXPECT_EQ(o.d(), 2.0);
+ }
+
+ void TestStructWithArrays() {
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+
+ nsTArray<double> ad;
+ ad.AppendElement(.5);
+ ad.AppendElement(1.0);
+ ad.AppendElement(2.0);
+
+ SIntDoubleArrays i(42, ai, ad);
+ SIntDoubleArrays o;
+
+ EXPECT_TRUE(SendTestStructWithArrays(i, &o));
+
+ EXPECT_EQ(42, o.i());
+ EXPECT_EQ(ai, o.ai());
+ EXPECT_EQ(ad, o.ad());
+ }
+
+ void TestStructWithActors() {
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+
+ SActors i;
+ i.i() = 42;
+ i.ai() = ai.Clone();
+ i.ap() = kids.Clone();
+
+ SActors o;
+ EXPECT_TRUE(SendTestStructWithActors(i, &o));
+
+ EXPECT_EQ(42, o.i());
+ EXPECT_EQ(ai, o.ai());
+ EXPECT_EQ(kids, o.ap());
+ }
+
+ void TestStructs() {
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+
+ SActors ia;
+ ia.i() = 42;
+ ia.ai() = ai.Clone();
+ ia.ap() = kids.Clone();
+ nsTArray<SActors> aa;
+ aa.AppendElement(ia);
+
+ Structs i;
+ i.i() = 42;
+ i.ai() = ai.Clone();
+ i.ap() = kids.Clone();
+ i.aa() = aa.Clone();
+
+ Structs o;
+ EXPECT_TRUE(SendTestStructs(i, &o));
+
+ EXPECT_EQ(42, o.i());
+ EXPECT_EQ(ai, o.ai());
+ EXPECT_EQ(kids, o.ap());
+
+ const SActors& os = o.aa()[0];
+ EXPECT_EQ(42, os.i());
+ EXPECT_EQ(ai, os.ai());
+ EXPECT_EQ(kids, os.ap());
+ }
+
+ void TestUnionWithStructs() {
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+
+ SActors ia;
+ ia.i() = 42;
+ ia.ai() = ai.Clone();
+ ia.ap() = kids.Clone();
+ nsTArray<SActors> iaa;
+ iaa.AppendElement(ia);
+
+ Structs is;
+ is.i() = 42;
+ is.ai() = ai.Clone();
+ is.ap() = kids.Clone();
+ is.aa() = iaa.Clone();
+ nsTArray<Structs> isa;
+ isa.AppendElement(is);
+
+ WithStructs o1, o2, o3, o4, o5;
+ EXPECT_TRUE(SendTestUnionWithStructs(
+ WithStructs(42), WithStructs(ai), WithStructs(kids), WithStructs(iaa),
+ WithStructs(isa), &o1, &o2, &o3, &o4, &o5));
+
+ EXPECT_EQ(o1, int(42));
+ EXPECT_EQ(o2.get_ArrayOfint(), ai);
+ EXPECT_EQ(o3.get_ArrayOfPTestDataStructuresSub(), kids);
+
+ const SActors& oa = o4.get_ArrayOfSActors()[0];
+ EXPECT_EQ(42, oa.i());
+ EXPECT_EQ(ai, oa.ai());
+ EXPECT_EQ(kids, oa.ap());
+
+ const Structs& os = o5.get_ArrayOfStructs()[0];
+ EXPECT_EQ(42, os.i());
+ EXPECT_EQ(ai, os.ai());
+ EXPECT_EQ(kids, os.ap());
+
+ const SActors& osa = os.aa()[0];
+ EXPECT_EQ(42, osa.i());
+ EXPECT_EQ(ai, osa.ai());
+ EXPECT_EQ(kids, osa.ap());
+ }
+
+ void TestStructWithUnions() {
+ WithUnions i;
+
+ i.i() = 42;
+
+ nsTArray<int> ai;
+ ai.AppendElement(1);
+ ai.AppendElement(2);
+ ai.AppendElement(3);
+ i.ai() = ai.Clone();
+
+ i.ap() = kids.Clone();
+
+ nsTArray<Actors> iaa;
+ iaa.AppendElement(kids);
+ i.aa() = iaa.Clone();
+
+ nsTArray<Unions> iau;
+ iau.AppendElement(int(42));
+ iau.AppendElement(ai);
+ iau.AppendElement(kids);
+ iau.AppendElement(iaa);
+ i.au() = iau.Clone();
+
+ WithUnions o;
+ EXPECT_TRUE(SendTestStructWithUnions(i, &o));
+
+ EXPECT_EQ(42, o.i());
+ EXPECT_EQ(o.ai(), ai);
+ EXPECT_EQ(o.ap(), kids);
+
+ const Actors& oaa = o.aa()[0];
+ EXPECT_EQ(oaa.get_ArrayOfPTestDataStructuresSub(), kids);
+
+ const nsTArray<Unions>& oau = o.au();
+ EXPECT_EQ(oau[0], 42);
+ EXPECT_EQ(oau[1].get_ArrayOfint(), ai);
+ EXPECT_EQ(oau[2].get_ArrayOfPTestDataStructuresSub(), kids);
+ EXPECT_EQ(oau[3].get_ArrayOfActors()[0].get_ArrayOfPTestDataStructuresSub(),
+ kids);
+ }
+
+ void TestUnionWithCxx() {
+ Attrs attrs;
+ attrs.common() = CommonAttrs(true);
+ attrs.specific() = BarAttrs(1.0f);
+
+ nsTArray<Op> ops;
+ ops.AppendElement(SetAttrs(kids[0], attrs));
+
+ EXPECT_TRUE(SendTestUnionWithCxx(ops));
+ }
+
+ void TestNsIntRegion() {
+ const int nelements = 1000;
+ RegionArray ra;
+ // big enough to hopefully force a realloc to a different chunk of
+ // memory on the receiving side, if the workaround isn't working
+ // correctly. But SetCapacity() here because we don't want to
+ // crash on the sending side.
+ ra.SetCapacity(nelements);
+ for (int i = 0; i < nelements; ++i) {
+ nsIntRegion r;
+ r.Or(nsIntRect(0, 0, 10, 10), nsIntRect(10, 10, 10, 10));
+ ra.AppendElement(r);
+ }
+
+ EXPECT_TRUE(SendTestNsIntRegion(ra));
+ }
+
+ ~TestDataStructuresChild() = default;
+};
+
+IPDL_TEST(TestDataStructures) {
+ for (uint32_t i = 0; i < nactors; ++i) {
+ auto sub = MakeRefPtr<TestDataStructuresSubParent>(i);
+ EXPECT_TRUE(mActor->SendPTestDataStructuresSubConstructor(sub, i))
+ << "can't alloc actor";
+ mActor->kids.AppendElement(WrapNotNull(sub));
+ }
+
+ EXPECT_TRUE(mActor->SendStart()) << "can't send Start()";
+}
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestDescendant.cpp b/ipc/ipdl/test/gtest/TestDescendant.cpp
new file mode 100644
index 0000000000..47f619d32a
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestDescendant.cpp
@@ -0,0 +1,98 @@
+/* -*- 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 multiple levels of descendant managed protocols.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestDescendantChild.h"
+#include "mozilla/_ipdltest/PTestDescendantParent.h"
+#include "mozilla/_ipdltest/PTestDescendantSubChild.h"
+#include "mozilla/_ipdltest/PTestDescendantSubParent.h"
+#include "mozilla/_ipdltest/PTestDescendantSubsubChild.h"
+#include "mozilla/_ipdltest/PTestDescendantSubsubParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+class TestDescendantSubsubParent : public PTestDescendantSubsubParent {
+ NS_INLINE_DECL_REFCOUNTING(TestDescendantSubsubParent, override)
+ private:
+ ~TestDescendantSubsubParent() = default;
+};
+
+class TestDescendantSubsubChild : public PTestDescendantSubsubChild {
+ NS_INLINE_DECL_REFCOUNTING(TestDescendantSubsubChild, override)
+ private:
+ ~TestDescendantSubsubChild() = default;
+};
+
+class TestDescendantSubParent : public PTestDescendantSubParent {
+ NS_INLINE_DECL_REFCOUNTING(TestDescendantSubParent, override)
+ private:
+ ~TestDescendantSubParent() = default;
+};
+
+class TestDescendantSubChild : public PTestDescendantSubChild {
+ NS_INLINE_DECL_REFCOUNTING(TestDescendantSubChild, override)
+ private:
+ already_AddRefed<PTestDescendantSubsubChild> AllocPTestDescendantSubsubChild()
+ final override {
+ return MakeAndAddRef<TestDescendantSubsubChild>();
+ }
+
+ ~TestDescendantSubChild() = default;
+};
+
+class TestDescendantParent : public PTestDescendantParent {
+ NS_INLINE_DECL_REFCOUNTING(TestDescendantParent, override)
+ private:
+ IPCResult RecvOk(NotNull<PTestDescendantSubsubParent*> a) final override {
+ EXPECT_TRUE(PTestDescendantSubsubParent::Send__delete__(a))
+ << "deleting Subsub";
+
+ Close();
+
+ return IPC_OK();
+ }
+
+ ~TestDescendantParent() = default;
+};
+
+class TestDescendantChild : public PTestDescendantChild {
+ NS_INLINE_DECL_REFCOUNTING(TestDescendantChild, override)
+ private:
+ already_AddRefed<PTestDescendantSubChild> AllocPTestDescendantSubChild(
+ PTestDescendantSubsubChild* dummy) final override {
+ EXPECT_FALSE(dummy) << "actor supposed to be null";
+ return MakeAndAddRef<TestDescendantSubChild>();
+ }
+
+ IPCResult RecvTest(NotNull<PTestDescendantSubsubChild*> a) final override {
+ EXPECT_TRUE(SendOk(a)) << "couldn't send Ok()";
+ return IPC_OK();
+ }
+
+ ~TestDescendantChild() = default;
+};
+
+IPDL_TEST(TestDescendant) {
+ auto p = MakeRefPtr<TestDescendantSubParent>();
+ auto* rv1 = mActor->SendPTestDescendantSubConstructor(p, nullptr);
+ EXPECT_EQ(p, rv1) << "can't allocate Sub";
+
+ auto pp = MakeRefPtr<TestDescendantSubsubParent>();
+ auto* rv2 = p->SendPTestDescendantSubsubConstructor(pp);
+ EXPECT_EQ(pp, rv2) << "can't allocate Subsub";
+
+ EXPECT_TRUE(mActor->SendTest(WrapNotNull(pp))) << "can't send Subsub";
+}
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestEndpointOpens.cpp b/ipc/ipdl/test/gtest/TestEndpointOpens.cpp
new file mode 100644
index 0000000000..50dab06058
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestEndpointOpens.cpp
@@ -0,0 +1,159 @@
+/* -*- 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 Endpoint usage.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestEndpointOpensChild.h"
+#include "mozilla/_ipdltest/PTestEndpointOpensParent.h"
+#include "mozilla/_ipdltest/PTestEndpointOpensOpenedChild.h"
+#include "mozilla/_ipdltest/PTestEndpointOpensOpenedParent.h"
+
+#include <memory>
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+class TestEndpointOpensOpenedParent : public PTestEndpointOpensOpenedParent {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestEndpointOpensOpenedParent, override)
+ private:
+ IPCResult RecvHello() final override {
+ EXPECT_FALSE(NS_IsMainThread());
+ if (!SendHi()) {
+ return IPC_TEST_FAIL(this);
+ }
+ return IPC_OK();
+ }
+
+ IPCResult RecvHelloSync() final override {
+ EXPECT_FALSE(NS_IsMainThread());
+ return IPC_OK();
+ }
+
+ void ActorDestroy(ActorDestroyReason why) final override {
+ EXPECT_FALSE(NS_IsMainThread());
+ }
+
+ ~TestEndpointOpensOpenedParent() = default;
+};
+
+class TestEndpointOpensChild : public PTestEndpointOpensChild {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestEndpointOpensChild, override)
+ private:
+ IPCResult RecvStart() final override;
+
+ ~TestEndpointOpensChild() = default;
+};
+
+class TestEndpointOpensOpenedChild : public PTestEndpointOpensOpenedChild {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestEndpointOpensOpenedChild, override)
+
+ explicit TestEndpointOpensOpenedChild(TestEndpointOpensChild* opensChild)
+ : mOpensChild(opensChild) {}
+
+ private:
+ IPCResult RecvHi() final override {
+ EXPECT_FALSE(NS_IsMainThread());
+
+ EXPECT_TRUE(SendHelloSync());
+
+ Close();
+ return IPC_OK();
+ }
+
+ void ActorDestroy(ActorDestroyReason why) final override {
+ EXPECT_FALSE(NS_IsMainThread());
+
+ // Kick off main-thread shutdown.
+ NS_DispatchToMainThread(NewRunnableMethod("ipc::IToplevelProtocol::Close",
+ mOpensChild,
+ &TestEndpointOpensChild::Close));
+ }
+
+ ~TestEndpointOpensOpenedChild() = default;
+
+ TestEndpointOpensChild* mOpensChild;
+};
+
+class TestEndpointOpensParent : public PTestEndpointOpensParent {
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TestEndpointOpensParent, override)
+ private:
+ IPCResult RecvStartSubprotocol(
+ Endpoint<PTestEndpointOpensOpenedParent>&& endpoint) final override {
+ nsCOMPtr<nsISerialEventTarget> eventTarget;
+ auto rv = NS_CreateBackgroundTaskQueue("ParentThread",
+ getter_AddRefs(eventTarget));
+ if (NS_FAILED(rv)) {
+ ADD_FAILURE() << "creating background task queue for child";
+ return IPC_TEST_FAIL(this);
+ }
+
+ eventTarget->Dispatch(NS_NewRunnableFunction(
+ "OpenParent", [endpoint{std::move(endpoint)}]() mutable {
+ EXPECT_FALSE(NS_IsMainThread());
+
+ // Open the actor on the off-main thread to park it there.
+ // Messages will be delivered to this thread's message loop
+ // instead of the main thread's.
+ auto actor = MakeRefPtr<TestEndpointOpensOpenedParent>();
+ ASSERT_TRUE(endpoint.Bind(actor));
+ }));
+
+ return IPC_OK();
+ }
+
+ ~TestEndpointOpensParent() = default;
+};
+
+IPCResult TestEndpointOpensChild::RecvStart() {
+ Endpoint<PTestEndpointOpensOpenedParent> parent;
+ Endpoint<PTestEndpointOpensOpenedChild> child;
+ nsresult rv;
+ rv = PTestEndpointOpensOpened::CreateEndpoints(
+ OtherPidMaybeInvalid(), base::GetCurrentProcId(), &parent, &child);
+ if (NS_FAILED(rv)) {
+ ADD_FAILURE() << "opening PTestEndpointOpensOpened";
+ return IPC_TEST_FAIL(this);
+ }
+
+ nsCOMPtr<nsISerialEventTarget> childEventTarget;
+ rv = NS_CreateBackgroundTaskQueue("ChildThread",
+ getter_AddRefs(childEventTarget));
+ if (NS_FAILED(rv)) {
+ ADD_FAILURE() << "creating background task queue for child";
+ return IPC_TEST_FAIL(this);
+ }
+
+ auto actor = MakeRefPtr<TestEndpointOpensOpenedChild>(this);
+ childEventTarget->Dispatch(NS_NewRunnableFunction(
+ "OpenChild",
+ [actor{std::move(actor)}, endpoint{std::move(child)}]() mutable {
+ EXPECT_FALSE(NS_IsMainThread());
+
+ // Open the actor on the off-main thread to park it there.
+ // Messages will be delivered to this thread's message loop
+ // instead of the main thread's.
+ ASSERT_TRUE(endpoint.Bind(actor));
+
+ // Kick off the unit tests
+ ASSERT_TRUE(actor->SendHello());
+ }));
+
+ EXPECT_TRUE(SendStartSubprotocol(std::move(parent)));
+
+ return IPC_OK();
+}
+
+IPDL_TEST_ON(CROSSPROCESS, TestEndpointOpens) {
+ EXPECT_TRUE(mActor->SendStart());
+}
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestHangs.cpp b/ipc/ipdl/test/gtest/TestHangs.cpp
new file mode 100644
index 0000000000..ddc4a0c7d0
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestHangs.cpp
@@ -0,0 +1,133 @@
+/* -*- 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 various cases of behavior when a synchronous method call times out.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestHangsChild.h"
+#include "mozilla/_ipdltest/PTestHangsParent.h"
+#include "mozilla/ipc/CrossProcessSemaphore.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+enum class HangMode : uint32_t {
+ /// No hang should occur.
+ None,
+ /// The synchronous call should time out.
+ Hang,
+ /// The synchronous call should time out but the response should still be
+ /// received
+ /// (racing with the reply timeout logic).
+ HangButReceive,
+ /// The synchronous call should time out but the response should still be
+ /// received because the child indicates that processing should continue after
+ /// timeout.
+ HangPermitted
+};
+
+class TestHangsChild : public PTestHangsChild {
+ NS_INLINE_DECL_REFCOUNTING(TestHangsChild, override)
+
+ TestHangsChild() : timeout(CrossProcessSemaphore::Create("timeout", 0)) {}
+
+ private:
+ IPCResult RecvStart(const uint32_t& hangMode,
+ StartResolver&& resolve) final override {
+ // Minimum possible, 2 ms. We want to detect a hang to race with the reply
+ // coming in, as reliably as possible. After 1ms the wait for a response
+ // will be retried.
+ SetReplyTimeoutMs(2);
+
+ this->hangMode = (HangMode)hangMode;
+
+ auto result = SendHang(hangMode, timeout->CloneHandle());
+ if (this->hangMode == HangMode::Hang) {
+ // Only the `Hang` mode should actually fail.
+ EXPECT_FALSE(result);
+ } else {
+ EXPECT_TRUE(result);
+ }
+
+ resolve(detectedHang);
+
+ return IPC_OK();
+ }
+
+ bool ShouldContinueFromReplyTimeout() final override {
+ timeout->Signal();
+ detectedHang = true;
+
+ if (hangMode == HangMode::HangButReceive) {
+ // Wait until the transaction is complete so that we can still receive the
+ // result after returning.
+ while (!GetIPCChannel()->TestOnlyIsTransactionComplete()) {
+ PR_Sleep(ticksPerSecond / 1000);
+ }
+ }
+
+ // Return true if `HangPermitted` mode (allowing the receive loop to
+ // continue).
+ return hangMode == HangMode::HangPermitted;
+ }
+
+ ~TestHangsChild() = default;
+
+ HangMode hangMode = HangMode::None;
+ uint32_t ticksPerSecond = PR_TicksPerSecond();
+ UniquePtr<CrossProcessSemaphore> timeout;
+
+ public:
+ bool detectedHang = false;
+};
+
+class TestHangsParent : public PTestHangsParent {
+ NS_INLINE_DECL_REFCOUNTING(TestHangsParent, override)
+
+ private:
+ IPCResult RecvHang(
+ const uint32_t& hangMode,
+ CrossProcessSemaphoreHandle&& timeout_handle) final override {
+ UniquePtr<CrossProcessSemaphore> timeout(
+ CrossProcessSemaphore::Create(std::move(timeout_handle)));
+ if (hangMode != (uint32_t)HangMode::None) {
+ // Wait to ensure the child process has called
+ // ShouldContinueFromReplyTimeout().
+ timeout->Wait();
+ }
+ return IPC_OK();
+ }
+
+ ~TestHangsParent() = default;
+};
+
+// We can verify that the Start message callbacks are run with the `Close()`
+// calls; without a `Close()`, the test will hang.
+
+#define TEST_HANGS(mode) \
+ IPDL_TEST(TestHangs, mode) { \
+ mActor->SendStart( \
+ (uint32_t)HangMode::mode, \
+ [=](bool detectedHang) { \
+ EXPECT_EQ(detectedHang, HangMode::mode != HangMode::None); \
+ mActor->Close(); \
+ }, \
+ [](auto&& reason) { FAIL() << "failed to send start"; }); \
+ }
+
+TEST_HANGS(None)
+TEST_HANGS(Hang)
+TEST_HANGS(HangButReceive)
+TEST_HANGS(HangPermitted)
+
+#undef TEST_HANGS
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestJSON.cpp b/ipc/ipdl/test/gtest/TestJSON.cpp
new file mode 100644
index 0000000000..a3f881abda
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestJSON.cpp
@@ -0,0 +1,157 @@
+/* -*- 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 sending JSON(-like) objects over IPC.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestJSONChild.h"
+#include "mozilla/_ipdltest/PTestJSONParent.h"
+#include "mozilla/_ipdltest/PTestJSONHandleChild.h"
+#include "mozilla/_ipdltest/PTestJSONHandleParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+static nsString String(const char* const str) {
+ return NS_ConvertUTF8toUTF16(str);
+}
+
+static void Array123(nsTArray<JSONVariant>& a123) {
+ a123.AppendElement(1);
+ a123.AppendElement(2);
+ a123.AppendElement(3);
+
+ ASSERT_EQ(a123, a123) << "operator== is broken";
+}
+
+template <class HandleT>
+JSONVariant MakeTestVariant(HandleT* handle) {
+ // In JS syntax:
+ //
+ // return [
+ // undefined, null, true, 1.25, "test string",
+ // handle,
+ // [ 1, 2, 3 ],
+ // { "undefined" : undefined,
+ // "null" : null,
+ // "true" : true,
+ // "1.25" : 1.25,
+ // "string" : "string"
+ // "handle" : handle,
+ // "array" : [ 1, 2, 3 ]
+ // }
+ // ]
+ //
+ nsTArray<JSONVariant> outer;
+
+ outer.AppendElement(void_t());
+ outer.AppendElement(null_t());
+ outer.AppendElement(true);
+ outer.AppendElement(1.25);
+ outer.AppendElement(String("test string"));
+
+ outer.AppendElement(handle);
+
+ nsTArray<JSONVariant> tmp;
+ Array123(tmp);
+ outer.AppendElement(tmp);
+
+ nsTArray<KeyValue> obj;
+ obj.AppendElement(KeyValue(String("undefined"), void_t()));
+ obj.AppendElement(KeyValue(String("null"), null_t()));
+ obj.AppendElement(KeyValue(String("true"), true));
+ obj.AppendElement(KeyValue(String("1.25"), 1.25));
+ obj.AppendElement(KeyValue(String("string"), String("value")));
+ obj.AppendElement(KeyValue(String("handle"), handle));
+ nsTArray<JSONVariant> tmp2;
+ Array123(tmp2);
+ obj.AppendElement(KeyValue(String("array"), tmp2));
+
+ outer.AppendElement(obj);
+
+ EXPECT_EQ(outer, outer) << "operator== is broken";
+
+ return JSONVariant(outer);
+}
+
+//-----------------------------------------------------------------------------
+// parent
+
+class TestJSONHandleParent : public PTestJSONHandleParent {
+ NS_INLINE_DECL_REFCOUNTING(TestJSONHandleParent, override)
+ private:
+ ~TestJSONHandleParent() = default;
+};
+
+class TestJSONHandleChild : public PTestJSONHandleChild {
+ NS_INLINE_DECL_REFCOUNTING(TestJSONHandleChild, override)
+ private:
+ ~TestJSONHandleChild() = default;
+};
+
+class TestJSONParent : public PTestJSONParent {
+ NS_INLINE_DECL_REFCOUNTING(TestJSONParent, override)
+ private:
+ IPCResult RecvTest(const JSONVariant& i, JSONVariant* o) final override {
+ EXPECT_EQ(i, MakeTestVariant(mKid.get())) << "inparam mangled en route";
+
+ *o = i;
+
+ EXPECT_EQ(i, *o) << "operator== and/or copy assignment are broken";
+
+ return IPC_OK();
+ }
+
+ already_AddRefed<PTestJSONHandleParent> AllocPTestJSONHandleParent()
+ final override {
+ auto handle = MakeRefPtr<TestJSONHandleParent>();
+ EXPECT_FALSE(mKid);
+ mKid = handle;
+ return handle.forget();
+ }
+
+ ~TestJSONParent() = default;
+
+ RefPtr<PTestJSONHandleParent> mKid;
+};
+
+//-----------------------------------------------------------------------------
+// child
+
+class TestJSONChild : public PTestJSONChild {
+ NS_INLINE_DECL_REFCOUNTING(TestJSONChild, override)
+ private:
+ IPCResult RecvStart() final override {
+ mKid = MakeRefPtr<TestJSONHandleChild>();
+ EXPECT_TRUE(SendPTestJSONHandleConstructor(mKid)) << "sending Handle ctor";
+
+ JSONVariant i(MakeTestVariant(mKid.get()));
+ EXPECT_EQ(i, i) << "operator== is broken";
+ EXPECT_EQ(i, MakeTestVariant(mKid.get())) << "copy ctor is broken";
+
+ JSONVariant o;
+ EXPECT_TRUE(SendTest(i, &o)) << "sending Test";
+
+ EXPECT_EQ(i, o) << "round-trip mangled input data";
+ EXPECT_EQ(o, MakeTestVariant(mKid.get())) << "outparam mangled en route";
+
+ Close();
+ return IPC_OK();
+ }
+
+ ~TestJSONChild() = default;
+
+ RefPtr<PTestJSONHandleChild> mKid;
+};
+
+IPDL_TEST(TestJSON) { EXPECT_TRUE(mActor->SendStart()) << "sending Start"; }
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestManyChildAllocs.cpp b/ipc/ipdl/test/gtest/TestManyChildAllocs.cpp
new file mode 100644
index 0000000000..2111f4f49f
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestManyChildAllocs.cpp
@@ -0,0 +1,82 @@
+/* -*- 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 that many child allocations work correctly.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestManyChildAllocsChild.h"
+#include "mozilla/_ipdltest/PTestManyChildAllocsParent.h"
+#include "mozilla/_ipdltest/PTestManyChildAllocsSubChild.h"
+#include "mozilla/_ipdltest/PTestManyChildAllocsSubParent.h"
+
+using namespace mozilla::ipc;
+
+#define NALLOCS 10
+
+namespace mozilla::_ipdltest {
+
+class TestManyChildAllocsSubParent : public PTestManyChildAllocsSubParent {
+ NS_INLINE_DECL_REFCOUNTING(TestManyChildAllocsSubParent, override)
+ private:
+ IPCResult RecvHello() final override { return IPC_OK(); }
+
+ ~TestManyChildAllocsSubParent() = default;
+};
+
+class TestManyChildAllocsSubChild : public PTestManyChildAllocsSubChild {
+ NS_INLINE_DECL_REFCOUNTING(TestManyChildAllocsSubChild, override)
+ private:
+ ~TestManyChildAllocsSubChild() = default;
+};
+
+class TestManyChildAllocsParent : public PTestManyChildAllocsParent {
+ NS_INLINE_DECL_REFCOUNTING(TestManyChildAllocsParent, override)
+ private:
+ IPCResult RecvDone() final override {
+ Close();
+
+ return IPC_OK();
+ }
+
+ already_AddRefed<PTestManyChildAllocsSubParent>
+ AllocPTestManyChildAllocsSubParent() final override {
+ return MakeAndAddRef<TestManyChildAllocsSubParent>();
+ }
+
+ ~TestManyChildAllocsParent() = default;
+};
+
+class TestManyChildAllocsChild : public PTestManyChildAllocsChild {
+ NS_INLINE_DECL_REFCOUNTING(TestManyChildAllocsChild, override)
+ private:
+ IPCResult RecvGo() final override {
+ for (int i = 0; i < NALLOCS; ++i) {
+ auto child = MakeRefPtr<TestManyChildAllocsSubChild>();
+ EXPECT_TRUE(SendPTestManyChildAllocsSubConstructor(child));
+ EXPECT_TRUE(child->SendHello()) << "can't send Hello()";
+ }
+
+ size_t len = ManagedPTestManyChildAllocsSubChild().Count();
+ EXPECT_EQ((size_t)NALLOCS, len)
+ << "expected " << NALLOCS << " kids, got " << len;
+
+ EXPECT_TRUE(SendDone()) << "can't send Done()";
+
+ return IPC_OK();
+ }
+
+ ~TestManyChildAllocsChild() = default;
+};
+
+IPDL_TEST(TestManyChildAllocs) {
+ EXPECT_TRUE(mActor->SendGo()) << "can't send Go()";
+}
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestMostNested.cpp b/ipc/ipdl/test/gtest/TestMostNested.cpp
new file mode 100644
index 0000000000..d3fb3582c6
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestMostNested.cpp
@@ -0,0 +1,88 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: sw=2 ts=4 et :
+ */
+/* 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 nested sync message priorities.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestMostNestedChild.h"
+#include "mozilla/_ipdltest/PTestMostNestedParent.h"
+
+#if defined(XP_UNIX)
+# include <unistd.h>
+#else
+# include <windows.h>
+#endif
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+class TestMostNestedChild : public PTestMostNestedChild {
+ NS_INLINE_DECL_REFCOUNTING(TestMostNestedChild, override)
+ private:
+ IPCResult RecvStart() final override {
+ EXPECT_TRUE(SendMsg1());
+ EXPECT_TRUE(SendMsg2());
+
+ Close();
+ return IPC_OK();
+ }
+
+ IPCResult RecvStartInner() final override {
+ EXPECT_TRUE(SendMsg3());
+ EXPECT_TRUE(SendMsg4());
+
+ return IPC_OK();
+ }
+
+ ~TestMostNestedChild() = default;
+};
+
+class TestMostNestedParent : public PTestMostNestedParent {
+ NS_INLINE_DECL_REFCOUNTING(TestMostNestedParent, override)
+ private:
+ IPCResult RecvMsg1() final override {
+ EXPECT_EQ(msg_num, 0);
+ msg_num = 1;
+ return IPC_OK();
+ }
+
+ IPCResult RecvMsg2() final override {
+ EXPECT_EQ(msg_num, 1);
+ msg_num = 2;
+
+ EXPECT_TRUE(SendStartInner());
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvMsg3() final override {
+ EXPECT_EQ(msg_num, 2);
+ msg_num = 3;
+ return IPC_OK();
+ }
+
+ IPCResult RecvMsg4() final override {
+ EXPECT_EQ(msg_num, 3);
+ msg_num = 4;
+ return IPC_OK();
+ }
+
+ ~TestMostNestedParent() = default;
+
+ int msg_num = 0;
+};
+
+// Can only run cross-process because nested sync messages have to come from the
+// main thread.
+IPDL_TEST_ON(CROSSPROCESS, TestMostNested) { EXPECT_TRUE(mActor->SendStart()); }
+
+} // namespace mozilla::_ipdltest
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
diff --git a/ipc/ipdl/test/gtest/TestSelfManage.cpp b/ipc/ipdl/test/gtest/TestSelfManage.cpp
new file mode 100644
index 0000000000..6dc1c4b7e4
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestSelfManage.cpp
@@ -0,0 +1,100 @@
+/* -*- 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 that actors can manage other actors of the same type.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestSelfManageChild.h"
+#include "mozilla/_ipdltest/PTestSelfManageParent.h"
+#include "mozilla/_ipdltest/PTestSelfManageRootChild.h"
+#include "mozilla/_ipdltest/PTestSelfManageRootParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+class TestSelfManageParent : public PTestSelfManageParent {
+ NS_INLINE_DECL_REFCOUNTING(TestSelfManageParent, override)
+ public:
+ ActorDestroyReason mWhy = ActorDestroyReason(-1);
+
+ private:
+ void ActorDestroy(ActorDestroyReason why) final override { mWhy = why; }
+
+ ~TestSelfManageParent() = default;
+};
+
+class TestSelfManageChild : public PTestSelfManageChild {
+ NS_INLINE_DECL_REFCOUNTING(TestSelfManageChild, override)
+ private:
+ already_AddRefed<PTestSelfManageChild> AllocPTestSelfManageChild()
+ final override {
+ return MakeAndAddRef<TestSelfManageChild>();
+ }
+
+ ~TestSelfManageChild() = default;
+};
+
+class TestSelfManageRootParent : public PTestSelfManageRootParent {
+ NS_INLINE_DECL_REFCOUNTING(TestSelfManageRootParent, override)
+ private:
+ ~TestSelfManageRootParent() = default;
+};
+
+class TestSelfManageRootChild : public PTestSelfManageRootChild {
+ NS_INLINE_DECL_REFCOUNTING(TestSelfManageRootChild, override)
+ private:
+ already_AddRefed<PTestSelfManageChild> AllocPTestSelfManageChild()
+ final override {
+ return MakeAndAddRef<TestSelfManageChild>();
+ }
+
+ ~TestSelfManageRootChild() = default;
+};
+
+IPDL_TEST(TestSelfManageRoot) {
+ auto child = MakeRefPtr<TestSelfManageParent>();
+ EXPECT_TRUE(mActor->SendPTestSelfManageConstructor(child));
+
+ EXPECT_EQ(mActor->ManagedPTestSelfManageParent().Count(), 1u);
+
+ {
+ auto childsChild = MakeRefPtr<TestSelfManageParent>();
+ EXPECT_TRUE(child->SendPTestSelfManageConstructor(childsChild));
+
+ EXPECT_EQ(mActor->ManagedPTestSelfManageParent().Count(), 1u);
+ EXPECT_EQ(child->ManagedPTestSelfManageParent().Count(), 1u);
+
+ EXPECT_TRUE(PTestSelfManageParent::Send__delete__(childsChild));
+
+ EXPECT_EQ(childsChild->mWhy, IProtocol::Deletion);
+ EXPECT_EQ(mActor->ManagedPTestSelfManageParent().Count(), 1u);
+ EXPECT_EQ(child->ManagedPTestSelfManageParent().Count(), 0u);
+ }
+
+ {
+ auto childsChild = MakeRefPtr<TestSelfManageParent>();
+ EXPECT_TRUE(child->SendPTestSelfManageConstructor(childsChild));
+
+ EXPECT_EQ(mActor->ManagedPTestSelfManageParent().Count(), 1u);
+ EXPECT_EQ(child->ManagedPTestSelfManageParent().Count(), 1u);
+
+ EXPECT_TRUE(PTestSelfManageParent::Send__delete__(child));
+
+ EXPECT_EQ(child->mWhy, IProtocol::Deletion);
+ EXPECT_EQ(childsChild->mWhy, IProtocol::AncestorDeletion);
+ EXPECT_EQ(mActor->ManagedPTestSelfManageParent().Count(), 0u);
+ EXPECT_EQ(child->ManagedPTestSelfManageParent().Count(), 0u);
+ }
+
+ mActor->Close();
+}
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestShmem.cpp b/ipc/ipdl/test/gtest/TestShmem.cpp
new file mode 100644
index 0000000000..e08bcee179
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestShmem.cpp
@@ -0,0 +1,122 @@
+/* -*- 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 sending and receiving Shmem values.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestShmemChild.h"
+#include "mozilla/_ipdltest/PTestShmemParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+class TestShmemParent : public PTestShmemParent {
+ NS_INLINE_DECL_REFCOUNTING(TestShmemParent, override)
+ private:
+ IPCResult RecvTake(Shmem&& mem, Shmem&& unsafe,
+ const uint32_t& expectedSize) final override {
+ EXPECT_EQ(mem.Size<char>(), expectedSize)
+ << "expected shmem size " << expectedSize << ", but it has size "
+ << mem.Size<char>();
+ EXPECT_EQ(unsafe.Size<char>(), expectedSize)
+ << "expected shmem size " << expectedSize << ", but it has size "
+ << unsafe.Size<char>();
+
+ EXPECT_FALSE(strcmp(mem.get<char>(), "And yourself!"))
+ << "expected message was not written";
+ EXPECT_FALSE(strcmp(unsafe.get<char>(), "And yourself!"))
+ << "expected message was not written";
+
+ EXPECT_TRUE(DeallocShmem(mem));
+ EXPECT_TRUE(DeallocShmem(unsafe));
+
+ Close();
+
+ return IPC_OK();
+ }
+
+ ~TestShmemParent() = default;
+};
+
+class TestShmemChild : public PTestShmemChild {
+ NS_INLINE_DECL_REFCOUNTING(TestShmemChild, override)
+ private:
+ IPCResult RecvGive(Shmem&& mem, Shmem&& unsafe,
+ const uint32_t& expectedSize) final override {
+ EXPECT_EQ(mem.Size<char>(), expectedSize)
+ << "expected shmem size " << expectedSize << ", but it has size "
+ << mem.Size<char>();
+ EXPECT_EQ(unsafe.Size<char>(), expectedSize)
+ << "expected shmem size " << expectedSize << ", but it has size "
+ << unsafe.Size<char>();
+
+ EXPECT_FALSE(strcmp(mem.get<char>(), "Hello!"))
+ << "expected message was not written";
+ EXPECT_FALSE(strcmp(unsafe.get<char>(), "Hello!"))
+ << "expected message was not written";
+
+ char* unsafeptr = unsafe.get<char>();
+
+ memcpy(mem.get<char>(), "And yourself!", sizeof("And yourself!"));
+ memcpy(unsafeptr, "And yourself!", sizeof("And yourself!"));
+
+ Shmem unsafecopy = unsafe;
+ EXPECT_TRUE(SendTake(std::move(mem), std::move(unsafe), expectedSize));
+
+ // these checks also shouldn't fail in the child
+ char uc1 = *unsafeptr;
+ (void)uc1;
+ char uc2 = *unsafecopy.get<char>();
+ (void)uc2;
+
+ return IPC_OK();
+ }
+
+ ~TestShmemChild() = default;
+};
+
+IPDL_TEST(TestShmem) {
+ Shmem mem;
+ Shmem unsafe;
+
+ uint32_t size = 12345;
+ EXPECT_TRUE(mActor->AllocShmem(size, &mem)) << "can't alloc shmem";
+ EXPECT_TRUE(mActor->AllocUnsafeShmem(size, &unsafe)) << "can't alloc shmem";
+
+ EXPECT_EQ(mem.Size<char>(), size) << "shmem is wrong size: expected " << size
+ << ", got " << mem.Size<char>();
+ EXPECT_EQ(unsafe.Size<char>(), size)
+ << "shmem is wrong size: expected " << size << ", got "
+ << unsafe.Size<char>();
+
+ char* ptr = mem.get<char>();
+ memcpy(ptr, "Hello!", sizeof("Hello!"));
+
+ char* unsafeptr = unsafe.get<char>();
+ memcpy(unsafeptr, "Hello!", sizeof("Hello!"));
+
+ Shmem unsafecopy = unsafe;
+ EXPECT_TRUE(mActor->SendGive(std::move(mem), std::move(unsafe), size));
+
+ // uncomment the following line for a (nondeterministic) surprise!
+ // char c1 = *ptr; (void)c1;
+
+ // uncomment the following line for a deterministic surprise!
+ // char c2 = *mem.get<char>(); (void)c2;
+
+ // unsafe shmem gets rid of those checks
+ char uc1 = *unsafeptr;
+ (void)uc1;
+ char uc2 = *unsafecopy.get<char>();
+ (void)uc2;
+}
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestSyncError.cpp b/ipc/ipdl/test/gtest/TestSyncError.cpp
new file mode 100644
index 0000000000..f7a85598a6
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestSyncError.cpp
@@ -0,0 +1,44 @@
+/* -*- 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 what happens when a sync message fails.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestSyncErrorChild.h"
+#include "mozilla/_ipdltest/PTestSyncErrorParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+class TestSyncErrorParent : public PTestSyncErrorParent {
+ NS_INLINE_DECL_REFCOUNTING(TestSyncErrorParent, override)
+ private:
+ IPCResult RecvError() final override { return IPC_TEST_FAIL(this); }
+
+ ~TestSyncErrorParent() = default;
+};
+
+class TestSyncErrorChild : public PTestSyncErrorChild {
+ NS_INLINE_DECL_REFCOUNTING(TestSyncErrorChild, override)
+ private:
+ IPCResult RecvStart() final override {
+ EXPECT_FALSE(SendError()) << "Error() should have return false";
+
+ Close();
+
+ return IPC_OK();
+ }
+ ~TestSyncErrorChild() = default;
+};
+
+IPDL_TEST(TestSyncError) { EXPECT_TRUE(mActor->SendStart()); }
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestUniquePtrIPC.cpp b/ipc/ipdl/test/gtest/TestUniquePtrIPC.cpp
new file mode 100644
index 0000000000..52ca322f8e
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestUniquePtrIPC.cpp
@@ -0,0 +1,80 @@
+/* -*- 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/. */
+
+/*
+ * Test UniquePtr IPC arguments.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestUniquePtrIPCChild.h"
+#include "mozilla/_ipdltest/PTestUniquePtrIPCParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+class TestUniquePtrIPCParent : public PTestUniquePtrIPCParent {
+ NS_INLINE_DECL_REFCOUNTING(TestUniquePtrIPCParent, override)
+ private:
+ ~TestUniquePtrIPCParent() = default;
+};
+
+class TestUniquePtrIPCChild : public PTestUniquePtrIPCChild {
+ NS_INLINE_DECL_REFCOUNTING(TestUniquePtrIPCChild, override)
+ private:
+ IPCResult RecvTestMessage(const UniquePtr<int>& aA1,
+ const UniquePtr<DummyStruct>& aA2,
+ const DummyStruct& aA3,
+ const UniquePtr<int>& aA4) final override {
+ EXPECT_TRUE(aA1) << "TestMessage received NULL aA1";
+ EXPECT_TRUE(aA2) << "TestMessage received NULL aA2";
+ EXPECT_FALSE(aA4)
+ << "TestMessage received non-NULL when expecting NULL aA4";
+
+ EXPECT_EQ(*aA1, 1);
+ EXPECT_EQ(aA2->x(), 2);
+ EXPECT_EQ(aA3.x(), 3);
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvTestSendReference(
+ const UniquePtr<DummyStruct>& aA) final override {
+ EXPECT_TRUE(aA) << "TestSendReference received NULL item in child";
+ EXPECT_EQ(aA->x(), 1);
+
+ Close();
+ return IPC_OK();
+ }
+
+ ~TestUniquePtrIPCChild() = default;
+};
+
+IPDL_TEST(TestUniquePtrIPC) {
+ UniquePtr<int> a1 = MakeUnique<int>(1);
+ UniquePtr<DummyStruct> a2 = MakeUnique<DummyStruct>(2);
+ DummyStruct a3(3);
+ UniquePtr<int> a4;
+
+ EXPECT_TRUE(mActor->SendTestMessage(a1, a2, a3, a4));
+
+ EXPECT_TRUE(a1)
+ << "IPC arguments are passed by const reference and shouldn't be moved";
+ EXPECT_TRUE(a2)
+ << "IPC arguments are passed by const reference and shouldn't be moved";
+
+ EXPECT_FALSE(a4) << "somehow turned null ptr into non-null by sending it";
+
+ // Pass UniquePtr by reference
+ UniquePtr<DummyStruct> b = MakeUnique<DummyStruct>(1);
+
+ EXPECT_TRUE(mActor->SendTestSendReference(b));
+ EXPECT_TRUE(b)
+ << "IPC arguments are passed by const reference and shouldn't be moved";
+}
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/TestUrgency.cpp b/ipc/ipdl/test/gtest/TestUrgency.cpp
new file mode 100644
index 0000000000..a4f7d0ea3e
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestUrgency.cpp
@@ -0,0 +1,115 @@
+/* -*- 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 that sync messages preempt other messages in the expected way.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestUrgencyChild.h"
+#include "mozilla/_ipdltest/PTestUrgencyParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+enum {
+ kFirstTestBegin = 1,
+ kFirstTestGotReply,
+ kSecondTestBegin,
+ kSecondTestGotReply,
+};
+
+class TestUrgencyParent : public PTestUrgencyParent {
+ NS_INLINE_DECL_REFCOUNTING(TestUrgencyParent, override)
+ private:
+ IPCResult RecvTest1(uint32_t* value) final override {
+ EXPECT_TRUE(SendReply1(value));
+ EXPECT_EQ(*value, (uint32_t)99) << "unexpected value";
+ return IPC_OK();
+ }
+
+ IPCResult RecvTest2() final override {
+ uint32_t value;
+ inreply_ = true;
+ EXPECT_TRUE(SendReply2(&value));
+ inreply_ = false;
+ EXPECT_EQ(value, (uint32_t)500) << "unexpected value";
+ return IPC_OK();
+ }
+
+ IPCResult RecvTest3(uint32_t* value) final override {
+ EXPECT_FALSE(inreply_) << "nested non-urgent on top of urgent message";
+ *value = 1000;
+ return IPC_OK();
+ }
+
+ IPCResult RecvFinalTest_Begin() final override { return IPC_OK(); }
+
+ ~TestUrgencyParent() = default;
+
+ bool inreply_ = false;
+};
+
+class TestUrgencyChild : public PTestUrgencyChild {
+ NS_INLINE_DECL_REFCOUNTING(TestUrgencyChild, override)
+ private:
+ IPCResult RecvStart() final override {
+ uint32_t result;
+
+ // Send a synchronous message, expect to get an urgent message while
+ // blocked.
+ test_ = kFirstTestBegin;
+ EXPECT_TRUE(SendTest1(&result));
+ EXPECT_EQ(result, (uint32_t)99) << "wrong value from SendTest1";
+ EXPECT_EQ(test_, kFirstTestGotReply)
+ << "never received first urgent message";
+
+ // Initiate the next test by sending an asynchronous message, then becoming
+ // blocked. This tests that the urgent message is still delivered properly,
+ // and that the parent does not try to service the sync
+ test_ = kSecondTestBegin;
+ EXPECT_TRUE(SendTest2());
+ EXPECT_TRUE(SendTest3(&result));
+ EXPECT_EQ(test_, kSecondTestGotReply)
+ << "never received second urgent message";
+ EXPECT_EQ(result, (uint32_t)1000) << "wrong value from SendTest3";
+
+ EXPECT_TRUE(SendFinalTest_Begin());
+
+ Close();
+
+ return IPC_OK();
+ }
+
+ IPCResult RecvReply1(uint32_t* reply) final override {
+ EXPECT_EQ(test_, kFirstTestBegin) << "wrong test state in RecvReply1";
+
+ *reply = 99;
+ test_ = kFirstTestGotReply;
+ return IPC_OK();
+ }
+
+ IPCResult RecvReply2(uint32_t* reply) final override {
+ EXPECT_EQ(test_, kSecondTestBegin) << "wrong test state in RecvReply2";
+
+ *reply = 500;
+ test_ = kSecondTestGotReply;
+ return IPC_OK();
+ }
+
+ ~TestUrgencyChild() = default;
+
+ uint32_t test_ = 0;
+};
+
+// Only run cross-process because we need to send nested sync messages (this can
+// only be done from the main thread).
+IPDL_TEST_ON(CROSSPROCESS, TestUrgency) { EXPECT_TRUE(mActor->SendStart()); }
+
+} // namespace mozilla::_ipdltest
diff --git a/ipc/ipdl/test/gtest/moz.build b/ipc/ipdl/test/gtest/moz.build
index 129e366a4b..86fa2eca9e 100644
--- a/ipc/ipdl/test/gtest/moz.build
+++ b/ipc/ipdl/test/gtest/moz.build
@@ -16,18 +16,59 @@ EXPORTS.mozilla._ipdltest += [
SOURCES += [
"IPDLUnitTest.cpp",
+ "TestAsyncReturns.cpp",
"TestBasic.cpp",
+ "TestCancel.cpp",
"TestCrossProcessSemaphore.cpp",
+ "TestDataStructures.cpp",
+ "TestDescendant.cpp",
+ "TestEndpointOpens.cpp",
+ "TestHangs.cpp",
"TestInduceConnectionError.cpp",
+ "TestJSON.cpp",
+ "TestManyChildAllocs.cpp",
"TestManyHandles.cpp",
+ "TestMostNested.cpp",
+ "TestMultiMgrs.cpp",
+ "TestSelfManage.cpp",
+ "TestShmem.cpp",
+ "TestSyncError.cpp",
+ "TestUniquePtrIPC.cpp",
+ "TestUrgency.cpp",
]
IPDL_SOURCES += [
"PIPDLUnitTest.ipdl",
+ "PTestAsyncReturns.ipdl",
"PTestBasic.ipdl",
+ "PTestCancel.ipdl",
"PTestCrossProcessSemaphore.ipdl",
+ "PTestDataStructures.ipdl",
+ "PTestDataStructuresCommon.ipdlh",
+ "PTestDataStructuresSub.ipdl",
+ "PTestDescendant.ipdl",
+ "PTestDescendantSub.ipdl",
+ "PTestDescendantSubsub.ipdl",
+ "PTestEndpointOpens.ipdl",
+ "PTestEndpointOpensOpened.ipdl",
+ "PTestHangs.ipdl",
"PTestInduceConnectionError.ipdl",
+ "PTestJSON.ipdl",
+ "PTestJSONHandle.ipdl",
+ "PTestManyChildAllocs.ipdl",
+ "PTestManyChildAllocsSub.ipdl",
"PTestManyHandles.ipdl",
+ "PTestMostNested.ipdl",
+ "PTestMultiMgrs.ipdl",
+ "PTestMultiMgrsBottom.ipdl",
+ "PTestMultiMgrsLeft.ipdl",
+ "PTestMultiMgrsRight.ipdl",
+ "PTestSelfManage.ipdl",
+ "PTestSelfManageRoot.ipdl",
+ "PTestShmem.ipdl",
+ "PTestSyncError.ipdl",
+ "PTestUniquePtrIPC.ipdl",
+ "PTestUrgency.ipdl",
]
include("/ipc/chromium/chromium-config.mozbuild")
diff --git a/ipc/ipdl/test/ipdl/error/ReturnFromDestructor.ipdl b/ipc/ipdl/test/ipdl/error/ReturnFromDestructor.ipdl
new file mode 100644
index 0000000000..3e409389a8
--- /dev/null
+++ b/ipc/ipdl/test/ipdl/error/ReturnFromDestructor.ipdl
@@ -0,0 +1,7 @@
+//error: destructors cannot return values
+
+[ChildProc=any]
+protocol ReturnFromDestructor {
+child:
+ async __delete__() returns (bool something);
+};
diff --git a/ipc/ipdl/test/ipdl/error/SyncDestructor.ipdl b/ipc/ipdl/test/ipdl/error/SyncDestructor.ipdl
new file mode 100644
index 0000000000..08eb39ff34
--- /dev/null
+++ b/ipc/ipdl/test/ipdl/error/SyncDestructor.ipdl
@@ -0,0 +1,7 @@
+//error: destructor must be async
+
+[ChildProc=any]
+protocol SyncDestructor {
+child:
+ sync __delete__();
+};
diff --git a/ipc/ipdl/test/ipdl/ok/PDeleteSub.ipdl b/ipc/ipdl/test/ipdl/ok/PDeleteSub.ipdl
index 12b4c677eb..c46f225d0f 100644
--- a/ipc/ipdl/test/ipdl/ok/PDeleteSub.ipdl
+++ b/ipc/ipdl/test/ipdl/ok/PDeleteSub.ipdl
@@ -4,7 +4,7 @@ sync protocol PDeleteSub {
manager PDelete;
parent:
- sync __delete__(int x) returns (double d);
+ async __delete__(int x);
};
diff --git a/ipc/ipdl/test/ipdl/sync-messages.ini b/ipc/ipdl/test/ipdl/sync-messages.ini
index 989964f0dd..82af605d01 100644
--- a/ipc/ipdl/test/ipdl/sync-messages.ini
+++ b/ipc/ipdl/test/ipdl/sync-messages.ini
@@ -24,8 +24,6 @@ description = test only
description = test only
[PsyncProtocol::SyncMsg]
description = test only
-[PDeleteSub::__delete__]
-description = test only
[PintrMessageCompress::foo]
description = test only
[PintrMessageCompress::bar]