aboutsummaryrefslogtreecommitdiffstats
path: root/emulator/opengl/shared/emugl/common/shared_library_unittest.cpp
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2014-07-08 21:45:47 +0200
committerDavid 'Digit' Turner <digit@google.com>2014-07-09 18:12:08 +0200
commit242a075e3256fc7f369f0e5f93fd2ae91c255774 (patch)
tree93d82dee2d537a506bd5b204df65495fbc21d663 /emulator/opengl/shared/emugl/common/shared_library_unittest.cpp
parentd1dd8ee1e85f60569ddf6ebc7fe1cbde7ebb6f38 (diff)
downloadsdk-242a075e3256fc7f369f0e5f93fd2ae91c255774.zip
sdk-242a075e3256fc7f369f0e5f93fd2ae91c255774.tar.gz
sdk-242a075e3256fc7f369f0e5f93fd2ae91c255774.tar.bz2
emulator/opengl: refactor shared library handling.
+ Add a unit test. Change-Id: I27c993d1dc819e5bd89fc1e9ae266e11e6ef9a76
Diffstat (limited to 'emulator/opengl/shared/emugl/common/shared_library_unittest.cpp')
-rw-r--r--emulator/opengl/shared/emugl/common/shared_library_unittest.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/emulator/opengl/shared/emugl/common/shared_library_unittest.cpp b/emulator/opengl/shared/emugl/common/shared_library_unittest.cpp
new file mode 100644
index 0000000..cec4c73
--- /dev/null
+++ b/emulator/opengl/shared/emugl/common/shared_library_unittest.cpp
@@ -0,0 +1,141 @@
+// 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 "emugl/common/shared_library.h"
+
+#include <gtest/gtest.h>
+
+#include <string>
+
+#include <limits.h>
+#include <string.h>
+
+// Hack to get the current executable's full path.
+namespace testing {
+namespace internal {
+
+extern std::string g_executable_path;
+
+} // namespace internal
+} // namespace testing
+
+namespace emugl {
+
+namespace {
+
+// Return the name/path of the test shared library to load.
+// Note that this doesn't include a platform-specific extension.
+// This assumes that the test shared library is under the lib/ sub-directory
+// of the current executable's path!
+std::string GetTestLibraryName() {
+ static const char kSubDir[] = "lib/";
+#ifdef __x86_64__
+ static const char kLibraryPrefix[] = "lib64";
+#else
+ static const char kLibraryPrefix[] = "lib";
+#endif
+ static const char kTestLibrarySuffix[] = "emugl_test_shared_library";
+
+ const char* exec_path = testing::internal::g_executable_path.c_str();
+
+#ifdef _WIN32
+ const char* p = strrchr(exec_path, '/');
+ const char* p2 = strrchr(exec_path, '\\');
+ if (p2) {
+ if (!p || p2 > p) {
+ p = p2;
+ }
+ }
+#else
+ const char* p = strrchr(exec_path, '/');
+#endif
+
+ std::string path;
+
+ if (!p) {
+ path = "./";
+ } else {
+ path = std::string(exec_path, p - exec_path + 1U);
+ }
+ path += kSubDir;
+ path += kLibraryPrefix;
+ path += kTestLibrarySuffix;
+ printf("Library path: %s\n", path.c_str());
+ return path;
+}
+
+class SharedLibraryTest : public testing::Test {
+public:
+ SharedLibraryTest() {
+ // Locate the shared library
+ mLibraryPath = GetTestLibraryName();
+ }
+
+ ~SharedLibraryTest() {}
+
+ const char* library_path() const { return mLibraryPath.c_str(); }
+
+private:
+ std::string mLibraryPath;
+};
+
+class ScopedSharedLibrary {
+public:
+ explicit ScopedSharedLibrary(SharedLibrary* lib) : mLib(lib) {}
+ ~ScopedSharedLibrary() {
+ delete mLib;
+ }
+ SharedLibrary* get() const { return mLib; }
+
+ SharedLibrary* operator->() { return mLib; }
+
+private:
+ SharedLibrary* mLib;
+};
+
+} // namespace
+
+TEST_F(SharedLibraryTest, Open) {
+ ScopedSharedLibrary lib(SharedLibrary::open(library_path()));
+ EXPECT_TRUE(lib.get());
+}
+
+TEST_F(SharedLibraryTest, OpenWithExtension) {
+ std::string path = library_path();
+#ifdef _WIN32
+ path += ".dll";
+#elif defined(__APPLE__)
+ path += ".dylib";
+#else
+ path += ".so";
+#endif
+ ScopedSharedLibrary lib(SharedLibrary::open(path.c_str()));
+ EXPECT_TRUE(lib.get());
+}
+
+TEST_F(SharedLibraryTest, FindSymbol) {
+ ScopedSharedLibrary lib(SharedLibrary::open(library_path()));
+ EXPECT_TRUE(lib.get());
+
+ if (lib.get()) {
+ typedef int (*FooFunction)(void);
+
+ FooFunction foo_func = reinterpret_cast<FooFunction>(
+ lib->findSymbol("foo_function"));
+ EXPECT_TRUE(foo_func);
+ EXPECT_EQ(42, (*foo_func)());
+ }
+}
+
+} // namespace emugl