607 lines · 18.5 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0-only//// node-tree-test.c - An application of Kunit to test node tree.//// Copyright (c) 2026 Takashi Sakamoto//// This file can not be built independently since it is intentionally included in core-topology.c. #include <kunit/test.h>#include <kunit/test-bug.h>#include <kunit/device.h> struct private_data {	struct fw_card *card;	unsigned int release_count;}; static int node_tree_test_init(struct kunit *test){	struct private_data *data; 	data = kunit_kzalloc(test, sizeof(*data), GFP_KERNEL);	KUNIT_ASSERT_NOT_NULL(test, data); 	data->card = kunit_kzalloc(test, sizeof(struct fw_card), GFP_KERNEL);	KUNIT_ASSERT_NOT_NULL(test, data->card); 	data->card->device = kunit_device_register(test, "dummy-device");	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, data->card->device); 	test->priv = data; 	return 0;} static void node_tree_test_exit(struct kunit *test){	struct private_data *data = test->priv; 	kunit_device_unregister(test, data->card->device);	kunit_kfree(test, data->card);	kunit_kfree(test, data);} static void release_fw_node(struct fw_card *card, struct fw_node *node, struct fw_node *parent){	struct private_data *data = kunit_get_current_test()->priv; 	fw_node_put(node);	++data->release_count;} static void node_tree_test_two_nodes(struct kunit *test){	//       root	// ++============++	// ||    phy 1   ||	// ||  P0 P1 P2  ||	// ++===|==|==|==++	//            |	//      +-----+	//      |	// ++===|==x==x==++	// ||  P0 P1 P2  ||	// ||    phy 0   ||	// ++============++	//	static const u32 self_id_sequence[] = {		0x80000080,		0x8100005e,	};	struct private_data *data = test->priv;	struct fw_card *card = data->card; 	card->node_id = LOCAL_BUS | 0x01; 	card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123);	KUNIT_EXPECT_NOT_NULL(test, card->local_node);	KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); 	struct fw_node *node = card->root_node;	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NULL(test, node->ports[1]);	KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); 	struct fw_node *parent = node;	node = parent->ports[2];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00);	KUNIT_EXPECT_EQ(test, node->port_count, 1);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); 	++card->color;	for_each_fw_node(card, card->root_node, release_fw_node);	KUNIT_EXPECT_EQ(test, data->release_count, 2);} static void node_tree_test_two_nodes_1394a(struct kunit *test){	//         root	// ++===============++	// ||      phy 0    ||	// ||  P0 P1 P2 P3  ||	// ++===|==|==|==|==++	//            |	//         +--+	//         |	// ++===|==|==|==|==|==++	// ||  P0 P1 P2 P3 P4  ||	// ||       phy 1      ||	// ++==================++	//	// NOTE: Just for Self-ID Packets Zero and One.	static const u32 self_id_sequence[] = {		0x80000065, 0x80814000,		0x8100005d, 0x81810000,	};	struct private_data *data = test->priv;	struct fw_card *card = data->card; 	card->node_id = LOCAL_BUS | 0x01; 	card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123);	KUNIT_EXPECT_NOT_NULL(test, card->local_node);	KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); 	struct fw_node *node = card->root_node;	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01);	KUNIT_EXPECT_EQ(test, node->port_count, 4);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NULL(test, node->ports[1]);	KUNIT_EXPECT_NOT_NULL(test, node->ports[2]);	KUNIT_EXPECT_NULL(test, node->ports[3]); 	struct fw_node *parent = node;	node = parent->ports[2];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00);	KUNIT_EXPECT_EQ(test, node->port_count, 5);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent);	KUNIT_EXPECT_NULL(test, node->ports[2]);	KUNIT_EXPECT_NULL(test, node->ports[3]);	KUNIT_EXPECT_NULL(test, node->ports[4]); 	++card->color;	for_each_fw_node(card, card->root_node, release_fw_node);	KUNIT_EXPECT_EQ(test, data->release_count, 2);} static void node_tree_test_three_nodes_case0(struct kunit *test){	//       root	// ++============++	// ||    phy 2   ||	// ||  P0 P1 P2  ||	// ++===|==|==|==++	//      |     |	//      +--+  +-----------------+	//         |                    |	// ++===|==|==x==++  ++===|==|==|==++	// ||  P0 P1 P2  ||  ||  P0 P1 P2  ||	// ||    phy 0   ||  ||    phy 1   ||	// ++============++  ++============++	//	static const u32 self_id_sequence[] = {		0x80000060,		0x81000058,		0x820000dc,	};	struct private_data *data = test->priv;	struct fw_card *card = data->card; 	card->node_id = LOCAL_BUS | 0x02; 	card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123);	KUNIT_EXPECT_NOT_NULL(test, card->local_node);	KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); 	struct fw_node *node = card->root_node;	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_NOT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NULL(test, node->ports[1]);	KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); 	struct fw_node *parent = node;	node = parent->ports[0];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00);	KUNIT_EXPECT_EQ(test, node->port_count, 2);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); 	node = parent->ports[2];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NULL(test, node->ports[1]);	KUNIT_EXPECT_PTR_EQ(test, node->ports[2], parent); 	++card->color;	for_each_fw_node(card, card->root_node, release_fw_node);	KUNIT_EXPECT_EQ(test, data->release_count, 3);} static void node_tree_test_three_nodes_case1(struct kunit *test){	//       root	// ++============++	// ||    phy 2   ||	// ||  P0 P1 P2  ||	// ++===|==|==x==++	//         |	//         |  +-----------+	//         |  |           |	// ++===|==|==|==++  ++===|==x==x==++	// ||  P0 P1 P2  ||  ||  P0 P1 P2  ||	// ||    phy 1   ||  ||    phy 0   ||	// ++============++  ++============++	//	static const u32 self_id_sequence[] = {		0x80000080,		0x8100006c,		0x82000070,	};	struct private_data *data = test->priv;	struct fw_card *card = data->card; 	card->node_id = LOCAL_BUS | 0x02; 	card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123);	KUNIT_EXPECT_NOT_NULL(test, card->local_node);	KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); 	struct fw_node *node = card->root_node;	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02);	KUNIT_EXPECT_EQ(test, node->port_count, 2);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); 	struct fw_node *parent = node;	node = parent->ports[1];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent);	KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); 	parent = node;	node = parent->ports[2];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00);	KUNIT_EXPECT_EQ(test, node->port_count, 1);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); 	++card->color;	for_each_fw_node(card, card->root_node, release_fw_node);	KUNIT_EXPECT_EQ(test, data->release_count, 3);} static void node_tree_test_four_nodes_case0(struct kunit *test){	//       root	// ++============++	// ||    phy 3   ||	// ||  P0 P1 P2  ||	// ++===|==|==|==++	//         |	//         |  +-----------+  +--------------+	//         |  |           |  |              |	// ++===|==|==|==++  ++===|==|==x==++  ++===|==x==x==++	// ||  P0 P1 P2  ||  ||  P0 P1 P2  ||  ||  P0 P1 P2  ||	// ||    phy 2   ||  ||    phy 1   ||  ||    phy 0   ||	// ++============++  ++============++  ++============++	//	static const u32 self_id_sequence[] = {		0x80000080,		0x810000b0,		0x8200006c,		0x83000074,	};	struct private_data *data = test->priv;	struct fw_card *card = data->card; 	card->node_id = LOCAL_BUS | 0x03; 	card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123);	KUNIT_EXPECT_NOT_NULL(test, card->local_node);	KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); 	struct fw_node *node = card->root_node;	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NOT_NULL(test, node->ports[1]);	KUNIT_EXPECT_NULL(test, node->ports[2]); 	struct fw_node *parent = node;	node = parent->ports[1];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent);	KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); 	parent = node;	node = parent->ports[2];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01);	KUNIT_EXPECT_EQ(test, node->port_count, 2);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent);	KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); 	parent = node;	node = parent->ports[1];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00);	KUNIT_EXPECT_EQ(test, node->port_count, 1);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); 	++card->color;	for_each_fw_node(card, card->root_node, release_fw_node);	KUNIT_EXPECT_EQ(test, data->release_count, 4);} static void node_tree_test_four_nodes_case1(struct kunit *test){	//       root	// ++============++	// ||    phy 3   ||	// ||  P0 P1 P2  ||	// ++===|==|==x==++	//      |	//      |  +--------------------------------+	//      |  |  +-----------+                 |	// ++===|==|==|==++  ++===|==x==x==++  ++===|==|==|==++	// ||  P0 P1 P2  ||  ||  P0 P1 P2  ||  ||  P0 P1 P2  ||	// ||    phy 2   ||  ||    phy 1   ||  ||    phy 0   ||	// ++============++  ++============++  ++============++	//	static const u32 self_id_sequence[] = {		0x80000094,		0x81000080,		0x820000bc,		0x830000d0,	};	struct private_data *data = test->priv;	struct fw_card *card = data->card; 	card->node_id = LOCAL_BUS | 0x03; 	card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123);	KUNIT_EXPECT_NOT_NULL(test, card->local_node);	KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); 	struct fw_node *node = card->root_node;	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03);	KUNIT_EXPECT_EQ(test, node->port_count, 2);	KUNIT_EXPECT_NOT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NULL(test, node->ports[1]); 	struct fw_node *parent = node;	node = parent->ports[0];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent);	KUNIT_EXPECT_NOT_NULL(test, node->ports[1]);	KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); 	parent = node;	node = parent->ports[2];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01);	KUNIT_EXPECT_EQ(test, node->port_count, 1);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); 	node = parent->ports[1];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent);	KUNIT_EXPECT_NULL(test, node->ports[1]);	KUNIT_EXPECT_NULL(test, node->ports[2]); 	++card->color;	for_each_fw_node(card, card->root_node, release_fw_node);	KUNIT_EXPECT_EQ(test, data->release_count, 4);} static void node_tree_test_four_nodes_case2(struct kunit *test){	//       root	// ++============++	// ||    phy 3   ||	// ||  P0 P1 P2  ||	// ++===|==|==|==++	//      |     |	//      |     +-----------------------------+	//      |  +--------------+                 |	// ++===|==|==x==++  ++===|==|==|==++  ++===|==x==x==++	// ||  P0 P1 P2  ||  ||  P0 P1 P2  ||  ||  P0 P1 P2  ||	// ||    phy 1   ||  ||    phy 0   ||  ||    phy 2   ||	// ++============++  ++============++  ++============++	//	static const u32 self_id_sequence[] = {		0x80000094,		0x810000b0,		0x82000080,		0x830000dc,	};	struct private_data *data = test->priv;	struct fw_card *card = data->card; 	card->node_id = LOCAL_BUS | 0x03; 	card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123);	KUNIT_EXPECT_NOT_NULL(test, card->local_node);	KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); 	struct fw_node *node = card->root_node;	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_NOT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NULL(test, node->ports[1]);	KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); 	struct fw_node *parent = node;	node = parent->ports[2];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02);	KUNIT_EXPECT_EQ(test, node->port_count, 1);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); 	node = parent->ports[0];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01);	KUNIT_EXPECT_EQ(test, node->port_count, 2);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent);	KUNIT_EXPECT_NOT_NULL(test, node->ports[1]); 	parent = node;	node = parent->ports[1];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent);	KUNIT_EXPECT_NULL(test, node->ports[1]);	KUNIT_EXPECT_NULL(test, node->ports[2]); 	++card->color;	for_each_fw_node(card, card->root_node, release_fw_node);	KUNIT_EXPECT_EQ(test, data->release_count, 4);} static void node_tree_test_four_nodes_case3(struct kunit *test){	//       root	// ++============++	// ||    phy 3   ||	// ||  P0 P1 P2  ||	// ++===|==|==|==++	//      |  |  +--------------------------------+	//      |  +--------------------+              |	//      |                       |              |	// ++===|==|==x==++  ++===|==|==|==++  ++===|==|==x==++	// ||  P0 P1 P2  ||  ||  P0 P1 P2  ||  ||  P0 P1 P2  ||	// ||    phy 0   ||  ||    phy 1   ||  ||    phy 2   ||	// ++============++  ++============++  ++============++	//	static const u32 self_id_sequence[] = {		0x80000090,		0x81000058,		0x82000060,		0x830000fc,	};	struct private_data *data = test->priv;	struct fw_card *card = data->card; 	card->node_id = LOCAL_BUS | 0x03; 	card->local_node = build_tree(card, self_id_sequence, ARRAY_SIZE(self_id_sequence), 123);	KUNIT_EXPECT_NOT_NULL(test, card->local_node);	KUNIT_EXPECT_PTR_EQ(test, card->local_node, card->root_node); 	struct fw_node *node = card->root_node;	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x03);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_NOT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NOT_NULL(test, node->ports[1]);	KUNIT_EXPECT_NOT_NULL(test, node->ports[2]); 	struct fw_node *parent = node;	node = parent->ports[2];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x02);	KUNIT_EXPECT_EQ(test, node->port_count, 2);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_PTR_EQ(test, node->ports[1], parent); 	node = parent->ports[1];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x01);	KUNIT_EXPECT_EQ(test, node->port_count, 3);	KUNIT_EXPECT_NULL(test, node->ports[0]);	KUNIT_EXPECT_NULL(test, node->ports[1]);	KUNIT_EXPECT_PTR_EQ(test, node->ports[2], parent); 	node = parent->ports[0];	KUNIT_EXPECT_EQ(test, node->node_id, LOCAL_BUS | 0x00);	KUNIT_EXPECT_EQ(test, node->port_count, 2);

Lines 1–500 of 607.