8 extern bool last_response_was_received;
9 extern DiagnosticResponse last_response_received;
10 extern DiagnosticShims SHIMS;
11 extern DiagnosticResponseReceived response_received_handler;
13 START_TEST (test_receive_wrong_arb_id)
15 DiagnosticRequest request = {
16 arbitration_id: 0x7df,
17 mode: OBD2_MODE_POWERTRAIN_DIAGNOSTIC_REQUEST
19 DiagnosticRequestHandle handle = diagnostic_request(&SHIMS, &request,
20 response_received_handler);
22 fail_if(last_response_was_received);
23 const uint8_t can_data[] = {0x2, request.mode + 0x40, 0x23};
24 diagnostic_receive_can_frame(&handle, request.arbitration_id, can_data,
26 fail_if(last_response_was_received);
30 START_TEST (test_send_diag_request)
32 DiagnosticRequest request = {
33 arbitration_id: 0x7df,
34 mode: OBD2_MODE_POWERTRAIN_DIAGNOSTIC_REQUEST
36 DiagnosticRequestHandle handle = diagnostic_request(&SHIMS, &request,
37 response_received_handler);
39 fail_if(last_response_was_received);
40 const uint8_t can_data[] = {0x2, request.mode + 0x40, 0x23};
41 diagnostic_receive_can_frame(&handle, request.arbitration_id + 0x8,
42 can_data, sizeof(can_data));
43 fail_unless(last_response_was_received);
44 ck_assert(last_response_received.success);
45 ck_assert_int_eq(last_response_received.arbitration_id,
46 request.arbitration_id + 0x8);
47 // TODO should we set it back to the original mode, or leave as mode + 0x40?
48 ck_assert_int_eq(last_response_received.mode, request.mode);
49 ck_assert_int_eq(last_response_received.pid, 0);
50 ck_assert_int_eq(last_response_received.payload_length, 1);
51 ck_assert_int_eq(last_response_received.payload[0], can_data[2]);
55 START_TEST (test_request_pid_standard)
57 DiagnosticRequestHandle handle = diagnostic_request_pid(&SHIMS,
58 DIAGNOSTIC_STANDARD_PID, 0x2, response_received_handler);
60 fail_if(last_response_was_received);
61 const uint8_t can_data[] = {0x3, 0x1 + 0x40, 0x2, 0x45};
62 // TODO need a constant for the 7df broadcast functional request
63 diagnostic_receive_can_frame(&handle, 0x7df + 0x8,
64 can_data, sizeof(can_data));
65 fail_unless(last_response_was_received);
66 ck_assert(last_response_received.success);
67 ck_assert_int_eq(last_response_received.arbitration_id,
69 // TODO should we set it back to the original mode, or leave as mode + 0x40?
70 ck_assert_int_eq(last_response_received.mode, 0x1);
71 ck_assert_int_eq(last_response_received.pid, 0x2);
72 ck_assert_int_eq(last_response_received.payload_length, 1);
73 ck_assert_int_eq(last_response_received.payload[0], can_data[3]);
77 START_TEST (test_request_pid_enhanced)
79 DiagnosticRequestHandle handle = diagnostic_request_pid(&SHIMS,
80 DIAGNOSTIC_ENHANCED_PID, 0x2, response_received_handler);
82 fail_if(last_response_was_received);
83 const uint8_t can_data[] = {0x4, 0x1 + 0x40, 0x0, 0x2, 0x45};
84 // TODO need a constant for the 7df broadcast functional request
85 diagnostic_receive_can_frame(&handle, 0x7df + 0x8, can_data,
87 fail_unless(last_response_was_received);
88 ck_assert(last_response_received.success);
89 ck_assert_int_eq(last_response_received.arbitration_id,
91 // TODO should we set it back to the original mode, or leave as mode + 0x40?
92 ck_assert_int_eq(last_response_received.mode, 0x22);
93 ck_assert_int_eq(last_response_received.pid, 0x2);
94 ck_assert_int_eq(last_response_received.payload_length, 1);
95 ck_assert_int_eq(last_response_received.payload[0], can_data[4]);
99 Suite* testSuite(void) {
100 Suite* s = suite_create("obd2");
101 TCase *tc_core = tcase_create("core");
102 tcase_add_checked_fixture(tc_core, setup, NULL);
103 tcase_add_test(tc_core, test_send_diag_request);
104 tcase_add_test(tc_core, test_receive_wrong_arb_id);
105 tcase_add_test(tc_core, test_request_pid_standard);
106 tcase_add_test(tc_core, test_request_pid_enhanced);
108 // TODO these are future work:
109 // TODO test request MIL
110 // TODO test request VIN
111 // TODO test request DTC
112 // TODO test clear DTC
113 // TODO test enumerate PIDs
114 suite_add_tcase(s, tc_core);
121 Suite* s = testSuite();
122 SRunner *sr = srunner_create(s);
123 // Don't fork so we can actually use gdb
124 srunner_set_fork_status(sr, CK_NOFORK);
125 srunner_run_all(sr, CK_NORMAL);
126 numberFailed = srunner_ntests_failed(sr);
128 return (numberFailed == 0) ? 0 : 1;