xref: /linux/drivers/firewire/self-id-sequence-helper-test.c (revision 4b132aacb0768ac1e652cf517097ea6f237214b9)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 //
3 // self-id-sequence-helper-test.c - An application of Kunit to test helpers of self ID sequence.
4 //
5 // Copyright (c) 2024 Takashi Sakamoto
6 
7 #include <kunit/test.h>
8 
9 #include "phy-packet-definitions.h"
10 
11 static void test_self_id_sequence_enumerator_valid(struct kunit *test)
12 {
13 	static const u32 valid_sequences[] = {
14 		0x00000000,
15 		0x00000001, 0x00800000,
16 		0x00000001, 0x00800001, 0x00900000,
17 		0x00000000,
18 	};
19 	struct self_id_sequence_enumerator enumerator;
20 	const u32 *entry;
21 	unsigned int quadlet_count;
22 
23 	enumerator.cursor = valid_sequences;
24 	enumerator.quadlet_count = ARRAY_SIZE(valid_sequences);
25 
26 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count);
27 	KUNIT_EXPECT_PTR_EQ(test, entry, &valid_sequences[0]);
28 	KUNIT_EXPECT_EQ(test, quadlet_count, 1);
29 	KUNIT_EXPECT_EQ(test, enumerator.quadlet_count, 6);
30 
31 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count);
32 	KUNIT_EXPECT_PTR_EQ(test, entry, &valid_sequences[1]);
33 	KUNIT_EXPECT_EQ(test, quadlet_count, 2);
34 	KUNIT_EXPECT_EQ(test, enumerator.quadlet_count, 4);
35 
36 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count);
37 	KUNIT_EXPECT_PTR_EQ(test, entry, &valid_sequences[3]);
38 	KUNIT_EXPECT_EQ(test, quadlet_count, 3);
39 	KUNIT_EXPECT_EQ(test, enumerator.quadlet_count, 1);
40 
41 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count);
42 	KUNIT_EXPECT_PTR_EQ(test, entry, &valid_sequences[6]);
43 	KUNIT_EXPECT_EQ(test, quadlet_count, 1);
44 	KUNIT_EXPECT_EQ(test, enumerator.quadlet_count, 0);
45 
46 	entry = self_id_sequence_enumerator_next(&enumerator, &quadlet_count);
47 	KUNIT_EXPECT_EQ(test, PTR_ERR(entry), -ENODATA);
48 }
49 
50 static void test_self_id_sequence_enumerator_invalid(struct kunit *test)
51 {
52 	static const u32 invalid_sequences[] = {
53 		0x00000001,
54 	};
55 	struct self_id_sequence_enumerator enumerator;
56 	const u32 *entry;
57 	unsigned int count;
58 
59 	enumerator.cursor = invalid_sequences;
60 	enumerator.quadlet_count = ARRAY_SIZE(invalid_sequences);
61 
62 	entry = self_id_sequence_enumerator_next(&enumerator, &count);
63 	KUNIT_EXPECT_EQ(test, PTR_ERR(entry), -EPROTO);
64 }
65 
66 static void test_self_id_sequence_get_port_status(struct kunit *test)
67 {
68 	static const u32 expected[] = {
69 		0x000000e5,
70 		0x00839e79,
71 		0x0091e79d,
72 		0x00a279e4,
73 	};
74 	u32 quadlets [] = {
75 		0x00000001,
76 		0x00800001,
77 		0x00900001,
78 		0x00a00000,
79 	};
80 	enum phy_packet_self_id_port_status port_status[28];
81 	unsigned int port_capacity;
82 	unsigned int port_index;
83 
84 	KUNIT_ASSERT_EQ(test, ARRAY_SIZE(expected), ARRAY_SIZE(quadlets));
85 
86 	// With an extra port.
87 	port_capacity = self_id_sequence_get_port_capacity(ARRAY_SIZE(expected)) + 1;
88 	KUNIT_ASSERT_EQ(test, port_capacity, ARRAY_SIZE(port_status));
89 
90 	for (port_index = 0; port_index < port_capacity; ++port_index) {
91 		port_status[port_index] =
92 			self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);
93 		self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,
94 						 port_status[port_index]);
95 	}
96 
97 	// Self ID zero.
98 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[0]);
99 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[1]);
100 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[2]);
101 
102 	// Self ID one.
103 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[3]);
104 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[4]);
105 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[5]);
106 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[6]);
107 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[7]);
108 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[8]);
109 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[9]);
110 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[10]);
111 
112 	// Self ID two.
113 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[11]);
114 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[12]);
115 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[13]);
116 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[14]);
117 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[15]);
118 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[16]);
119 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[17]);
120 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[18]);
121 
122 	// Self ID three.
123 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[19]);
124 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[20]);
125 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[21]);
126 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[22]);
127 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[23]);
128 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[24]);
129 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[25]);
130 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[26]);
131 
132 	// Our of order.
133 	KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[27]);
134 
135 	KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));
136 }
137 
138 static struct kunit_case self_id_sequence_helper_test_cases[] = {
139 	KUNIT_CASE(test_self_id_sequence_enumerator_valid),
140 	KUNIT_CASE(test_self_id_sequence_enumerator_invalid),
141 	KUNIT_CASE(test_self_id_sequence_get_port_status),
142 	{}
143 };
144 
145 static struct kunit_suite self_id_sequence_helper_test_suite = {
146 	.name = "self-id-sequence-helper",
147 	.test_cases = self_id_sequence_helper_test_cases,
148 };
149 kunit_test_suite(self_id_sequence_helper_test_suite);
150 
151 MODULE_DESCRIPTION("Unit test suite for helpers of self ID sequence");
152 MODULE_LICENSE("GPL");
153