| // SPDX-License-Identifier: GPL-2.0-or-later | 
 | // | 
 | // self-id-sequence-helper-test.c - An application of Kunit to test helpers of self ID sequence. | 
 | // | 
 | // Copyright (c) 2024 Takashi Sakamoto | 
 |  | 
 | #include <kunit/test.h> | 
 |  | 
 | #include "phy-packet-definitions.h" | 
 |  | 
 | static void test_self_id_sequence_enumerator_valid(struct kunit *test) | 
 | { | 
 | 	static const u32 valid_sequences[] = { | 
 | 		0x00000000, | 
 | 		0x00000001, 0x00800000, | 
 | 		0x00000001, 0x00800001, 0x00900000, | 
 | 		0x00000000, | 
 | 	}; | 
 | 	struct self_id_sequence_enumerator enumerator; | 
 | 	const u32 *entry; | 
 | 	unsigned int quadlet_count; | 
 |  | 
 | 	enumerator.cursor = valid_sequences; | 
 | 	enumerator.quadlet_count = ARRAY_SIZE(valid_sequences); | 
 |  | 
 | 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count); | 
 | 	KUNIT_EXPECT_PTR_EQ(test, entry, &valid_sequences[0]); | 
 | 	KUNIT_EXPECT_EQ(test, quadlet_count, 1); | 
 | 	KUNIT_EXPECT_EQ(test, enumerator.quadlet_count, 6); | 
 |  | 
 | 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count); | 
 | 	KUNIT_EXPECT_PTR_EQ(test, entry, &valid_sequences[1]); | 
 | 	KUNIT_EXPECT_EQ(test, quadlet_count, 2); | 
 | 	KUNIT_EXPECT_EQ(test, enumerator.quadlet_count, 4); | 
 |  | 
 | 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count); | 
 | 	KUNIT_EXPECT_PTR_EQ(test, entry, &valid_sequences[3]); | 
 | 	KUNIT_EXPECT_EQ(test, quadlet_count, 3); | 
 | 	KUNIT_EXPECT_EQ(test, enumerator.quadlet_count, 1); | 
 |  | 
 | 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count); | 
 | 	KUNIT_EXPECT_PTR_EQ(test, entry, &valid_sequences[6]); | 
 | 	KUNIT_EXPECT_EQ(test, quadlet_count, 1); | 
 | 	KUNIT_EXPECT_EQ(test, enumerator.quadlet_count, 0); | 
 |  | 
 | 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count); | 
 | 	KUNIT_EXPECT_EQ(test, PTR_ERR(entry), -ENODATA); | 
 | } | 
 |  | 
 | static void test_self_id_sequence_enumerator_invalid(struct kunit *test) | 
 | { | 
 | 	static const u32 invalid_sequences[] = { | 
 | 		0x00000001, | 
 | 	}; | 
 | 	struct self_id_sequence_enumerator enumerator; | 
 | 	const u32 *entry; | 
 | 	unsigned int count; | 
 |  | 
 | 	enumerator.cursor = invalid_sequences; | 
 | 	enumerator.quadlet_count = ARRAY_SIZE(invalid_sequences); | 
 |  | 
 | 	entry = self_id_sequence_enumerator_next(&enumerator, &count); | 
 | 	KUNIT_EXPECT_EQ(test, PTR_ERR(entry), -EPROTO); | 
 | } | 
 |  | 
 | static void test_self_id_sequence_get_port_status(struct kunit *test) | 
 | { | 
 | 	static const u32 expected[] = { | 
 | 		0x000000e5, | 
 | 		0x00839e79, | 
 | 		0x0091e79d, | 
 | 		0x00a279e4, | 
 | 	}; | 
 | 	u32 quadlets [] = { | 
 | 		0x00000001, | 
 | 		0x00800001, | 
 | 		0x00900001, | 
 | 		0x00a00000, | 
 | 	}; | 
 | 	enum phy_packet_self_id_port_status port_status[28]; | 
 | 	unsigned int port_capacity; | 
 | 	unsigned int port_index; | 
 |  | 
 | 	KUNIT_ASSERT_EQ(test, ARRAY_SIZE(expected), ARRAY_SIZE(quadlets)); | 
 |  | 
 | 	// With an extra port. | 
 | 	port_capacity = self_id_sequence_get_port_capacity(ARRAY_SIZE(expected)) + 1; | 
 | 	KUNIT_ASSERT_EQ(test, port_capacity, ARRAY_SIZE(port_status)); | 
 |  | 
 | 	for (port_index = 0; port_index < port_capacity; ++port_index) { | 
 | 		port_status[port_index] = | 
 | 			self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index); | 
 | 		self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index, | 
 | 						 port_status[port_index]); | 
 | 	} | 
 |  | 
 | 	// Self ID zero. | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[0]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[1]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[2]); | 
 |  | 
 | 	// Self ID one. | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[3]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[4]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[5]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[6]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[7]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[8]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[9]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[10]); | 
 |  | 
 | 	// Self ID two. | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[11]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[12]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[13]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[14]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[15]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[16]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[17]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[18]); | 
 |  | 
 | 	// Self ID three. | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[19]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[20]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[21]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[22]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[23]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[24]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[25]); | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[26]); | 
 |  | 
 | 	// Our of order. | 
 | 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[27]); | 
 |  | 
 | 	KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected)); | 
 | } | 
 |  | 
 | static struct kunit_case self_id_sequence_helper_test_cases[] = { | 
 | 	KUNIT_CASE(test_self_id_sequence_enumerator_valid), | 
 | 	KUNIT_CASE(test_self_id_sequence_enumerator_invalid), | 
 | 	KUNIT_CASE(test_self_id_sequence_get_port_status), | 
 | 	{} | 
 | }; | 
 |  | 
 | static struct kunit_suite self_id_sequence_helper_test_suite = { | 
 | 	.name = "self-id-sequence-helper", | 
 | 	.test_cases = self_id_sequence_helper_test_cases, | 
 | }; | 
 | kunit_test_suite(self_id_sequence_helper_test_suite); | 
 |  | 
 | MODULE_DESCRIPTION("Unit test suite for helpers of self ID sequence"); | 
 | MODULE_LICENSE("GPL"); |