[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