Test for hidden api enforcement killswitch
Currently, simply verifies that we can access VMRuntime.THE_ONE, which
doesn't prove anything as there is no blacklisting enabled yet.
Refactor JNI parts of hidden API test into cts-signature-common to it can
be used in this test.
(cherry picked from commit d635f8936bb3baad00c4bf5658e3bc7f420a3421 in
master)
Bug: 64382372
Test: $ cts/tests/signature/runSignatureTests.sh
Change-Id: I8c566136dea2a6b5d41d81981d0f1ef88a0a1a5f
diff --git a/tests/signature/dex-checker/Android.mk b/tests/signature/dex-checker/Android.mk
new file mode 100644
index 0000000..8a86a36
--- /dev/null
+++ b/tests/signature/dex-checker/Android.mk
@@ -0,0 +1,25 @@
+# Copyright (C) 2018 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libcts_dexchecker
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := dex-checker.cpp
+LOCAL_CFLAGS := -Wall -Werror
+LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+LOCAL_SDK_VERSION := current
+LOCAL_NDK_STL_VARIANT := c++_static
+include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/signature/dex-checker/dex-checker.cpp b/tests/signature/dex-checker/dex-checker.cpp
new file mode 100644
index 0000000..dc6757e
--- /dev/null
+++ b/tests/signature/dex-checker/dex-checker.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 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 "jni.h"
+
+class ScopedUtfChars {
+ public:
+ ScopedUtfChars(JNIEnv* env, jstring s) : env_(env), string_(s) {
+ if (s == NULL) {
+ utf_chars_ = NULL;
+ } else {
+ utf_chars_ = env->GetStringUTFChars(s, NULL);
+ }
+ }
+
+ ~ScopedUtfChars() {
+ if (utf_chars_) {
+ env_->ReleaseStringUTFChars(string_, utf_chars_);
+ }
+ }
+
+ const char* c_str() const {
+ return utf_chars_;
+ }
+
+ private:
+ JNIEnv* env_;
+ jstring string_;
+ const char* utf_chars_;
+};
+
+extern "C" JNIEXPORT void JNICALL
+Java_android_signature_cts_DexMemberChecker_getField_1JNI(
+ JNIEnv* env, jclass, jclass klass, jstring name, jstring type) {
+ ScopedUtfChars utf_name(env, name);
+ ScopedUtfChars utf_type(env, type);
+ // Attempt to access the given instance field. It will succeed if it exists,
+ // and throw NoSuchFieldError if not.
+ env->GetFieldID(klass, utf_name.c_str(), utf_type.c_str());
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_android_signature_cts_DexMemberChecker_getStaticField_1JNI(
+ JNIEnv* env, jclass, jclass klass, jstring name, jstring type) {
+ ScopedUtfChars utf_name(env, name);
+ ScopedUtfChars utf_type(env, type);
+ // Attempt to access the given static field. It will succeed if it exists,
+ // and throw NoSuchFieldError if not.
+ env->GetStaticFieldID(klass, utf_name.c_str(), utf_type.c_str());
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_android_signature_cts_DexMemberChecker_getMethod_1JNI(
+ JNIEnv* env, jclass, jclass klass, jstring name, jstring signature) {
+ ScopedUtfChars utf_name(env, name);
+ ScopedUtfChars utf_signature(env, signature);
+ // Attempt to access the given instance method. It will succeed if it exists,
+ // and throw NoSuchMethodError if not.
+ env->GetMethodID(klass, utf_name.c_str(), utf_signature.c_str());
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_android_signature_cts_DexMemberChecker_getStaticMethod_1JNI(
+ JNIEnv* env, jclass, jclass klass, jstring name, jstring signature) {
+ ScopedUtfChars utf_name(env, name);
+ ScopedUtfChars utf_signature(env, signature);
+ // Attempt to access the given static method. It will succeed if it exists,
+ // and throw NoSuchMethodError if not.
+ env->GetStaticMethodID(klass, utf_name.c_str(), utf_signature.c_str());
+}