Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tests: canbus: isotp: conformance: add mode_check test
Add a test to check error codes if attempting to use ISO-TP with CAN FD mode even though the controller supports classical CAN only. Signed-off-by: Martin Jäger <martin@libre.solar>
- Loading branch information
1 parent
44bf015
commit 07787e5
Showing
1 changed file
with
91 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
/* | ||
* Copyright (c) 2023 Libre Solar Technologies GmbH | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
/* | ||
* This test suite checks that correct errors are returned when trying to use the ISO-TP | ||
* protocol with CAN-FD mode even though the controller does not support CAN-FD. | ||
*/ | ||
|
||
#include <zephyr/canbus/isotp.h> | ||
#include <zephyr/ztest.h> | ||
|
||
static const struct device *const can_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_canbus)); | ||
static struct isotp_recv_ctx recv_ctx; | ||
static struct isotp_send_ctx send_ctx; | ||
static bool canfd_capable; | ||
|
||
static const struct isotp_fc_opts fc_opts = { | ||
.bs = 0, | ||
.stmin = 0 | ||
}; | ||
|
||
static const struct isotp_msg_id rx_addr = { | ||
.std_id = 0x20, | ||
#ifdef CONFIG_TEST_USE_CAN_FD_MODE | ||
.dl = CONFIG_TEST_ISOTP_TX_DL, | ||
.flags = ISOTP_MSG_FDF | ISOTP_MSG_BRS, | ||
#endif | ||
}; | ||
|
||
static const struct isotp_msg_id tx_addr = { | ||
.std_id = 0x21, | ||
#ifdef CONFIG_TEST_USE_CAN_FD_MODE | ||
.dl = CONFIG_TEST_ISOTP_TX_DL, | ||
.flags = ISOTP_MSG_FDF | ISOTP_MSG_BRS, | ||
#endif | ||
}; | ||
|
||
ZTEST(isotp_canfd_notsup, test_bind) | ||
{ | ||
int err; | ||
|
||
err = isotp_bind(&recv_ctx, can_dev, &rx_addr, &tx_addr, &fc_opts, K_NO_WAIT); | ||
if (IS_ENABLED(CONFIG_TEST_USE_CAN_FD_MODE) && !canfd_capable) { | ||
zassert_equal(err, ISOTP_N_ERROR); | ||
} else { | ||
zassert_equal(err, ISOTP_N_OK); | ||
} | ||
|
||
isotp_unbind(&recv_ctx); | ||
} | ||
|
||
ZTEST(isotp_canfd_notsup, test_send) | ||
{ | ||
uint8_t buf[] = { 1, 2, 3 }; | ||
int err; | ||
|
||
err = isotp_send(&send_ctx, can_dev, buf, sizeof(buf), &rx_addr, &tx_addr, NULL, NULL); | ||
if (IS_ENABLED(CONFIG_TEST_USE_CAN_FD_MODE) && !canfd_capable) { | ||
zassert_equal(err, ISOTP_N_ERROR); | ||
} else { | ||
zassert_equal(err, ISOTP_N_OK); | ||
} | ||
} | ||
|
||
static void *isotp_canfd_notup_setup(void) | ||
{ | ||
can_mode_t cap; | ||
int err; | ||
|
||
zassert_true(device_is_ready(can_dev), "CAN device not ready"); | ||
|
||
err = can_get_capabilities(can_dev, &cap); | ||
zassert_equal(err, 0, "failed to get CAN controller capabilities (err %d)", err); | ||
|
||
canfd_capable = (cap & CAN_MODE_FD) != 0; | ||
|
||
(void)can_stop(can_dev); | ||
|
||
err = can_set_mode(can_dev, CAN_MODE_LOOPBACK | (canfd_capable ? CAN_MODE_FD : 0)); | ||
zassert_equal(err, 0, "Failed to set mode [%d]", err); | ||
|
||
err = can_start(can_dev); | ||
zassert_equal(err, 0, "Failed to start CAN controller [%d]", err); | ||
|
||
return NULL; | ||
} | ||
|
||
ZTEST_SUITE(isotp_canfd_notsup, NULL, isotp_canfd_notup_setup, NULL, NULL, NULL); |