mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-03 10:33:33 +00:00
2f62d8c857
This patch introduces a new system for building IPDL unit tests, which is roughly inspired by the old cxx unit test design, however designed to work with gtest. It re-uses the existing IPDLUnitTest process type, using static constructors only present in xul-gtest to register child actor constructors and ProcessChild implementations to avoid bloating xul. The IPDLUnitTest actor is used as a backchannel to communicate test failures from the child process back to the parent process, and manage the test's async lifecycle more reliably. The IPDLUnitTest process also needed to have various properties about how it was initialized adjusted: * The IPDLUnitTest process should now always load xul-gtest when running gtests, by using the "Self" process type and adding a DYLD_LIBRARY_PATH override on macOS where the "Self" process type cannot be used. * The IPDLUnitTest process now initializes minimal XPCOM, and runs a frankeneventloop to allow it to use XPCOM event loop structures such as SpinEventLoopUntil in tests. * Support for creating IPDLUnitTest processes on Android was added, as these tests had never run on android before. Differential Revision: https://phabricator.services.mozilla.com/D137170
118 lines
3.3 KiB
C++
118 lines
3.3 KiB
C++
/* -*- 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 "mozilla/Bootstrap.h"
|
|
#include "nsXPCOM.h"
|
|
|
|
#include "AutoSQLiteLifetime.h"
|
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
|
# ifdef MOZ_PROFILE_GENERATE
|
|
extern "C" int __llvm_profile_dump(void);
|
|
# endif
|
|
#endif
|
|
|
|
namespace mozilla {
|
|
|
|
class BootstrapImpl final : public Bootstrap {
|
|
protected:
|
|
AutoSQLiteLifetime mSQLLT;
|
|
|
|
virtual void Dispose() override { delete this; }
|
|
|
|
public:
|
|
BootstrapImpl() = default;
|
|
|
|
~BootstrapImpl() = default;
|
|
|
|
virtual void NS_LogInit() override { ::NS_LogInit(); }
|
|
|
|
virtual void NS_LogTerm() override { ::NS_LogTerm(); }
|
|
|
|
virtual void XRE_TelemetryAccumulate(int aID, uint32_t aSample) override {
|
|
::XRE_TelemetryAccumulate(aID, aSample);
|
|
}
|
|
|
|
virtual void XRE_StartupTimelineRecord(int aEvent,
|
|
mozilla::TimeStamp aWhen) override {
|
|
::XRE_StartupTimelineRecord(aEvent, aWhen);
|
|
}
|
|
|
|
virtual int XRE_main(int argc, char* argv[],
|
|
const BootstrapConfig& aConfig) override {
|
|
return ::XRE_main(argc, argv, aConfig);
|
|
}
|
|
|
|
virtual void XRE_StopLateWriteChecks() override {
|
|
::XRE_StopLateWriteChecks();
|
|
}
|
|
|
|
virtual int XRE_XPCShellMain(int argc, char** argv, char** envp,
|
|
const XREShellData* aShellData) override {
|
|
return ::XRE_XPCShellMain(argc, argv, envp, aShellData);
|
|
}
|
|
|
|
virtual GeckoProcessType XRE_GetProcessType() override {
|
|
return ::XRE_GetProcessType();
|
|
}
|
|
|
|
virtual void XRE_SetProcessType(const char* aProcessTypeString) override {
|
|
::XRE_SetProcessType(aProcessTypeString);
|
|
}
|
|
|
|
virtual nsresult XRE_InitChildProcess(
|
|
int argc, char* argv[], const XREChildData* aChildData) override {
|
|
return ::XRE_InitChildProcess(argc, argv, aChildData);
|
|
}
|
|
|
|
virtual void XRE_EnableSameExecutableForContentProc() override {
|
|
::XRE_EnableSameExecutableForContentProc();
|
|
}
|
|
|
|
#ifdef MOZ_WIDGET_ANDROID
|
|
virtual void GeckoStart(JNIEnv* aEnv, char** argv, int argc,
|
|
const StaticXREAppData& aAppData, bool xpcshell,
|
|
const char* outFilePath) override {
|
|
::GeckoStart(aEnv, argv, argc, aAppData, xpcshell, outFilePath);
|
|
}
|
|
|
|
virtual void XRE_SetAndroidChildFds(
|
|
JNIEnv* aEnv, const XRE_AndroidChildFds& aFds) override {
|
|
::XRE_SetAndroidChildFds(aEnv, aFds);
|
|
}
|
|
|
|
# ifdef MOZ_PROFILE_GENERATE
|
|
virtual void XRE_WriteLLVMProfData() override {
|
|
__android_log_print(ANDROID_LOG_INFO, "GeckoLibLoad",
|
|
"Calling __llvm_profile_dump()");
|
|
__llvm_profile_dump();
|
|
}
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef LIBFUZZER
|
|
virtual void XRE_LibFuzzerSetDriver(LibFuzzerDriver aDriver) override {
|
|
::XRE_LibFuzzerSetDriver(aDriver);
|
|
}
|
|
#endif
|
|
|
|
#ifdef MOZ_ENABLE_FORKSERVER
|
|
virtual int XRE_ForkServer(int* argc, char*** argv) override {
|
|
return ::XRE_ForkServer(argc, argv);
|
|
}
|
|
#endif
|
|
};
|
|
|
|
extern "C" NS_EXPORT void NS_FROZENCALL
|
|
XRE_GetBootstrap(Bootstrap::UniquePtr& b) {
|
|
static bool sBootstrapInitialized = false;
|
|
MOZ_RELEASE_ASSERT(!sBootstrapInitialized);
|
|
|
|
sBootstrapInitialized = true;
|
|
b.reset(new BootstrapImpl());
|
|
}
|
|
|
|
} // namespace mozilla
|