Loading libnativebridge/native_bridge.cc +13 −4 Original line number Diff line number Diff line Loading @@ -205,6 +205,10 @@ static const char* kRuntimeISA = "unknown"; bool NeedsNativeBridge(const char* instruction_set) { if (instruction_set == nullptr) { ALOGE("Null instruction set in NeedsNativeBridge."); return false; } return strncmp(instruction_set, kRuntimeISA, strlen(kRuntimeISA) + 1) != 0; } Loading Loading @@ -240,11 +244,16 @@ void PreInitializeNativeBridge(const char* app_data_dir_in, const char* instruct // mount command will fail, so we safe the extra file existence check... char cpuinfo_path[1024]; snprintf(cpuinfo_path, 1024, "/system/lib" #ifdef HAVE_ANDROID_OS snprintf(cpuinfo_path, sizeof(cpuinfo_path), "/system/lib" #ifdef __LP64__ "64" #endif #endif // __LP64__ "/%s/cpuinfo", instruction_set); #else // !HAVE_ANDROID_OS // To be able to test on the host, we hardwire a relative path. snprintf(cpuinfo_path, sizeof(cpuinfo_path), "./cpuinfo"); #endif // Bind-mount. if (TEMP_FAILURE_RETRY(mount(cpuinfo_path, // Source. Loading @@ -252,7 +261,7 @@ void PreInitializeNativeBridge(const char* app_data_dir_in, const char* instruct nullptr, // FS type. MS_BIND, // Mount flags: bind mount. nullptr)) == -1) { // "Data." ALOGW("Failed to bind-mount %s as /proc/cpuinfo: %d", cpuinfo_path, errno); ALOGW("Failed to bind-mount %s as /proc/cpuinfo: %s", cpuinfo_path, strerror(errno)); } #else UNUSED(instruction_set); Loading libnativebridge/tests/Android.mk +2 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,8 @@ include $(CLEAR_VARS) # Build the unit tests. test_src_files := \ InvalidCharsNativeBridge_test.cpp \ NeedsNativeBridge_test.cpp \ PreInitializeNativeBridge_test.cpp \ ReSetupNativeBridge_test.cpp \ UnavailableNativeBridge_test.cpp \ ValidNameNativeBridge_test.cpp Loading libnativebridge/tests/NeedsNativeBridge_test.cpp 0 → 100644 +48 −0 Original line number Diff line number Diff line /* * Copyright (C) 2014 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 "NativeBridgeTest.h" namespace android { static const char* kISAs[] = { "arm", "arm64", "mips", "x86", "x86_64", "random", "64arm", "64_x86", "64_x86_64", "", "reallylongstringabcd", nullptr }; #if defined(__arm__) static const char* kRuntimeISA = "arm"; #elif defined(__aarch64__) static const char* kRuntimeISA = "arm64"; #elif defined(__mips__) static const char* kRuntimeISA = "mips"; #elif defined(__i386__) static const char* kRuntimeISA = "x86"; #elif defined(__x86_64__) static const char* kRuntimeISA = "x86_64"; #else static const char* kRuntimeISA = "unknown"; #endif TEST_F(NativeBridgeTest, NeedsNativeBridge) { EXPECT_EQ(false, NeedsNativeBridge(kRuntimeISA)); const size_t kISACount = sizeof(kISAs)/sizeof(kISAs[0]); for (size_t i = 0; i < kISACount; i++) { EXPECT_EQ(kISAs[i] == nullptr ? false : strcmp(kISAs[i], kRuntimeISA) != 0, NeedsNativeBridge(kISAs[i])); } } } // namespace android libnativebridge/tests/PreInitializeNativeBridge_test.cpp 0 → 100644 +66 −0 Original line number Diff line number Diff line /* * Copyright (C) 2014 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 "NativeBridgeTest.h" #include <cstdio> #include <cstring> #include <cutils/log.h> #include <dlfcn.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <sys/mount.h> #include <sys/stat.h> namespace android { static constexpr const char* kTestData = "PreInitializeNativeBridge test."; TEST_F(NativeBridgeTest, PreInitializeNativeBridge) { #ifndef __APPLE_ // Mac OS does not support bind-mount. #ifndef HAVE_ANDROID_OS // Cannot write into the hard-wired location. // Try to create our mount namespace. if (unshare(CLONE_NEWNS) != -1) { // Create a dummy file. FILE* cpuinfo = fopen("./cpuinfo", "w"); ASSERT_NE(nullptr, cpuinfo) << strerror(errno); fprintf(cpuinfo, kTestData); fclose(cpuinfo); // Call the setup. PreInitializeNativeBridge("does not matter 1", "short 2"); // Read /proc/cpuinfo FILE* proc_cpuinfo = fopen("/proc/cpuinfo", "r"); ASSERT_NE(nullptr, proc_cpuinfo) << strerror(errno); char buf[1024]; EXPECT_NE(nullptr, fgets(buf, sizeof(buf), proc_cpuinfo)) << "Error reading."; fclose(proc_cpuinfo); EXPECT_EQ(0, strcmp(buf, kTestData)); // Delete the file. ASSERT_EQ(0, unlink("./cpuinfo")) << "Error unlinking temporary file."; // Ending the test will tear down the mount namespace. } else { GTEST_LOG_(WARNING) << "Could not create mount namespace. Are you running this as root?"; } #endif #endif } } // namespace android Loading
libnativebridge/native_bridge.cc +13 −4 Original line number Diff line number Diff line Loading @@ -205,6 +205,10 @@ static const char* kRuntimeISA = "unknown"; bool NeedsNativeBridge(const char* instruction_set) { if (instruction_set == nullptr) { ALOGE("Null instruction set in NeedsNativeBridge."); return false; } return strncmp(instruction_set, kRuntimeISA, strlen(kRuntimeISA) + 1) != 0; } Loading Loading @@ -240,11 +244,16 @@ void PreInitializeNativeBridge(const char* app_data_dir_in, const char* instruct // mount command will fail, so we safe the extra file existence check... char cpuinfo_path[1024]; snprintf(cpuinfo_path, 1024, "/system/lib" #ifdef HAVE_ANDROID_OS snprintf(cpuinfo_path, sizeof(cpuinfo_path), "/system/lib" #ifdef __LP64__ "64" #endif #endif // __LP64__ "/%s/cpuinfo", instruction_set); #else // !HAVE_ANDROID_OS // To be able to test on the host, we hardwire a relative path. snprintf(cpuinfo_path, sizeof(cpuinfo_path), "./cpuinfo"); #endif // Bind-mount. if (TEMP_FAILURE_RETRY(mount(cpuinfo_path, // Source. Loading @@ -252,7 +261,7 @@ void PreInitializeNativeBridge(const char* app_data_dir_in, const char* instruct nullptr, // FS type. MS_BIND, // Mount flags: bind mount. nullptr)) == -1) { // "Data." ALOGW("Failed to bind-mount %s as /proc/cpuinfo: %d", cpuinfo_path, errno); ALOGW("Failed to bind-mount %s as /proc/cpuinfo: %s", cpuinfo_path, strerror(errno)); } #else UNUSED(instruction_set); Loading
libnativebridge/tests/Android.mk +2 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,8 @@ include $(CLEAR_VARS) # Build the unit tests. test_src_files := \ InvalidCharsNativeBridge_test.cpp \ NeedsNativeBridge_test.cpp \ PreInitializeNativeBridge_test.cpp \ ReSetupNativeBridge_test.cpp \ UnavailableNativeBridge_test.cpp \ ValidNameNativeBridge_test.cpp Loading
libnativebridge/tests/NeedsNativeBridge_test.cpp 0 → 100644 +48 −0 Original line number Diff line number Diff line /* * Copyright (C) 2014 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 "NativeBridgeTest.h" namespace android { static const char* kISAs[] = { "arm", "arm64", "mips", "x86", "x86_64", "random", "64arm", "64_x86", "64_x86_64", "", "reallylongstringabcd", nullptr }; #if defined(__arm__) static const char* kRuntimeISA = "arm"; #elif defined(__aarch64__) static const char* kRuntimeISA = "arm64"; #elif defined(__mips__) static const char* kRuntimeISA = "mips"; #elif defined(__i386__) static const char* kRuntimeISA = "x86"; #elif defined(__x86_64__) static const char* kRuntimeISA = "x86_64"; #else static const char* kRuntimeISA = "unknown"; #endif TEST_F(NativeBridgeTest, NeedsNativeBridge) { EXPECT_EQ(false, NeedsNativeBridge(kRuntimeISA)); const size_t kISACount = sizeof(kISAs)/sizeof(kISAs[0]); for (size_t i = 0; i < kISACount; i++) { EXPECT_EQ(kISAs[i] == nullptr ? false : strcmp(kISAs[i], kRuntimeISA) != 0, NeedsNativeBridge(kISAs[i])); } } } // namespace android
libnativebridge/tests/PreInitializeNativeBridge_test.cpp 0 → 100644 +66 −0 Original line number Diff line number Diff line /* * Copyright (C) 2014 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 "NativeBridgeTest.h" #include <cstdio> #include <cstring> #include <cutils/log.h> #include <dlfcn.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <sys/mount.h> #include <sys/stat.h> namespace android { static constexpr const char* kTestData = "PreInitializeNativeBridge test."; TEST_F(NativeBridgeTest, PreInitializeNativeBridge) { #ifndef __APPLE_ // Mac OS does not support bind-mount. #ifndef HAVE_ANDROID_OS // Cannot write into the hard-wired location. // Try to create our mount namespace. if (unshare(CLONE_NEWNS) != -1) { // Create a dummy file. FILE* cpuinfo = fopen("./cpuinfo", "w"); ASSERT_NE(nullptr, cpuinfo) << strerror(errno); fprintf(cpuinfo, kTestData); fclose(cpuinfo); // Call the setup. PreInitializeNativeBridge("does not matter 1", "short 2"); // Read /proc/cpuinfo FILE* proc_cpuinfo = fopen("/proc/cpuinfo", "r"); ASSERT_NE(nullptr, proc_cpuinfo) << strerror(errno); char buf[1024]; EXPECT_NE(nullptr, fgets(buf, sizeof(buf), proc_cpuinfo)) << "Error reading."; fclose(proc_cpuinfo); EXPECT_EQ(0, strcmp(buf, kTestData)); // Delete the file. ASSERT_EQ(0, unlink("./cpuinfo")) << "Error unlinking temporary file."; // Ending the test will tear down the mount namespace. } else { GTEST_LOG_(WARNING) << "Could not create mount namespace. Are you running this as root?"; } #endif #endif } } // namespace android