diff options
author | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-05 22:18:09 +0000 |
---|---|---|
committer | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-05 22:18:09 +0000 |
commit | 108c2a1d2780d49121e16b18a29580ef4d28c790 (patch) | |
tree | eca587b489c7c22924814f4475c4a56ec5bc5b8e /base/native_library_mac.mm | |
parent | 9e241cc8a7320c0a818da0ddac1bc3910fc1b60a (diff) | |
download | chromium_src-108c2a1d2780d49121e16b18a29580ef4d28c790.zip chromium_src-108c2a1d2780d49121e16b18a29580ef4d28c790.tar.gz chromium_src-108c2a1d2780d49121e16b18a29580ef4d28c790.tar.bz2 |
Porting the browser tests to Unix.
The browser tests are an alternative to UI tests.
They provide a way to exercise the browser from within the test (without having the test and the browser running in different processes).
In order to ensure atexit hanlders are run after each tests and static initializers start fresh for each test, each test is run in a new process (on Linux and Mac). On Windows, a DLL containing the test is loaded/unloaded for each tests.
BUG=None
TEST=Run the browser tests.
Review URL: http://codereview.chromium.org/115896
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17781 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/native_library_mac.mm')
-rw-r--r-- | base/native_library_mac.mm | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/base/native_library_mac.mm b/base/native_library_mac.mm index f817a01..577f5ac 100644 --- a/base/native_library_mac.mm +++ b/base/native_library_mac.mm @@ -4,15 +4,28 @@ #include "base/native_library.h" +#include <dlfcn.h> #import <Carbon/Carbon.h> #include "base/file_path.h" +#include "base/file_util.h" #include "base/scoped_cftyperef.h" +#include "base/string_util.h" namespace base { // static NativeLibrary LoadNativeLibrary(const FilePath& library_path) { + if (library_path.Extension() == "dylib" || + !file_util::DirectoryExists(library_path)) { + void* dylib = dlopen(library_path.value().c_str(), RTLD_LAZY); + if (!dylib) + return NULL; + NativeLibrary native_lib = new NativeLibraryStruct(); + native_lib->type = DYNAMIC_LIB; + native_lib->dylib = dylib; + return native_lib; + } scoped_cftyperef<CFURLRef> url(CFURLCreateFromFileSystemRepresentation( kCFAllocatorDefault, (const UInt8*)library_path.value().c_str(), @@ -20,19 +33,39 @@ NativeLibrary LoadNativeLibrary(const FilePath& library_path) { true)); if (!url) return NULL; + CFBundleRef bundle = CFBundleCreate(kCFAllocatorDefault, url.get()); + if (!bundle) + return NULL; - return CFBundleCreate(kCFAllocatorDefault, url.get()); + NativeLibrary native_lib = new NativeLibraryStruct(); + native_lib->type = BUNDLE; + native_lib->bundle = bundle; + return native_lib; } // static void UnloadNativeLibrary(NativeLibrary library) { - CFRelease(library); + if (library->type == BUNDLE) + CFRelease(library->bundle); + else + dlclose(library->dylib); + delete library; } // static void* GetFunctionPointerFromNativeLibrary(NativeLibrary library, - NativeLibraryFunctionNameType name) { - return CFBundleGetFunctionPointerForName(library, name); + const char* name) { + if (library->type == BUNDLE) + return CFBundleGetFunctionPointerForName(library->bundle, + CFStringCreateWithCString(kCFAllocatorDefault, name, + kCFStringEncodingUTF8)); + + return dlsym(library->dylib, name); +} + +// static +string16 GetNativeLibraryName(const string16& name) { + return name + ASCIIToUTF16(".dylib"); } } // namespace base |