efi_selftest_hii.c 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * efi_selftest_hii
  4. *
  5. * Copyright (c) 2018 AKASHI Takahiro, Linaro Limited
  6. *
  7. * Test HII database protocols
  8. */
  9. #include <efi_selftest.h>
  10. #include "efi_selftest_hii_data.c"
  11. #define PRINT_TESTNAME efi_st_printf("%s:\n", __func__)
  12. static struct efi_boot_services *boottime;
  13. static const efi_guid_t hii_database_protocol_guid =
  14. EFI_HII_DATABASE_PROTOCOL_GUID;
  15. static const efi_guid_t hii_string_protocol_guid =
  16. EFI_HII_STRING_PROTOCOL_GUID;
  17. static struct efi_hii_database_protocol *hii_database_protocol;
  18. static struct efi_hii_string_protocol *hii_string_protocol;
  19. /*
  20. * Setup unit test.
  21. *
  22. * @handle: handle of the loaded image
  23. * @systable: system table
  24. *
  25. * Return: EFI_ST_SUCCESS for success
  26. */
  27. static int setup(const efi_handle_t handle,
  28. const struct efi_system_table *systable)
  29. {
  30. efi_status_t ret;
  31. boottime = systable->boottime;
  32. /* HII database protocol */
  33. ret = boottime->locate_protocol(&hii_database_protocol_guid, NULL,
  34. (void **)&hii_database_protocol);
  35. if (ret != EFI_SUCCESS) {
  36. hii_database_protocol = NULL;
  37. efi_st_error("HII database protocol is not available.\n");
  38. return EFI_ST_FAILURE;
  39. }
  40. /* HII string protocol */
  41. ret = boottime->locate_protocol(&hii_string_protocol_guid, NULL,
  42. (void **)&hii_string_protocol);
  43. if (ret != EFI_SUCCESS) {
  44. hii_string_protocol = NULL;
  45. efi_st_error("HII string protocol is not available.\n");
  46. return EFI_ST_FAILURE;
  47. }
  48. return EFI_ST_SUCCESS;
  49. }
  50. /*
  51. * HII database protocol tests
  52. */
  53. /**
  54. * test_hii_database_new_package_list() - test creation and removal of
  55. * package list
  56. *
  57. * This test adds a new package list and then tries to remove it using
  58. * the provided handle.
  59. *
  60. * @Return: status code
  61. */
  62. static int test_hii_database_new_package_list(void)
  63. {
  64. efi_hii_handle_t handle;
  65. efi_status_t ret;
  66. PRINT_TESTNAME;
  67. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  68. (struct efi_hii_package_list_header *)packagelist1,
  69. NULL, &handle);
  70. if (ret != EFI_SUCCESS || !handle) {
  71. efi_st_error("new_package_list returned %u\n",
  72. (unsigned int)ret);
  73. return EFI_ST_FAILURE;
  74. }
  75. ret = hii_database_protocol->remove_package_list(hii_database_protocol,
  76. handle);
  77. if (ret != EFI_SUCCESS) {
  78. efi_st_error("remove_package_list returned %u\n",
  79. (unsigned int)ret);
  80. return EFI_ST_FAILURE;
  81. }
  82. return EFI_ST_SUCCESS;
  83. }
  84. /**
  85. * test_hii_database_update_package_list() - test update of package list
  86. *
  87. * This test adds a new package list and then tries to update it using
  88. * another package list.
  89. *
  90. * @Return: status code
  91. */
  92. static int test_hii_database_update_package_list(void)
  93. {
  94. efi_hii_handle_t handle = NULL;
  95. efi_status_t ret;
  96. int result = EFI_ST_FAILURE;
  97. PRINT_TESTNAME;
  98. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  99. (struct efi_hii_package_list_header *)packagelist1,
  100. NULL, &handle);
  101. if (ret != EFI_SUCCESS || !handle) {
  102. efi_st_error("new_package_list returned %u\n",
  103. (unsigned int)ret);
  104. return EFI_ST_FAILURE;
  105. }
  106. ret = hii_database_protocol->update_package_list(hii_database_protocol,
  107. handle,
  108. (struct efi_hii_package_list_header *)packagelist2);
  109. if (ret != EFI_SUCCESS || !handle) {
  110. efi_st_error("new_package_list returned %u\n",
  111. (unsigned int)ret);
  112. goto out;
  113. }
  114. result = EFI_ST_SUCCESS;
  115. out:
  116. if (handle) {
  117. ret = hii_database_protocol->remove_package_list(
  118. hii_database_protocol, handle);
  119. if (ret != EFI_SUCCESS) {
  120. efi_st_error("remove_package_list returned %u\n",
  121. (unsigned int)ret);
  122. return EFI_ST_FAILURE;
  123. }
  124. }
  125. return result;
  126. }
  127. /**
  128. * test_hii_database_list_package_lists() - test listing of package lists
  129. *
  130. * This test adds two package lists and then tries to enumerate them
  131. * against different package types. We will get an array of handles.
  132. *
  133. * @Return: status code
  134. */
  135. static int test_hii_database_list_package_lists(void)
  136. {
  137. efi_hii_handle_t handle1 = NULL, handle2 = NULL, *handles;
  138. efi_uintn_t handles_size;
  139. efi_status_t ret;
  140. int result = EFI_ST_FAILURE;
  141. PRINT_TESTNAME;
  142. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  143. (struct efi_hii_package_list_header *)packagelist1,
  144. NULL, &handle1);
  145. if (ret != EFI_SUCCESS || !handle1) {
  146. efi_st_error("new_package_list returned %u\n",
  147. (unsigned int)ret);
  148. goto out;
  149. }
  150. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  151. (struct efi_hii_package_list_header *)packagelist2,
  152. NULL, &handle2);
  153. if (ret != EFI_SUCCESS || !handle2) {
  154. efi_st_error("new_package_list returned %u\n",
  155. (unsigned int)ret);
  156. goto out;
  157. }
  158. /* TYPE_ALL */
  159. handles = NULL;
  160. handles_size = 0;
  161. ret = hii_database_protocol->list_package_lists(hii_database_protocol,
  162. EFI_HII_PACKAGE_TYPE_ALL, NULL,
  163. &handles_size, handles);
  164. if (ret != EFI_BUFFER_TOO_SMALL) {
  165. efi_st_error("list_package_lists returned %u\n",
  166. (unsigned int)ret);
  167. goto out;
  168. }
  169. ret = boottime->allocate_pool(EFI_LOADER_DATA, handles_size,
  170. (void **)&handles);
  171. if (ret != EFI_SUCCESS) {
  172. efi_st_error("AllocatePool failed\n");
  173. goto out;
  174. }
  175. ret = hii_database_protocol->list_package_lists(hii_database_protocol,
  176. EFI_HII_PACKAGE_TYPE_ALL, NULL,
  177. &handles_size, handles);
  178. if (ret != EFI_SUCCESS) {
  179. efi_st_error("list_package_lists returned %u\n",
  180. (unsigned int)ret);
  181. goto out;
  182. }
  183. ret = boottime->free_pool(handles);
  184. if (ret != EFI_SUCCESS) {
  185. efi_st_error("FreePool failed\n");
  186. goto out;
  187. }
  188. /* STRINGS */
  189. handles = NULL;
  190. handles_size = 0;
  191. ret = hii_database_protocol->list_package_lists(hii_database_protocol,
  192. EFI_HII_PACKAGE_STRINGS, NULL,
  193. &handles_size, handles);
  194. if (ret != EFI_BUFFER_TOO_SMALL) {
  195. efi_st_error("list_package_lists returned %u\n",
  196. (unsigned int)ret);
  197. goto out;
  198. }
  199. ret = boottime->allocate_pool(EFI_LOADER_DATA, handles_size,
  200. (void **)&handles);
  201. if (ret != EFI_SUCCESS) {
  202. efi_st_error("AllocatePool failed\n");
  203. goto out;
  204. }
  205. ret = hii_database_protocol->list_package_lists(hii_database_protocol,
  206. EFI_HII_PACKAGE_STRINGS, NULL,
  207. &handles_size, handles);
  208. if (ret != EFI_SUCCESS) {
  209. efi_st_error("list_package_lists returned %u\n",
  210. (unsigned int)ret);
  211. goto out;
  212. }
  213. ret = boottime->free_pool(handles);
  214. if (ret != EFI_SUCCESS) {
  215. efi_st_error("FreePool failed\n");
  216. goto out;
  217. }
  218. /* GUID */
  219. handles = NULL;
  220. handles_size = 0;
  221. ret = hii_database_protocol->list_package_lists(hii_database_protocol,
  222. EFI_HII_PACKAGE_TYPE_GUID, &package_guid,
  223. &handles_size, handles);
  224. if (ret != EFI_BUFFER_TOO_SMALL) {
  225. efi_st_error("list_package_lists returned %u\n",
  226. (unsigned int)ret);
  227. goto out;
  228. }
  229. ret = boottime->allocate_pool(EFI_LOADER_DATA, handles_size,
  230. (void **)&handles);
  231. if (ret != EFI_SUCCESS) {
  232. efi_st_error("AllocatePool failed\n");
  233. goto out;
  234. }
  235. ret = hii_database_protocol->list_package_lists(hii_database_protocol,
  236. EFI_HII_PACKAGE_TYPE_GUID, &package_guid,
  237. &handles_size, handles);
  238. if (ret != EFI_SUCCESS) {
  239. efi_st_error("list_package_lists returned %u\n",
  240. (unsigned int)ret);
  241. goto out;
  242. }
  243. ret = boottime->free_pool(handles);
  244. if (ret != EFI_SUCCESS) {
  245. efi_st_error("FreePool failed\n");
  246. goto out;
  247. }
  248. /* KEYBOARD_LAYOUT */
  249. handles = NULL;
  250. handles_size = 0;
  251. ret = hii_database_protocol->list_package_lists(hii_database_protocol,
  252. EFI_HII_PACKAGE_KEYBOARD_LAYOUT, NULL,
  253. &handles_size, handles);
  254. if (ret != EFI_BUFFER_TOO_SMALL) {
  255. efi_st_error("list_package_lists returned %u\n",
  256. (unsigned int)ret);
  257. goto out;
  258. }
  259. ret = boottime->allocate_pool(EFI_LOADER_DATA, handles_size,
  260. (void **)&handles);
  261. if (ret != EFI_SUCCESS) {
  262. efi_st_error("AllocatePool failed\n");
  263. goto out;
  264. }
  265. ret = hii_database_protocol->list_package_lists(hii_database_protocol,
  266. EFI_HII_PACKAGE_KEYBOARD_LAYOUT, NULL,
  267. &handles_size, handles);
  268. if (ret != EFI_SUCCESS) {
  269. efi_st_error("list_package_lists returned %u\n",
  270. (unsigned int)ret);
  271. goto out;
  272. }
  273. ret = boottime->free_pool(handles);
  274. if (ret != EFI_SUCCESS) {
  275. efi_st_error("FreePool failed\n");
  276. goto out;
  277. }
  278. result = EFI_ST_SUCCESS;
  279. out:
  280. if (handle1) {
  281. ret = hii_database_protocol->remove_package_list(
  282. hii_database_protocol, handle1);
  283. if (ret != EFI_SUCCESS)
  284. efi_st_error("remove_package_list returned %u\n",
  285. (unsigned int)ret);
  286. }
  287. if (handle2) {
  288. ret = hii_database_protocol->remove_package_list(
  289. hii_database_protocol, handle2);
  290. if (ret != EFI_SUCCESS)
  291. efi_st_error("remove_package_list returned %u\n",
  292. (unsigned int)ret);
  293. }
  294. return result;
  295. }
  296. /**
  297. * test_hii_database_export_package_lists() - test export of package lists
  298. *
  299. * @Return: status code
  300. */
  301. static int test_hii_database_export_package_lists(void)
  302. {
  303. PRINT_TESTNAME;
  304. /* export_package_lists() not implemented yet */
  305. return EFI_ST_SUCCESS;
  306. }
  307. /**
  308. * test_hii_database_register_package_notify() - test registration of
  309. * notification function
  310. *
  311. * @Return: status code
  312. */
  313. static int test_hii_database_register_package_notify(void)
  314. {
  315. PRINT_TESTNAME;
  316. /* register_package_notify() not implemented yet */
  317. return EFI_ST_SUCCESS;
  318. }
  319. /**
  320. * test_hii_database_unregister_package_notify() - test removal of
  321. * notification function
  322. *
  323. * @Return: status code
  324. */
  325. static int test_hii_database_unregister_package_notify(void)
  326. {
  327. PRINT_TESTNAME;
  328. /* unregsiter_package_notify() not implemented yet */
  329. return EFI_ST_SUCCESS;
  330. }
  331. /**
  332. * test_hii_database_find_keyboard_layouts() - test listing of
  333. * all the keyboard layouts in the system
  334. *
  335. * This test adds two package lists, each of which has two keyboard layouts
  336. * and then tries to enumerate them. We will get an array of handles.
  337. *
  338. * @Return: status code
  339. */
  340. static int test_hii_database_find_keyboard_layouts(void)
  341. {
  342. efi_hii_handle_t handle1 = NULL, handle2 = NULL;
  343. efi_guid_t *guids;
  344. u16 guids_size;
  345. efi_status_t ret;
  346. int result = EFI_ST_FAILURE;
  347. PRINT_TESTNAME;
  348. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  349. (struct efi_hii_package_list_header *)packagelist1,
  350. NULL, &handle1);
  351. if (ret != EFI_SUCCESS || !handle1) {
  352. efi_st_error("new_package_list returned %u\n",
  353. (unsigned int)ret);
  354. goto out;
  355. }
  356. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  357. (struct efi_hii_package_list_header *)packagelist2,
  358. NULL, &handle2);
  359. if (ret != EFI_SUCCESS || !handle2) {
  360. efi_st_error("new_package_list returned %u\n",
  361. (unsigned int)ret);
  362. goto out;
  363. }
  364. guids = NULL;
  365. guids_size = 0;
  366. ret = hii_database_protocol->find_keyboard_layouts(
  367. hii_database_protocol, &guids_size, guids);
  368. if (ret != EFI_BUFFER_TOO_SMALL) {
  369. efi_st_error("find_keyboard_layouts returned %u\n",
  370. (unsigned int)ret);
  371. goto out;
  372. }
  373. ret = boottime->allocate_pool(EFI_LOADER_DATA, guids_size,
  374. (void **)&guids);
  375. if (ret != EFI_SUCCESS) {
  376. efi_st_error("AllocatePool failed\n");
  377. goto out;
  378. }
  379. ret = hii_database_protocol->find_keyboard_layouts(
  380. hii_database_protocol, &guids_size, guids);
  381. if (ret != EFI_SUCCESS) {
  382. efi_st_error("find_keyboard_layouts returned %u\n",
  383. (unsigned int)ret);
  384. goto out;
  385. }
  386. ret = boottime->free_pool(guids);
  387. if (ret != EFI_SUCCESS) {
  388. efi_st_error("FreePool failed\n");
  389. goto out;
  390. }
  391. result = EFI_ST_SUCCESS;
  392. out:
  393. if (handle1) {
  394. ret = hii_database_protocol->remove_package_list(
  395. hii_database_protocol, handle1);
  396. if (ret != EFI_SUCCESS)
  397. efi_st_error("remove_package_list returned %u\n",
  398. (unsigned int)ret);
  399. }
  400. if (handle2) {
  401. ret = hii_database_protocol->remove_package_list(
  402. hii_database_protocol, handle2);
  403. if (ret != EFI_SUCCESS)
  404. efi_st_error("remove_package_list returned %u\n",
  405. (unsigned int)ret);
  406. }
  407. return result;
  408. }
  409. /**
  410. * test_hii_database_get_keyboard_layout() - test retrieval of keyboard layout
  411. *
  412. * This test adds two package lists, each of which has two keyboard layouts
  413. * and then tries to get a handle to keyboard layout with a specific guid
  414. * and the current one.
  415. *
  416. * @Return: status code
  417. */
  418. static int test_hii_database_get_keyboard_layout(void)
  419. {
  420. efi_hii_handle_t handle1 = NULL, handle2 = NULL;
  421. struct efi_hii_keyboard_layout *kb_layout;
  422. u16 kb_layout_size;
  423. efi_status_t ret;
  424. int result = EFI_ST_FAILURE;
  425. PRINT_TESTNAME;
  426. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  427. (struct efi_hii_package_list_header *)packagelist1,
  428. NULL, &handle1);
  429. if (ret != EFI_SUCCESS || !handle1) {
  430. efi_st_error("new_package_list returned %u\n",
  431. (unsigned int)ret);
  432. goto out;
  433. }
  434. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  435. (struct efi_hii_package_list_header *)packagelist2,
  436. NULL, &handle2);
  437. if (ret != EFI_SUCCESS || !handle2) {
  438. efi_st_error("new_package_list returned %u\n",
  439. (unsigned int)ret);
  440. goto out;
  441. }
  442. /* specific keyboard_layout(guid11) */
  443. kb_layout = NULL;
  444. kb_layout_size = 0;
  445. ret = hii_database_protocol->get_keyboard_layout(hii_database_protocol,
  446. &kb_layout_guid11, &kb_layout_size, kb_layout);
  447. if (ret != EFI_BUFFER_TOO_SMALL) {
  448. efi_st_error("get_keyboard_layout returned %u\n",
  449. (unsigned int)ret);
  450. goto out;
  451. }
  452. ret = boottime->allocate_pool(EFI_LOADER_DATA, kb_layout_size,
  453. (void **)&kb_layout);
  454. if (ret != EFI_SUCCESS) {
  455. efi_st_error("AllocatePool failed\n");
  456. goto out;
  457. }
  458. ret = hii_database_protocol->get_keyboard_layout(hii_database_protocol,
  459. &kb_layout_guid11, &kb_layout_size, kb_layout);
  460. if (ret != EFI_SUCCESS) {
  461. efi_st_error("get_keyboard_layout returned %u\n",
  462. (unsigned int)ret);
  463. goto out;
  464. }
  465. ret = boottime->free_pool(kb_layout);
  466. if (ret != EFI_SUCCESS) {
  467. efi_st_error("FreePool failed\n");
  468. goto out;
  469. }
  470. /* current */
  471. kb_layout = NULL;
  472. kb_layout_size = 0;
  473. ret = hii_database_protocol->get_keyboard_layout(hii_database_protocol,
  474. NULL, &kb_layout_size, kb_layout);
  475. if (ret != EFI_INVALID_PARAMETER) {
  476. efi_st_error("get_keyboard_layout returned %u\n",
  477. (unsigned int)ret);
  478. goto out;
  479. }
  480. result = EFI_ST_SUCCESS;
  481. out:
  482. if (handle1) {
  483. ret = hii_database_protocol->remove_package_list(
  484. hii_database_protocol, handle1);
  485. if (ret != EFI_SUCCESS)
  486. efi_st_error("remove_package_list returned %u\n",
  487. (unsigned int)ret);
  488. }
  489. if (handle2) {
  490. ret = hii_database_protocol->remove_package_list(
  491. hii_database_protocol, handle2);
  492. if (ret != EFI_SUCCESS)
  493. efi_st_error("remove_package_list returned %u\n",
  494. (unsigned int)ret);
  495. }
  496. return result;
  497. }
  498. /**
  499. * test_hii_database_set_keyboard_layout() - test change of
  500. * current keyboard layout
  501. *
  502. * @Return: status code
  503. */
  504. static int test_hii_database_set_keyboard_layout(void)
  505. {
  506. efi_status_t ret;
  507. PRINT_TESTNAME;
  508. /* Invalid key guid. */
  509. ret = hii_database_protocol->set_keyboard_layout(
  510. hii_database_protocol, NULL);
  511. if (ret != EFI_INVALID_PARAMETER) {
  512. efi_st_error("set_keyboard_layout returned %u not invalid\n",
  513. (unsigned int)ret);
  514. return EFI_ST_FAILURE;
  515. }
  516. /* set_keyboard_layout() not implemented yet */
  517. return EFI_ST_SUCCESS;
  518. }
  519. /**
  520. * test_hii_database_get_package_list_handle() - test retrieval of
  521. * driver associated with a package list
  522. *
  523. * This test adds a package list, and then tries to get a handle to driver
  524. * which is associated with a package list.
  525. *
  526. * @Return: status code
  527. */
  528. static int test_hii_database_get_package_list_handle(void)
  529. {
  530. efi_hii_handle_t handle = NULL;
  531. efi_handle_t driver_handle;
  532. efi_status_t ret;
  533. int result = EFI_ST_FAILURE;
  534. PRINT_TESTNAME;
  535. driver_handle = (efi_handle_t)0x12345678; /* dummy */
  536. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  537. (struct efi_hii_package_list_header *)packagelist1,
  538. driver_handle, &handle);
  539. if (ret != EFI_SUCCESS || !handle) {
  540. efi_st_error("new_package_list returned %u\n",
  541. (unsigned int)ret);
  542. return EFI_ST_FAILURE;
  543. }
  544. driver_handle = NULL;
  545. ret = hii_database_protocol->get_package_list_handle(
  546. hii_database_protocol, handle, &driver_handle);
  547. if (ret != EFI_SUCCESS || driver_handle != (efi_handle_t)0x12345678) {
  548. efi_st_error("get_package_list_handle returned %u, driver:%p\n",
  549. (unsigned int)ret, driver_handle);
  550. goto out;
  551. }
  552. result = EFI_ST_SUCCESS;
  553. out:
  554. if (handle) {
  555. ret = hii_database_protocol->remove_package_list(
  556. hii_database_protocol, handle);
  557. if (ret != EFI_SUCCESS) {
  558. efi_st_error("remove_package_list returned %u\n",
  559. (unsigned int)ret);
  560. return EFI_ST_FAILURE;
  561. }
  562. }
  563. return result;
  564. }
  565. static int test_hii_database_protocol(void)
  566. {
  567. int ret;
  568. ret = test_hii_database_new_package_list();
  569. if (ret != EFI_ST_SUCCESS)
  570. return EFI_ST_FAILURE;
  571. ret = test_hii_database_update_package_list();
  572. if (ret != EFI_ST_SUCCESS)
  573. return EFI_ST_FAILURE;
  574. ret = test_hii_database_list_package_lists();
  575. if (ret != EFI_ST_SUCCESS)
  576. return EFI_ST_FAILURE;
  577. ret = test_hii_database_export_package_lists();
  578. if (ret != EFI_ST_SUCCESS)
  579. return EFI_ST_FAILURE;
  580. ret = test_hii_database_register_package_notify();
  581. if (ret != EFI_ST_SUCCESS)
  582. return EFI_ST_FAILURE;
  583. ret = test_hii_database_unregister_package_notify();
  584. if (ret != EFI_ST_SUCCESS)
  585. return EFI_ST_FAILURE;
  586. ret = test_hii_database_find_keyboard_layouts();
  587. if (ret != EFI_ST_SUCCESS)
  588. return EFI_ST_FAILURE;
  589. ret = test_hii_database_get_keyboard_layout();
  590. if (ret != EFI_ST_SUCCESS)
  591. return EFI_ST_FAILURE;
  592. ret = test_hii_database_set_keyboard_layout();
  593. if (ret != EFI_ST_SUCCESS)
  594. return EFI_ST_FAILURE;
  595. ret = test_hii_database_get_package_list_handle();
  596. if (ret != EFI_ST_SUCCESS)
  597. return EFI_ST_FAILURE;
  598. return EFI_ST_SUCCESS;
  599. }
  600. /*
  601. * HII string protocol tests
  602. */
  603. /**
  604. * test_hii_string_new_string() - test creation of a new string entry
  605. *
  606. * This test adds a package list, and then tries to add a new string
  607. * entry for a specific language.
  608. *
  609. * @Return: status code
  610. */
  611. static int test_hii_string_new_string(void)
  612. {
  613. efi_hii_handle_t handle = NULL;
  614. efi_string_id_t id;
  615. efi_status_t ret;
  616. int result = EFI_ST_FAILURE;
  617. PRINT_TESTNAME;
  618. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  619. (struct efi_hii_package_list_header *)packagelist1,
  620. NULL, &handle);
  621. if (ret != EFI_SUCCESS || !handle) {
  622. efi_st_error("new_package_list returned %u\n",
  623. (unsigned int)ret);
  624. return EFI_ST_FAILURE;
  625. }
  626. ret = hii_string_protocol->new_string(hii_string_protocol, handle,
  627. &id, (u8 *)"en-US",
  628. u"Japanese", u"Japanese", NULL);
  629. if (ret != EFI_SUCCESS) {
  630. efi_st_error("new_string returned %u\n",
  631. (unsigned int)ret);
  632. goto out;
  633. }
  634. efi_st_printf("new string id is %u\n", id);
  635. result = EFI_ST_SUCCESS;
  636. out:
  637. if (handle) {
  638. ret = hii_database_protocol->remove_package_list(
  639. hii_database_protocol, handle);
  640. if (ret != EFI_SUCCESS) {
  641. efi_st_error("remove_package_list returned %u\n",
  642. (unsigned int)ret);
  643. return EFI_ST_FAILURE;
  644. }
  645. }
  646. return result;
  647. }
  648. /**
  649. * test_hii_string_get_string() - test retrieval of a string entry
  650. *
  651. * This test adds a package list, create a new string entry and then tries
  652. * to get it with its string id.
  653. *
  654. * @Return: status code
  655. */
  656. static int test_hii_string_get_string(void)
  657. {
  658. efi_hii_handle_t handle = NULL;
  659. efi_string_id_t id;
  660. efi_string_t string;
  661. efi_uintn_t string_len;
  662. efi_status_t ret;
  663. int result = EFI_ST_FAILURE;
  664. PRINT_TESTNAME;
  665. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  666. (struct efi_hii_package_list_header *)packagelist1,
  667. NULL, &handle);
  668. if (ret != EFI_SUCCESS || !handle) {
  669. efi_st_error("new_package_list returned %u\n",
  670. (unsigned int)ret);
  671. return EFI_ST_FAILURE;
  672. }
  673. ret = hii_string_protocol->new_string(hii_string_protocol, handle,
  674. &id, (u8 *)"en-US",
  675. u"Japanese", u"Japanese", NULL);
  676. if (ret != EFI_SUCCESS) {
  677. efi_st_error("new_string returned %u\n",
  678. (unsigned int)ret);
  679. goto out;
  680. }
  681. string = NULL;
  682. string_len = 0;
  683. ret = hii_string_protocol->get_string(hii_string_protocol,
  684. (u8 *)"en-US", handle, id, string, &string_len, NULL);
  685. if (ret != EFI_BUFFER_TOO_SMALL) {
  686. efi_st_error("get_string returned %u\n",
  687. (unsigned int)ret);
  688. goto out;
  689. }
  690. string_len += sizeof(u16);
  691. ret = boottime->allocate_pool(EFI_LOADER_DATA, string_len,
  692. (void **)&string);
  693. if (ret != EFI_SUCCESS) {
  694. efi_st_error("AllocatePool failed\n");
  695. goto out;
  696. }
  697. ret = hii_string_protocol->get_string(hii_string_protocol,
  698. (u8 *)"en-US", handle, id, string, &string_len, NULL);
  699. if (ret != EFI_SUCCESS) {
  700. efi_st_error("get_string returned %u\n",
  701. (unsigned int)ret);
  702. goto out;
  703. }
  704. if (efi_st_strcmp_16_8(string, "Japanese")) {
  705. efi_st_error("get_string returned incorrect string\n");
  706. goto out;
  707. }
  708. result = EFI_ST_SUCCESS;
  709. out:
  710. if (handle) {
  711. ret = hii_database_protocol->remove_package_list(
  712. hii_database_protocol, handle);
  713. if (ret != EFI_SUCCESS) {
  714. efi_st_error("remove_package_list returned %u\n",
  715. (unsigned int)ret);
  716. return EFI_ST_FAILURE;
  717. }
  718. }
  719. return result;
  720. }
  721. /**
  722. * test_hii_string_set_string() - test change of a string entry
  723. *
  724. * This test adds a package list, create a new string entry and then tries
  725. * to modify it.
  726. *
  727. * @Return: status code
  728. */
  729. static int test_hii_string_set_string(void)
  730. {
  731. efi_hii_handle_t handle = NULL;
  732. efi_string_id_t id;
  733. efi_status_t ret;
  734. int result = EFI_ST_FAILURE;
  735. PRINT_TESTNAME;
  736. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  737. (struct efi_hii_package_list_header *)packagelist1,
  738. NULL, &handle);
  739. if (ret != EFI_SUCCESS || !handle) {
  740. efi_st_error("new_package_list returned %u\n",
  741. (unsigned int)ret);
  742. return EFI_ST_FAILURE;
  743. }
  744. ret = hii_string_protocol->new_string(hii_string_protocol, handle,
  745. &id, (u8 *)"en-US",
  746. u"Japanese", u"Japanese", NULL);
  747. if (ret != EFI_SUCCESS) {
  748. efi_st_error("new_string returned %u\n",
  749. (unsigned int)ret);
  750. goto out;
  751. }
  752. ret = hii_string_protocol->set_string(hii_string_protocol, handle,
  753. id, (u8 *)"en-US",
  754. u"Nihongo", NULL);
  755. if (ret != EFI_SUCCESS) {
  756. efi_st_error("set_string returned %u\n",
  757. (unsigned int)ret);
  758. goto out;
  759. }
  760. result = EFI_ST_SUCCESS;
  761. out:
  762. if (handle) {
  763. ret = hii_database_protocol->remove_package_list(
  764. hii_database_protocol, handle);
  765. if (ret != EFI_SUCCESS) {
  766. efi_st_error("remove_package_list returned %u\n",
  767. (unsigned int)ret);
  768. return EFI_ST_FAILURE;
  769. }
  770. }
  771. return result;
  772. }
  773. /**
  774. * test_hii_string_get_languages() - test listing of languages
  775. *
  776. * This test adds a package list, and then tries to enumerate languages
  777. * in it. We will get an string of language names.
  778. *
  779. * @Return: status code
  780. */
  781. static int test_hii_string_get_languages(void)
  782. {
  783. efi_hii_handle_t handle = NULL;
  784. u8 *languages;
  785. efi_uintn_t languages_len;
  786. efi_status_t ret;
  787. int result = EFI_ST_FAILURE;
  788. PRINT_TESTNAME;
  789. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  790. (struct efi_hii_package_list_header *)packagelist1,
  791. NULL, &handle);
  792. if (ret != EFI_SUCCESS || !handle) {
  793. efi_st_error("new_package_list returned %u\n",
  794. (unsigned int)ret);
  795. return EFI_ST_FAILURE;
  796. }
  797. languages = NULL;
  798. languages_len = 0;
  799. ret = hii_string_protocol->get_languages(hii_string_protocol, handle,
  800. languages, &languages_len);
  801. if (ret != EFI_BUFFER_TOO_SMALL) {
  802. efi_st_error("get_languages returned %u\n",
  803. (unsigned int)ret);
  804. goto out;
  805. }
  806. ret = boottime->allocate_pool(EFI_LOADER_DATA, languages_len,
  807. (void **)&languages);
  808. if (ret != EFI_SUCCESS) {
  809. efi_st_error("AllocatePool failed\n");
  810. goto out;
  811. }
  812. ret = hii_string_protocol->get_languages(hii_string_protocol, handle,
  813. languages, &languages_len);
  814. if (ret != EFI_SUCCESS) {
  815. efi_st_error("get_languages returned %u\n",
  816. (unsigned int)ret);
  817. goto out;
  818. }
  819. efi_st_printf("got languages are %s\n", languages);
  820. result = EFI_ST_SUCCESS;
  821. out:
  822. if (handle) {
  823. ret = hii_database_protocol->remove_package_list(
  824. hii_database_protocol, handle);
  825. if (ret != EFI_SUCCESS) {
  826. efi_st_error("remove_package_list returned %u\n",
  827. (unsigned int)ret);
  828. return EFI_ST_FAILURE;
  829. }
  830. }
  831. return result;
  832. }
  833. /**
  834. * test_hii_string_get_secondary_languages() - test listing of secondary
  835. * languages
  836. *
  837. * This test adds a package list, and then tries to enumerate secondary
  838. * languages with a specific language. We will get an string of language names.
  839. *
  840. * @Return: status code
  841. */
  842. static int test_hii_string_get_secondary_languages(void)
  843. {
  844. efi_hii_handle_t handle = NULL;
  845. u8 *languages;
  846. efi_uintn_t languages_len;
  847. efi_status_t ret;
  848. int result = EFI_ST_FAILURE;
  849. PRINT_TESTNAME;
  850. ret = hii_database_protocol->new_package_list(hii_database_protocol,
  851. (struct efi_hii_package_list_header *)packagelist1,
  852. NULL, &handle);
  853. if (ret != EFI_SUCCESS || !handle) {
  854. efi_st_error("new_package_list returned %u\n",
  855. (unsigned int)ret);
  856. return EFI_ST_FAILURE;
  857. }
  858. languages = NULL;
  859. languages_len = 0;
  860. ret = hii_string_protocol->get_secondary_languages(hii_string_protocol,
  861. handle, (u8 *)"en-US", languages, &languages_len);
  862. if (ret == EFI_NOT_FOUND) {
  863. efi_st_printf("no secondary languages\n");
  864. result = EFI_ST_SUCCESS;
  865. goto out;
  866. }
  867. if (ret != EFI_BUFFER_TOO_SMALL) {
  868. efi_st_error("get_secondary_languages returned %u\n",
  869. (unsigned int)ret);
  870. goto out;
  871. }
  872. ret = boottime->allocate_pool(EFI_LOADER_DATA, languages_len,
  873. (void **)&languages);
  874. if (ret != EFI_SUCCESS) {
  875. efi_st_error("AllocatePool failed\n");
  876. goto out;
  877. }
  878. ret = hii_string_protocol->get_secondary_languages(hii_string_protocol,
  879. handle, (u8 *)"en-US", languages, &languages_len);
  880. if (ret != EFI_SUCCESS) {
  881. efi_st_error("get_secondary_languages returned %u\n",
  882. (unsigned int)ret);
  883. goto out;
  884. }
  885. efi_st_printf("got secondary languages are %s\n", languages);
  886. result = EFI_ST_SUCCESS;
  887. out:
  888. if (handle) {
  889. ret = hii_database_protocol->remove_package_list(
  890. hii_database_protocol, handle);
  891. if (ret != EFI_SUCCESS) {
  892. efi_st_error("remove_package_list returned %u\n",
  893. (unsigned int)ret);
  894. return EFI_ST_FAILURE;
  895. }
  896. }
  897. return result;
  898. }
  899. static int test_hii_string_protocol(void)
  900. {
  901. int ret;
  902. ret = test_hii_string_new_string();
  903. if (ret != EFI_ST_SUCCESS)
  904. return EFI_ST_FAILURE;
  905. ret = test_hii_string_get_string();
  906. if (ret != EFI_ST_SUCCESS)
  907. return EFI_ST_FAILURE;
  908. ret = test_hii_string_set_string();
  909. if (ret != EFI_ST_SUCCESS)
  910. return EFI_ST_FAILURE;
  911. ret = test_hii_string_get_languages();
  912. if (ret != EFI_ST_SUCCESS)
  913. return EFI_ST_FAILURE;
  914. ret = test_hii_string_get_secondary_languages();
  915. if (ret != EFI_ST_SUCCESS)
  916. return EFI_ST_FAILURE;
  917. return EFI_ST_SUCCESS;
  918. }
  919. /*
  920. * Execute unit test.
  921. *
  922. * Return: EFI_ST_SUCCESS for success, EFI_ST_FAILURE for failure
  923. */
  924. static int execute(void)
  925. {
  926. int ret;
  927. /* HII database protocol */
  928. ret = test_hii_database_protocol();
  929. if (ret != EFI_ST_SUCCESS)
  930. return EFI_ST_FAILURE;
  931. /* HII string protocol */
  932. ret = test_hii_string_protocol();
  933. if (ret != EFI_ST_SUCCESS)
  934. return EFI_ST_FAILURE;
  935. return EFI_ST_SUCCESS;
  936. }
  937. EFI_UNIT_TEST(hii) = {
  938. .name = "HII database protocols",
  939. .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
  940. .setup = setup,
  941. .execute = execute,
  942. };