test-runner: Add DBus session support
authorFrédéric Danis <frederic.danis@collabora.com>
Fri, 10 Jun 2022 16:38:17 +0000 (18:38 +0200)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 15 May 2023 09:25:54 +0000 (14:55 +0530)
Audio daemons requests access to DBus session to start

Signed-off-by: Manika Shrivastava <manika.sh@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
tools/test-runner.c

index 4933906..acd292a 100755 (executable)
@@ -46,6 +46,7 @@ static int test_argc;
 
 static bool run_auto = false;
 static bool start_dbus = false;
+static bool start_dbus_session;
 static bool start_daemon = false;
 static bool start_emulator = false;
 static bool start_monitor = false;
@@ -250,9 +251,11 @@ static void start_qemu(void)
                                "acpi=off pci=noacpi noapic quiet ro init=%s "
                                "bluetooth.enable_ecred=1"
                                "TESTHOME=%s TESTDBUS=%u TESTDAEMON=%u "
+                               "TESTDBUSSESSION=%u XDG_RUNTIME_DIR=/run/user/0 "
                                "TESTMONITOR=%u TESTEMULATOR=%u TESTDEVS=%d "
                                "TESTAUTO=%u TESTARGS=\'%s\'",
                                initcmd, cwd, start_dbus, start_daemon,
+                               start_dbus_session,
                                start_monitor, start_emulator, num_devs,
                                run_auto, testargs);
 
@@ -419,19 +422,63 @@ static void create_dbus_system_conf(void)
        mkdir("/run/dbus", 0755);
 }
 
