DO NOT MERGE - Merge pi-dev@5234907 into stage-aosp-master

Bug: 120848293
Change-Id: I7e2c069a43748c95be376e784ee152f3f4a88c5f
diff --git a/Android.bp b/Android.bp
index 38220e3..8d06c40 100644
--- a/Android.bp
+++ b/Android.bp
@@ -25,7 +25,10 @@
         },
     },
 
-    srcs: ["linux/seccomp_bpf.c"],
+    srcs: [
+       "linux/seccomp_bpf.c",
+       "seccomp_bpf_tests.c",
+    ],
 
     cflags: [
         "-Wall",
@@ -36,6 +39,7 @@
         "-Wno-incompatible-pointer-types-discards-qualifiers",
         "-Wno-sign-compare",
         "-Wno-empty-body",
+        "-Wno-unused-function",
         // TODO(rsesek): Remove after syncing in upstream.
         "-D__ARCH_WANT_SYSCALL_DEPRECATED",
     ],
diff --git a/seccomp_bpf_tests.c b/seccomp_bpf_tests.c
new file mode 100644
index 0000000..523084f
--- /dev/null
+++ b/seccomp_bpf_tests.c
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "seccomp_bpf_tests.h"
+
+#include <android/log.h>
+#include <string.h>
+
+static const char TAG[] = "SeccompBpfTest-Native";
+
+/* Forward declare from seccomp_bpf_tests.c. */
+struct __test_metadata {
+	const char *name;
+	void (*fn)(struct __test_metadata *);
+	int termsig;
+	int passed;
+	int trigger; /* extra handler after the evaluation */
+	struct __test_metadata *prev, *next;
+};
+extern struct __test_metadata* get_seccomp_test_list();
+extern void __run_test(struct __test_metadata*);
+
+int run_seccomp_test(const char* name) {
+    for (struct __test_metadata* t = get_seccomp_test_list(); t; t = t->next) {
+        if (strcmp(t->name, name) == 0) {
+            __android_log_print(ANDROID_LOG_INFO, TAG, "Start: %s", t->name);
+            __run_test(t);
+            __android_log_print(ANDROID_LOG_INFO, TAG, "%s: %s",
+                t->passed ? "PASS" : "FAIL", t->name);
+            return t->passed;
+        }
+    }
+    return 0;
+}
diff --git a/seccomp_bpf_tests.h b/seccomp_bpf_tests.h
index a46be51..1de226e 100644
--- a/seccomp_bpf_tests.h
+++ b/seccomp_bpf_tests.h
@@ -20,9 +20,16 @@
  * for use by CTS.
  */
 
-#include "linux/test_harness.h"
-
-// Forward declare from seccomp_bpf_tests.c.
+#ifdef __cplusplus
 extern "C" {
-struct __test_metadata* get_seccomp_test_list();
+#endif
+
+/**
+ * Runs a Seccomp kernel test named |name|. Returns 1 if the test passed
+ * and 0 if the test failed.
+ */
+int run_seccomp_test(const char* name);
+
+#ifdef __cplusplus
 }
+#endif