uboot/lib/efi_selftest/efi_selftest_unicode_collation.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * efi_selftest_unicode_collation
   4 *
   5 * Copyright (c) 2018 Heinrich Schuchardt <xypron.glpk@gmx.de>
   6 *
   7 * Test unicode collation protocol.
   8 */
   9
  10#include <efi_selftest.h>
  11
  12static const efi_guid_t unicode_collation_protocol_guid =
  13        EFI_UNICODE_COLLATION_PROTOCOL2_GUID;
  14
  15static struct efi_boot_services *boottime;
  16
  17static struct efi_unicode_collation_protocol *unicode_collation_protocol;
  18
  19/**
  20 * setup() - setup unit test.
  21 *
  22 * @handle:     handle of the loaded image
  23 * @systable:   system table
  24 * ReturnValue: EFI_ST_SUCCESS for success
  25 */
  26static int setup(const efi_handle_t handle,
  27                 const struct efi_system_table *systable)
  28{
  29        efi_status_t ret;
  30
  31        boottime = systable->boottime;
  32
  33        ret = boottime->locate_protocol(&unicode_collation_protocol_guid, NULL,
  34                                        (void **)&unicode_collation_protocol);
  35        if (ret != EFI_SUCCESS) {
  36                unicode_collation_protocol = NULL;
  37                efi_st_error("Unicode collation protocol is not available.\n");
  38                return EFI_ST_FAILURE;
  39        }
  40
  41        return EFI_ST_SUCCESS;
  42}
  43
  44static int test_stri_coll(void)
  45{
  46        efi_intn_t ret;
  47        u16 c1[] = L"first";
  48        u16 c2[] = L"FIRST";
  49        u16 c3[] = L"second";
  50
  51        ret = unicode_collation_protocol->stri_coll(unicode_collation_protocol,
  52                                                    c1, c2);
  53        if (ret) {
  54                efi_st_error(
  55                        "stri_coll(\"%ps\", \"%ps\") = %d\n", c1, c2, (int)ret);
  56                return EFI_ST_FAILURE;
  57        }
  58
  59        ret = unicode_collation_protocol->stri_coll(unicode_collation_protocol,
  60                                                    c1, c3);
  61        if (ret >= 0) {
  62                efi_st_error(
  63                        "stri_coll(\"%ps\", \"%ps\") = %d\n", c1, c3, (int)ret);
  64                return EFI_ST_FAILURE;
  65        }
  66
  67        ret = unicode_collation_protocol->stri_coll(unicode_collation_protocol,
  68                                                    c3, c1);
  69        if (ret <= 0) {
  70                efi_st_error(
  71                        "stri_coll(\"%ps\", \"%ps\") = %d\n", c3, c1, (int)ret);
  72                return EFI_ST_FAILURE;
  73        }
  74
  75        return EFI_ST_SUCCESS;
  76}
  77
  78static int test_metai_match(void)
  79{
  80        bool ret;
  81        const u16 c[] = L"Das U-Boot";
  82
  83        ret = unicode_collation_protocol->metai_match(
  84                unicode_collation_protocol, c, L"*");
  85        if (!ret) {
  86                efi_st_error("metai_match returned %u\n", ret);
  87                return EFI_ST_FAILURE;
  88        }
  89
  90        ret = unicode_collation_protocol->metai_match(
  91                unicode_collation_protocol, c, L"Da[rstu] U-Boot");
  92        if (!ret) {
  93                efi_st_error("metai_match returned %u\n", ret);
  94                return EFI_ST_FAILURE;
  95        }
  96
  97        ret = unicode_collation_protocol->metai_match(
  98                unicode_collation_protocol, c, L"Da[q-v] U-Boot");
  99        if (!ret) {
 100                efi_st_error("metai_match returned %u\n", ret);
 101                return EFI_ST_FAILURE;
 102        }
 103
 104        ret = unicode_collation_protocol->metai_match(
 105                unicode_collation_protocol, c, L"Da? U-Boot");
 106        if (!ret) {
 107                efi_st_error("metai_match returned %u\n", ret);
 108                return EFI_ST_FAILURE;
 109        }
 110
 111        ret = unicode_collation_protocol->metai_match(
 112                unicode_collation_protocol, c, L"D*Bo*t");
 113        if (!ret) {
 114                efi_st_error("metai_match returned %u\n", ret);
 115                return EFI_ST_FAILURE;
 116        }
 117
 118        ret = unicode_collation_protocol->metai_match(
 119                unicode_collation_protocol, c, L"Da[xyz] U-Boot");
 120        if (ret) {
 121                efi_st_error("metai_match returned %u\n", ret);
 122                return EFI_ST_FAILURE;
 123        }
 124
 125        ret = unicode_collation_protocol->metai_match(
 126                unicode_collation_protocol, c, L"Da[a-d] U-Boot");
 127        if (ret) {
 128                efi_st_error("metai_match returned %u\n", ret);
 129                return EFI_ST_FAILURE;
 130        }
 131
 132        ret = unicode_collation_protocol->metai_match(
 133                unicode_collation_protocol, c, L"Da?? U-Boot");
 134        if (ret) {
 135                efi_st_error("metai_match returned %u\n", ret);
 136                return EFI_ST_FAILURE;
 137        }
 138
 139        ret = unicode_collation_protocol->metai_match(
 140                unicode_collation_protocol, c, L"D*Bo*tt");
 141        if (ret) {
 142                efi_st_error("metai_match returned %u\n", ret);
 143                return EFI_ST_FAILURE;
 144        }
 145
 146        return EFI_ST_SUCCESS;
 147}
 148
 149static int test_str_lwr(void)
 150{
 151        u16 c[] = L"U-Boot";
 152
 153        unicode_collation_protocol->str_lwr(unicode_collation_protocol, c);
 154        if (efi_st_strcmp_16_8(c, "u-boot")) {
 155                efi_st_error("str_lwr returned \"%ps\"\n", c);
 156                return EFI_ST_FAILURE;
 157        }
 158
 159        return EFI_ST_SUCCESS;
 160}
 161
 162static int test_str_upr(void)
 163{
 164        u16 c[] = L"U-Boot";
 165
 166        unicode_collation_protocol->str_upr(unicode_collation_protocol, c);
 167        if (efi_st_strcmp_16_8(c, "U-BOOT")) {
 168                efi_st_error("str_lwr returned \"%ps\"\n", c);
 169                return EFI_ST_FAILURE;
 170        }
 171
 172        return EFI_ST_SUCCESS;
 173}
 174
 175static int test_fat_to_str(void)
 176{
 177        u16 str[16];
 178
 179        boottime->set_mem(str, sizeof(str), 0);
 180        unicode_collation_protocol->fat_to_str(unicode_collation_protocol, 6,
 181                                               "U-BOOT", str);
 182        if (efi_st_strcmp_16_8(str, "U-BOOT")) {
 183                efi_st_error("fat_to_str returned \"%ps\"\n", str);
 184                return EFI_ST_FAILURE;
 185        }
 186
 187        return EFI_ST_SUCCESS;
 188}
 189
 190static int test_str_to_fat(void)
 191{
 192        char fat[16];
 193        bool ret;
 194
 195        boottime->set_mem(fat, sizeof(fat), 0);
 196        ret = unicode_collation_protocol->str_to_fat(unicode_collation_protocol,
 197                                                     L"U -Boo.t", 6, fat);
 198        if (ret || efi_st_strcmp_16_8(L"U-BOOT", fat)) {
 199                efi_st_error("str_to_fat returned %u, \"%s\"\n", ret, fat);
 200                return EFI_ST_FAILURE;
 201        }
 202
 203        boottime->set_mem(fat, 16, 0);
 204        ret = unicode_collation_protocol->str_to_fat(unicode_collation_protocol,
 205                                                     L"U\\Boot", 6, fat);
 206        if (!ret || efi_st_strcmp_16_8(L"U_BOOT", fat)) {
 207                efi_st_error("str_to_fat returned %u, \"%s\"\n", ret, fat);
 208                return EFI_ST_FAILURE;
 209        }
 210
 211        return EFI_ST_SUCCESS;
 212}
 213
 214/**
 215 * execute() - Execute unit test.
 216 *
 217 * ReturnValue: EFI_ST_SUCCESS for success
 218 */
 219static int execute(void)
 220{
 221        int ret;
 222
 223        if (!unicode_collation_protocol) {
 224                efi_st_printf("Unicode collation protocol missing\n");
 225                return EFI_ST_FAILURE;
 226        }
 227
 228        ret = test_stri_coll();
 229        if (ret != EFI_ST_SUCCESS)
 230                return ret;
 231
 232        ret = test_metai_match();
 233        if (ret != EFI_ST_SUCCESS)
 234                return ret;
 235
 236        ret = test_str_lwr();
 237        if (ret != EFI_ST_SUCCESS)
 238                return ret;
 239
 240        ret = test_str_upr();
 241        if (ret != EFI_ST_SUCCESS)
 242                return ret;
 243
 244        ret = test_fat_to_str();
 245        if (ret != EFI_ST_SUCCESS)
 246                return ret;
 247
 248        ret = test_str_to_fat();
 249        if (ret != EFI_ST_SUCCESS)
 250                return ret;
 251
 252        return EFI_ST_SUCCESS;
 253}
 254
 255EFI_UNIT_TEST(unicoll) = {
 256        .name = "unicode collation",
 257        .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
 258        .execute = execute,
 259        .setup = setup,
 260};
 261