X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=tests%2Ftest_receive.c;h=607f906101a8cf367422462923f50b86f7737a7c;hb=ee24440b7c123ab1b0317e57be33e837a1cb51f1;hp=5c757076e1ddd8fe7f6111a9fd152dfba0ea8bc4;hpb=e3637d97ecaef1768d3f9ef40cb0204a0e668ff2;p=apps%2Fagl-service-can-low-level.git diff --git a/tests/test_receive.c b/tests/test_receive.c index 5c757076..607f9061 100644 --- a/tests/test_receive.c +++ b/tests/test_receive.c @@ -6,7 +6,9 @@ #include extern IsoTpShims SHIMS; -extern IsoTpHandle HANDLE; +extern IsoTpReceiveHandle RECEIVE_HANDLE; + +extern void message_sent(const IsoTpMessage* message, const bool success); extern uint16_t last_can_frame_sent_arb_id; extern uint8_t last_can_payload_sent; @@ -15,21 +17,31 @@ extern bool can_frame_was_sent; extern bool message_was_received; extern uint16_t last_message_received_arb_id; -extern uint8_t* last_message_received_payload; +extern uint8_t last_message_received_payload[]; extern uint8_t last_message_received_payload_size; extern uint16_t last_message_sent_arb_id; extern bool last_message_sent_status; -extern uint8_t* last_message_sent_payload; +extern uint8_t last_message_sent_payload[]; extern uint8_t last_message_sent_payload_size; extern void setup(); +START_TEST (test_receive_empty_can_message) +{ + const uint8_t data[CAN_MESSAGE_BYTE_SIZE] = {0}; + fail_if(RECEIVE_HANDLE.completed); + IsoTpMessage message = isotp_continue_receive(&SHIMS, &RECEIVE_HANDLE, 0x100, data, 0); + fail_if(message.completed); + fail_if(message_was_received); +} +END_TEST + START_TEST (test_receive_wrong_id) { const uint8_t data[CAN_MESSAGE_BYTE_SIZE] = {0}; - fail_if(HANDLE.completed); - IsoTpMessage message = isotp_receive_can_frame(&SHIMS, &HANDLE, 0x100, data, 1); + fail_if(RECEIVE_HANDLE.completed); + IsoTpMessage message = isotp_continue_receive(&SHIMS, &RECEIVE_HANDLE, 0x100, data, 1); fail_if(message.completed); fail_if(message_was_received); } @@ -39,7 +51,7 @@ START_TEST (test_receive_bad_pci) { // 4 is a reserved number for the PCI field - only 0-3 are allowed const uint8_t data[CAN_MESSAGE_BYTE_SIZE] = {0x40}; - IsoTpMessage message = isotp_receive_can_frame(&SHIMS, &HANDLE, 0x2a, data, 1); + IsoTpMessage message = isotp_continue_receive(&SHIMS, &RECEIVE_HANDLE, 0x2a, data, 1); fail_if(message.completed); fail_if(message_was_received); } @@ -48,9 +60,9 @@ END_TEST START_TEST (test_receive_single_frame_empty_payload) { const uint8_t data[CAN_MESSAGE_BYTE_SIZE] = {0x00, 0x12, 0x34}; - fail_if(HANDLE.completed); - IsoTpMessage message = isotp_receive_can_frame(&SHIMS, &HANDLE, 0x2a, data, 3); - fail_unless(HANDLE.completed); + fail_if(RECEIVE_HANDLE.completed); + IsoTpMessage message = isotp_continue_receive(&SHIMS, &RECEIVE_HANDLE, 0x2a, data, 3); + fail_unless(RECEIVE_HANDLE.completed); fail_unless(message.completed); fail_unless(message_was_received); ck_assert_int_eq(last_message_received_arb_id, 0x2a); @@ -61,7 +73,7 @@ END_TEST START_TEST (test_receive_single_frame) { const uint8_t data[CAN_MESSAGE_BYTE_SIZE] = {0x02, 0x12, 0x34}; - IsoTpMessage message = isotp_receive_can_frame(&SHIMS, &HANDLE, 0x2a, data, 3); + IsoTpMessage message = isotp_continue_receive(&SHIMS, &RECEIVE_HANDLE, 0x2a, data, 3); fail_unless(message.completed); fail_unless(message_was_received); ck_assert_int_eq(last_message_received_arb_id, 0x2a); @@ -71,6 +83,70 @@ START_TEST (test_receive_single_frame) } END_TEST +START_TEST (test_receive_multi_frame) +{ + const uint8_t data0[CAN_MESSAGE_BYTE_SIZE] = {0x10, 0x14, 0x49, 0x02, 0x01, 0x31, 0x46, 0x4d}; + IsoTpMessage message0 = isotp_continue_receive(&SHIMS, &RECEIVE_HANDLE, 0x2a, data0, 8); + fail_unless(!RECEIVE_HANDLE.completed); + fail_unless(!message0.completed); + fail_unless(!message_was_received); + fail_unless(message0.multi_frame); + //make sure flow control message has been sent. + ck_assert_int_eq(last_can_frame_sent_arb_id, 0x2a - 8); + ck_assert_int_eq(last_can_payload_sent, 0x30); + + const uint8_t data1[CAN_MESSAGE_BYTE_SIZE] = {0x21, 0x43, 0x55, 0x39, 0x4a, 0x39, 0x34, 0x48}; + IsoTpMessage message1 = isotp_continue_receive(&SHIMS, &RECEIVE_HANDLE, 0x2a, data1, 8); + fail_unless(!RECEIVE_HANDLE.completed); + fail_unless(!message1.completed); + fail_unless(!message_was_received); + fail_unless(message1.multi_frame); + + const uint8_t data2[CAN_MESSAGE_BYTE_SIZE] = {0x22, 0x55, 0x41, 0x30, 0x34, 0x35, 0x32, 0x34}; + IsoTpMessage message2 = isotp_continue_receive(&SHIMS, &RECEIVE_HANDLE, 0x2a, data2, 8); + fail_unless(RECEIVE_HANDLE.completed); + fail_unless(message2.completed); + fail_unless(message_was_received); + fail_unless(message2.multi_frame); + + ck_assert_int_eq(last_message_received_arb_id, 0x2a); + ck_assert_int_eq(last_message_received_payload_size, 0x14); + ck_assert_int_eq(last_message_received_payload[0], 0x49); + ck_assert_int_eq(last_message_received_payload[1], 0x02); + ck_assert_int_eq(last_message_received_payload[2], 0x01); + ck_assert_int_eq(last_message_received_payload[3], 0x31); + ck_assert_int_eq(last_message_received_payload[4], 0x46); + ck_assert_int_eq(last_message_received_payload[5], 0x4d); + ck_assert_int_eq(last_message_received_payload[6], 0x43); + ck_assert_int_eq(last_message_received_payload[7], 0x55); + ck_assert_int_eq(last_message_received_payload[8], 0x39); + ck_assert_int_eq(last_message_received_payload[9], 0x4a); + ck_assert_int_eq(last_message_received_payload[10], 0x39); + ck_assert_int_eq(last_message_received_payload[11], 0x34); + ck_assert_int_eq(last_message_received_payload[12], 0x48); + ck_assert_int_eq(last_message_received_payload[13], 0x55); + ck_assert_int_eq(last_message_received_payload[14], 0x41); + ck_assert_int_eq(last_message_received_payload[15], 0x30); + ck_assert_int_eq(last_message_received_payload[16], 0x34); + ck_assert_int_eq(last_message_received_payload[17], 0x35); + ck_assert_int_eq(last_message_received_payload[18], 0x32); + ck_assert_int_eq(last_message_received_payload[19], 0x34); +} +END_TEST + +START_TEST (test_receive_large_multi_frame) +{ + const uint8_t data0[CAN_MESSAGE_BYTE_SIZE] = {0x10, 0x80, 0x49, 0x02, 0x01, 0x31, 0x46, 0x4d}; + IsoTpMessage message = isotp_continue_receive(&SHIMS, &RECEIVE_HANDLE, 0x2a, data0, 8); + //Make sure we don't try to receive messages that are too large and don't send flow control. + fail_unless(!can_frame_was_sent); + fail_unless(!RECEIVE_HANDLE.completed); + fail_unless(!message.completed); + fail_unless(!message_was_received); + fail_unless(!message.multi_frame); +} +END_TEST + Suite* testSuite(void) { Suite* s = suite_create("iso15765"); TCase *tc_core = tcase_create("receive"); @@ -79,6 +155,9 @@ Suite* testSuite(void) { tcase_add_test(tc_core, test_receive_bad_pci); tcase_add_test(tc_core, test_receive_single_frame); tcase_add_test(tc_core, test_receive_single_frame_empty_payload); + tcase_add_test(tc_core, test_receive_empty_can_message); + tcase_add_test(tc_core, test_receive_multi_frame); + tcase_add_test(tc_core, test_receive_large_multi_frame); suite_add_tcase(s, tc_core); return s;