aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Schrock <steve.schrock@getcruise.com>2024-04-16 22:12:33 +0000
committerDenis Kenzior <denkenz@gmail.com>2024-04-17 10:37:00 -0500
commitc3313629276f9bd8ba964ed01697d39c4730ab6d (patch)
tree822cbb988b2fa9f76183485f94cd581faf913479
parentc39ddccf761b734535039752c6fcc2c47a85438a (diff)
downloadofono-c3313629276f9bd8ba964ed01697d39c4730ab6d.tar.gz
qmi unit: Add notification registration test
-rw-r--r--unit/test-qmimodem-qmi.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/unit/test-qmimodem-qmi.c b/unit/test-qmimodem-qmi.c
index 7826ab671..0e15f898f 100644
--- a/unit/test-qmimodem-qmi.c
+++ b/unit/test-qmimodem-qmi.c
@@ -36,6 +36,7 @@ struct test_info {
bool discovery_callback_called : 1;
bool service_send_callback_called : 1;
+ bool notify_callback_called : 1;
};
static uint32_t unique_service_type(uint32_t index)
@@ -286,6 +287,7 @@ static bool received_data(struct l_io *io, void *user_data)
#define TEST_TLV_TYPE 0x21 /* Its data value is 1 byte */
#define TEST_REQ_DATA_VALUE 0x89
#define TEST_RESP_DATA_VALUE 0x8A
+#define TEST_IND_DATA_VALUE 0x8B
static void send_test_data_cb(struct qmi_result *result, void *user_data)
{
@@ -307,6 +309,7 @@ static void send_test_data_cb(struct qmi_result *result, void *user_data)
#define TEST_REQ_MESSAGE_ID 42
#define TEST_RESP_MESSAGE_ID 43
+#define TEST_IND_MESSAGE_ID 44
#define QMI_HDR_SIZE 7
enum qmi_message_type {
@@ -440,6 +443,57 @@ static void test_send_data(const void *data)
test_cleanup(info);
}
+
+static void notify_cb(struct qmi_result *result, void *user_data)
+{
+ struct test_info *info = user_data;
+ uint8_t data;
+
+ assert(!qmi_result_set_error(result, NULL));
+ assert(qmi_result_get_uint8(result, TEST_TLV_TYPE, &data));
+ assert(data == TEST_IND_DATA_VALUE);
+
+ info->notify_callback_called = true;
+}
+
+static void test_notifications(const void *data)
+{
+ struct test_info *info = test_setup();
+ struct l_io *io;
+ uint32_t service_type;
+ struct qmi_service *service;
+
+ perform_discovery(info);
+
+ service_type = unique_service_type(0); /* Use the first service */
+ assert(qmi_service_create(info->device, service_type,
+ create_service_cb, info, NULL));
+ perform_all_pending_work();
+ service = l_queue_pop_head(info->services);
+ assert(service);
+
+ io = l_io_new(info->service_fds[0]);
+ assert(io);
+ l_io_set_read_handler(io, received_data, info, NULL);
+
+ send_request_via_qmi(info, service);
+ send_response_to_client(info, io);
+
+ qmi_service_register(service, TEST_IND_MESSAGE_ID, notify_cb, info,
+ NULL);
+ send_message_to_client(&info->sender, io, QMI_MESSAGE_TYPE_IND, 0,
+ TEST_IND_MESSAGE_ID,
+ TEST_IND_DATA_VALUE);
+
+ while (!info->notify_callback_called)
+ l_main_iterate(-1);
+
+ l_io_destroy(io);
+ qmi_service_unref(service);
+
+ test_cleanup(info);
+}
+
static void exit_if_qrtr_not_supported(void)
{
int fd;
@@ -469,6 +523,7 @@ int main(int argc, char **argv)
l_test_add("QRTR discovery", test_discovery, NULL);
l_test_add("QRTR services may be created", test_create_services, NULL);
l_test_add("QRTR service sends/responses", test_send_data, NULL);
+ l_test_add("QRTR notifications", test_notifications, NULL);
result = l_test_run();
__ofono_log_cleanup();