Coverage Report

Created: 2026-03-11 06:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/u-boot/test/dm/part.c
Line
Count
Source
1
// SPDX-License-Identifier: GPL-2.0+
2
/*
3
 * Copyright (C) 2020 Sean Anderson <sean.anderson@seco.com>
4
 */
5
6
#include <dm.h>
7
#include <env.h>
8
#include <mmc.h>
9
#include <part.h>
10
#include <part_efi.h>
11
#include <dm/test.h>
12
#include <test/ut.h>
13
14
static int do_test(struct unit_test_state *uts, int expected,
15
       const char *part_str, bool whole)
16
0
{
17
0
  struct blk_desc *mmc_dev_desc;
18
0
  struct disk_partition part_info;
19
20
0
  int ret = part_get_info_by_dev_and_name_or_num("mmc", part_str,
21
0
                   &mmc_dev_desc,
22
0
                   &part_info, whole);
23
24
0
  ut_assertf(expected == ret, "test(%d, \"%s\", %d) == %d", expected,
25
0
       part_str, whole, ret);
26
0
  return 0;
27
0
}
28
29
static int dm_test_part(struct unit_test_state *uts)
30
0
{
31
0
  char *oldbootdevice;
32
0
  char str_disk_guid[UUID_STR_LEN + 1];
33
0
  int ret;
34
0
  struct blk_desc *mmc_dev_desc;
35
0
  struct disk_partition parts[2] = {
36
0
    {
37
0
      .start = 48, /* GPT data takes up the first 34 blocks or so */
38
0
      .size = 1,
39
0
      .name = "test1",
40
0
    },
41
0
    {
42
0
      .start = 49,
43
0
      .size = 1,
44
0
      .name = "test2",
45
0
    },
46
0
  };
47
48
0
  ut_asserteq(2, blk_get_device_by_str("mmc", "2", &mmc_dev_desc));
49
0
  if (CONFIG_IS_ENABLED(RANDOM_UUID)) {
50
0
    gen_rand_uuid_str(parts[0].uuid, UUID_STR_FORMAT_STD);
51
0
    gen_rand_uuid_str(parts[1].uuid, UUID_STR_FORMAT_STD);
52
0
    gen_rand_uuid_str(str_disk_guid, UUID_STR_FORMAT_STD);
53
0
  }
54
0
  ut_assertok(gpt_restore(mmc_dev_desc, str_disk_guid, parts,
55
0
        ARRAY_SIZE(parts)));
56
57
0
  oldbootdevice = env_get("bootdevice");
58
59
0
#define test(expected, part_str, whole) \
60
0
  ut_assertok(do_test(uts, expected, part_str, whole))
61
62
0
  env_set("bootdevice", NULL);
63
0
  test(-ENODEV, NULL, true);
64
0
  test(-ENODEV, "", true);
65
0
  env_set("bootdevice", "0");
66
0
  test(0, NULL, true);
67
0
  test(0, "", true);
68
0
  env_set("bootdevice", "2");
69
0
  test(1, NULL, false);
70
0
  test(1, "", false);
71
0
  test(1, "-", false);
72
0
  env_set("bootdevice", "");
73
0
  test(-EPROTONOSUPPORT, "0", false);
74
0
  test(0, "0", true);
75
0
  test(0, ":0", true);
76
0
  test(0, ".0", true);
77
0
  test(0, ".0:0", true);
78
0
  test(-EINVAL, "#test1", true);
79
0
  test(1, "2", false);
80
0
  test(1, "2", true);
81
0
  test(-ENOENT, "2:0", false);
82
0
  test(0, "2:0", true);
83
0
  test(1, "2:1", false);
84
0
  test(2, "2:2", false);
85
0
  test(1, "2.0", false);
86
0
  test(0, "2.0:0", true);
87
0
  test(1, "2.0:1", false);
88
0
  test(2, "2.0:2", false);
89
0
  test(-EINVAL, "2#bogus", false);
90
0
  test(1, "2#test1", false);
91
0
  test(2, "2#test2", false);
92
0
  ret = 0;
93
94
0
  env_set("bootdevice", oldbootdevice);
95
0
  return ret;
96
0
}
97
DM_TEST(dm_test_part, UTF_SCAN_PDATA | UTF_SCAN_FDT);
98
99
static int dm_test_part_bootable(struct unit_test_state *uts)
100
0
{
101
0
  struct blk_desc *desc;
102
0
  struct udevice *dev;
103
104
0
  ut_assertok(uclass_get_device_by_name(UCLASS_BLK, "mmc1.blk", &dev));
105
0
  desc = dev_get_uclass_plat(dev);
106
0
  ut_asserteq(1, part_get_bootable(desc));
107
108
0
  return 0;
109
0
}
110
DM_TEST(dm_test_part_bootable, UTF_SCAN_FDT);
111
112
static int do_get_info_test(struct unit_test_state *uts,
113
          struct blk_desc *dev_desc, int part, int part_type,
114
          struct disk_partition const *reference)