-static pid_t start_dbus_daemon(void)
+static void create_dbus_session_conf(void)
+{
+       FILE *fp;
+
+       fp = fopen("/etc/dbus-1/session.conf", "we");
+       if (!fp)
+               return;
+
+       fputs("<!DOCTYPE busconfig PUBLIC "
+               "\"-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN\" "
+               "\"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd\">\n", fp);
+       fputs("<busconfig>\n", fp);
+       fputs("<type>session</type>\n", fp);
+       fputs("<listen>unix:path=/run/user/0/bus</listen>\n", fp);
+       fputs("<policy context=\"default\">\n", fp);
+       fputs("<allow user=\"*\"/>\n", fp);
+       fputs("<allow own=\"*\"/>\n", fp);
+       fputs("<allow send_type=\"method_call\"/>\n", fp);
+       fputs("<allow send_type=\"signal\"/>\n", fp);
+       fputs("<allow send_type=\"method_return\"/>\n", fp);
+       fputs("<allow send_type=\"error\"/>\n", fp);
+       fputs("<allow receive_type=\"method_call\"/>\n", fp);
+       fputs("<allow receive_type=\"signal\"/>\n", fp);
+       fputs("<allow receive_type=\"method_return\"/>\n", fp);
+       fputs("<allow receive_type=\"error\"/>\n", fp);
+       fputs("</policy>\n", fp);
+       fputs("</busconfig>\n", fp);
+
+       fclose(fp);
+
+       if (symlink("/etc/dbus-1/session.conf",
+                               "/usr/share/dbus-1/session.conf") < 0)
+               perror("Failed to create session.conf symlink");
+
+       mkdir("/run/user", 0755);
+       mkdir("/run/user/0", 0755);
+}
+
+static pid_t start_dbus_daemon(bool session)
 {
        char *argv[3], *envp[1];
        pid_t pid;
        int i;
+       char *bus_type = session ? "session" : "system";
+       char *socket_path = session ?
+                       "/run/user/0/bus" : "/run/dbus/system_bus_socket";
 
        argv[0] = "/usr/bin/dbus-daemon";
-       argv[1] = "--system";
+       if (session)
+               argv[1] = "--session";
+       else
+               argv[1] = "--system";
        argv[2] = NULL;
 
        envp[0] = NULL;
 
-       printf("Starting D-Bus daemon\n");
+       printf("Starting D-Bus %s daemon\n", bus_type);
 
        pid = fork();
        if (pid < 0) {
@@ -444,13 +491,13 @@ static pid_t start_dbus_daemon(void)
                exit(EXIT_SUCCESS);
        }
 
-       printf("D-Bus daemon process %d created\n", pid);
+       printf("D-Bus %s daemon process %d created\n", bus_type, pid);
 
        for (i = 0; i < 20; i++) {
                struct stat st;
 
-               if (!stat("/run/dbus/system_bus_socket", &st)) {
-                       printf("Found D-Bus daemon socket\n");
+               if (!stat(socket_path, &st)) {
+                       printf("Found D-Bus %s daemon socket\n", bus_type);
                        return pid;
                }
 
@@ -669,7 +716,8 @@ static void run_command(char *cmdname, char *home)
 #endif
        int pos = 0, idx = 0;
        int serial_fd;
-       pid_t pid, dbus_pid, daemon_pid, monitor_pid, emulator_pid;
+       pid_t pid, dbus_pid, daemon_pid, monitor_pid, emulator_pid,
+             dbus_session_pid;
 
        if (num_devs) {
                const char *node = "/dev/ttyS1";
@@ -687,10 +735,16 @@ static void run_command(char *cmdname, char *home)
 
        if (start_dbus) {
                create_dbus_system_conf();
-               dbus_pid = start_dbus_daemon();
+               dbus_pid = start_dbus_daemon(false);
        } else
                dbus_pid = -1;
 
+       if (start_dbus_session) {
+               create_dbus_session_conf();
+               dbus_session_pid = start_dbus_daemon(true);
+       } else
+               dbus_session_pid = -1;
+
        if (start_daemon)
                daemon_pid = start_bluetooth_daemon(home);
        else
@@ -783,7 +837,12 @@ start_next:
                        printf("Process %d continued\n", corpse);
 
                if (corpse == dbus_pid) {
-                       printf("D-Bus daemon terminated\n");
+                       printf("D-Bus system daemon terminated\n");
+                       dbus_pid = -1;
+               }
+
+               if (corpse == dbus_session_pid) {
+                       printf("D-Bus session daemon terminated\n");
                        dbus_pid = -1;
                }
 
@@ -817,6 +876,9 @@ start_next:
        if (dbus_pid > 0)
                kill(dbus_pid, SIGTERM);
 
+       if (dbus_session_pid > 0)
+               kill(dbus_session_pid, SIGTERM);
+
        if (emulator_pid > 0)
                kill(dbus_pid, SIGTERM);
 
@@ -877,10 +939,16 @@ static void run_tests(void)
 
        ptr = strstr(cmdline, "TESTDBUS=1");
        if (ptr) {
-               printf("D-Bus daemon requested\n");
+               printf("D-Bus system daemon requested\n");
                start_dbus = true;
        }
 
+       ptr = strstr(cmdline, "TESTDBUSSESSION=1");
+       if (ptr) {
+               printf("D-Bus session daemon requested\n");
+               start_dbus_session = true;
+       }
+
        ptr = strstr(cmdline, "TESTDAEMON=1");
        if (ptr) {
                printf("bluetoothd requested\n");
@@ -917,7 +985,8 @@ static void usage(void)
        printf("\ttest-runner [options] [--] <command> [args]\n");
        printf("Options:\n"
                "\t-a, --auto             Find tests and run them\n"
-               "\t-b, --dbus             Start D-Bus daemon\n"
+               "\t-b, --dbus             Start D-Bus system daemon\n"
+               "\t-s, --dbus-session     Start D-Bus session daemon\n"
                "\t-d, --daemon           Start bluetoothd\n"
                "\t-m, --monitor          Start btmon\n"
                "\t-l, --emulator         Start btvirt\n"
@@ -931,6 +1000,7 @@ static const struct option main_options[] = {
        { "all",     no_argument,       NULL, 'a' },
        { "auto",    no_argument,       NULL, 'a' },
        { "dbus",    no_argument,       NULL, 'b' },
+       { "dbus-session", no_argument,  NULL, 's' },
        { "unix",    no_argument,       NULL, 'u' },
        { "daemon",  no_argument,       NULL, 'd' },
        { "emulator", no_argument,      NULL, 'l' },
@@ -956,7 +1026,7 @@ int main(int argc, char *argv[])
        for (;;) {
                int opt;
 
-               opt = getopt_long(argc, argv, "aubdlmq:k:vh", main_options,
+               opt = getopt_long(argc, argv, "aubdslmq:k:vh", main_options,
                                                                NULL);
                if (opt < 0)
                        break;
@@ -971,6 +1041,9 @@ int main(int argc, char *argv[])
                case 'b':
                        start_dbus = true;
                        break;
+               case 's':
+                       start_dbus_session = true;
+                       break;
                case 'd':
                        start_dbus = true;
                        start_daemon = true;