From e539d112cd12ba5d3967b6956af1d91e5bf674a8 Mon Sep 17 00:00:00 2001 From: Anastasia Klimchuk Date: Mon, 29 Nov 2021 17:00:27 +1100 Subject: tests: Add run_probe_lifecycle and add dummyflasher probe test This patch implements run_probe_lifecycle and adds dummyflasher test to run probing lifecycle. A lifecycle consists of 3 steps: 1) init programmer 2) do some action 3) shutdown programmer. Step 2 can be "do nothing", and this is named "basic lifecycle", i.e. the simplest. This patch implements "probe lifecycle" which probes a chip as Step 2. Internally there is one run_lifecycle function which performs steps 1, 2, 3. run_lifecycle is operating via libflashrom API. Long term goal for cli_classic is to operate via libflashrom API, so the test aligns with this approach. BUG=b:181803212 TEST=ninja test Change-Id: I9eb7fe3a436fbba5e70db957139fd26e00efec36 Signed-off-by: Anastasia Klimchuk Reviewed-on: https://review.coreboot.org/c/flashrom/+/59741 Tested-by: build bot (Jenkins) Reviewed-by: Thomas Heijligen --- tests/lifecycle.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++------- tests/tests.c | 1 + tests/tests.h | 1 + 3 files changed, 56 insertions(+), 7 deletions(-) (limited to 'tests') diff --git a/tests/lifecycle.c b/tests/lifecycle.c index 8cb604be3..c439ff72d 100644 --- a/tests/lifecycle.c +++ b/tests/lifecycle.c @@ -16,26 +16,64 @@ #include #include +#include "libflashrom.h" #include "io_mock.h" #include "programmer.h" +#include "spi.h" -static void run_basic_lifecycle(void **state, const struct programmer_entry *prog, const char *param) +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 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 */ + struct flashrom_programmer *flashprog; char *param_dup = strdup(param); - printf("Testing programmer_init for programmer=%s ...\n", prog->name); - assert_int_equal(0, programmer_init(prog, param_dup)); - printf("... programmer_init for programmer=%s successful\n", prog->name); + printf("Testing flashrom_programmer_init for programmer=%s ...\n", prog->name); + assert_int_equal(0, flashrom_programmer_init(&flashprog, prog->name, param_dup)); + printf("... flashrom_programmer_init for programmer=%s successful\n", prog->name); - printf("Testing programmer_shutdown for programmer=%s ...\n", prog->name); - assert_int_equal(0, programmer_shutdown()); - printf("... programmer_shutdown 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); free(param_dup); } +static void run_basic_lifecycle(void **state, 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, prog, param, NULL /* chip_name */, NULL /* action */); +} + +static void run_probe_lifecycle(void **state, 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, prog, param, chip_name, &probe_chip); +} + void dummy_basic_lifecycle_test_success(void **state) { #if CONFIG_DUMMY == 1 @@ -45,6 +83,15 @@ void dummy_basic_lifecycle_test_success(void **state) #endif } +void dummy_probe_lifecycle_test_success(void **state) +{ +#if CONFIG_DUMMY == 1 + run_probe_lifecycle(state, &programmer_dummy, "bus=spi,emulate=W25Q128FV", "W25Q128.V"); +#else + skip(); +#endif +} + void nicrealtek_basic_lifecycle_test_success(void **state) { #if CONFIG_NICREALTEK == 1 diff --git a/tests/tests.c b/tests/tests.c index 21cc1ed8c..0f160417a 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -364,6 +364,7 @@ int main(void) const struct CMUnitTest lifecycle_tests[] = { cmocka_unit_test(dummy_basic_lifecycle_test_success), + cmocka_unit_test(dummy_probe_lifecycle_test_success), cmocka_unit_test(nicrealtek_basic_lifecycle_test_success), cmocka_unit_test(raiden_debug_basic_lifecycle_test_success), cmocka_unit_test(dediprog_basic_lifecycle_test_success), diff --git a/tests/tests.h b/tests/tests.h index 1218a30c0..5f05abfff 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -42,6 +42,7 @@ void probe_spi_st95_test_success(void **state); /* spi95.c */ /* lifecycle.c */ void dummy_basic_lifecycle_test_success(void **state); +void dummy_probe_lifecycle_test_success(void **state); void nicrealtek_basic_lifecycle_test_success(void **state); void raiden_debug_basic_lifecycle_test_success(void **state); void dediprog_basic_lifecycle_test_success(void **state); -- cgit v1.2.3