| /* |
| * 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); |
| } |