net: mctp-serial: Add kunit test for next_chunk_len()

Test various edge cases of inputs that contain characters
that need escaping.

This adds a new kunit suite for mctp-serial.

Signed-off-by: Matt Johnston <matt@codeconstruct.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Matt Johnston 2024-08-29 15:43:45 +08:00 committed by David S. Miller
parent fe1910f933
commit 4fa9c5181c
2 changed files with 114 additions and 0 deletions

View File

@ -21,6 +21,11 @@ config MCTP_SERIAL
Say y here if you need to connect to MCTP endpoints over serial. To
compile as a module, use m; the module will be called mctp-serial.
config MCTP_SERIAL_TEST
bool "MCTP serial tests" if !KUNIT_ALL_TESTS
depends on MCTP_SERIAL=y && KUNIT=y
default KUNIT_ALL_TESTS
config MCTP_TRANSPORT_I2C
tristate "MCTP SMBus/I2C transport"
# i2c-mux is optional, but we must build as a module if i2c-mux is a module

View File

@ -521,3 +521,112 @@ module_exit(mctp_serial_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Jeremy Kerr <jk@codeconstruct.com.au>");
MODULE_DESCRIPTION("MCTP Serial transport");
#if IS_ENABLED(CONFIG_MCTP_SERIAL_TEST)
#include <kunit/test.h>
#define MAX_CHUNKS 6
struct test_chunk_tx {
u8 input_len;
u8 input[MCTP_SERIAL_MTU];
u8 chunks[MAX_CHUNKS];
};
static void test_next_chunk_len(struct kunit *test)
{
struct mctp_serial devx;
struct mctp_serial *dev = &devx;
int next;
const struct test_chunk_tx *params = test->param_value;
memset(dev, 0x0, sizeof(*dev));
memcpy(dev->txbuf, params->input, params->input_len);
dev->txlen = params->input_len;
for (size_t i = 0; i < MAX_CHUNKS; i++) {
next = next_chunk_len(dev);
dev->txpos += next;
KUNIT_EXPECT_EQ(test, next, params->chunks[i]);
if (next == 0) {
KUNIT_EXPECT_EQ(test, dev->txpos, dev->txlen);
return;
}
}
KUNIT_FAIL_AND_ABORT(test, "Ran out of chunks");
}
static struct test_chunk_tx chunk_tx_tests[] = {
{
.input_len = 5,
.input = { 0x00, 0x11, 0x22, 0x7e, 0x80 },
.chunks = { 3, 1, 1, 0},
},
{
.input_len = 5,
.input = { 0x00, 0x11, 0x22, 0x7e, 0x7d },
.chunks = { 3, 1, 1, 0},
},
{
.input_len = 3,
.input = { 0x7e, 0x11, 0x22, },
.chunks = { 1, 2, 0},
},
{
.input_len = 3,
.input = { 0x7e, 0x7e, 0x7d, },
.chunks = { 1, 1, 1, 0},
},
{
.input_len = 4,
.input = { 0x7e, 0x7e, 0x00, 0x7d, },
.chunks = { 1, 1, 1, 1, 0},
},
{
.input_len = 6,
.input = { 0x7e, 0x7e, 0x00, 0x7d, 0x10, 0x10},
.chunks = { 1, 1, 1, 1, 2, 0},
},
{
.input_len = 1,
.input = { 0x7e },
.chunks = { 1, 0 },
},
{
.input_len = 1,
.input = { 0x80 },
.chunks = { 1, 0 },
},
{
.input_len = 3,
.input = { 0x80, 0x80, 0x00 },
.chunks = { 3, 0 },
},
{
.input_len = 7,
.input = { 0x01, 0x00, 0x08, 0xc8, 0x00, 0x80, 0x02 },
.chunks = { 7, 0 },
},
{
.input_len = 7,
.input = { 0x01, 0x00, 0x08, 0xc8, 0x7e, 0x80, 0x02 },
.chunks = { 4, 1, 2, 0 },
},
};
KUNIT_ARRAY_PARAM(chunk_tx, chunk_tx_tests, NULL);
static struct kunit_case mctp_serial_test_cases[] = {
KUNIT_CASE_PARAM(test_next_chunk_len, chunk_tx_gen_params),
};
static struct kunit_suite mctp_serial_test_suite = {
.name = "mctp_serial",
.test_cases = mctp_serial_test_cases,
};
kunit_test_suite(mctp_serial_test_suite);
#endif /* CONFIG_MCTP_SERIAL_TEST */