diff --git a/android/android-tester.c b/android/android-tester.c
index b5d8ca3..a4ee824 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
static char exec_dir[PATH_MAX + 1];
+static gint scheduled_cbacks_num = 0;
+
+static gboolean check_callbacks_called(gpointer user_data)
+{
+ /* Wait for all callbacks scheduled in current test context to execute
+ * in main loop. This will avoid late callback calls after test case has
+ * already failed or timed out.
+ */
+
+ if (g_atomic_int_get(&scheduled_cbacks_num) == 0) {
+ tester_teardown_complete();
+ return FALSE;
+ }
+
+ return TRUE;
+}
static void check_daemon_term(void)
{
int status;
data->bluetoothd_pid = 0;
if (WIFEXITED(status) && (WEXITSTATUS(status) == EXIT_SUCCESS)) {
- tester_teardown_complete();
+ g_idle_add(check_callbacks_called, NULL);
return;
}
cleanup:
g_free(cb_data);
+
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->state = state;
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(adapter_state_changed, cb_data);
}
g_free(cb_data);
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
struct bt_cb_data *cb_data = g_new0(struct bt_cb_data, 1);
cb_data->state = state;
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(discovery_state_changed, cb_data);
}
free_properties(cb_data->num, cb_data->props);
g_free(cb_data);
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->num = num_properties;
cb_data->props = copy_properties(num_properties, properties);
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(device_found, cb_data);
}
free_properties(cb_data->num, cb_data->props);
g_free(cb_data);
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->num = num_properties;
cb_data->props = copy_properties(num_properties, properties);
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(adapter_properties, cb_data);
}
free_properties(cb_data->num, cb_data->props);
g_free(cb_data);
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->num = num_properties;
cb_data->props = copy_properties(num_properties, properties);
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(remote_device_properties, cb_data);
}
g_free(cb_data);
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->state = state;
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(adapter_socket_state_changed, cb_data);
}
cb_data->state);
g_free(cb_data);
+
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->state = state;
cb_data->bdaddr = *bd_addr;
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(hidhost_connection_state, cb_data);
}
cb_data->status);
g_free(cb_data);
+
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->bdaddr = *bd_addr;
cb_data->status = status;
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(hidhost_virual_unplug, cb_data);
}
cb_data->hid_info);
g_free(cb_data);
+
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->bdaddr = *bd_addr;
cb_data->hid_info = hid;
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(hidhost_hid_info, cb_data);
}
cb_data->status, cb_data->mode);
g_free(cb_data);
+
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->status = status;
cb_data->mode = mode;
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(hidhost_protocol_mode, cb_data);
}
g_free(cb_data->report);
g_free(cb_data);
+
+ g_atomic_int_dec_and_test(&scheduled_cbacks_num);
return FALSE;
}
cb_data->report = g_memdup(report, size);
cb_data->size = size;
+ g_atomic_int_inc(&scheduled_cbacks_num);
g_idle_add(hidhost_get_report, cb_data);
}