aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tools
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-02-28 15:23:37 -0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-02-28 15:26:02 -0800
commit850003734a742ff31d9ca8c2254faea1da25b1ff (patch)
tree3243624cd89f316d044ed6dd91bda12cc81aa9a1 /tools
parentd91fe6994f63a861959a79790d166f63e22623bf (diff)
test-runner: Add option to start emulator
This adds an option (-l/--emulator) to start btvirt before processing the command which is convenient to runs tools like bluetoothctl: sudo tools/test-runner -l -d -k <pathto/bzImage> -- client/bluetoothctl power on
Diffstat (limited to 'tools')
-rw-r--r--tools/test-runner.c86
1 files changed, 82 insertions, 4 deletions
diff --git a/tools/test-runner.c b/tools/test-runner.c
index 71cc0d2dfb..e0e002dd69 100644
--- a/tools/test-runner.c
+++ b/tools/test-runner.c
@@ -47,6 +47,7 @@ static int test_argc;
static bool run_auto = false;
static bool start_dbus = false;
+static bool start_emulator = false;
static bool start_monitor = false;
static int num_devs = 0;
static const char *qemu_binary = NULL;
@@ -249,9 +250,10 @@ static void start_qemu(void)
"acpi=off pci=noacpi noapic quiet ro init=%s "
"bluetooth.enable_ecred=1"
"TESTHOME=%s TESTDBUS=%u TESTMONITOR=%u "
- "TESTDEVS=%d TESTAUTO=%u TESTARGS=\'%s\'",
+ "TESTEMULATOR=%u TESTDEVS=%d TESTAUTO=%u "
+ "TESTARGS=\'%s\'",
initcmd, cwd, start_dbus, start_monitor,
- num_devs, run_auto, testargs);
+ start_emulator, num_devs, run_auto, testargs);
argv = alloca(sizeof(qemu_argv) +
(sizeof(char *) * (4 + (num_devs * 4))));
@@ -600,12 +602,64 @@ static pid_t start_btmon(const char *home)
return pid;
}
+static const char *btvirt_table[] = {
+ "btvirt",
+ "emulator/btvirt",
+ "/usr/sbin/btvirt",
+ NULL
+};
+
+static pid_t start_btvirt(void)
+{
+ const char *btvirt = NULL;
+ char *argv[3], *envp[2];
+ pid_t pid;
+ int i;
+
+ for (i = 0; btvirt_table[i]; i++) {
+ struct stat st;
+
+ if (!stat(btvirt_table[i], &st)) {
+ btvirt = btvirt_table[i];
+ break;
+ }
+ }
+
+ if (!btvirt) {
+ fprintf(stderr, "Failed to locate btvirt binary\n");
+ return -1;
+ }
+
+ printf("Using %s\n", btvirt);
+
+ argv[0] = (char *) btvirt;
+ argv[1] = "-l";
+ argv[2] = NULL;
+
+ printf("Starting Emulator\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("Emulator process %d created\n", pid);
+
+ 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;
+ pid_t pid, dbus_pid, daemon_pid, monitor_pid, emulator_pid;
if (num_devs) {
const char *node = "/dev/ttyS1";
@@ -635,6 +689,11 @@ static void run_command(char *cmdname, char *home)
else
monitor_pid = -1;
+ if (start_emulator)
+ emulator_pid = start_btvirt();
+ else
+ emulator_pid = -1;
+
start_next:
if (run_auto) {
if (chdir(home + 5) < 0) {
@@ -735,6 +794,11 @@ start_next:
daemon_pid = -1;
}
+ if (corpse == emulator_pid) {
+ printf("Bluetooth emulator terminated\n");
+ emulator_pid = -1;
+ }
+
if (corpse == monitor_pid) {
printf("Bluetooth monitor terminated\n");
monitor_pid = -1;
@@ -755,6 +819,9 @@ start_next:
if (dbus_pid > 0)
kill(dbus_pid, SIGTERM);
+ if (emulator_pid > 0)
+ kill(dbus_pid, SIGTERM);
+
if (monitor_pid > 0)
kill(monitor_pid, SIGTERM);
@@ -822,6 +889,12 @@ static void run_tests(void)
start_monitor = true;
}
+ ptr = strstr(cmdline, "TESTEMULATOR=1");
+ if (ptr) {
+ printf("Emulator requested\n");
+ start_emulator = true;
+ }
+
ptr = strstr(cmdline, "TESTHOME=");
if (ptr) {
home = ptr + 4;
@@ -853,6 +926,7 @@ static const struct option main_options[] = {
{ "auto", no_argument, NULL, 'a' },
{ "unix", no_argument, NULL, 'u' },
{ "dbus", no_argument, NULL, 'd' },
+ { "emulator", no_argument, NULL, 'l' },
{ "monitor", no_argument, NULL, 'm' },
{ "qemu", required_argument, NULL, 'q' },
{ "kernel", required_argument, NULL, 'k' },
@@ -875,7 +949,8 @@ int main(int argc, char *argv[])
for (;;) {
int opt;
- opt = getopt_long(argc, argv, "audmq:k:vh", main_options, NULL);
+ opt = getopt_long(argc, argv, "audlmq:k:vh", main_options,
+ NULL);
if (opt < 0)
break;
@@ -889,6 +964,9 @@ int main(int argc, char *argv[])
case 'd':
start_dbus = true;
break;
+ case 'l':
+ start_emulator = true;
+ break;
case 'm':
start_monitor = true;
break;