| // 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); | |
| KUNIT_EXPECT_PTR_EQ(test, node->ports[0], parent); | |
| KUNIT_EXPECT_NULL(test, node->ports[1]); | |
| ++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_invalid_extended_self_id_sequence(struct kunit *test) | |
| { | |
| // Use the same node tree as node_tree_test_four_nodes_case1, except for the invalid | |
| // content of self ID packet for the phy 3. | |
| static const u32 self_id_sequence[] = { | |
| 0x80000094, | |
| 0x81000080, | |
| 0x820000bc, | |
| 0x830000d1, // Invalid. | |
| }; | |
| 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_NULL(test, card->local_node); | |
| } | |
| static void node_tree_test_invalid_phy_id(struct kunit *test) | |
| { | |
| // Use the same node tree as node_tree_test_four_nodes_case1, except for the invalid | |
| // phy ID for phy 3. | |
| static const u32 self_id_sequence[] = { | |
| 0x80000094, | |
| 0x81000080, | |
| 0x820000bc, | |
| 0x8f0000d0, // Invalid. | |
| }; | |
| 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_NULL(test, card->local_node); | |
| } | |
| static void node_tree_test_invalid_child_port_count(struct kunit *test) | |
| { | |
| // Use the same node tree as node_tree_test_four_nodes_case1, except for the invalid | |
| // count of child ports for phy 3. | |
| static const u32 self_id_sequence[] = { | |
| 0x80000094, | |
| 0x81000080, | |
| 0x820000bc, | |
| 0x830000fc, // Invalid. | |
| }; | |
| 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_NULL(test, card->local_node); | |
| } | |
| static void node_tree_test_invalid_parent_port_count(struct kunit *test) | |
| { | |
| // Use the same node tree as node_tree_test_four_nodes_case1, except for the invalid | |
| // count of parent ports for phy 3. | |
| static const u32 self_id_sequence[] = { | |
| 0x80000094, | |
| 0x81000080, | |
| 0x820000bc, | |
| 0x830000e8, // Invalid. | |
| }; | |
| 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_NULL(test, card->local_node); | |
| } | |
| static struct kunit_case node_tree_test_cases[] = { | |
| KUNIT_CASE(node_tree_test_two_nodes), | |
| KUNIT_CASE(node_tree_test_two_nodes_1394a), | |
| KUNIT_CASE(node_tree_test_three_nodes_case0), | |
| KUNIT_CASE(node_tree_test_three_nodes_case1), | |
| KUNIT_CASE(node_tree_test_four_nodes_case0), | |
| KUNIT_CASE(node_tree_test_four_nodes_case1), | |
| KUNIT_CASE(node_tree_test_four_nodes_case2), | |
| KUNIT_CASE(node_tree_test_four_nodes_case3), | |
| KUNIT_CASE(node_tree_test_invalid_extended_self_id_sequence), | |
| KUNIT_CASE(node_tree_test_invalid_phy_id), | |
| KUNIT_CASE(node_tree_test_invalid_child_port_count), | |
| KUNIT_CASE(node_tree_test_invalid_parent_port_count), | |
| {} | |
| }; | |
| static struct kunit_suite node_tree_test_suite = { | |
| .name = "firewire-node-tree", | |
| .init = node_tree_test_init, | |
| .exit = node_tree_test_exit, | |
| .test_cases = node_tree_test_cases, | |
| }; | |
| kunit_test_suite(node_tree_test_suite); |