Commit 4fa9c518 authored by Matt Johnston's avatar Matt Johnston Committed by David S. Miller
Browse files

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: default avatarMatt Johnston <matt@codeconstruct.com.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fe1910f9
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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
+109 −0
Original line number Diff line number Diff line
@@ -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 */