| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * Test for part command | |
| * | |
| * Copyright (C) 2026 Amarula Solutions | |
| * Written by Dario Binacchi <dario.binacchi@amarulasolutions.com> | |
| */ | |
| #include <command.h> | |
| #include <dm.h> | |
| #include <env.h> | |
| #include <part.h> | |
| #include <vsprintf.h> | |
| #include <dm/test.h> | |
| #include <test/cmd.h> | |
| #include <test/test.h> | |
| #include <test/ut.h> | |
| static struct disk_partition gpt_parts[] = { | |
| { | |
| .start = 48, | |
| .size = 1, | |
| .name = "test1", | |
| .uuid = "c5bce7a2-03f0-4d03-9048-01ff23b9d527", | |
| }, | |
| { | |
| .start = 49, | |
| .size = 2, | |
| .name = "test2", | |
| .uuid = "9df346e8-2c53-4cd8-b9ac-3af83f9a9b74", | |
| }, | |
| }; | |
| static char disk_guid[UUID_STR_LEN + 1] = | |
| "8d60b397-1bb6-4d33-80ee-b1587d24c2f8"; | |
| static int setup_gpt_partitions(struct unit_test_state *uts, | |
| unsigned int mmc_dev_num) | |
| { | |
| struct blk_desc *mmc_dev_desc; | |
| char dev_str[10]; | |
| int i, ret; | |
| if (!CONFIG_IS_ENABLED(MMC)) | |
| return -EAGAIN; | |
| snprintf(dev_str, sizeof(dev_str), "%u", mmc_dev_num); | |
| ret = blk_get_device_by_str("mmc", dev_str, &mmc_dev_desc); | |
| if (ret == -ENODEV) | |
| return -EAGAIN; | |
| ut_asserteq(mmc_dev_num, ret); | |
| if (CONFIG_IS_ENABLED(RANDOM_UUID)) { | |
| for (i = 0; i < ARRAY_SIZE(gpt_parts); i++) | |
| gen_rand_uuid_str(gpt_parts[i].uuid, | |
| UUID_STR_FORMAT_STD); | |
| gen_rand_uuid_str(disk_guid, UUID_STR_FORMAT_STD); | |
| } | |
| ut_assertok(gpt_restore(mmc_dev_desc, disk_guid, gpt_parts, | |
| ARRAY_SIZE(gpt_parts))); | |
| return 0; | |
| } | |
| static int cmd_test_part_number(struct unit_test_state *uts) | |
| { | |
| unsigned int mmc_dev_num = 2; | |
| char expected[10]; | |
| int i, ret; | |
| ret = setup_gpt_partitions(uts, mmc_dev_num); | |
| if (ret == -EAGAIN) | |
| return ret; | |
| ut_assertok(ret); | |
| for (i = 0; i < ARRAY_SIZE(gpt_parts); i++) { | |
| env_set("partnum", NULL); | |
| ut_assertok(run_commandf("part number mmc %u %s partnum", | |
| mmc_dev_num, gpt_parts[i].name)); | |
| snprintf(expected, sizeof(expected), "0x%x", i + 1); | |
| ut_asserteq_str(expected, env_get("partnum")); | |
| } | |
| env_set("partnum", NULL); | |
| ut_asserteq(1, run_commandf("part number mmc %u bogus partnum", | |
| mmc_dev_num)); | |
| ut_assertnull(env_get("partnum")); | |
| for (i = 0; i < ARRAY_SIZE(gpt_parts); i++) { | |
| env_set("partnum", NULL); | |
| ut_assertok(run_commandf("part number mmc %u %s partnum", | |
| mmc_dev_num, gpt_parts[i].uuid)); | |
| snprintf(expected, sizeof(expected), "0x%x", i + 1); | |
| ut_asserteq_str(expected, env_get("partnum")); | |
| } | |
| env_set("partnum", NULL); | |
| ut_asserteq(1, run_commandf("part number mmc %u %s partnum", | |
| mmc_dev_num, | |
| "00000000-0000-0000-0000-000000000000")); | |
| ut_assertnull(env_get("partnum")); | |
| return 0; | |
| } | |
| CMD_TEST(cmd_test_part_number, UTF_CONSOLE); | |
| static int cmd_test_part_start(struct unit_test_state *uts) | |
| { | |
| unsigned int mmc_dev_num = 2; | |
| char expected[32]; | |
| int i, ret; | |
| ret = setup_gpt_partitions(uts, mmc_dev_num); | |
| if (ret == -EAGAIN) | |
| return ret; | |
| ut_assertok(ret); | |
| for (i = 0; i < ARRAY_SIZE(gpt_parts); i++) { | |
| env_set("partstart", NULL); | |
| ut_assertok(run_commandf("part start mmc %u %d partstart", | |
| mmc_dev_num, i + 1)); | |
| snprintf(expected, sizeof(expected), "%lx", | |
| (unsigned long)gpt_parts[i].start); | |
| ut_asserteq_str(expected, env_get("partstart")); | |
| } | |
| env_set("partstart", NULL); | |
| ut_asserteq(1, run_commandf("part start mmc %u 3 partstart", | |
| mmc_dev_num)); | |
| ut_assertnull(env_get("partstart")); | |
| for (i = 0; i < ARRAY_SIZE(gpt_parts); i++) { | |
| env_set("partstart", NULL); | |
| ut_assertok(run_commandf("part start mmc %u %s partstart", | |
| mmc_dev_num, gpt_parts[i].name)); | |
| snprintf(expected, sizeof(expected), "%lx", | |
| (unsigned long)gpt_parts[i].start); | |
| ut_asserteq_str(expected, env_get("partstart")); | |
| } | |
| env_set("partstart", NULL); | |
| ut_asserteq(1, run_commandf("part start mmc %u bogus partstart", | |
| mmc_dev_num)); | |
| ut_assertnull(env_get("partstart")); | |
| for (i = 0; i < ARRAY_SIZE(gpt_parts); i++) { | |
| env_set("partstart", NULL); | |
| ut_assertok(run_commandf("part start mmc %u %s partstart", | |
| mmc_dev_num, gpt_parts[i].uuid)); | |
| snprintf(expected, sizeof(expected), "%lx", | |
| (unsigned long)gpt_parts[i].start); | |
| ut_asserteq_str(expected, env_get("partstart")); | |
| } | |
| env_set("partstart", NULL); | |
| ut_asserteq(1, run_commandf("part start mmc %u %s partstart", | |
| mmc_dev_num, | |
| "00000000-0000-0000-0000-000000000000")); | |
| ut_assertnull(env_get("partstart")); | |
| return 0; | |
| } | |
| CMD_TEST(cmd_test_part_start, UTF_CONSOLE); | |
| static int cmd_test_part_size(struct unit_test_state *uts) | |
| { | |
| unsigned int mmc_dev_num = 2; | |
| char expected[32]; | |
| int i, ret; | |
| ret = setup_gpt_partitions(uts, mmc_dev_num); | |
| if (ret == -EAGAIN) | |
| return ret; | |
| ut_assertok(ret); | |
| for (i = 0; i < ARRAY_SIZE(gpt_parts); i++) { | |
| env_set("partsize", NULL); | |
| ut_assertok(run_commandf("part size mmc %u %d partsize", | |
| mmc_dev_num, i + 1)); | |
| snprintf(expected, sizeof(expected), "%lx", | |
| (unsigned long)gpt_parts[i].size); | |
| ut_asserteq_str(expected, env_get("partsize")); | |
| } | |
| env_set("partsize", NULL); | |
| ut_asserteq(1, run_commandf("part size mmc %u 3 partsize", | |
| mmc_dev_num)); | |
| ut_assertnull(env_get("partsize")); | |
| for (i = 0; i < ARRAY_SIZE(gpt_parts); i++) { | |
| env_set("partsize", NULL); | |
| ut_assertok(run_commandf("part size mmc %u %s partsize", | |
| mmc_dev_num, gpt_parts[i].name)); | |
| snprintf(expected, sizeof(expected), "%lx", | |
| (unsigned long)gpt_parts[i].size); | |
| ut_asserteq_str(expected, env_get("partsize")); | |
| } | |
| env_set("partsize", NULL); | |
| ut_asserteq(1, run_commandf("part size mmc %u bogus partsize", | |
| mmc_dev_num)); | |
| ut_assertnull(env_get("partsize")); | |
| for (i = 0; i < ARRAY_SIZE(gpt_parts); i++) { | |
| env_set("partsize", NULL); | |
| ut_assertok(run_commandf("part size mmc %u %s partsize", | |
| mmc_dev_num, gpt_parts[i].uuid)); | |
| snprintf(expected, sizeof(expected), "%lx", | |
| (unsigned long)gpt_parts[i].size); | |
| ut_asserteq_str(expected, env_get("partsize")); | |
| } | |
| env_set("partsize", NULL); | |
| ut_asserteq(1, run_commandf("part size mmc %u %s partsize", | |
| mmc_dev_num, | |
| "00000000-0000-0000-0000-000000000000")); | |
| ut_assertnull(env_get("partsize")); | |
| return 0; | |
| } | |
| CMD_TEST(cmd_test_part_size, UTF_CONSOLE); |