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