We don't yet have any boards upstream that make use of the progress
notifier, but at least have some tests, so we know it's working.

Signed-off-by: Ahmad Fatoum <[email protected]>
---
 lib/Kconfig                   |  2 +-
 test/kconfig/base.cfg         |  1 +
 test/kconfig/full.cfg         |  1 +
 test/self/Kconfig             |  4 ++
 test/self/Makefile            |  1 +
 test/self/progress-notifier.c | 79 +++++++++++++++++++++++++++++++++++
 6 files changed, 87 insertions(+), 1 deletion(-)
 create mode 100644 test/self/progress-notifier.c

diff --git a/lib/Kconfig b/lib/Kconfig
index 922710e106b3..ea6de76a22f9 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -155,7 +155,7 @@ source "lib/logo/Kconfig"
 source "lib/bootstrap/Kconfig"
 
 config PROGRESS_NOTIFIER
-       bool
+       bool "Progress Notifier" if COMPILE_TEST
        help
          This is selected by boards that register a notifier to visualize
          progress, like blinking a LED during an update.
diff --git a/test/kconfig/base.cfg b/test/kconfig/base.cfg
index 6a9f68349816..80b9c68f023b 100644
--- a/test/kconfig/base.cfg
+++ b/test/kconfig/base.cfg
@@ -1,3 +1,4 @@
+CONFIG_COMPILE_TEST=y
 CONFIG_TEST=y
 CONFIG_SELFTEST=y
 CONFIG_CMD_SELFTEST=y
diff --git a/test/kconfig/full.cfg b/test/kconfig/full.cfg
index 39275768ea1f..547100bacc39 100644
--- a/test/kconfig/full.cfg
+++ b/test/kconfig/full.cfg
@@ -1,2 +1,3 @@
 CONFIG_BTHREAD=y
 CONFIG_CMD_BTHREAD=y
+CONFIG_PROGRESS_NOTIFIER=y
diff --git a/test/self/Kconfig b/test/self/Kconfig
index 73dc6c7b4f03..dfaa32dda009 100644
--- a/test/self/Kconfig
+++ b/test/self/Kconfig
@@ -28,6 +28,7 @@ config SELFTEST_AUTORUN
 config SELFTEST_ENABLE_ALL
        bool "Enable all self-tests"
        select SELFTEST_PRINTF
+       select SELFTEST_PROGRESS_NOTIFIER
        help
          Selects all self-tests compatible with current configuration
 
@@ -36,4 +37,7 @@ config SELFTEST_PRINTF
        help
          Tests barebox vsnprintf() functionality
 
+config SELFTEST_PROGRESS_NOTIFIER
+       bool "progress notifier selftest"
+
 endif
diff --git a/test/self/Makefile b/test/self/Makefile
index b4aa49d6f817..e78ccc3cfb90 100644
--- a/test/self/Makefile
+++ b/test/self/Makefile
@@ -2,3 +2,4 @@
 
 obj-$(CONFIG_SELFTEST) += core.o
 obj-$(CONFIG_SELFTEST_PRINTF) += printf.o
+obj-$(CONFIG_SELFTEST_PROGRESS_NOTIFIER) += progress-notifier.o
diff --git a/test/self/progress-notifier.c b/test/self/progress-notifier.c
new file mode 100644
index 000000000000..af65b0900e42
--- /dev/null
+++ b/test/self/progress-notifier.c
@@ -0,0 +1,79 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <common.h>
+#include <bselftest.h>
+#include <progress.h>
+
+BSELFTEST_GLOBALS();
+
+static void __ok(bool cond, const char *func, int line)
+{
+       total_tests++;
+       if (!cond) {
+               failed_tests++;
+               printf("%s:%d: assertion failure\n", func, line);
+       }
+}
+
+#define ok(cond) \
+       __ok(cond, __func__, __LINE__)
+
+static unsigned long stage;
+static const void *prefix;
+static int counter;
+
+static int dummy_notifier(struct notifier_block *r, unsigned long _stage, void 
*_prefix)
+{
+       prefix = _prefix;
+       stage = _stage;
+       counter++;
+       return 0;
+}
+
+static struct notifier_block dummy_nb =  {
+       .notifier_call = dummy_notifier
+};
+
+static void test_dummy_notifier(void)
+{
+       const char *arg = "ARGUMENT";
+       int local_counter = 0;
+
+       stage = 0;
+       prefix = NULL;
+       counter = 0;
+
+       progress_register_client(&dummy_nb);
+       ok(stage == 0);
+       ok(prefix == NULL);
+       ok(counter == local_counter);
+       progress_notifier_call_chain(1, arg);
+
+       if (IS_ENABLED(CONFIG_PROGRESS_NOTIFIER)) {
+               ok(stage == 1);
+               ok(prefix == arg);
+               ok(counter == ++local_counter);
+               progress_notifier_call_chain(0, NULL);
+               local_counter++;
+       } else {
+               total_tests += 2;
+               skipped_tests += 2;
+       }
+
+       ok(stage == 0);
+       ok(prefix == NULL || *(const char *)prefix == '\0');
+       ok(counter == local_counter);
+       progress_unregister_client(&dummy_nb);
+
+       ok(stage == 0);
+       ok(prefix == NULL || *(const char *)prefix == '\0');
+       ok(counter == local_counter);
+}
+
+static void test_notifier(void)
+{
+       test_dummy_notifier();
+}
+bselftest(core, test_notifier);
-- 
2.32.0.rc0


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to