blob: 323f5f664c6a76f6e28b518d50d745eccb7622c3 [file] [log] [blame]
Randall Spangler7f436692013-02-05 12:42:36 -08001/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 *
5 * Tests for vboot_api_kernel, part 2
6 */
7
Bill Richardson0c3ba242013-03-29 11:09:30 -07008#include <stdint.h>
Randall Spangler7f436692013-02-05 12:42:36 -08009#include <stdio.h>
10#include <stdlib.h>
11
12#include "gbb_header.h"
13#include "host_common.h"
14#include "load_kernel_fw.h"
15#include "rollback_index.h"
16#include "test_common.h"
17#include "vboot_audio.h"
18#include "vboot_common.h"
19#include "vboot_kernel.h"
20#include "vboot_nvstorage.h"
21#include "vboot_struct.h"
22
23/* Mock data */
24static VbCommonParams cparams;
25static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
26static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
27static GoogleBinaryBlockHeader gbb;
28static LoadKernelParams lkp;
29
30static int shutdown_request_calls_left;
31static int audio_looping_calls_left;
32static uint32_t vbtlk_retval;
33static int vbexlegacy_called;
34static int trust_ec;
35static int virtdev_set;
36static uint32_t virtdev_retval;
37
38static uint32_t mock_keypress[8];
39static uint32_t mock_keypress_count;
40static uint32_t screens_displayed[8];
41static uint32_t screens_count = 0;
42static uint32_t mock_num_disks[8];
43static uint32_t mock_num_disks_count;
44
45/* Reset mock data (for use before each test) */
46static void ResetMocks(void)
47{
48 Memset(&cparams, 0, sizeof(cparams));
49 cparams.shared_data_size = sizeof(shared_data);
50 cparams.shared_data_blob = shared_data;
51 cparams.gbb_data = &gbb;
Simon Glass527ba812013-07-25 08:48:47 -060052 cparams.gbb = &gbb;
Randall Spangler7f436692013-02-05 12:42:36 -080053
54 Memset(&gbb, 0, sizeof(gbb));
55 gbb.major_version = GBB_MAJOR_VER;
56 gbb.minor_version = GBB_MINOR_VER;
57 gbb.flags = 0;
58
59 /*
60 * Only the outermost vboot_api_kernel call sets vboot_api_kernel's
61 * vnc. So clear it here too.
62 */
63 Memset(VbApiKernelGetVnc(), 0, sizeof(VbNvContext));
64 VbNvSetup(VbApiKernelGetVnc());
65 VbNvTeardown(VbApiKernelGetVnc()); /* So CRC gets generated */
66
67 Memset(&shared_data, 0, sizeof(shared_data));
68 VbSharedDataInit(shared, sizeof(shared_data));
69
70 Memset(&lkp, 0, sizeof(lkp));
71
72 shutdown_request_calls_left = -1;
73 audio_looping_calls_left = 30;
74 vbtlk_retval = 1000;
75 vbexlegacy_called = 0;
76 trust_ec = 0;
77 virtdev_set = 0;
78 virtdev_retval = 0;
79
80 Memset(screens_displayed, 0, sizeof(screens_displayed));
81 screens_count = 0;
82
83 Memset(mock_keypress, 0, sizeof(mock_keypress));
84 mock_keypress_count = 0;
85
86 Memset(mock_num_disks, 0, sizeof(mock_num_disks));
87 mock_num_disks_count = 0;
88}
89
90/* Mock functions */
91
92uint32_t VbExIsShutdownRequested(void)
93{
94 if (shutdown_request_calls_left == 0)
95 return 1;
96 else if (shutdown_request_calls_left > 0)
97 shutdown_request_calls_left--;
98
99 return 0;
100}
101
102uint32_t VbExKeyboardRead(void)
103{
104 if (mock_keypress_count < ARRAY_SIZE(mock_keypress))
105 return mock_keypress[mock_keypress_count++];
106 else
107 return 0;
108}
109
110int VbExLegacy(void)
111{
112 vbexlegacy_called++;
113 return 0;
114}
115
116VbError_t VbExDiskGetInfo(VbDiskInfo **infos_ptr, uint32_t *count,
117 uint32_t disk_flags)
118{
119 if (mock_num_disks_count < ARRAY_SIZE(mock_num_disks)) {
120 if (mock_num_disks[mock_num_disks_count] == -1)
121 return VBERROR_SIMULATED;
122 else
123 *count = mock_num_disks[mock_num_disks_count++];
124 } else {
125 *count = 0;
126 }
127 return VBERROR_SUCCESS;
128}
129
130VbError_t VbExDiskFreeInfo(VbDiskInfo *infos,
131 VbExDiskHandle_t preserve_handle)
132{
133 return VBERROR_SUCCESS;
134}
135
136int VbExTrustEC(void)
137{
138 return trust_ec;
139}
140
141int VbAudioLooping(VbAudioContext *audio)
142{
143 if (audio_looping_calls_left == 0)
144 return 0;
145 else if (audio_looping_calls_left > 0)
146 audio_looping_calls_left--;
147
148 return 1;
149}
150
151uint32_t VbTryLoadKernel(VbCommonParams *cparams, LoadKernelParams *p,
152 uint32_t get_info_flags)
153{
154 return vbtlk_retval + get_info_flags;
155}
156
157VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen, int force,
158 VbNvContext *vncptr)
159{
160 if (screens_count < ARRAY_SIZE(screens_displayed))
161 screens_displayed[screens_count++] = screen;
162
163 return VBERROR_SUCCESS;
164}
165
166uint32_t SetVirtualDevMode(int val)
167{
168 virtdev_set = val;
169 return virtdev_retval;
170}
171
172/* Tests */
173
174static void VbUserConfirmsTest(void)
175{
176 printf("Testing VbUserConfirms()...\n");
177
178 ResetMocks();
179 shutdown_request_calls_left = 1;
180 TEST_EQ(VbUserConfirms(&cparams, 0), -1, "Shutdown requested");
181
182 ResetMocks();
183 mock_keypress[0] = '\r';
184 TEST_EQ(VbUserConfirms(&cparams, 0), 1, "Enter");
185
186 ResetMocks();
187 mock_keypress[0] = 0x1b;
188 TEST_EQ(VbUserConfirms(&cparams, 0), 0, "Esc");
189
190 ResetMocks();
191 mock_keypress[0] = ' ';
192 shutdown_request_calls_left = 1;
193 TEST_EQ(VbUserConfirms(&cparams, 1), 0, "Space means no");
194
195 ResetMocks();
196 mock_keypress[0] = ' ';
197 shutdown_request_calls_left = 1;
198 TEST_EQ(VbUserConfirms(&cparams, 0), -1, "Space ignored");
199
200 printf("...done.\n");
201}
202
203static void VbBootTest(void)
204{
205 ResetMocks();
206 TEST_EQ(VbBootNormal(&cparams, &lkp), 1002, "VbBootNormal()");
207}
208
209static void VbBootDevTest(void)
210{
211 uint32_t u;
212
213 printf("Testing VbBootDeveloper()...\n");
214
215 /* Proceed after timeout */
216 ResetMocks();
217 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Timeout");
218 TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
219 " warning screen");
220 VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u);
221 TEST_EQ(u, 0, " recovery reason");
222 TEST_EQ(audio_looping_calls_left, 0, " used up audio");
223
Randall Spanglerf2a1dc02013-06-11 16:53:07 -0700224 /* Proceed to legacy after timeout if GBB flag set */
225 ResetMocks();
226 gbb.flags |= GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY;
227 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Timeout");
228 TEST_EQ(vbexlegacy_called, 1, " try legacy");
229
Randall Spangler7f436692013-02-05 12:42:36 -0800230 /* Up arrow is uninteresting / passed to VbCheckDisplayKey() */
231 ResetMocks();
232 mock_keypress[0] = VB_KEY_UP;
233 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Up arrow");
234
235 /* Shutdown requested in loop */
236 ResetMocks();
237 shutdown_request_calls_left = 2;
238 TEST_EQ(VbBootDeveloper(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
239 "Shutdown requested");
240 TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
241
242 /* Space goes straight to recovery if no virtual dev switch */
243 ResetMocks();
244 mock_keypress[0] = ' ';
245 TEST_EQ(VbBootDeveloper(&cparams, &lkp), VBERROR_LOAD_KERNEL_RECOVERY,
246 "Space = recovery");
247 VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u);
248 TEST_EQ(u, VBNV_RECOVERY_RW_DEV_SCREEN, " recovery reason");
249
250 /* Space asks to disable virtual dev switch */
251 ResetMocks();
252 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_DEV_SWITCH_ON;
253 mock_keypress[0] = ' ';
254 mock_keypress[1] = '\r';
255 TEST_EQ(VbBootDeveloper(&cparams, &lkp), VBERROR_TPM_REBOOT_REQUIRED,
256 "Space = tonorm");
257 TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
258 " warning screen");
259 TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
260 " tonorm screen");
261 TEST_EQ(screens_displayed[2], VB_SCREEN_TO_NORM_CONFIRMED,
262 " confirm screen");
263 VbNvGet(VbApiKernelGetVnc(), VBNV_DISABLE_DEV_REQUEST, &u);
264 TEST_EQ(u, 1, " disable dev request");
265
266 /* Space-space doesn't disable it */
267 ResetMocks();
268 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_DEV_SWITCH_ON;
269 mock_keypress[0] = ' ';
270 mock_keypress[1] = ' ';
271 mock_keypress[2] = 0x1b;
272 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Space-space");
273 TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
274 " warning screen");
275 TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
276 " tonorm screen");
277 TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING,
278 " warning screen");
279
280 /* Enter doesn't by default */
281 ResetMocks();
282 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_DEV_SWITCH_ON;
283 mock_keypress[0] = '\r';
284 mock_keypress[1] = '\r';
285 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Enter ignored");
286
287 /* Enter does if GBB flag set */
288 ResetMocks();
289 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_DEV_SWITCH_ON;
290 gbb.flags |= GBB_FLAG_ENTER_TRIGGERS_TONORM;
291 mock_keypress[0] = '\r';
292 mock_keypress[1] = '\r';
293 TEST_EQ(VbBootDeveloper(&cparams, &lkp), VBERROR_TPM_REBOOT_REQUIRED,
294 "Enter = tonorm");
295
296 /* Tonorm ignored if GBB forces dev switch on */
297 ResetMocks();
298 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_DEV_SWITCH_ON;
299 gbb.flags |= GBB_FLAG_FORCE_DEV_SWITCH_ON;
300 mock_keypress[0] = ' ';
301 mock_keypress[1] = '\r';
302 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Can't tonorm gbb-dev");
303
304 /* Shutdown requested at tonorm screen */
305 ResetMocks();
306 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_DEV_SWITCH_ON;
307 mock_keypress[0] = ' ';
308 shutdown_request_calls_left = 2;
309 TEST_EQ(VbBootDeveloper(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
310 "Shutdown requested at tonorm");
311 TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
312 " warning screen");
313 TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
314 " tonorm screen");
315
316 /* Ctrl+D dismisses warning */
317 ResetMocks();
318 mock_keypress[0] = 0x04;
319 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Ctrl+D");
320 VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u);
321 TEST_EQ(u, 0, " recovery reason");
322 TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
Randall Spanglerf2a1dc02013-06-11 16:53:07 -0700323 TEST_EQ(vbexlegacy_called, 0, " not legacy");
324
325 /* Ctrl+D doesn't boot legacy even if GBB flag is set */
326 ResetMocks();
327 mock_keypress[0] = 0x04;
328 gbb.flags |= GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY;
329 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Ctrl+D");
330 TEST_EQ(vbexlegacy_called, 0, " not legacy");
Randall Spangler7f436692013-02-05 12:42:36 -0800331
332 /* Ctrl+L tries legacy boot mode only if enabled */
333 ResetMocks();
334 mock_keypress[0] = 0x0c;
335 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Ctrl+L normal");
336 TEST_EQ(vbexlegacy_called, 0, " not legacy");
337
338 ResetMocks();
339
340 gbb.flags |= GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
341 mock_keypress[0] = 0x0c;
342 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Ctrl+L force legacy");
343 TEST_EQ(vbexlegacy_called, 1, " try legacy");
344
345 ResetMocks();
346 VbNvSet(VbApiKernelGetVnc(), VBNV_DEV_BOOT_LEGACY, 1);
347 mock_keypress[0] = 0x0c;
348 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Ctrl+L nv legacy");
349 TEST_EQ(vbexlegacy_called, 1, " try legacy");
350
351 /* Ctrl+U boots USB only if enabled */
352 ResetMocks();
353 mock_keypress[0] = 0x15;
354 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Ctrl+U normal");
355
356 /* Ctrl+U enabled, with good USB boot */
357 ResetMocks();
358 VbNvSet(VbApiKernelGetVnc(), VBNV_DEV_BOOT_USB, 1);
359 mock_keypress[0] = 0x15;
360 vbtlk_retval = VBERROR_SUCCESS - VB_DISK_FLAG_REMOVABLE;
361 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 0, "Ctrl+U USB");
362
363 /* Ctrl+U enabled via GBB */
364 ResetMocks();
365 gbb.flags |= GBB_FLAG_FORCE_DEV_BOOT_USB;
366 mock_keypress[0] = 0x15;
367 vbtlk_retval = VBERROR_SUCCESS - VB_DISK_FLAG_REMOVABLE;
368 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 0, "Ctrl+U force USB");
369
370 /* If no USB, eventually times out and tries fixed disk */
371 ResetMocks();
372 VbNvSet(VbApiKernelGetVnc(), VBNV_DEV_BOOT_USB, 1);
373 mock_keypress[0] = 0x15;
374 TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Ctrl+U enabled");
375 TEST_EQ(vbexlegacy_called, 0, " not legacy");
376 VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u);
377 TEST_EQ(u, 0, " recovery reason");
378 TEST_EQ(audio_looping_calls_left, 0, " used up audio");
379
380 printf("...done.\n");
381}
382
383static void VbBootRecTest(void)
384{
385 uint32_t u;
386
387 printf("Testing VbBootRecovery()...\n");
388
389 /* Shutdown requested in loop */
390 ResetMocks();
391 shutdown_request_calls_left = 10;
392 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
393 "Shutdown requested");
394 VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u);
395 TEST_EQ(u, 0, " recovery reason");
396 TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK,
397 " blank screen");
398 TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_NO_GOOD,
399 " no good screen");
400
401 /* Disk inserted after start */
402 ResetMocks();
403 vbtlk_retval = VBERROR_SUCCESS - VB_DISK_FLAG_REMOVABLE;
404 TEST_EQ(VbBootRecovery(&cparams, &lkp), 0, "Good");
405
406 /* No disk inserted */
407 ResetMocks();
408 vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
409 shutdown_request_calls_left = 10;
410 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
411 "Bad disk");
412 TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK,
413 " blank screen");
414 TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_INSERT,
415 " insert screen");
416
417 /* Remove disks */
418 ResetMocks();
419 shutdown_request_calls_left = 100;
420 mock_num_disks[0] = 1;
421 mock_num_disks[1] = 1;
422 vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
423 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
424 "Remove");
425 TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_REMOVE,
426 " remove screen");
427 TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_REMOVE,
428 " remove screen");
429 TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK,
430 " blank screen");
431 TEST_EQ(screens_displayed[3], VB_SCREEN_RECOVERY_INSERT,
432 " insert screen");
433
434 /* No removal if dev switch is on */
435 ResetMocks();
436 shutdown_request_calls_left = 100;
437 mock_num_disks[0] = 1;
438 mock_num_disks[1] = 1;
439 shared->flags |= VBSD_BOOT_DEV_SWITCH_ON;
440 vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
441 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
442 "No remove in dev");
443 TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
444 " insert screen");
445
446 /* No removal if recovery button physically pressed */
447 ResetMocks();
448 shutdown_request_calls_left = 100;
449 mock_num_disks[0] = 1;
450 mock_num_disks[1] = 1;
451 shared->flags |= VBSD_BOOT_REC_SWITCH_ON;
452 vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
453 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
454 "No remove in rec");
455 TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
456 " insert screen");
457
458 /* Bad disk count doesn't require removal */
459 ResetMocks();
460 mock_num_disks[0] = -1;
461 vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
462 shutdown_request_calls_left = 10;
463 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
464 "Bad disk count");
465 TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK,
466 " blank screen");
467 TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_INSERT,
468 " insert screen");
469
470 /* Ctrl+D ignored for many reasons... */
471 ResetMocks();
472 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_REC_SWITCH_ON;
473 shutdown_request_calls_left = 100;
474 mock_keypress[0] = 0x04;
475 trust_ec = 0;
476 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
477 "Ctrl+D ignored if EC not trusted");
478 TEST_EQ(virtdev_set, 0, " virtual dev mode off");
479 TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
480 " todev screen");
481
482 ResetMocks();
483 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_REC_SWITCH_ON |
484 VBSD_BOOT_DEV_SWITCH_ON;
485 trust_ec = 1;
486 shutdown_request_calls_left = 100;
487 mock_keypress[0] = 0x04;
488 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
489 "Ctrl+D ignored if already in dev mode");
490 TEST_EQ(virtdev_set, 0, " virtual dev mode off");
491 TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
492 " todev screen");
493
494 ResetMocks();
495 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH;
496 trust_ec = 1;
497 shutdown_request_calls_left = 100;
498 mock_keypress[0] = 0x04;
499 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
500 "Ctrl+D ignored if recovery not manually triggered");
501 TEST_EQ(virtdev_set, 0, " virtual dev mode off");
502 TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
503 " todev screen");
504
505 ResetMocks();
506 shared->flags = VBSD_BOOT_REC_SWITCH_ON;
507 trust_ec = 1;
508 shutdown_request_calls_left = 100;
509 mock_keypress[0] = 0x04;
510 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
511 "Ctrl+D ignored if no virtual dev switch");
512 TEST_EQ(virtdev_set, 0, " virtual dev mode off");
513 TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
514 " todev screen");
515
516 /* Ctrl+D then space means don't enable */
517 ResetMocks();
518 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_REC_SWITCH_ON;
519 shutdown_request_calls_left = 100;
520 vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
521 trust_ec = 1;
522 mock_keypress[0] = 0x04;
523 mock_keypress[1] = ' ';
524 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
525 "Ctrl+D todev abort");
526 TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
527 " insert screen");
528 TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
529 " todev screen");
530 TEST_EQ(screens_displayed[2], VB_SCREEN_RECOVERY_INSERT,
531 " insert screen");
532 TEST_EQ(virtdev_set, 0, " virtual dev mode off");
533
534 /* Ctrl+D then enter means enable */
535 ResetMocks();
536 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_REC_SWITCH_ON;
537 shutdown_request_calls_left = 100;
538 vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
539 trust_ec = 1;
540 mock_keypress[0] = 0x04;
541 mock_keypress[1] = '\r';
542 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_TPM_REBOOT_REQUIRED,
543 "Ctrl+D todev confirm");
544 TEST_EQ(virtdev_set, 1, " virtual dev mode on");
545
546 /* Handle TPM error in enabling dev mode */
547 ResetMocks();
548 shared->flags = VBSD_HONOR_VIRT_DEV_SWITCH | VBSD_BOOT_REC_SWITCH_ON;
549 shutdown_request_calls_left = 100;
550 vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
551 trust_ec = 1;
552 mock_keypress[0] = 0x04;
553 mock_keypress[1] = '\r';
554 virtdev_retval = VBERROR_SIMULATED;
555 TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_TPM_SET_BOOT_MODE_STATE,
556 "Ctrl+D todev failure");
557
558 printf("...done.\n");
559}
560
561
562int main(void)
563{
564 VbUserConfirmsTest();
565 VbBootTest();
566 VbBootDevTest();
567 VbBootRecTest();
568
569 return gTestSuccess ? 0 : 255;
570}