net: mctp-serial: Add kunit test for next_chunk_len()
authorMatt Johnston <matt@codeconstruct.com.au>
Thu, 29 Aug 2024 07:43:45 +0000 (15:43 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Sep 2024 17:14:01 +0000 (18:14 +0100)
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>
drivers/net/mctp/Kconfig
drivers/net/mctp/mctp-serial.c

index ce9d2d2ccf3bb48361b845d271c56b2e7622560f..15860d6ac39fef62847d7186f1f0d81c1d3cd619 100644 (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
index 5bf6fdff701cd64964faf0a4a7b4aac50830a01c..7a40d07ff77bbec1e314ddc4b7b38005782ee3f7 100644 (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 */