14c4fb10dSAKASHI Takahiro // SPDX-License-Identifier: GPL-2.0+
24c4fb10dSAKASHI Takahiro /*
34c4fb10dSAKASHI Takahiro  * efi_selftest_hii
44c4fb10dSAKASHI Takahiro  *
54c4fb10dSAKASHI Takahiro  * Copyright (c) 2018 AKASHI Takahiro, Linaro Limited
64c4fb10dSAKASHI Takahiro  *
74c4fb10dSAKASHI Takahiro  * Test HII database protocols
84c4fb10dSAKASHI Takahiro  */
94c4fb10dSAKASHI Takahiro 
104c4fb10dSAKASHI Takahiro #include <efi_selftest.h>
114c4fb10dSAKASHI Takahiro #include "efi_selftest_hii_data.c"
124c4fb10dSAKASHI Takahiro 
134c4fb10dSAKASHI Takahiro #define PRINT_TESTNAME efi_st_printf("%s:\n", __func__)
144c4fb10dSAKASHI Takahiro 
154c4fb10dSAKASHI Takahiro static struct efi_boot_services *boottime;
164c4fb10dSAKASHI Takahiro 
174c4fb10dSAKASHI Takahiro static const efi_guid_t hii_database_protocol_guid =
184c4fb10dSAKASHI Takahiro 	EFI_HII_DATABASE_PROTOCOL_GUID;
194c4fb10dSAKASHI Takahiro static const efi_guid_t hii_string_protocol_guid =
204c4fb10dSAKASHI Takahiro 	EFI_HII_STRING_PROTOCOL_GUID;
214c4fb10dSAKASHI Takahiro 
224c4fb10dSAKASHI Takahiro static struct efi_hii_database_protocol *hii_database_protocol;
234c4fb10dSAKASHI Takahiro static struct efi_hii_string_protocol *hii_string_protocol;
244c4fb10dSAKASHI Takahiro 
254c4fb10dSAKASHI Takahiro /*
264c4fb10dSAKASHI Takahiro  * Setup unit test.
274c4fb10dSAKASHI Takahiro  *
284c4fb10dSAKASHI Takahiro  * @handle:	handle of the loaded image
294c4fb10dSAKASHI Takahiro  * @systable:	system table
304c4fb10dSAKASHI Takahiro  *
314c4fb10dSAKASHI Takahiro  * @return:	EFI_ST_SUCCESS for success
324c4fb10dSAKASHI Takahiro  */
setup(const efi_handle_t handle,const struct efi_system_table * systable)334c4fb10dSAKASHI Takahiro static int setup(const efi_handle_t handle,
344c4fb10dSAKASHI Takahiro 		 const struct efi_system_table *systable)
354c4fb10dSAKASHI Takahiro {
364c4fb10dSAKASHI Takahiro 	efi_status_t ret;
374c4fb10dSAKASHI Takahiro 
384c4fb10dSAKASHI Takahiro 	boottime = systable->boottime;
394c4fb10dSAKASHI Takahiro 
404c4fb10dSAKASHI Takahiro 	/* HII database protocol */
414c4fb10dSAKASHI Takahiro 	ret = boottime->locate_protocol(&hii_database_protocol_guid, NULL,
424c4fb10dSAKASHI Takahiro 					(void **)&hii_database_protocol);
434c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
444c4fb10dSAKASHI Takahiro 		hii_database_protocol = NULL;
454c4fb10dSAKASHI Takahiro 		efi_st_error("HII database protocol is not available.\n");
464c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
474c4fb10dSAKASHI Takahiro 	}
484c4fb10dSAKASHI Takahiro 
494c4fb10dSAKASHI Takahiro 	/* HII string protocol */
504c4fb10dSAKASHI Takahiro 	ret = boottime->locate_protocol(&hii_string_protocol_guid, NULL,
514c4fb10dSAKASHI Takahiro 					(void **)&hii_string_protocol);
524c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
534c4fb10dSAKASHI Takahiro 		hii_string_protocol = NULL;
544c4fb10dSAKASHI Takahiro 		efi_st_error("HII string protocol is not available.\n");
554c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
564c4fb10dSAKASHI Takahiro 	}
574c4fb10dSAKASHI Takahiro 
584c4fb10dSAKASHI Takahiro 	return EFI_ST_SUCCESS;
594c4fb10dSAKASHI Takahiro }
604c4fb10dSAKASHI Takahiro 
614c4fb10dSAKASHI Takahiro /*
624c4fb10dSAKASHI Takahiro  * HII database protocol tests
634c4fb10dSAKASHI Takahiro  */
644c4fb10dSAKASHI Takahiro 
654c4fb10dSAKASHI Takahiro /**
664c4fb10dSAKASHI Takahiro  * test_hii_database_new_package_list() - test creation and removal of
674c4fb10dSAKASHI Takahiro  *	package list
684c4fb10dSAKASHI Takahiro  *
694c4fb10dSAKASHI Takahiro  * This test adds a new package list and then tries to remove it using
704c4fb10dSAKASHI Takahiro  * the provided handle.
714c4fb10dSAKASHI Takahiro  *
724c4fb10dSAKASHI Takahiro  * @Return:     status code
734c4fb10dSAKASHI Takahiro  */
test_hii_database_new_package_list(void)744c4fb10dSAKASHI Takahiro static int test_hii_database_new_package_list(void)
754c4fb10dSAKASHI Takahiro {
764c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle;
774c4fb10dSAKASHI Takahiro 	efi_status_t ret;
784c4fb10dSAKASHI Takahiro 
794c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
804c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
814c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
824c4fb10dSAKASHI Takahiro 			NULL, &handle);
834c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle) {
844c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
854c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
864c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
874c4fb10dSAKASHI Takahiro 	}
884c4fb10dSAKASHI Takahiro 
894c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->remove_package_list(hii_database_protocol,
904c4fb10dSAKASHI Takahiro 			handle);
914c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
924c4fb10dSAKASHI Takahiro 		efi_st_error("remove_package_list returned %u\n",
934c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
944c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
954c4fb10dSAKASHI Takahiro 	}
964c4fb10dSAKASHI Takahiro 
974c4fb10dSAKASHI Takahiro 	return EFI_ST_SUCCESS;
984c4fb10dSAKASHI Takahiro }
994c4fb10dSAKASHI Takahiro 
1004c4fb10dSAKASHI Takahiro /**
1014c4fb10dSAKASHI Takahiro  * test_hii_database_update_package_list() - test update of package list
1024c4fb10dSAKASHI Takahiro  *
1034c4fb10dSAKASHI Takahiro  * This test adds a new package list and then tries to update it using
1044c4fb10dSAKASHI Takahiro  * another package list.
1054c4fb10dSAKASHI Takahiro  *
1064c4fb10dSAKASHI Takahiro  * @Return:     status code
1074c4fb10dSAKASHI Takahiro  */
test_hii_database_update_package_list(void)1084c4fb10dSAKASHI Takahiro static int test_hii_database_update_package_list(void)
1094c4fb10dSAKASHI Takahiro {
1104c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle = NULL;
1114c4fb10dSAKASHI Takahiro 	efi_status_t ret;
1124c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
1134c4fb10dSAKASHI Takahiro 
1144c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
1154c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
1164c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
1174c4fb10dSAKASHI Takahiro 			NULL, &handle);
1184c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle) {
1194c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
1204c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
1214c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
1224c4fb10dSAKASHI Takahiro 	}
1234c4fb10dSAKASHI Takahiro 
1244c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->update_package_list(hii_database_protocol,
1254c4fb10dSAKASHI Takahiro 			handle,
1264c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist2);
1274c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle) {
1284c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
1294c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
1304c4fb10dSAKASHI Takahiro 		goto out;
1314c4fb10dSAKASHI Takahiro 	}
1324c4fb10dSAKASHI Takahiro 
1334c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
1344c4fb10dSAKASHI Takahiro 
1354c4fb10dSAKASHI Takahiro out:
1364c4fb10dSAKASHI Takahiro 	if (handle) {
1374c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
1384c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle);
1394c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS) {
1404c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
1414c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
1424c4fb10dSAKASHI Takahiro 			return EFI_ST_FAILURE;
1434c4fb10dSAKASHI Takahiro 		}
1444c4fb10dSAKASHI Takahiro 	}
1454c4fb10dSAKASHI Takahiro 
1464c4fb10dSAKASHI Takahiro 	return result;
1474c4fb10dSAKASHI Takahiro }
1484c4fb10dSAKASHI Takahiro 
1494c4fb10dSAKASHI Takahiro /**
1504c4fb10dSAKASHI Takahiro  * test_hii_database_list_package_lists() - test listing of package lists
1514c4fb10dSAKASHI Takahiro  *
1524c4fb10dSAKASHI Takahiro  * This test adds two package lists and then tries to enumerate them
1534c4fb10dSAKASHI Takahiro  * against different package types. We will get an array of handles.
1544c4fb10dSAKASHI Takahiro  *
1554c4fb10dSAKASHI Takahiro  * @Return:     status code
1564c4fb10dSAKASHI Takahiro  */
test_hii_database_list_package_lists(void)1574c4fb10dSAKASHI Takahiro static int test_hii_database_list_package_lists(void)
1584c4fb10dSAKASHI Takahiro {
1594c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle1 = NULL, handle2 = NULL, *handles;
1604c4fb10dSAKASHI Takahiro 	efi_uintn_t handles_size;
1614c4fb10dSAKASHI Takahiro 	efi_status_t ret;
1624c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
1634c4fb10dSAKASHI Takahiro 
1644c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
1654c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
1664c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
1674c4fb10dSAKASHI Takahiro 			NULL, &handle1);
1684c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle1) {
1694c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
1704c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
1714c4fb10dSAKASHI Takahiro 		goto out;
1724c4fb10dSAKASHI Takahiro 	}
1734c4fb10dSAKASHI Takahiro 
1744c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
1754c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist2,
1764c4fb10dSAKASHI Takahiro 			NULL, &handle2);
1774c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle2) {
1784c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
1794c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
1804c4fb10dSAKASHI Takahiro 		goto out;
1814c4fb10dSAKASHI Takahiro 	}
1824c4fb10dSAKASHI Takahiro 
1834c4fb10dSAKASHI Takahiro 	/* TYPE_ALL */
1844c4fb10dSAKASHI Takahiro 	handles = NULL;
1854c4fb10dSAKASHI Takahiro 	handles_size = 0;
1864c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->list_package_lists(hii_database_protocol,
1874c4fb10dSAKASHI Takahiro 			EFI_HII_PACKAGE_TYPE_ALL, NULL,
1884c4fb10dSAKASHI Takahiro 			&handles_size, handles);
1894c4fb10dSAKASHI Takahiro 	if (ret != EFI_BUFFER_TOO_SMALL) {
1904c4fb10dSAKASHI Takahiro 		efi_st_error("list_package_lists returned %u\n",
1914c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
1924c4fb10dSAKASHI Takahiro 		goto out;
1934c4fb10dSAKASHI Takahiro 	}
194ee3c8ba8SHeinrich Schuchardt 	ret = boottime->allocate_pool(EFI_LOADER_DATA, handles_size,
195ee3c8ba8SHeinrich Schuchardt 				      (void **)&handles);
196ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
197ee3c8ba8SHeinrich Schuchardt 		efi_st_error("AllocatePool failed\n");
1984c4fb10dSAKASHI Takahiro 		goto out;
1994c4fb10dSAKASHI Takahiro 	}
2004c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->list_package_lists(hii_database_protocol,
2014c4fb10dSAKASHI Takahiro 			EFI_HII_PACKAGE_TYPE_ALL, NULL,
2024c4fb10dSAKASHI Takahiro 			&handles_size, handles);
2034c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
2044c4fb10dSAKASHI Takahiro 		efi_st_error("list_package_lists returned %u\n",
2054c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
2064c4fb10dSAKASHI Takahiro 		goto out;
2074c4fb10dSAKASHI Takahiro 	}
208ee3c8ba8SHeinrich Schuchardt 	ret = boottime->free_pool(handles);
209ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
210ee3c8ba8SHeinrich Schuchardt 		efi_st_error("FreePool failed\n");
211ee3c8ba8SHeinrich Schuchardt 		goto out;
212ee3c8ba8SHeinrich Schuchardt 	}
2134c4fb10dSAKASHI Takahiro 
2144c4fb10dSAKASHI Takahiro 	/* STRINGS */
2154c4fb10dSAKASHI Takahiro 	handles = NULL;
2164c4fb10dSAKASHI Takahiro 	handles_size = 0;
2174c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->list_package_lists(hii_database_protocol,
2184c4fb10dSAKASHI Takahiro 			EFI_HII_PACKAGE_STRINGS, NULL,
2194c4fb10dSAKASHI Takahiro 			&handles_size, handles);
2204c4fb10dSAKASHI Takahiro 	if (ret != EFI_BUFFER_TOO_SMALL) {
2214c4fb10dSAKASHI Takahiro 		efi_st_error("list_package_lists returned %u\n",
2224c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
2234c4fb10dSAKASHI Takahiro 		ret = EFI_ST_FAILURE;
2244c4fb10dSAKASHI Takahiro 		goto out;
2254c4fb10dSAKASHI Takahiro 	}
226ee3c8ba8SHeinrich Schuchardt 	ret = boottime->allocate_pool(EFI_LOADER_DATA, handles_size,
227ee3c8ba8SHeinrich Schuchardt 				      (void **)&handles);
228ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
229ee3c8ba8SHeinrich Schuchardt 		efi_st_error("AllocatePool failed\n");
2304c4fb10dSAKASHI Takahiro 		ret = EFI_ST_FAILURE;
2314c4fb10dSAKASHI Takahiro 		goto out;
2324c4fb10dSAKASHI Takahiro 	}
2334c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->list_package_lists(hii_database_protocol,
2344c4fb10dSAKASHI Takahiro 			EFI_HII_PACKAGE_STRINGS, NULL,
2354c4fb10dSAKASHI Takahiro 			&handles_size, handles);
2364c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
2374c4fb10dSAKASHI Takahiro 		efi_st_error("list_package_lists returned %u\n",
2384c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
2394c4fb10dSAKASHI Takahiro 		ret = EFI_ST_FAILURE;
2404c4fb10dSAKASHI Takahiro 		goto out;
2414c4fb10dSAKASHI Takahiro 	}
242ee3c8ba8SHeinrich Schuchardt 	ret = boottime->free_pool(handles);
243ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
244ee3c8ba8SHeinrich Schuchardt 		efi_st_error("FreePool failed\n");
245ee3c8ba8SHeinrich Schuchardt 		goto out;
246ee3c8ba8SHeinrich Schuchardt 	}
2474c4fb10dSAKASHI Takahiro 
2484c4fb10dSAKASHI Takahiro 	/* GUID */
2494c4fb10dSAKASHI Takahiro 	handles = NULL;
2504c4fb10dSAKASHI Takahiro 	handles_size = 0;
2514c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->list_package_lists(hii_database_protocol,
2524c4fb10dSAKASHI Takahiro 			EFI_HII_PACKAGE_TYPE_GUID, &package_guid,
2534c4fb10dSAKASHI Takahiro 			&handles_size, handles);
2544c4fb10dSAKASHI Takahiro 	if (ret != EFI_BUFFER_TOO_SMALL) {
2554c4fb10dSAKASHI Takahiro 		efi_st_error("list_package_lists returned %u\n",
2564c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
2574c4fb10dSAKASHI Takahiro 		ret = EFI_ST_FAILURE;
2584c4fb10dSAKASHI Takahiro 		goto out;
2594c4fb10dSAKASHI Takahiro 	}
260ee3c8ba8SHeinrich Schuchardt 	ret = boottime->allocate_pool(EFI_LOADER_DATA, handles_size,
261ee3c8ba8SHeinrich Schuchardt 				      (void **)&handles);
262ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
263ee3c8ba8SHeinrich Schuchardt 		efi_st_error("AllocatePool failed\n");
2644c4fb10dSAKASHI Takahiro 		ret = EFI_ST_FAILURE;
2654c4fb10dSAKASHI Takahiro 		goto out;
2664c4fb10dSAKASHI Takahiro 	}
2674c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->list_package_lists(hii_database_protocol,
2684c4fb10dSAKASHI Takahiro 			EFI_HII_PACKAGE_TYPE_GUID, &package_guid,
2694c4fb10dSAKASHI Takahiro 			&handles_size, handles);
2704c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
2714c4fb10dSAKASHI Takahiro 		efi_st_error("list_package_lists returned %u\n",
2724c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
2734c4fb10dSAKASHI Takahiro 		ret = EFI_ST_FAILURE;
2744c4fb10dSAKASHI Takahiro 		goto out;
2754c4fb10dSAKASHI Takahiro 	}
276ee3c8ba8SHeinrich Schuchardt 	ret = boottime->free_pool(handles);
277ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
278ee3c8ba8SHeinrich Schuchardt 		efi_st_error("FreePool failed\n");
279ee3c8ba8SHeinrich Schuchardt 		ret = EFI_ST_FAILURE;
280ee3c8ba8SHeinrich Schuchardt 		goto out;
281ee3c8ba8SHeinrich Schuchardt 	}
2824c4fb10dSAKASHI Takahiro 
2834c4fb10dSAKASHI Takahiro 	/* KEYBOARD_LAYOUT */
2844c4fb10dSAKASHI Takahiro 	handles = NULL;
2854c4fb10dSAKASHI Takahiro 	handles_size = 0;
2864c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->list_package_lists(hii_database_protocol,
2874c4fb10dSAKASHI Takahiro 			EFI_HII_PACKAGE_KEYBOARD_LAYOUT, NULL,
2884c4fb10dSAKASHI Takahiro 			&handles_size, handles);
2894c4fb10dSAKASHI Takahiro 	if (ret != EFI_BUFFER_TOO_SMALL) {
2904c4fb10dSAKASHI Takahiro 		efi_st_error("list_package_lists returned %u\n",
2914c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
2924c4fb10dSAKASHI Takahiro 		ret = EFI_ST_FAILURE;
2934c4fb10dSAKASHI Takahiro 		goto out;
2944c4fb10dSAKASHI Takahiro 	}
295ee3c8ba8SHeinrich Schuchardt 	ret = boottime->allocate_pool(EFI_LOADER_DATA, handles_size,
296ee3c8ba8SHeinrich Schuchardt 				      (void **)&handles);
297ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
298ee3c8ba8SHeinrich Schuchardt 		efi_st_error("AllocatePool failed\n");
2994c4fb10dSAKASHI Takahiro 		ret = EFI_ST_FAILURE;
3004c4fb10dSAKASHI Takahiro 		goto out;
3014c4fb10dSAKASHI Takahiro 	}
3024c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->list_package_lists(hii_database_protocol,
3034c4fb10dSAKASHI Takahiro 			EFI_HII_PACKAGE_KEYBOARD_LAYOUT, NULL,
3044c4fb10dSAKASHI Takahiro 			&handles_size, handles);
3054c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
3064c4fb10dSAKASHI Takahiro 		efi_st_error("list_package_lists returned %u\n",
3074c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
3084c4fb10dSAKASHI Takahiro 		ret = EFI_ST_FAILURE;
3094c4fb10dSAKASHI Takahiro 		goto out;
3104c4fb10dSAKASHI Takahiro 	}
311ee3c8ba8SHeinrich Schuchardt 	ret = boottime->free_pool(handles);
312ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
313ee3c8ba8SHeinrich Schuchardt 		efi_st_error("FreePool failed\n");
314ee3c8ba8SHeinrich Schuchardt 		ret = EFI_ST_FAILURE;
315ee3c8ba8SHeinrich Schuchardt 		goto out;
316ee3c8ba8SHeinrich Schuchardt 	}
3174c4fb10dSAKASHI Takahiro 
3184c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
3194c4fb10dSAKASHI Takahiro 
3204c4fb10dSAKASHI Takahiro out:
3214c4fb10dSAKASHI Takahiro 	if (handle1) {
3224c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
3234c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle1);
3244c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS)
3254c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
3264c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
3274c4fb10dSAKASHI Takahiro 	}
3284c4fb10dSAKASHI Takahiro 	if (handle2) {
3294c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
3304c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle2);
3314c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS)
3324c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
3334c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
3344c4fb10dSAKASHI Takahiro 	}
3354c4fb10dSAKASHI Takahiro 
3364c4fb10dSAKASHI Takahiro 	return result;
3374c4fb10dSAKASHI Takahiro }
3384c4fb10dSAKASHI Takahiro 
3394c4fb10dSAKASHI Takahiro /**
3404c4fb10dSAKASHI Takahiro  * test_hii_database_export_package_lists() - test export of package lists
3414c4fb10dSAKASHI Takahiro  *
3424c4fb10dSAKASHI Takahiro  * @Return:     status code
3434c4fb10dSAKASHI Takahiro  */
test_hii_database_export_package_lists(void)3444c4fb10dSAKASHI Takahiro static int test_hii_database_export_package_lists(void)
3454c4fb10dSAKASHI Takahiro {
3464c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
3474c4fb10dSAKASHI Takahiro 	/* export_package_lists() not implemented yet */
3484c4fb10dSAKASHI Takahiro 	return EFI_ST_SUCCESS;
3494c4fb10dSAKASHI Takahiro }
3504c4fb10dSAKASHI Takahiro 
3514c4fb10dSAKASHI Takahiro /**
3524c4fb10dSAKASHI Takahiro  * test_hii_database_register_package_notify() - test registration of
3534c4fb10dSAKASHI Takahiro  *	notification function
3544c4fb10dSAKASHI Takahiro  *
3554c4fb10dSAKASHI Takahiro  * @Return:     status code
3564c4fb10dSAKASHI Takahiro  */
test_hii_database_register_package_notify(void)3574c4fb10dSAKASHI Takahiro static int test_hii_database_register_package_notify(void)
3584c4fb10dSAKASHI Takahiro {
3594c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
3604c4fb10dSAKASHI Takahiro 	/* register_package_notify() not implemented yet */
3614c4fb10dSAKASHI Takahiro 	return EFI_ST_SUCCESS;
3624c4fb10dSAKASHI Takahiro }
3634c4fb10dSAKASHI Takahiro 
3644c4fb10dSAKASHI Takahiro /**
3654c4fb10dSAKASHI Takahiro  * test_hii_database_unregister_package_notify() - test removal of
3664c4fb10dSAKASHI Takahiro  *	notification function
3674c4fb10dSAKASHI Takahiro  *
3684c4fb10dSAKASHI Takahiro  * @Return:     status code
3694c4fb10dSAKASHI Takahiro  */
test_hii_database_unregister_package_notify(void)3704c4fb10dSAKASHI Takahiro static int test_hii_database_unregister_package_notify(void)
3714c4fb10dSAKASHI Takahiro {
3724c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
3734c4fb10dSAKASHI Takahiro 	/* unregsiter_package_notify() not implemented yet */
3744c4fb10dSAKASHI Takahiro 	return EFI_ST_SUCCESS;
3754c4fb10dSAKASHI Takahiro }
3764c4fb10dSAKASHI Takahiro 
3774c4fb10dSAKASHI Takahiro /**
3784c4fb10dSAKASHI Takahiro  * test_hii_database_find_keyboard_layouts() - test listing of
3794c4fb10dSAKASHI Takahiro  *	all the keyboard layouts in the system
3804c4fb10dSAKASHI Takahiro  *
3814c4fb10dSAKASHI Takahiro  * This test adds two package lists, each of which has two keyboard layouts
3824c4fb10dSAKASHI Takahiro  * and then tries to enumerate them. We will get an array of handles.
3834c4fb10dSAKASHI Takahiro  *
3844c4fb10dSAKASHI Takahiro  * @Return:     status code
3854c4fb10dSAKASHI Takahiro  */
test_hii_database_find_keyboard_layouts(void)3864c4fb10dSAKASHI Takahiro static int test_hii_database_find_keyboard_layouts(void)
3874c4fb10dSAKASHI Takahiro {
3884c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle1 = NULL, handle2 = NULL;
3894c4fb10dSAKASHI Takahiro 	efi_guid_t *guids;
3904c4fb10dSAKASHI Takahiro 	u16 guids_size;
3914c4fb10dSAKASHI Takahiro 	efi_status_t ret;
3924c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
3934c4fb10dSAKASHI Takahiro 
3944c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
3954c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
3964c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
3974c4fb10dSAKASHI Takahiro 			NULL, &handle1);
3984c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle1) {
3994c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
4004c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
4014c4fb10dSAKASHI Takahiro 		goto out;
4024c4fb10dSAKASHI Takahiro 	}
4034c4fb10dSAKASHI Takahiro 
4044c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
4054c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist2,
4064c4fb10dSAKASHI Takahiro 			NULL, &handle2);
4074c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle2) {
4084c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
4094c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
4104c4fb10dSAKASHI Takahiro 		goto out;
4114c4fb10dSAKASHI Takahiro 	}
4124c4fb10dSAKASHI Takahiro 
4134c4fb10dSAKASHI Takahiro 	guids = NULL;
4144c4fb10dSAKASHI Takahiro 	guids_size = 0;
4154c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->find_keyboard_layouts(
4164c4fb10dSAKASHI Takahiro 			hii_database_protocol, &guids_size, guids);
4174c4fb10dSAKASHI Takahiro 	if (ret != EFI_BUFFER_TOO_SMALL) {
4184c4fb10dSAKASHI Takahiro 		efi_st_error("find_keyboard_layouts returned %u\n",
4194c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
4204c4fb10dSAKASHI Takahiro 		goto out;
4214c4fb10dSAKASHI Takahiro 	}
422ee3c8ba8SHeinrich Schuchardt 	ret = boottime->allocate_pool(EFI_LOADER_DATA, guids_size,
423ee3c8ba8SHeinrich Schuchardt 				      (void **)&guids);
424ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
425ee3c8ba8SHeinrich Schuchardt 		efi_st_error("AllocatePool failed\n");
4264c4fb10dSAKASHI Takahiro 		goto out;
4274c4fb10dSAKASHI Takahiro 	}
4284c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->find_keyboard_layouts(
4294c4fb10dSAKASHI Takahiro 			hii_database_protocol, &guids_size, guids);
4304c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
4314c4fb10dSAKASHI Takahiro 		efi_st_error("find_keyboard_layouts returned %u\n",
4324c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
4334c4fb10dSAKASHI Takahiro 		goto out;
4344c4fb10dSAKASHI Takahiro 	}
435ee3c8ba8SHeinrich Schuchardt 	ret = boottime->free_pool(guids);
436ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
437ee3c8ba8SHeinrich Schuchardt 		efi_st_error("FreePool failed\n");
438ee3c8ba8SHeinrich Schuchardt 		goto out;
439ee3c8ba8SHeinrich Schuchardt 	}
4404c4fb10dSAKASHI Takahiro 
4414c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
4424c4fb10dSAKASHI Takahiro 
4434c4fb10dSAKASHI Takahiro out:
4444c4fb10dSAKASHI Takahiro 	if (handle1) {
4454c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
4464c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle1);
4474c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS)
4484c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
4494c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
4504c4fb10dSAKASHI Takahiro 	}
4514c4fb10dSAKASHI Takahiro 	if (handle2) {
4524c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
4534c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle2);
4544c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS)
4554c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
4564c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
4574c4fb10dSAKASHI Takahiro 	}
4584c4fb10dSAKASHI Takahiro 
4594c4fb10dSAKASHI Takahiro 	return result;
4604c4fb10dSAKASHI Takahiro }
4614c4fb10dSAKASHI Takahiro 
4624c4fb10dSAKASHI Takahiro /**
4634c4fb10dSAKASHI Takahiro  * test_hii_database_get_keyboard_layout() - test retrieval of keyboard layout
4644c4fb10dSAKASHI Takahiro  *
4654c4fb10dSAKASHI Takahiro  * This test adds two package lists, each of which has two keyboard layouts
4664c4fb10dSAKASHI Takahiro  * and then tries to get a handle to keyboard layout with a specific guid
4674c4fb10dSAKASHI Takahiro  * and the current one.
4684c4fb10dSAKASHI Takahiro  *
4694c4fb10dSAKASHI Takahiro  * @Return:     status code
4704c4fb10dSAKASHI Takahiro  */
test_hii_database_get_keyboard_layout(void)4714c4fb10dSAKASHI Takahiro static int test_hii_database_get_keyboard_layout(void)
4724c4fb10dSAKASHI Takahiro {
4734c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle1 = NULL, handle2 = NULL;
4744c4fb10dSAKASHI Takahiro 	struct efi_hii_keyboard_layout *kb_layout;
4754c4fb10dSAKASHI Takahiro 	u16 kb_layout_size;
4764c4fb10dSAKASHI Takahiro 	efi_status_t ret;
4774c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
4784c4fb10dSAKASHI Takahiro 
4794c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
4804c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
4814c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
4824c4fb10dSAKASHI Takahiro 			NULL, &handle1);
4834c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle1) {
4844c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
4854c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
4864c4fb10dSAKASHI Takahiro 		goto out;
4874c4fb10dSAKASHI Takahiro 	}
4884c4fb10dSAKASHI Takahiro 
4894c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
4904c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist2,
4914c4fb10dSAKASHI Takahiro 			NULL, &handle2);
4924c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle2) {
4934c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
4944c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
4954c4fb10dSAKASHI Takahiro 		goto out;
4964c4fb10dSAKASHI Takahiro 	}
4974c4fb10dSAKASHI Takahiro 
4984c4fb10dSAKASHI Takahiro 	/* specific keyboard_layout(guid11) */
4994c4fb10dSAKASHI Takahiro 	kb_layout = NULL;
5004c4fb10dSAKASHI Takahiro 	kb_layout_size = 0;
5014c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->get_keyboard_layout(hii_database_protocol,
5024c4fb10dSAKASHI Takahiro 			&kb_layout_guid11, &kb_layout_size, kb_layout);
5034c4fb10dSAKASHI Takahiro 	if (ret != EFI_BUFFER_TOO_SMALL) {
5044c4fb10dSAKASHI Takahiro 		efi_st_error("get_keyboard_layout returned %u\n",
5054c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
5064c4fb10dSAKASHI Takahiro 		goto out;
5074c4fb10dSAKASHI Takahiro 	}
508ee3c8ba8SHeinrich Schuchardt 	ret = boottime->allocate_pool(EFI_LOADER_DATA, kb_layout_size,
509ee3c8ba8SHeinrich Schuchardt 				      (void **)&kb_layout);
510ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
511ee3c8ba8SHeinrich Schuchardt 		efi_st_error("AllocatePool failed\n");
5124c4fb10dSAKASHI Takahiro 		goto out;
5134c4fb10dSAKASHI Takahiro 	}
5144c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->get_keyboard_layout(hii_database_protocol,
5154c4fb10dSAKASHI Takahiro 			&kb_layout_guid11, &kb_layout_size, kb_layout);
5164c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
5174c4fb10dSAKASHI Takahiro 		efi_st_error("get_keyboard_layout returned %u\n",
5184c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
5194c4fb10dSAKASHI Takahiro 		goto out;
5204c4fb10dSAKASHI Takahiro 	}
521ee3c8ba8SHeinrich Schuchardt 	ret = boottime->free_pool(kb_layout);
522ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
523ee3c8ba8SHeinrich Schuchardt 		efi_st_error("FreePool failed\n");
524ee3c8ba8SHeinrich Schuchardt 		goto out;
525ee3c8ba8SHeinrich Schuchardt 	}
5264c4fb10dSAKASHI Takahiro 
5274c4fb10dSAKASHI Takahiro 	/* current */
5284c4fb10dSAKASHI Takahiro 	kb_layout = NULL;
5294c4fb10dSAKASHI Takahiro 	kb_layout_size = 0;
5304c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->get_keyboard_layout(hii_database_protocol,
5314c4fb10dSAKASHI Takahiro 			NULL, &kb_layout_size, kb_layout);
5324c4fb10dSAKASHI Takahiro 	if (ret != EFI_INVALID_PARAMETER) {
5334c4fb10dSAKASHI Takahiro 		efi_st_error("get_keyboard_layout returned %u\n",
5344c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
5354c4fb10dSAKASHI Takahiro 		goto out;
5364c4fb10dSAKASHI Takahiro 	}
5374c4fb10dSAKASHI Takahiro 
5384c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
5394c4fb10dSAKASHI Takahiro 
5404c4fb10dSAKASHI Takahiro out:
5414c4fb10dSAKASHI Takahiro 	if (handle1) {
5424c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
5434c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle1);
5444c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS)
5454c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
5464c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
5474c4fb10dSAKASHI Takahiro 	}
5484c4fb10dSAKASHI Takahiro 	if (handle2) {
5494c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
5504c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle2);
5514c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS)
5524c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
5534c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
5544c4fb10dSAKASHI Takahiro 	}
5554c4fb10dSAKASHI Takahiro 
5564c4fb10dSAKASHI Takahiro 	return result;
5574c4fb10dSAKASHI Takahiro }
5584c4fb10dSAKASHI Takahiro 
5594c4fb10dSAKASHI Takahiro /**
5604c4fb10dSAKASHI Takahiro  * test_hii_database_set_keyboard_layout() - test change of
5614c4fb10dSAKASHI Takahiro  *	current keyboard layout
5624c4fb10dSAKASHI Takahiro  *
5634c4fb10dSAKASHI Takahiro  * @Return:     status code
5644c4fb10dSAKASHI Takahiro  */
test_hii_database_set_keyboard_layout(void)5654c4fb10dSAKASHI Takahiro static int test_hii_database_set_keyboard_layout(void)
5664c4fb10dSAKASHI Takahiro {
5674c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
5684c4fb10dSAKASHI Takahiro 	/* set_keyboard_layout() not implemented yet */
5694c4fb10dSAKASHI Takahiro 	return EFI_ST_SUCCESS;
5704c4fb10dSAKASHI Takahiro }
5714c4fb10dSAKASHI Takahiro 
5724c4fb10dSAKASHI Takahiro /**
5734c4fb10dSAKASHI Takahiro  * test_hii_database_get_package_list_handle() - test retrieval of
5744c4fb10dSAKASHI Takahiro  *	driver associated with a package list
5754c4fb10dSAKASHI Takahiro  *
5764c4fb10dSAKASHI Takahiro  * This test adds a package list, and then tries to get a handle to driver
5774c4fb10dSAKASHI Takahiro  * which is associated with a package list.
5784c4fb10dSAKASHI Takahiro  *
5794c4fb10dSAKASHI Takahiro  * @Return:     status code
5804c4fb10dSAKASHI Takahiro  */
test_hii_database_get_package_list_handle(void)5814c4fb10dSAKASHI Takahiro static int test_hii_database_get_package_list_handle(void)
5824c4fb10dSAKASHI Takahiro {
5834c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle = NULL;
5844c4fb10dSAKASHI Takahiro 	efi_handle_t driver_handle;
5854c4fb10dSAKASHI Takahiro 	efi_status_t ret;
5864c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
5874c4fb10dSAKASHI Takahiro 
5884c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
5894c4fb10dSAKASHI Takahiro 	driver_handle = (efi_handle_t)0x12345678; /* dummy */
5904c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
5914c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
5924c4fb10dSAKASHI Takahiro 			driver_handle, &handle);
5934c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle) {
5944c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
5954c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
5964c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
5974c4fb10dSAKASHI Takahiro 	}
5984c4fb10dSAKASHI Takahiro 
5994c4fb10dSAKASHI Takahiro 	driver_handle = NULL;
6004c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->get_package_list_handle(
6014c4fb10dSAKASHI Takahiro 			hii_database_protocol, handle, &driver_handle);
6024c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || driver_handle != (efi_handle_t)0x12345678) {
6034c4fb10dSAKASHI Takahiro 		efi_st_error("get_package_list_handle returned %u, driver:%p\n",
6044c4fb10dSAKASHI Takahiro 			     (unsigned int)ret, driver_handle);
6054c4fb10dSAKASHI Takahiro 		goto out;
6064c4fb10dSAKASHI Takahiro 	}
6074c4fb10dSAKASHI Takahiro 
6084c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
6094c4fb10dSAKASHI Takahiro 
6104c4fb10dSAKASHI Takahiro out:
6114c4fb10dSAKASHI Takahiro 	if (handle) {
6124c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
6134c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle);
6144c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS) {
6154c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
6164c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
6174c4fb10dSAKASHI Takahiro 			return EFI_ST_FAILURE;
6184c4fb10dSAKASHI Takahiro 		}
6194c4fb10dSAKASHI Takahiro 	}
6204c4fb10dSAKASHI Takahiro 
6214c4fb10dSAKASHI Takahiro 	return result;
6224c4fb10dSAKASHI Takahiro }
6234c4fb10dSAKASHI Takahiro 
test_hii_database_protocol(void)6244c4fb10dSAKASHI Takahiro static int test_hii_database_protocol(void)
6254c4fb10dSAKASHI Takahiro {
6264c4fb10dSAKASHI Takahiro 	int ret;
6274c4fb10dSAKASHI Takahiro 
6284c4fb10dSAKASHI Takahiro 	ret = test_hii_database_new_package_list();
6294c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6304c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6314c4fb10dSAKASHI Takahiro 
6324c4fb10dSAKASHI Takahiro 	ret = test_hii_database_update_package_list();
6334c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6344c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6354c4fb10dSAKASHI Takahiro 
6364c4fb10dSAKASHI Takahiro 	ret = test_hii_database_list_package_lists();
6374c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6384c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6394c4fb10dSAKASHI Takahiro 
6404c4fb10dSAKASHI Takahiro 	ret = test_hii_database_export_package_lists();
6414c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6424c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6434c4fb10dSAKASHI Takahiro 
6444c4fb10dSAKASHI Takahiro 	ret = test_hii_database_register_package_notify();
6454c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6464c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6474c4fb10dSAKASHI Takahiro 
6484c4fb10dSAKASHI Takahiro 	ret = test_hii_database_unregister_package_notify();
6494c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6504c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6514c4fb10dSAKASHI Takahiro 
6524c4fb10dSAKASHI Takahiro 	ret = test_hii_database_find_keyboard_layouts();
6534c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6544c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6554c4fb10dSAKASHI Takahiro 
6564c4fb10dSAKASHI Takahiro 	ret = test_hii_database_get_keyboard_layout();
6574c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6584c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6594c4fb10dSAKASHI Takahiro 
6604c4fb10dSAKASHI Takahiro 	ret = test_hii_database_set_keyboard_layout();
6614c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6624c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6634c4fb10dSAKASHI Takahiro 
6644c4fb10dSAKASHI Takahiro 	ret = test_hii_database_get_package_list_handle();
6654c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
6664c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6674c4fb10dSAKASHI Takahiro 
6684c4fb10dSAKASHI Takahiro 	return EFI_ST_SUCCESS;
6694c4fb10dSAKASHI Takahiro }
6704c4fb10dSAKASHI Takahiro 
6714c4fb10dSAKASHI Takahiro /*
6724c4fb10dSAKASHI Takahiro  * HII string protocol tests
6734c4fb10dSAKASHI Takahiro  */
6744c4fb10dSAKASHI Takahiro 
6754c4fb10dSAKASHI Takahiro /**
6764c4fb10dSAKASHI Takahiro  * test_hii_string_new_string() - test creation of a new string entry
6774c4fb10dSAKASHI Takahiro  *
6784c4fb10dSAKASHI Takahiro  * This test adds a package list, and then tries to add a new string
6794c4fb10dSAKASHI Takahiro  * entry for a specific language.
6804c4fb10dSAKASHI Takahiro  *
6814c4fb10dSAKASHI Takahiro  * @Return:     status code
6824c4fb10dSAKASHI Takahiro  */
test_hii_string_new_string(void)6834c4fb10dSAKASHI Takahiro static int test_hii_string_new_string(void)
6844c4fb10dSAKASHI Takahiro {
6854c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle = NULL;
6864c4fb10dSAKASHI Takahiro 	efi_string_id_t id;
6874c4fb10dSAKASHI Takahiro 	efi_status_t ret;
6884c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
6894c4fb10dSAKASHI Takahiro 
6904c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
6914c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
6924c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
6934c4fb10dSAKASHI Takahiro 			NULL, &handle);
6944c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle) {
6954c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
6964c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
6974c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
6984c4fb10dSAKASHI Takahiro 	}
6994c4fb10dSAKASHI Takahiro 
7004c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->new_string(hii_string_protocol, handle,
7014c4fb10dSAKASHI Takahiro 					      &id, (u8 *)"en-US",
7024c4fb10dSAKASHI Takahiro 					      L"Japanese", L"Japanese", NULL);
7034c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
7044c4fb10dSAKASHI Takahiro 		efi_st_error("new_string returned %u\n",
7054c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
7064c4fb10dSAKASHI Takahiro 		goto out;
7074c4fb10dSAKASHI Takahiro 	}
7084c4fb10dSAKASHI Takahiro 	efi_st_printf("new string id is %u\n", id);
7094c4fb10dSAKASHI Takahiro 
7104c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
7114c4fb10dSAKASHI Takahiro 
7124c4fb10dSAKASHI Takahiro out:
7134c4fb10dSAKASHI Takahiro 	if (handle) {
7144c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
7154c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle);
7164c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS) {
7174c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
7184c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
7194c4fb10dSAKASHI Takahiro 			return EFI_ST_FAILURE;
7204c4fb10dSAKASHI Takahiro 		}
7214c4fb10dSAKASHI Takahiro 	}
7224c4fb10dSAKASHI Takahiro 
7234c4fb10dSAKASHI Takahiro 	return result;
7244c4fb10dSAKASHI Takahiro }
7254c4fb10dSAKASHI Takahiro 
7264c4fb10dSAKASHI Takahiro /**
7274c4fb10dSAKASHI Takahiro  * test_hii_string_get_string() - test retrieval of a string entry
7284c4fb10dSAKASHI Takahiro  *
7294c4fb10dSAKASHI Takahiro  * This test adds a package list, create a new string entry and then tries
7304c4fb10dSAKASHI Takahiro  * to get it with its string id.
7314c4fb10dSAKASHI Takahiro  *
7324c4fb10dSAKASHI Takahiro  * @Return:     status code
7334c4fb10dSAKASHI Takahiro  */
test_hii_string_get_string(void)7344c4fb10dSAKASHI Takahiro static int test_hii_string_get_string(void)
7354c4fb10dSAKASHI Takahiro {
7364c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle = NULL;
7374c4fb10dSAKASHI Takahiro 	efi_string_id_t id;
7384c4fb10dSAKASHI Takahiro 	efi_string_t string;
7394c4fb10dSAKASHI Takahiro 	efi_uintn_t string_len;
7404c4fb10dSAKASHI Takahiro 	efi_status_t ret;
7414c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
7424c4fb10dSAKASHI Takahiro 
7434c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
7444c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
7454c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
7464c4fb10dSAKASHI Takahiro 			NULL, &handle);
7474c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle) {
7484c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
7494c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
7504c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
7514c4fb10dSAKASHI Takahiro 	}
7524c4fb10dSAKASHI Takahiro 
7534c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->new_string(hii_string_protocol, handle,
7544c4fb10dSAKASHI Takahiro 					      &id, (u8 *)"en-US",
7554c4fb10dSAKASHI Takahiro 					      L"Japanese", L"Japanese", NULL);
7564c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
7574c4fb10dSAKASHI Takahiro 		efi_st_error("new_string returned %u\n",
7584c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
7594c4fb10dSAKASHI Takahiro 		goto out;
7604c4fb10dSAKASHI Takahiro 	}
7614c4fb10dSAKASHI Takahiro 
7624c4fb10dSAKASHI Takahiro 	string = NULL;
7634c4fb10dSAKASHI Takahiro 	string_len = 0;
7644c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->get_string(hii_string_protocol,
7654c4fb10dSAKASHI Takahiro 			(u8 *)"en-US", handle, id, string, &string_len, NULL);
7664c4fb10dSAKASHI Takahiro 	if (ret != EFI_BUFFER_TOO_SMALL) {
7674c4fb10dSAKASHI Takahiro 		efi_st_error("get_string returned %u\n",
7684c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
7694c4fb10dSAKASHI Takahiro 		goto out;
7704c4fb10dSAKASHI Takahiro 	}
7714c4fb10dSAKASHI Takahiro 	string_len += sizeof(u16);
772ee3c8ba8SHeinrich Schuchardt 	ret = boottime->allocate_pool(EFI_LOADER_DATA, string_len,
773ee3c8ba8SHeinrich Schuchardt 				      (void **)&string);
774ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
775ee3c8ba8SHeinrich Schuchardt 		efi_st_error("AllocatePool failed\n");
7764c4fb10dSAKASHI Takahiro 		goto out;
7774c4fb10dSAKASHI Takahiro 	}
7784c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->get_string(hii_string_protocol,
7794c4fb10dSAKASHI Takahiro 			(u8 *)"en-US", handle, id, string, &string_len, NULL);
7804c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
7814c4fb10dSAKASHI Takahiro 		efi_st_error("get_string returned %u\n",
7824c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
7834c4fb10dSAKASHI Takahiro 		goto out;
7844c4fb10dSAKASHI Takahiro 	}
7854c4fb10dSAKASHI Takahiro 
786*d0bd8761SHeinrich Schuchardt 	if (efi_st_strcmp_16_8(string, "Japanese")) {
787*d0bd8761SHeinrich Schuchardt 		efi_st_error("get_string returned incorrect string\n");
788*d0bd8761SHeinrich Schuchardt 		goto out;
789*d0bd8761SHeinrich Schuchardt 	}
7904c4fb10dSAKASHI Takahiro 
7914c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
7924c4fb10dSAKASHI Takahiro 
7934c4fb10dSAKASHI Takahiro out:
7944c4fb10dSAKASHI Takahiro 	if (handle) {
7954c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
7964c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle);
7974c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS) {
7984c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
7994c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
8004c4fb10dSAKASHI Takahiro 			return EFI_ST_FAILURE;
8014c4fb10dSAKASHI Takahiro 		}
8024c4fb10dSAKASHI Takahiro 	}
8034c4fb10dSAKASHI Takahiro 
8044c4fb10dSAKASHI Takahiro 	return result;
8054c4fb10dSAKASHI Takahiro }
8064c4fb10dSAKASHI Takahiro 
8074c4fb10dSAKASHI Takahiro /**
8084c4fb10dSAKASHI Takahiro  * test_hii_string_set_string() - test change of a string entry
8094c4fb10dSAKASHI Takahiro  *
8104c4fb10dSAKASHI Takahiro  * This test adds a package list, create a new string entry and then tries
8114c4fb10dSAKASHI Takahiro  * to modify it.
8124c4fb10dSAKASHI Takahiro  *
8134c4fb10dSAKASHI Takahiro  * @Return:     status code
8144c4fb10dSAKASHI Takahiro  */
test_hii_string_set_string(void)8154c4fb10dSAKASHI Takahiro static int test_hii_string_set_string(void)
8164c4fb10dSAKASHI Takahiro {
8174c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle = NULL;
8184c4fb10dSAKASHI Takahiro 	efi_string_id_t id;
8194c4fb10dSAKASHI Takahiro 	efi_status_t ret;
8204c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
8214c4fb10dSAKASHI Takahiro 
8224c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
8234c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
8244c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
8254c4fb10dSAKASHI Takahiro 			NULL, &handle);
8264c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle) {
8274c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
8284c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
8294c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
8304c4fb10dSAKASHI Takahiro 	}
8314c4fb10dSAKASHI Takahiro 
8324c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->new_string(hii_string_protocol, handle,
8334c4fb10dSAKASHI Takahiro 					      &id, (u8 *)"en-US",
8344c4fb10dSAKASHI Takahiro 					      L"Japanese", L"Japanese", NULL);
8354c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
8364c4fb10dSAKASHI Takahiro 		efi_st_error("new_string returned %u\n",
8374c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
8384c4fb10dSAKASHI Takahiro 		goto out;
8394c4fb10dSAKASHI Takahiro 	}
8404c4fb10dSAKASHI Takahiro 
8414c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->set_string(hii_string_protocol, handle,
8424c4fb10dSAKASHI Takahiro 					      id, (u8 *)"en-US",
8434c4fb10dSAKASHI Takahiro 					      L"Nihongo", NULL);
8444c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
8454c4fb10dSAKASHI Takahiro 		efi_st_error("set_string returned %u\n",
8464c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
8474c4fb10dSAKASHI Takahiro 		goto out;
8484c4fb10dSAKASHI Takahiro 	}
8494c4fb10dSAKASHI Takahiro 
8504c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
8514c4fb10dSAKASHI Takahiro 
8524c4fb10dSAKASHI Takahiro out:
8534c4fb10dSAKASHI Takahiro 	if (handle) {
8544c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
8554c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle);
8564c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS) {
8574c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
8584c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
8594c4fb10dSAKASHI Takahiro 			return EFI_ST_FAILURE;
8604c4fb10dSAKASHI Takahiro 		}
8614c4fb10dSAKASHI Takahiro 	}
8624c4fb10dSAKASHI Takahiro 
8634c4fb10dSAKASHI Takahiro 	return result;
8644c4fb10dSAKASHI Takahiro }
8654c4fb10dSAKASHI Takahiro 
8664c4fb10dSAKASHI Takahiro /**
8674c4fb10dSAKASHI Takahiro  * test_hii_string_get_languages() - test listing of languages
8684c4fb10dSAKASHI Takahiro  *
8694c4fb10dSAKASHI Takahiro  * This test adds a package list, and then tries to enumerate languages
8704c4fb10dSAKASHI Takahiro  * in it. We will get an string of language names.
8714c4fb10dSAKASHI Takahiro  *
8724c4fb10dSAKASHI Takahiro  * @Return:     status code
8734c4fb10dSAKASHI Takahiro  */
test_hii_string_get_languages(void)8744c4fb10dSAKASHI Takahiro static int test_hii_string_get_languages(void)
8754c4fb10dSAKASHI Takahiro {
8764c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle = NULL;
8774c4fb10dSAKASHI Takahiro 	u8 *languages;
8784c4fb10dSAKASHI Takahiro 	efi_uintn_t languages_len;
8794c4fb10dSAKASHI Takahiro 	efi_status_t ret;
8804c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
8814c4fb10dSAKASHI Takahiro 
8824c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
8834c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
8844c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
8854c4fb10dSAKASHI Takahiro 			NULL, &handle);
8864c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle) {
8874c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
8884c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
8894c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
8904c4fb10dSAKASHI Takahiro 	}
8914c4fb10dSAKASHI Takahiro 
8924c4fb10dSAKASHI Takahiro 	languages = NULL;
8934c4fb10dSAKASHI Takahiro 	languages_len = 0;
8944c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->get_languages(hii_string_protocol, handle,
8954c4fb10dSAKASHI Takahiro 			languages, &languages_len);
8964c4fb10dSAKASHI Takahiro 	if (ret != EFI_BUFFER_TOO_SMALL) {
8974c4fb10dSAKASHI Takahiro 		efi_st_error("get_languages returned %u\n",
8984c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
8994c4fb10dSAKASHI Takahiro 		goto out;
9004c4fb10dSAKASHI Takahiro 	}
901ee3c8ba8SHeinrich Schuchardt 	ret = boottime->allocate_pool(EFI_LOADER_DATA, languages_len,
902ee3c8ba8SHeinrich Schuchardt 				      (void **)&languages);
903ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
904ee3c8ba8SHeinrich Schuchardt 		efi_st_error("AllocatePool failed\n");
9054c4fb10dSAKASHI Takahiro 		goto out;
9064c4fb10dSAKASHI Takahiro 	}
9074c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->get_languages(hii_string_protocol, handle,
9084c4fb10dSAKASHI Takahiro 			languages, &languages_len);
9094c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
9104c4fb10dSAKASHI Takahiro 		efi_st_error("get_languages returned %u\n",
9114c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
9124c4fb10dSAKASHI Takahiro 		goto out;
9134c4fb10dSAKASHI Takahiro 	}
9144c4fb10dSAKASHI Takahiro 
9154c4fb10dSAKASHI Takahiro 	efi_st_printf("got languages are %s\n", languages);
9164c4fb10dSAKASHI Takahiro 
9174c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
9184c4fb10dSAKASHI Takahiro 
9194c4fb10dSAKASHI Takahiro out:
9204c4fb10dSAKASHI Takahiro 	if (handle) {
9214c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
9224c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle);
9234c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS) {
9244c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
9254c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
9264c4fb10dSAKASHI Takahiro 			return EFI_ST_FAILURE;
9274c4fb10dSAKASHI Takahiro 		}
9284c4fb10dSAKASHI Takahiro 	}
9294c4fb10dSAKASHI Takahiro 
9304c4fb10dSAKASHI Takahiro 	return result;
9314c4fb10dSAKASHI Takahiro }
9324c4fb10dSAKASHI Takahiro 
9334c4fb10dSAKASHI Takahiro /**
9344c4fb10dSAKASHI Takahiro  * test_hii_string_get_secondary_languages() - test listing of secondary
9354c4fb10dSAKASHI Takahiro  *	languages
9364c4fb10dSAKASHI Takahiro  *
9374c4fb10dSAKASHI Takahiro  * This test adds a package list, and then tries to enumerate secondary
9384c4fb10dSAKASHI Takahiro  * languages with a specific language. We will get an string of language names.
9394c4fb10dSAKASHI Takahiro  *
9404c4fb10dSAKASHI Takahiro  * @Return:     status code
9414c4fb10dSAKASHI Takahiro  */
test_hii_string_get_secondary_languages(void)9424c4fb10dSAKASHI Takahiro static int test_hii_string_get_secondary_languages(void)
9434c4fb10dSAKASHI Takahiro {
9444c4fb10dSAKASHI Takahiro 	efi_hii_handle_t handle = NULL;
9454c4fb10dSAKASHI Takahiro 	u8 *languages;
9464c4fb10dSAKASHI Takahiro 	efi_uintn_t languages_len;
9474c4fb10dSAKASHI Takahiro 	efi_status_t ret;
9484c4fb10dSAKASHI Takahiro 	int result = EFI_ST_FAILURE;
9494c4fb10dSAKASHI Takahiro 
9504c4fb10dSAKASHI Takahiro 	PRINT_TESTNAME;
9514c4fb10dSAKASHI Takahiro 	ret = hii_database_protocol->new_package_list(hii_database_protocol,
9524c4fb10dSAKASHI Takahiro 			(struct efi_hii_package_list_header *)packagelist1,
9534c4fb10dSAKASHI Takahiro 			NULL, &handle);
9544c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS || !handle) {
9554c4fb10dSAKASHI Takahiro 		efi_st_error("new_package_list returned %u\n",
9564c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
9574c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
9584c4fb10dSAKASHI Takahiro 	}
9594c4fb10dSAKASHI Takahiro 
9604c4fb10dSAKASHI Takahiro 	languages = NULL;
9614c4fb10dSAKASHI Takahiro 	languages_len = 0;
9624c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->get_secondary_languages(hii_string_protocol,
9634c4fb10dSAKASHI Takahiro 			handle, (u8 *)"en-US", languages, &languages_len);
9644c4fb10dSAKASHI Takahiro 	if (ret == EFI_NOT_FOUND) {
9654c4fb10dSAKASHI Takahiro 		efi_st_printf("no secondary languages\n");
9664c4fb10dSAKASHI Takahiro 		result = EFI_ST_SUCCESS;
9674c4fb10dSAKASHI Takahiro 		goto out;
9684c4fb10dSAKASHI Takahiro 	}
9694c4fb10dSAKASHI Takahiro 	if (ret != EFI_BUFFER_TOO_SMALL) {
9704c4fb10dSAKASHI Takahiro 		efi_st_error("get_secondary_languages returned %u\n",
9714c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
9724c4fb10dSAKASHI Takahiro 		goto out;
9734c4fb10dSAKASHI Takahiro 	}
974ee3c8ba8SHeinrich Schuchardt 	ret = boottime->allocate_pool(EFI_LOADER_DATA, languages_len,
975ee3c8ba8SHeinrich Schuchardt 				      (void **)&languages);
976ee3c8ba8SHeinrich Schuchardt 	if (ret != EFI_SUCCESS) {
977ee3c8ba8SHeinrich Schuchardt 		efi_st_error("AllocatePool failed\n");
9784c4fb10dSAKASHI Takahiro 		goto out;
9794c4fb10dSAKASHI Takahiro 	}
9804c4fb10dSAKASHI Takahiro 	ret = hii_string_protocol->get_secondary_languages(hii_string_protocol,
9814c4fb10dSAKASHI Takahiro 			handle, (u8 *)"en-US", languages, &languages_len);
9824c4fb10dSAKASHI Takahiro 	if (ret != EFI_SUCCESS) {
9834c4fb10dSAKASHI Takahiro 		efi_st_error("get_secondary_languages returned %u\n",
9844c4fb10dSAKASHI Takahiro 			     (unsigned int)ret);
9854c4fb10dSAKASHI Takahiro 		goto out;
9864c4fb10dSAKASHI Takahiro 	}
9874c4fb10dSAKASHI Takahiro 
9884c4fb10dSAKASHI Takahiro 	efi_st_printf("got secondary languages are %s\n", languages);
9894c4fb10dSAKASHI Takahiro 
9904c4fb10dSAKASHI Takahiro 	result = EFI_ST_SUCCESS;
9914c4fb10dSAKASHI Takahiro 
9924c4fb10dSAKASHI Takahiro out:
9934c4fb10dSAKASHI Takahiro 	if (handle) {
9944c4fb10dSAKASHI Takahiro 		ret = hii_database_protocol->remove_package_list(
9954c4fb10dSAKASHI Takahiro 				hii_database_protocol, handle);
9964c4fb10dSAKASHI Takahiro 		if (ret != EFI_SUCCESS) {
9974c4fb10dSAKASHI Takahiro 			efi_st_error("remove_package_list returned %u\n",
9984c4fb10dSAKASHI Takahiro 				     (unsigned int)ret);
9994c4fb10dSAKASHI Takahiro 			return EFI_ST_FAILURE;
10004c4fb10dSAKASHI Takahiro 		}
10014c4fb10dSAKASHI Takahiro 	}
10024c4fb10dSAKASHI Takahiro 
10034c4fb10dSAKASHI Takahiro 	return result;
10044c4fb10dSAKASHI Takahiro }
10054c4fb10dSAKASHI Takahiro 
test_hii_string_protocol(void)10064c4fb10dSAKASHI Takahiro static int test_hii_string_protocol(void)
10074c4fb10dSAKASHI Takahiro {
10084c4fb10dSAKASHI Takahiro 	int ret;
10094c4fb10dSAKASHI Takahiro 
10104c4fb10dSAKASHI Takahiro 	ret = test_hii_string_new_string();
10114c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
10124c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
10134c4fb10dSAKASHI Takahiro 
10144c4fb10dSAKASHI Takahiro 	ret = test_hii_string_get_string();
10154c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
10164c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
10174c4fb10dSAKASHI Takahiro 
10184c4fb10dSAKASHI Takahiro 	ret = test_hii_string_set_string();
10194c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
10204c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
10214c4fb10dSAKASHI Takahiro 
10224c4fb10dSAKASHI Takahiro 	ret = test_hii_string_get_languages();
10234c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
10244c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
10254c4fb10dSAKASHI Takahiro 
10264c4fb10dSAKASHI Takahiro 	ret = test_hii_string_get_secondary_languages();
10274c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
10284c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
10294c4fb10dSAKASHI Takahiro 
10304c4fb10dSAKASHI Takahiro 	return EFI_ST_SUCCESS;
10314c4fb10dSAKASHI Takahiro }
10324c4fb10dSAKASHI Takahiro 
10334c4fb10dSAKASHI Takahiro /*
10344c4fb10dSAKASHI Takahiro  * Execute unit test.
10354c4fb10dSAKASHI Takahiro  *
10364c4fb10dSAKASHI Takahiro  * @return:	EFI_ST_SUCCESS for success, EFI_ST_FAILURE for failure
10374c4fb10dSAKASHI Takahiro  */
execute(void)10384c4fb10dSAKASHI Takahiro static int execute(void)
10394c4fb10dSAKASHI Takahiro {
10404c4fb10dSAKASHI Takahiro 	int ret;
10414c4fb10dSAKASHI Takahiro 
10424c4fb10dSAKASHI Takahiro 	/* HII database protocol */
10434c4fb10dSAKASHI Takahiro 	ret = test_hii_database_protocol();
10444c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
10454c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
10464c4fb10dSAKASHI Takahiro 
10474c4fb10dSAKASHI Takahiro 	/* HII string protocol */
10484c4fb10dSAKASHI Takahiro 	ret = test_hii_string_protocol();
10494c4fb10dSAKASHI Takahiro 	if (ret != EFI_ST_SUCCESS)
10504c4fb10dSAKASHI Takahiro 		return EFI_ST_FAILURE;
10514c4fb10dSAKASHI Takahiro 
10524c4fb10dSAKASHI Takahiro 	return EFI_ST_SUCCESS;
10534c4fb10dSAKASHI Takahiro }
10544c4fb10dSAKASHI Takahiro 
10554c4fb10dSAKASHI Takahiro EFI_UNIT_TEST(hii) = {
10564c4fb10dSAKASHI Takahiro 	.name = "HII database protocols",
10574c4fb10dSAKASHI Takahiro 	.phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
10584c4fb10dSAKASHI Takahiro 	.setup = setup,
10594c4fb10dSAKASHI Takahiro 	.execute = execute,
10604c4fb10dSAKASHI Takahiro };
1061