Confirm CAN messages are built correctly.
[apps/agl-service-can-low-level.git] / tests / test_send.c
1 #include <isotp/isotp.h>
2 #include <check.h>
3 #include <stdint.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <stdarg.h>
7
8 extern IsoTpShims SHIMS;
9 extern IsoTpHandler ISOTP_HANDLER;
10
11 extern uint16_t last_can_frame_sent_arb_id;
12 extern uint8_t last_can_payload_sent[8];
13 extern uint8_t last_can_payload_size;
14 extern bool can_frame_was_sent;
15
16 extern bool message_was_received;
17 extern uint16_t last_message_received_arb_id;
18 extern uint8_t* last_message_received_payload;
19 extern uint8_t last_message_received_payload_size;
20
21 extern uint16_t last_message_sent_arb_id;
22 extern bool last_message_sent_status;
23 extern uint8_t* last_message_sent_payload;
24 extern uint8_t last_message_sent_payload_size;
25
26 extern void setup();
27
28 START_TEST (test_send_empty_payload)
29 {
30     fail_unless(isotp_send(&ISOTP_HANDLER, NULL, 0));
31     ck_assert_int_eq(last_message_sent_arb_id, ISOTP_HANDLER.arbitration_id);
32     fail_unless(last_message_sent_status);
33     ck_assert_int_eq(last_message_sent_payload[0], NULL);
34     ck_assert_int_eq(last_message_sent_payload_size, 0);
35
36     ck_assert_int_eq(last_can_frame_sent_arb_id, ISOTP_HANDLER.arbitration_id);
37     fail_unless(can_frame_was_sent);
38     ck_assert_int_eq(last_can_payload_sent[0], 0x0);
39     ck_assert_int_eq(last_can_payload_size, 1);
40 }
41 END_TEST
42
43 START_TEST (test_send_single_frame)
44 {
45     const uint8_t payload[] = {0x12, 0x34};
46     fail_unless(isotp_send(&ISOTP_HANDLER, &payload, sizeof(payload)));
47     ck_assert_int_eq(last_message_sent_arb_id, ISOTP_HANDLER.arbitration_id);
48     fail_unless(last_message_sent_status);
49     ck_assert_int_eq(last_message_sent_payload[0], 0x12);
50     ck_assert_int_eq(last_message_sent_payload[1], 0x34);
51     ck_assert_int_eq(last_message_sent_payload_size, 2);
52
53     ck_assert_int_eq(last_can_frame_sent_arb_id, ISOTP_HANDLER.arbitration_id);
54     fail_unless(can_frame_was_sent);
55     ck_assert_int_eq(last_can_payload_sent[0], 0x2);
56     ck_assert_int_eq(last_can_payload_sent[1], 0x12);
57     ck_assert_int_eq(last_can_payload_sent[2], 0x34);
58     ck_assert_int_eq(last_can_payload_size, 3);
59 }
60 END_TEST
61
62 START_TEST (test_send_multi_frame)
63 {
64     const uint8_t payload[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0x01, 0x23,
65             0x45, 0x67, 0x89};
66     bool status = isotp_send(&ISOTP_HANDLER, &payload, sizeof(payload));
67     fail_if(status);
68     fail_if(last_message_sent_status);
69     fail_if(can_frame_was_sent);
70 }
71 END_TEST
72
73 Suite* testSuite(void) {
74     Suite* s = suite_create("iso15765");
75     TCase *tc_core = tcase_create("send");
76     tcase_add_checked_fixture(tc_core, setup, NULL);
77     tcase_add_test(tc_core, test_send_empty_payload);
78     tcase_add_test(tc_core, test_send_single_frame);
79     tcase_add_test(tc_core, test_send_multi_frame);
80     suite_add_tcase(s, tc_core);
81
82     return s;
83 }
84
85 int main(void) {
86     int numberFailed;
87     Suite* s = testSuite();
88     SRunner *sr = srunner_create(s);
89     // Don't fork so we can actually use gdb
90     srunner_set_fork_status(sr, CK_NOFORK);
91     srunner_run_all(sr, CK_NORMAL);
92     numberFailed = srunner_ntests_failed(sr);
93     srunner_free(sr);
94     return (numberFailed == 0) ? 0 : 1;
95 }