115
0
{
116
0
  struct disk_partition p;
117
0
  int ret;
118
119
0
  memset(&p, 0, sizeof(p));
120
121
0
  ret = part_get_info_by_type(dev_desc, part, part_type, &p);
122
0
  printf("part_get_info_by_type(%d, 0x%x) = %d\n", part, part_type, ret);
123
0
  if (ut_assertok(ret)) {
124
0
    return 0;
125
0
  }
126
127
0
  ut_asserteq(reference->start, p.start);
128
0
  ut_asserteq(reference->size, p.size);
129
0
  ut_asserteq(reference->sys_ind, p.sys_ind);
130
131
0
  return 0;
132
0
}
133
134
static int dm_test_part_get_info_by_type(struct unit_test_state *uts)
135
0
{
136
0
  char str_disk_guid[UUID_STR_LEN + 1];
137
0
  struct blk_desc *mmc_dev_desc;
138
0
  struct disk_partition gpt_parts[] = {
139
0
    {
140
0
      .start = 48, /* GPT data takes up the first 34 blocks or so */
141
0
      .size = 1,
142
0
      .name = "test1",
143
0
      .sys_ind = 0,
144
0
    },
145
0
    {
146
0
      .start = 49,
147
0
      .size = 1,
148
0
      .name = "test2",
149
0
      .sys_ind = 0,
150
0
    },
151
0
  };
152
0
  struct disk_partition mbr_parts[] = {
153
0
    {
154
0
      .start = 1,
155
0
      .size = 33,
156
0
      .name = "gpt",
157
0
      .sys_ind = EFI_PMBR_OSTYPE_EFI_GPT,
158
0
    },
159
0
    {
160
0
      .start = 48,
161
0
      .size = 1,
162
0
      .name = "test1",
163
0
      .sys_ind = 0x83,
164
0
    },
165
0
  };
166
167
0
  ut_asserteq(2, blk_get_device_by_str("mmc", "2", &mmc_dev_desc));
168
0
  if (CONFIG_IS_ENABLED(RANDOM_UUID)) {
169
0
    gen_rand_uuid_str(gpt_parts[0].uuid, UUID_STR_FORMAT_STD);
170
0
    gen_rand_uuid_str(gpt_parts[1].uuid, UUID_STR_FORMAT_STD);
171
0
    gen_rand_uuid_str(str_disk_guid, UUID_STR_FORMAT_STD);
172
0
  }
173
0
  ut_assertok(gpt_restore(mmc_dev_desc, str_disk_guid, gpt_parts,
174
0
        ARRAY_SIZE(gpt_parts)));
175
176
0
  ut_assertok(write_mbr_partitions(mmc_dev_desc, mbr_parts,
177
0
           ARRAY_SIZE(mbr_parts), 0));
178
179
0
#define get_info_test(_part, _part_type, _reference) \
180
0
  ut_assertok(do_get_info_test(uts, mmc_dev_desc, _part, _part_type, \
181
0
             _reference))
182
183
0
  for (int i = 0; i < ARRAY_SIZE(gpt_parts); i++) {
184
0
    get_info_test(i + 1, PART_TYPE_UNKNOWN, &gpt_parts[i]);
185
0
  }
186
187
0
  for (int i = 0; i < ARRAY_SIZE(mbr_parts); i++) {
188
0
    get_info_test(i + 1, PART_TYPE_DOS, &mbr_parts[i]);
189
0
  }
190
191
0
  for (int i = 0; i < ARRAY_SIZE(gpt_parts); i++) {
192
0
    get_info_test(i + 1, PART_TYPE_EFI, &gpt_parts[i]);
193
0
  }
194
195
0
  return 0;
196
0
}
197
DM_TEST(dm_test_part_get_info_by_type, UTF_SCAN_PDATA | UTF_SCAN_FDT);