diff --git a/headers/private/app/LaunchDaemonDefs.h b/headers/private/app/LaunchDaemonDefs.h index ea2f6cff41..8f0dc55939 100644 --- a/headers/private/app/LaunchDaemonDefs.h +++ b/headers/private/app/LaunchDaemonDefs.h @@ -1,5 +1,5 @@ /* - * Copyright 2015-2016, Haiku, Inc. All Rights Reserved. + * Copyright 2015-2017, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -18,8 +18,13 @@ namespace BPrivate { + #define kLaunchDaemonSignature "application/x-vnd.Haiku-launch_daemon" -#define B_LAUNCH_DAEMON_PORT_NAME "system:launch_daemon" +#ifdef TEST_MODE +# define B_LAUNCH_DAEMON_PORT_NAME "test:launch_daemon" +#else +# define B_LAUNCH_DAEMON_PORT_NAME "system:launch_daemon" +#endif // Message constants diff --git a/src/kits/app/LaunchRoster.cpp b/src/kits/app/LaunchRoster.cpp index e8fcc16c3a..afd09c512e 100644 --- a/src/kits/app/LaunchRoster.cpp +++ b/src/kits/app/LaunchRoster.cpp @@ -341,8 +341,12 @@ BLaunchRoster::GetJobInfo(const char* name, BMessage& info) void BLaunchRoster::_InitMessenger() { +#ifdef TEST_MODE + port_id daemonPort = find_port(B_LAUNCH_DAEMON_PORT_NAME); +#else // find the launch_daemon port port_id daemonPort = BPrivate::get_launch_daemon_port(); +#endif port_info info; if (daemonPort >= 0 && get_port_info(daemonPort, &info) == B_OK) { BMessenger::Private(fMessenger).SetTo(info.team, daemonPort, diff --git a/src/servers/launch/LaunchDaemon.cpp b/src/servers/launch/LaunchDaemon.cpp index 1d9b76da0f..c1a1418a1e 100644 --- a/src/servers/launch/LaunchDaemon.cpp +++ b/src/servers/launch/LaunchDaemon.cpp @@ -59,8 +59,10 @@ using namespace BSupportKit; using BSupportKit::BPrivate::JobQueue; +#ifndef TEST_MODE static const char* kLaunchDirectory = "launch"; static const char* kUserLaunchDirectory = "user_launch"; +#endif enum launch_options { @@ -328,7 +330,11 @@ LaunchDaemon::LaunchDaemon(bool userMode, const EventMap& events, userMode ? "AppPort" : B_LAUNCH_DAEMON_PORT_NAME), false, &error), fEvents(events), fInitTarget(userMode ? NULL : new Target("init")), +#ifdef TEST_MODE + fUserMode(true) +#else fUserMode(userMode) +#endif { mutex_init(&fTeamsLock, "teams lock"); @@ -437,12 +443,17 @@ LaunchDaemon::ReadyToRun() Utility::BlockMedia("/boot", true); if (fUserMode) { +#ifndef TEST_MODE BLaunchRoster roster; BLaunchRoster::Private(roster).RegisterSessionDaemon(this); +#endif // TEST_MODE } else _InitSystem(); BStringList paths; +#ifdef TEST_MODE + paths.Add("/boot/home/test_launch"); +#else if (fUserMode) { // System-wide user specific jobs BPathFinder::FindPaths(B_FIND_PATH_DATA_DIRECTORY, kUserLaunchDirectory, @@ -462,6 +473,7 @@ LaunchDaemon::ReadyToRun() BPathFinder::FindPaths(B_FIND_PATH_SETTINGS_DIRECTORY, kLaunchDirectory, fUserMode ? B_FIND_PATHS_USER_ONLY : B_FIND_PATHS_SYSTEM_ONLY, paths); +#endif // TEST_MODE _ReadPaths(paths); BMessenger target(this); @@ -1905,9 +1917,11 @@ LaunchDaemon::_SetupEnvironment() void LaunchDaemon::_InitSystem() { +#ifndef TEST_MODE _AddInitJob(new InitRealTimeClockJob()); _AddInitJob(new InitSharedMemoryDirectoryJob()); _AddInitJob(new InitTemporaryDirectoryJob()); +#endif fJobQueue.AddJob(fInitTarget); } @@ -1924,6 +1938,9 @@ LaunchDaemon::_AddInitJob(BJob* job) // #pragma mark - +#ifndef TEST_MODE + + static void open_stdio(int targetFD, int openMode) { @@ -1939,6 +1956,9 @@ open_stdio(int targetFD, int openMode) } +#endif // TEST_MODE + + int main() { @@ -1947,10 +1967,12 @@ main() return EXIT_FAILURE; } +#ifndef TEST_MODE // Make stdin/out/err available open_stdio(STDIN_FILENO, O_RDONLY); open_stdio(STDOUT_FILENO, O_WRONLY); dup2(STDOUT_FILENO, STDERR_FILENO); +#endif EventMap events; status_t status; diff --git a/src/tests/servers/launch/Jamfile b/src/tests/servers/launch/Jamfile index 401f7994cb..7788bfdfc4 100644 --- a/src/tests/servers/launch/Jamfile +++ b/src/tests/servers/launch/Jamfile @@ -2,9 +2,14 @@ SubDir HAIKU_TOP src tests servers launch ; AddSubDirSupportedPlatforms libbe_test ; -UsePrivateHeaders app shared storage support ; +UsePrivateHeaders app libroot shared storage support ; +UsePrivateSystemHeaders ; + +UseHeaders [ FDirName $(HAIKU_TOP) src bin multiuser ] ; SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src servers launch ] ; +SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits app ] ; +SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src bin ] ; UnitTestLib liblaunch_daemontest.so : LaunchDaemonTestAddon.cpp @@ -21,3 +26,34 @@ UnitTestLib liblaunch_daemontest.so : : be network bnetapi shared [ TargetLibstdc++ ] [ TargetLibsupc++ ] ; + +local defines = [ FDefines TEST_MODE=1 ] ; + +SubDirCcFlags $(defines) ; +SubDirC++Flags $(defines) ; + +Server test_launch_daemon : + LaunchDaemon.cpp + + BaseJob.cpp + Conditions.cpp + Events.cpp + Job.cpp + NetworkWatcher.cpp + SettingsParser.cpp + Target.cpp + Utility.cpp + VolumeWatcher.cpp + Worker.cpp + : + be network bnetapi shared libmultiuser_utils.a [ TargetLibstdc++ ] + : + LaunchDaemon.rdef +; + +BinCommand test_launch_roster : + LaunchRoster.cpp + launch_roster.cpp + : + be +;