Message ID | 20220610072850.16593-4-frederic.danis@collabora.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | test-runner: Add support for audio daemons | expand |
Context | Check | Description |
---|---|---|
tedd_an/pre-ci_am | success | Success |
tedd_an/checkpatch | success | Checkpatch PASS |
tedd_an/gitlint | success | Gitlint PASS |
Hi Frédéric, On Fri, Jun 10, 2022 at 12:30 AM Frédéric Danis <frederic.danis@collabora.com> wrote: > > Kernel events should have been managed so the audio card is accessible > from PipeWire > --- > tools/test-runner.c | 83 +++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 80 insertions(+), 3 deletions(-) > > diff --git a/tools/test-runner.c b/tools/test-runner.c > index bbbca5b5d..e79e3b6e9 100644 > --- a/tools/test-runner.c > +++ b/tools/test-runner.c > @@ -251,13 +251,14 @@ static void start_qemu(void) > "rootfstype=9p " > "rootflags=trans=virtio,version=9p2000.L " > "acpi=off pci=noacpi noapic quiet ro init=%s " > - "bluetooth.enable_ecred=1" > + "bluetooth.enable_ecred=1 " > "TESTHOME=%s TESTDBUS=%u TESTDAEMON=%u " > "TESTDBUSSESSION=%u XDG_RUNTIME_DIR=/run/user/0 " > + "AUDIO_SUPPORT=%u " Lets name these TESTAUDIO instead of AUDIO_SUPPORT so it is consistent with the other parameters like it. > "TESTMONITOR=%u TESTEMULATOR=%u TESTDEVS=%d " > "TESTAUTO=%u TESTARGS=\'%s\'", > initcmd, cwd, start_dbus, start_daemon, > - start_dbus_session, > + start_dbus_session, audio_support, > start_monitor, start_emulator, num_devs, > run_auto, testargs); > > @@ -724,13 +725,70 @@ static pid_t start_btvirt(const char *home) > return pid; > } > > +static void trigger_udev(void) > +{ > + char *argv[3], *envp[1]; > + pid_t pid; > + > + argv[0] = "/bin/udevadm"; > + argv[1] = "trigger"; > + argv[2] = NULL; > + > + envp[0] = NULL; > + > + printf("Triggering udev events\n"); > + > + pid = fork(); > + if (pid < 0) { > + perror("Failed to fork new process"); > + return; > + } > + > + if (pid == 0) { > + execve(argv[0], argv, envp); > + exit(EXIT_SUCCESS); > + } > + > + printf("udev trigger process %d created\n", pid); > +} > + > +static pid_t start_udevd(void) > +{ > + char *argv[2], *envp[1]; > + pid_t pid; > + > + argv[0] = "/lib/systemd/systemd-udevd"; > + argv[1] = NULL; > + > + envp[0] = NULL; > + > + printf("Starting udevd daemon\n"); > + > + pid = fork(); > + if (pid < 0) { > + perror("Failed to fork new process"); > + return -1; > + } > + > + if (pid == 0) { > + execve(argv[0], argv, envp); > + exit(EXIT_SUCCESS); > + } > + > + printf("udevd daemon process %d created\n", pid); > + > + trigger_udev(); > + > + return pid; > +} > + > static void run_command(char *cmdname, char *home) > { > char *argv[9], *envp[3]; > int pos = 0, idx = 0; > int serial_fd; > pid_t pid, dbus_pid, daemon_pid, monitor_pid, emulator_pid, > - dbus_session_pid; > + dbus_session_pid, udevd_pid; > > if (num_devs) { > const char *node = "/dev/ttyS1"; > @@ -746,6 +804,11 @@ static void run_command(char *cmdname, char *home) > } else > serial_fd = -1; > > + if (audio_support) > + udevd_pid = start_udevd(); > + else > + udevd_pid = -1; > + > if (start_dbus) { > create_dbus_system_conf(); > dbus_pid = start_dbus_daemon(false); > @@ -874,6 +937,11 @@ start_next: > monitor_pid = -1; > } > > + if (corpse == udevd_pid) { > + printf("udevd terminated\n"); > + udevd_pid = -1; > + } > + > if (corpse == pid) > break; > } > @@ -898,6 +966,9 @@ start_next: > if (monitor_pid > 0) > kill(monitor_pid, SIGTERM); > > + if (udevd_pid > 0) > + kill(udevd_pid, SIGTERM); > + > if (serial_fd >= 0) { > close(serial_fd); > serial_fd = -1; > @@ -980,6 +1051,12 @@ static void run_tests(void) > start_emulator = true; > } > > + ptr = strstr(cmdline, "AUDIO_SUPPORT=1"); > + if (ptr) { > + printf("Audio support requested\n"); > + audio_support = true; > + } > + > ptr = strstr(cmdline, "TESTHOME="); > if (ptr) { > home = ptr + 4; > -- > 2.25.1 >
diff --git a/tools/test-runner.c b/tools/test-runner.c index bbbca5b5d..e79e3b6e9 100644 --- a/tools/test-runner.c +++ b/tools/test-runner.c @@ -251,13 +251,14 @@ static void start_qemu(void) "rootfstype=9p " "rootflags=trans=virtio,version=9p2000.L " "acpi=off pci=noacpi noapic quiet ro init=%s " - "bluetooth.enable_ecred=1" + "bluetooth.enable_ecred=1 " "TESTHOME=%s TESTDBUS=%u TESTDAEMON=%u " "TESTDBUSSESSION=%u XDG_RUNTIME_DIR=/run/user/0 " + "AUDIO_SUPPORT=%u " "TESTMONITOR=%u TESTEMULATOR=%u TESTDEVS=%d " "TESTAUTO=%u TESTARGS=\'%s\'", initcmd, cwd, start_dbus, start_daemon, - start_dbus_session, + start_dbus_session, audio_support, start_monitor, start_emulator, num_devs, run_auto, testargs); @@ -724,13 +725,70 @@ static pid_t start_btvirt(const char *home) return pid; } +static void trigger_udev(void) +{ + char *argv[3], *envp[1]; + pid_t pid; + + argv[0] = "/bin/udevadm"; + argv[1] = "trigger"; + argv[2] = NULL; + + envp[0] = NULL; + + printf("Triggering udev events\n"); + + pid = fork(); + if (pid < 0) { + perror("Failed to fork new process"); + return; + } + + if (pid == 0) { + execve(argv[0], argv, envp); + exit(EXIT_SUCCESS); + } + + printf("udev trigger process %d created\n", pid); +} + +static pid_t start_udevd(void) +{ + char *argv[2], *envp[1]; + pid_t pid; + + argv[0] = "/lib/systemd/systemd-udevd"; + argv[1] = NULL; + + envp[0] = NULL; + + printf("Starting udevd daemon\n"); + + pid = fork(); + if (pid < 0) { + perror("Failed to fork new process"); + return -1; + } + + if (pid == 0) { + execve(argv[0], argv, envp); + exit(EXIT_SUCCESS); + } + + printf("udevd daemon process %d created\n", pid); + + trigger_udev(); + + return pid; +} + static void run_command(char *cmdname, char *home) { char *argv[9], *envp[3]; int pos = 0, idx = 0; int serial_fd; pid_t pid, dbus_pid, daemon_pid, monitor_pid, emulator_pid, - dbus_session_pid; + dbus_session_pid, udevd_pid; if (num_devs) { const char *node = "/dev/ttyS1"; @@ -746,6 +804,11 @@ static void run_command(char *cmdname, char *home) } else serial_fd = -1; + if (audio_support) + udevd_pid = start_udevd(); + else + udevd_pid = -1; + if (start_dbus) { create_dbus_system_conf(); dbus_pid = start_dbus_daemon(false); @@ -874,6 +937,11 @@ start_next: monitor_pid = -1; } + if (corpse == udevd_pid) { + printf("udevd terminated\n"); + udevd_pid = -1; + } + if (corpse == pid) break; } @@ -898,6 +966,9 @@ start_next: if (monitor_pid > 0) kill(monitor_pid, SIGTERM); + if (udevd_pid > 0) + kill(udevd_pid, SIGTERM); + if (serial_fd >= 0) { close(serial_fd); serial_fd = -1; @@ -980,6 +1051,12 @@ static void run_tests(void) start_emulator = true; } + ptr = strstr(cmdline, "AUDIO_SUPPORT=1"); + if (ptr) { + printf("Audio support requested\n"); + audio_support = true; + } + ptr = strstr(cmdline, "TESTHOME="); if (ptr) { home = ptr + 4;