Anastasia Klimchuk submitted this change.

View Change

Approvals: build bot (Jenkins): Verified Thomas Heijligen: Looks good to me, approved
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 <aklm@chromium.org>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/59741
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Thomas Heijligen <src@posteo.de>
---
M tests/lifecycle.c
M tests/tests.c
M tests/tests.h
3 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/tests/lifecycle.c b/tests/lifecycle.c
index 8cb604b..c439ff7 100644
--- a/tests/lifecycle.c
+++ b/tests/lifecycle.c
@@ -16,26 +16,64 @@
#include <include/test.h>
#include <string.h>

+#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 @@
#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 21cc1ed..0f16041 100644
--- a/tests/tests.c
+++ b/tests/tests.c
@@ -364,6 +364,7 @@

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 1218a30..5f05abf 100644
--- a/tests/tests.h
+++ b/tests/tests.h
@@ -42,6 +42,7 @@

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

To view, visit change 59741. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: flashrom
Gerrit-Branch: master
Gerrit-Change-Id: I9eb7fe3a436fbba5e70db957139fd26e00efec36
Gerrit-Change-Number: 59741
Gerrit-PatchSet: 6
Gerrit-Owner: Anastasia Klimchuk <aklm@chromium.org>
Gerrit-Reviewer: Anastasia Klimchuk <aklm@chromium.org>
Gerrit-Reviewer: Angel Pons <th3fanbus@gmail.com>
Gerrit-Reviewer: Edward O'Callaghan <quasisec@chromium.org>
Gerrit-Reviewer: Nico Huber <nico.h@gmx.de>
Gerrit-Reviewer: Thomas Heijligen <src@posteo.de>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-CC: Paul Menzel <paulepanter@mailbox.org>
Gerrit-MessageType: merged