core: add more QCDM frame marker testcases
This commit is contained in:
@@ -171,10 +171,10 @@ typedef void (*VerInfoCb) (MMQcdmSerialPort *port,
|
|||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
qcdm_verinfo_cb (MMQcdmSerialPort *port,
|
qcdm_verinfo_expect_success_cb (MMQcdmSerialPort *port,
|
||||||
GByteArray *response,
|
GByteArray *response,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GMainLoop *loop = user_data;
|
GMainLoop *loop = user_data;
|
||||||
|
|
||||||
@@ -184,7 +184,7 @@ qcdm_verinfo_cb (MMQcdmSerialPort *port,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
qcdm_verinfo (MMQcdmSerialPort *port, VerInfoCb cb, GMainLoop *loop)
|
qcdm_request_verinfo (MMQcdmSerialPort *port, VerInfoCb cb, GMainLoop *loop)
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
GByteArray *verinfo;
|
GByteArray *verinfo;
|
||||||
@@ -202,6 +202,33 @@ qcdm_verinfo (MMQcdmSerialPort *port, VerInfoCb cb, GMainLoop *loop)
|
|||||||
mm_qcdm_serial_port_queue_command (port, verinfo, 3, cb, loop);
|
mm_qcdm_serial_port_queue_command (port, verinfo, 3, cb, loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
qcdm_test_child (int fd, VerInfoCb cb)
|
||||||
|
{
|
||||||
|
MMQcdmSerialPort *port;
|
||||||
|
GMainLoop *loop;
|
||||||
|
gboolean success;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
/* In the child */
|
||||||
|
g_type_init ();
|
||||||
|
|
||||||
|
loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
|
||||||
|
port = mm_qcdm_serial_port_new_fd (fd, MM_PORT_TYPE_PRIMARY);
|
||||||
|
g_assert (port);
|
||||||
|
|
||||||
|
success = mm_serial_port_open (MM_SERIAL_PORT (port), &error);
|
||||||
|
g_assert_no_error (error);
|
||||||
|
g_assert (success);
|
||||||
|
|
||||||
|
qcdm_request_verinfo (port, cb, loop);
|
||||||
|
g_main_loop_run (loop);
|
||||||
|
|
||||||
|
mm_serial_port_close (MM_SERIAL_PORT (port));
|
||||||
|
g_object_unref (port);
|
||||||
|
}
|
||||||
|
|
||||||
/* Test that a Version Info request/response is processed correctly to
|
/* Test that a Version Info request/response is processed correctly to
|
||||||
* make sure things in general are working.
|
* make sure things in general are working.
|
||||||
*/
|
*/
|
||||||
@@ -225,28 +252,8 @@ test_verinfo (void *f)
|
|||||||
g_assert (cpid >= 0);
|
g_assert (cpid >= 0);
|
||||||
|
|
||||||
if (cpid == 0) {
|
if (cpid == 0) {
|
||||||
MMQcdmSerialPort *port;
|
|
||||||
GMainLoop *loop;
|
|
||||||
gboolean success;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
/* In the child */
|
/* In the child */
|
||||||
g_type_init ();
|
qcdm_test_child (d->slave, qcdm_verinfo_expect_success_cb);
|
||||||
|
|
||||||
loop = g_main_loop_new (NULL, FALSE);
|
|
||||||
|
|
||||||
port = mm_qcdm_serial_port_new_fd (d->slave, MM_PORT_TYPE_PRIMARY);
|
|
||||||
g_assert (port);
|
|
||||||
|
|
||||||
success = mm_serial_port_open (MM_SERIAL_PORT (port), &error);
|
|
||||||
g_assert_no_error (error);
|
|
||||||
g_assert (success);
|
|
||||||
|
|
||||||
qcdm_verinfo (port, qcdm_verinfo_cb, loop);
|
|
||||||
g_main_loop_run (loop);
|
|
||||||
|
|
||||||
mm_serial_port_close (MM_SERIAL_PORT (port));
|
|
||||||
g_object_unref (port);
|
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
/* Parent */
|
/* Parent */
|
||||||
@@ -261,10 +268,10 @@ test_verinfo (void *f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
qcdm_cns_cb (MMQcdmSerialPort *port,
|
qcdm_verinfo_expect_fail_cb (MMQcdmSerialPort *port,
|
||||||
GByteArray *response,
|
GByteArray *response,
|
||||||
GError *error,
|
GError *error,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GMainLoop *loop = user_data;
|
GMainLoop *loop = user_data;
|
||||||
|
|
||||||
@@ -292,28 +299,86 @@ test_sierra_cns_rejected (void *f)
|
|||||||
g_assert (cpid >= 0);
|
g_assert (cpid >= 0);
|
||||||
|
|
||||||
if (cpid == 0) {
|
if (cpid == 0) {
|
||||||
MMQcdmSerialPort *port;
|
|
||||||
GMainLoop *loop;
|
|
||||||
gboolean success;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
/* In the child */
|
/* In the child */
|
||||||
g_type_init ();
|
qcdm_test_child (d->slave, qcdm_verinfo_expect_fail_cb);
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
/* Parent */
|
||||||
|
d->child = cpid;
|
||||||
|
|
||||||
loop = g_main_loop_new (NULL, FALSE);
|
req_len = server_wait_request (d->master, req, sizeof (req));
|
||||||
|
g_assert (req_len == 1);
|
||||||
|
g_assert_cmpint (req[0], ==, 0x00);
|
||||||
|
|
||||||
port = mm_qcdm_serial_port_new_fd (d->slave, MM_PORT_TYPE_PRIMARY);
|
server_send_response (d->master, rsp, sizeof (rsp));
|
||||||
g_assert (port);
|
|
||||||
|
|
||||||
success = mm_serial_port_open (MM_SERIAL_PORT (port), &error);
|
/* We expect the child to exit normally */
|
||||||
g_assert_no_error (error);
|
g_assert (wait_for_child (d, 3));
|
||||||
g_assert (success);
|
}
|
||||||
|
|
||||||
qcdm_verinfo (port, qcdm_cns_cb, loop);
|
/* Test that a random response to a Version Info command correctly
|
||||||
g_main_loop_run (loop);
|
* raises an error in the child's response handler.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
test_random_data_rejected (void *f)
|
||||||
|
{
|
||||||
|
TestData *d = f;
|
||||||
|
char req[512];
|
||||||
|
gsize req_len;
|
||||||
|
pid_t cpid;
|
||||||
|
const char rsp[] = {
|
||||||
|
0x7e, 0x7e, 0x7e, 0x6b, 0x6d, 0x7e, 0x7e, 0x7e, 0x7e,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e
|
||||||
|
};
|
||||||
|
|
||||||
mm_serial_port_close (MM_SERIAL_PORT (port));
|
signal (SIGCHLD, SIG_DFL);
|
||||||
g_object_unref (port);
|
cpid = fork ();
|
||||||
|
g_assert (cpid >= 0);
|
||||||
|
|
||||||
|
if (cpid == 0) {
|
||||||
|
/* In the child */
|
||||||
|
qcdm_test_child (d->slave, qcdm_verinfo_expect_fail_cb);
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
/* Parent */
|
||||||
|
d->child = cpid;
|
||||||
|
|
||||||
|
req_len = server_wait_request (d->master, req, sizeof (req));
|
||||||
|
g_assert (req_len == 1);
|
||||||
|
g_assert_cmpint (req[0], ==, 0x00);
|
||||||
|
|
||||||
|
server_send_response (d->master, rsp, sizeof (rsp));
|
||||||
|
|
||||||
|
/* We expect the child to exit normally */
|
||||||
|
g_assert (wait_for_child (d, 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test that a bunch of frame markers at the beginning of a valid response
|
||||||
|
* to a Version Info command is parsed correctly.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
test_leading_frame_markers (void *f)
|
||||||
|
{
|
||||||
|
TestData *d = f;
|
||||||
|
char req[512];
|
||||||
|
gsize req_len;
|
||||||
|
pid_t cpid;
|
||||||
|
const char rsp[] = {
|
||||||
|
0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e,
|
||||||
|
0x00, 0x41, 0x75, 0x67, 0x20, 0x31, 0x39, 0x20, 0x32, 0x30, 0x30, 0x38,
|
||||||
|
0x32, 0x30, 0x3a, 0x34, 0x38, 0x3a, 0x34, 0x37, 0x4f, 0x63, 0x74, 0x20,
|
||||||
|
0x32, 0x39, 0x20, 0x32, 0x30, 0x30, 0x37, 0x31, 0x39, 0x3a, 0x30, 0x30,
|
||||||
|
0x3a, 0x30, 0x30, 0x53, 0x43, 0x4e, 0x52, 0x5a, 0x2e, 0x2e, 0x2e, 0x2a,
|
||||||
|
0x06, 0x04, 0xb9, 0x0b, 0x02, 0x00, 0xb2, 0x19, 0xc4, 0x7e
|
||||||
|
};
|
||||||
|
|
||||||
|
signal (SIGCHLD, SIG_DFL);
|
||||||
|
cpid = fork ();
|
||||||
|
g_assert (cpid >= 0);
|
||||||
|
|
||||||
|
if (cpid == 0) {
|
||||||
|
/* In the child */
|
||||||
|
qcdm_test_child (d->slave, qcdm_verinfo_expect_success_cb);
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
/* Parent */
|
/* Parent */
|
||||||
@@ -402,6 +467,8 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
g_test_suite_add (suite, TESTCASE_PTY (test_verinfo, data));
|
g_test_suite_add (suite, TESTCASE_PTY (test_verinfo, data));
|
||||||
g_test_suite_add (suite, TESTCASE_PTY (test_sierra_cns_rejected, data));
|
g_test_suite_add (suite, TESTCASE_PTY (test_sierra_cns_rejected, data));
|
||||||
|
g_test_suite_add (suite, TESTCASE_PTY (test_random_data_rejected, data));
|
||||||
|
g_test_suite_add (suite, TESTCASE_PTY (test_leading_frame_markers, data));
|
||||||
|
|
||||||
result = g_test_run ();
|
result = g_test_run ();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user