summaryrefslogtreecommitdiffstats
path: root/tests/lifecycle.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lifecycle.c')
-rw-r--r--tests/lifecycle.c98
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);
+}