diff options
Diffstat (limited to 'tests/lifecycle.c')
-rw-r--r-- | tests/lifecycle.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/tests/lifecycle.c b/tests/lifecycle.c new file mode 100644 index 000000000..95c424969 --- /dev/null +++ b/tests/lifecycle.c @@ -0,0 +1,98 @@ +/* + * This file is part of the flashrom project. + * + * Copyright 2021 Google LLC + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "lifecycle.h" + +static void probe_chip(const struct programmer_entry *prog, + struct flashrom_programmer *flashprog, + const char *const chip_name) +{ + struct flashrom_flashctx *flashctx; + + printf("Testing flashrom_flash_probe for programmer=%s, chip=%s ... \n", prog->name, chip_name); + assert_int_equal(0, flashrom_flash_probe(&flashctx, flashprog, chip_name)); + printf("... flashrom_flash_probe for programmer=%s successful\n", prog->name); + + flashrom_flash_release(flashctx); /* cleanup */ +} + +static void run_lifecycle(void **state, const struct io_mock *io, const struct programmer_entry *prog, + const char *param, const char *const chip_name, + void (*action)(const struct programmer_entry *prog, + struct flashrom_programmer *flashprog, + const char *const chip_name)) +{ + (void) state; /* unused */ + + io_mock_register(io); + + struct flashrom_programmer *flashprog; + + printf("Testing flashrom_programmer_init for programmer=%s ...\n", prog->name); + assert_int_equal(0, flashrom_programmer_init(&flashprog, prog->name, param)); + printf("... flashrom_programmer_init for programmer=%s successful\n", prog->name); + + if (action) + action(prog, flashprog, chip_name); + + printf("Testing flashrom_programmer_shutdown for programmer=%s ...\n", prog->name); + assert_int_equal(0, flashrom_programmer_shutdown(flashprog)); + printf("... flashrom_programmer_shutdown for programmer=%s successful\n", prog->name); + + io_mock_register(NULL); +} + +void run_basic_lifecycle(void **state, const struct io_mock *io, + const struct programmer_entry *prog, const char *param) +{ + /* Basic lifecycle only does init and shutdown, + * so neither chip name nor action is needed. */ + run_lifecycle(state, io, prog, param, NULL /* chip_name */, NULL /* action */); +} + +void run_probe_lifecycle(void **state, const struct io_mock *io, + const struct programmer_entry *prog, const char *param, const char *const chip_name) +{ + /* Each probe lifecycle should run independently, without cache. */ + clear_spi_id_cache(); + run_lifecycle(state, io, prog, param, chip_name, &probe_chip); +} + +void run_init_error_path(void **state, const struct io_mock *io, const struct programmer_entry *prog, + const char *param, const int error_code) +{ + (void) state; /* unused */ + + io_mock_register(io); + + struct flashrom_programmer *flashprog; + + printf("Testing init error path for programmer=%s with params: %s ...\n", prog->name, param); + assert_int_equal(error_code, flashrom_programmer_init(&flashprog, prog->name, param)); + printf("... init failed with error code %i as expected\n", error_code); + + /* + * `flashrom_programmer_shutdown` runs only registered shutdown functions, which means + * if nothing has been registered then nothing runs. + * Since this is testing error path on initialisation and error can happen at different + * phases of init, we don't know whether shutdown function has already been registered + * or not yet. Running `flashrom_programmer_shutdown` covers both situations. + */ + printf("Running programmer shutdown in case anything got registered...\n"); + assert_int_equal(0, flashrom_programmer_shutdown(flashprog)); + printf("... completed\n"); + + io_mock_register(NULL); +} |