[PATCH for_v2? v2 09/14] selftests/x86/sgx: Use kselftest operators to check test results

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Use kselftest's operators, e.g. ASSERT_EQ, EXPECT_EQ, etc... to check
test results.  Implement a custom __EXPECT() macro instead of using the
framework defined in kselftest_harness.h.  The harness framework is
designed for tests that are short and sweet, e.g. true unit tests, and
don't work well with SGX's need for a large, run-once setup.  The
harness code will also be problematic when tests for the vDSO's callback
code are added in the future.

Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx>
---
 tools/testing/selftests/x86/sgx/main.c | 52 ++++++++++++++++++++------
 1 file changed, 40 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/x86/sgx/main.c b/tools/testing/selftests/x86/sgx/main.c
index 664a2ed98915..f1bd74913ec3 100644
--- a/tools/testing/selftests/x86/sgx/main.c
+++ b/tools/testing/selftests/x86/sgx/main.c
@@ -18,6 +18,7 @@
 #include <sys/auxv.h>
 
 #include "../../kselftest.h"
+#include "../../kselftest_operators.h"
 
 #include "defines.h"
 #include "../../../../../arch/x86/kernel/cpu/sgx/arch.h"
@@ -26,6 +27,41 @@
 
 #define PAGE_SIZE  4096
 
+#define EXPECT_FAILED(_assert, fmt, ...)			\
+do {								\
+	if (_assert)						\
+		ksft_exit_fail_msg(fmt, ##__VA_ARGS__);		\
+	else							\
+		ksft_test_result_fail(fmt, ##__VA_ARGS__);	\
+} while (0)
+
+#define __EXPECT(_expected, _expected_str, _seen, _seen_str, _t, _assert)     \
+do {									      \
+	/* Avoid multiple evaluation of the cases */			      \
+	__typeof__(_expected) __exp = (_expected);			      \
+	__typeof__(_seen) __seen = (_seen);				      \
+	if (passed && !(__exp _t __seen)) {				      \
+		unsigned long long __exp_print = (uintptr_t)__exp;	      \
+		unsigned long long __seen_print = (uintptr_t)__seen;	      \
+		EXPECT_FAILED(_assert,					      \
+			      "Expected '%s (%llu) %s %s (%llu)' at %s:%u\n", \
+			      _expected_str, __exp_print, #_t, _seen_str,     \
+			      __seen_print, __FILE__, __LINE__);	      \
+		passed = false;						      \
+	}								      \
+} while (0)
+
+#define RUN_TEST(test_name)						\
+({									\
+	passed = true;							\
+									\
+	test_name(&secs);						\
+	if (passed)							\
+		ksft_test_result_pass("%s: Passed\n", #test_name);	\
+})
+
+static bool passed = true;
+
 static const uint64_t MAGIC = 0x1122334455667788ULL;
 void *eenter;
 
@@ -339,11 +375,7 @@ static void test_sgx_basic(struct sgx_secs *secs)
 	uint64_t result = 0;
 
 	sgx_call_eenter((void *)&MAGIC, &result, (void *)secs->base);
-	if (result != MAGIC) {
-		ksft_test_result_error("0x%lx != 0x%lx\n", result, MAGIC);
-		return;
-	}
-	ksft_test_result_pass("%s: Passed\n", __func__);
+	EXPECT_EQ(result, MAGIC);
 }
 
 static void test_sgx_vdso(struct sgx_secs *secs)
@@ -355,11 +387,7 @@ static void test_sgx_vdso(struct sgx_secs *secs)
 
 	sgx_call_vdso((void *)&MAGIC, &result, NULL, NULL, NULL, NULL,
 		      (void *)secs->base, &exception, NULL);
-	if (result != MAGIC) {
-		ksft_test_result_error("0x%lx != 0x%lx\n", result, MAGIC);
-		return;
-	}
-	ksft_test_result_pass("%s: Passed\n", __func__);
+	EXPECT_EQ(result, MAGIC);
 }
 
 int main(int argc, char *argv[], char *envp[])
@@ -381,12 +409,12 @@ int main(int argc, char *argv[], char *envp[])
 	if (!encl_build(&secs, bin, bin_size, &sigstruct))
 		exit(1);
 
-	test_sgx_basic(&secs);
+	RUN_TEST(test_sgx_basic);
 
 	if (!setup_vdso())
 		exit(1);
 
-	test_sgx_vdso(&secs);
+	RUN_TEST(test_sgx_vdso);
 
 	return ksft_exit_pass();
 }
-- 
2.22.0




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux