[PATCH 3/6] fwts: Allow tests to be conditional on available features
Jeremy Kerr
jk at ozlabs.org
Wed May 13 03:30:54 UTC 2015
Add a .fw_features member to struct fwts_framework_test, and update the
registration macros to allow tests to only be run if specified features
are present.
Signed-off-by: Jeremy Kerr <jk at ozlabs.org>
Acked-by: Colin Ian King <colin.king at canonical.com>
Acked-by: Alex Hung <alex.hung at canonical.com>
---
src/lib/include/fwts_framework.h | 28 ++++++++++++++++------------
src/lib/src/fwts_framework.c | 14 +++++++++++++-
2 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/src/lib/include/fwts_framework.h b/src/lib/include/fwts_framework.h
index fdd2b05..40554a6 100644
--- a/src/lib/include/fwts_framework.h
+++ b/src/lib/include/fwts_framework.h
@@ -176,12 +176,14 @@ typedef struct fwts_framework_test {
fwts_framework_ops *ops;
fwts_priority priority;
fwts_framework_flags flags;
+ int fw_features;
fwts_results results; /* Per test results */
bool was_run;
+
} fwts_framework_test;
int fwts_framework_args(const int argc, char **argv);
-void fwts_framework_test_add(const char *name, fwts_framework_ops *ops, const fwts_priority priority, const fwts_framework_flags flags);
+void fwts_framework_test_add(const char *name, fwts_framework_ops *ops, const fwts_priority priority, const fwts_framework_flags flags, int fw_features);
int fwts_framework_compare_test_name(void *, void *);
void fwts_framework_show_version(FILE *fp, const char *name);
@@ -256,16 +258,18 @@ static inline int fwts_tests_passed(const fwts_framework *fw)
#define FWTS_ASSERT(e, m) \
enum { FWTS_CONCAT_EXPAND(FWTS_ASSERT_ ## m ## _in_line_, __LINE__) = 1 / !!(e) }
-#define FWTS_REGISTER(name, ops, priority, flags) \
-/* Ensure name is not too long */ \
-FWTS_ASSERT(FWTS_ARRAY_LEN(name) < 16, \
- fwts_register_name_too_long); \
- \
-static void __test_init (void) __attribute__ ((constructor)); \
- \
-static void __test_init (void) \
-{ \
- fwts_framework_test_add(name, ops, priority, flags); \
+#define FWTS_REGISTER_FEATURES(name, ops, priority, flags, features) \
+/* Ensure name is not too long */ \
+FWTS_ASSERT(FWTS_ARRAY_LEN(name) < 16, \
+ fwts_register_name_too_long); \
+ \
+static void __test_init (void) __attribute__ ((constructor)); \
+ \
+static void __test_init (void) \
+{ \
+ fwts_framework_test_add(name, ops, priority, flags, features); \
}
-
+
+#define FWTS_REGISTER(name, ops, priority, flags) \
+ FWTS_REGISTER_FEATURES(name, ops, priority, flags, 0)
#endif
diff --git a/src/lib/src/fwts_framework.c b/src/lib/src/fwts_framework.c
index d9896b4..83e626d 100644
--- a/src/lib/src/fwts_framework.c
+++ b/src/lib/src/fwts_framework.c
@@ -138,7 +138,8 @@ void fwts_framework_test_add(
const char *name,
fwts_framework_ops *ops,
const fwts_priority priority,
- const fwts_framework_flags flags)
+ const fwts_framework_flags flags,
+ int fw_features)
{
fwts_framework_test *new_test;
@@ -164,6 +165,7 @@ void fwts_framework_test_add(
new_test->ops = ops;
new_test->priority = priority;
new_test->flags = flags;
+ new_test->fw_features = fw_features;
/* Add test, sorted on run order priority */
fwts_list_add_ordered(&fwts_framework_test_list, new_test, fwts_framework_compare_priority);
@@ -565,6 +567,16 @@ static int fwts_framework_run_test(fwts_framework *fw, fwts_framework_test *test
fwts_framework_minor_test_progress(fw, 0, "");
+ if (!fwts_firmware_has_features(test->fw_features)) {
+ int missing = test->fw_features & ~fwts_firmware_features();
+ fwts_log_info(fw, "Test skipped, missing features 0x%08x",
+ missing);
+ fw->current_major_test->results.skipped +=
+ test->ops->total_tests;
+ fw->total.skipped += test->ops->total_tests;
+ goto done;
+ }
+
if ((test->flags & FWTS_FLAG_ROOT_PRIV) &&
(fwts_check_root_euid(fw, true) != FWTS_OK)) {
fwts_log_error(fw, "Aborted test, insufficient privilege.");
More information about the fwts-devel
mailing list