#if ENABLE_UNIT_TESTS
|
|
#include "UnitTest++.h"
|
|
#include "../LibraryLoader-c-api.h"
|
#include "../../LibraryLoader.h"
|
#include "utils/StringUtils.h"
|
|
#if IL2CPP_TARGET_POSIX && !IL2CPP_TARGET_PS4 && !IL2CPP_TARGET_PS5
|
#include "dlfcn.h"
|
#else
|
#define RTLD_LAZY 0
|
#endif
|
|
#if IL2CPP_TARGET_PS4
|
static const char* POSIX_DL_NAME = "/app0/test.prx";
|
static const char* POSIX_FUNC_NAME = "prx_func";
|
#elif IL2CPP_TARGET_PS5
|
static const char* POSIX_DL_NAME = "/app0/test.prx";
|
static const char* POSIX_FUNC_NAME = "prx_func";
|
#elif IL2CPP_TARGET_LINUX
|
static const char* POSIX_DL_NAME = "libm.so.6";
|
static const char* POSIX_FUNC_NAME = "abs";
|
#else
|
static const char* POSIX_DL_NAME = "libm";
|
static const char* POSIX_FUNC_NAME = "abs";
|
#endif
|
static const char* WINDOWS_DL_NAME = "user32";
|
static const char* WINDOWS_FUNC_NAME = "CalcMenuBar";
|
|
SUITE(LibraryLoader)
|
{
|
#if IL2CPP_TARGET_POSIX
|
|
struct PosixLoaderFixture
|
{
|
PosixLoaderFixture()
|
{
|
palDynLib = UnityPalLibraryLoaderLoadDynamicLibrary(POSIX_DL_NAME, RTLD_LAZY);
|
Il2CppNativeString libName(il2cpp::utils::StringUtils::Utf8ToNativeString(POSIX_DL_NAME));
|
classDynLib = il2cpp::os::LibraryLoader::LoadDynamicLibrary(STRING_TO_STRINGVIEW(libName));
|
}
|
|
~PosixLoaderFixture()
|
{
|
il2cpp::os::LibraryLoader::CleanupLoadedLibraries();
|
}
|
|
void* palDynLib;
|
void* classDynLib;
|
bool palResult;
|
bool classResult;
|
Il2CppMethodPointer palMethodPointer;
|
Il2CppMethodPointer classMethodPointer;
|
};
|
|
TEST_FIXTURE(PosixLoaderFixture, PosixLoadDynamicLibraryReturnsAPointer)
|
{
|
CHECK_NOT_NULL(palDynLib);
|
}
|
|
TEST_FIXTURE(PosixLoaderFixture, PosixCloseLoadedLibraryReturnsTrue)
|
{
|
CHECK_EQUAL(true, UnityPalLibraryLoaderCloseLoadedLibrary(&palDynLib));
|
}
|
|
TEST_FIXTURE(PosixLoaderFixture, PosixGetFunctionPointerisNotNull)
|
{
|
CHECK_NOT_NULL(UnityPalLibraryLoaderGetFunctionPointer(palDynLib, POSIX_FUNC_NAME));
|
}
|
|
TEST_FIXTURE(PosixLoaderFixture, PosixLoadDynamicLibraryMatchesClass)
|
{
|
CHECK_EQUAL(classDynLib, palDynLib);
|
}
|
|
TEST(PosixCloseLoadedLibraryMatchesClass)
|
{
|
// Note: not using fixture for this test, because order is important.
|
void* palDynLib = UnityPalLibraryLoaderLoadDynamicLibrary(POSIX_DL_NAME, RTLD_LAZY);
|
bool palResult = UnityPalLibraryLoaderCloseLoadedLibrary(&palDynLib);
|
Il2CppNativeString libName(il2cpp::utils::StringUtils::Utf8ToNativeString(POSIX_DL_NAME));
|
void* classDynLib = il2cpp::os::LibraryLoader::LoadDynamicLibrary(STRING_TO_STRINGVIEW(libName));
|
bool classResult = il2cpp::os::LibraryLoader::CloseLoadedLibrary(classDynLib);
|
CHECK_EQUAL(classResult, palResult);
|
}
|
|
TEST_FIXTURE(PosixLoaderFixture, PosixGetFunctionPointerMatchesClass)
|
{
|
palMethodPointer = UnityPalLibraryLoaderGetFunctionPointer(classDynLib, POSIX_FUNC_NAME);
|
classMethodPointer = il2cpp::os::LibraryLoader::GetFunctionPointer(classDynLib, POSIX_FUNC_NAME);
|
CHECK_EQUAL(classMethodPointer, palMethodPointer);
|
}
|
|
#endif // IL2CPP_TARGET_POSIX
|
#if defined(WINDOWS)
|
|
struct WindowsLoaderFixture
|
{
|
WindowsLoaderFixture()
|
{
|
palDynLib = UnityPalLibraryLoaderLoadDynamicLibrary(WINDOWS_DL_NAME, RTLD_LAZY);
|
Il2CppNativeString libName(il2cpp::utils::StringUtils::Utf8ToNativeString(WINDOWS_DL_NAME));
|
classDynLib = il2cpp::os::LibraryLoader::LoadDynamicLibrary(STRING_TO_STRINGVIEW(libName));
|
}
|
|
~WindowsLoaderFixture()
|
{
|
il2cpp::os::LibraryLoader::CleanupLoadedLibraries();
|
}
|
|
void* palDynLib;
|
void* classDynLib;
|
bool palResult;
|
bool classResult;
|
Il2CppMethodPointer palMethodPointer;
|
Il2CppMethodPointer classMethodPointer;
|
};
|
|
TEST_FIXTURE(WindowsLoaderFixture, WindowsLoadDynamicLibraryReturnsAPointer)
|
{
|
CHECK_NOT_NULL(palDynLib);
|
}
|
|
TEST_FIXTURE(WindowsLoaderFixture, WindowsCloseLoadedLibraryReturnsTrue)
|
{
|
CHECK_EQUAL((int32_t)true, UnityPalLibraryLoaderCloseLoadedLibrary(&palDynLib));
|
}
|
|
TEST_FIXTURE(WindowsLoaderFixture, WindowsGetFunctionPointerisNotNull)
|
{
|
CHECK_NOT_NULL(UnityPalLibraryLoaderGetFunctionPointer(palDynLib, WINDOWS_FUNC_NAME));
|
}
|
|
TEST_FIXTURE(WindowsLoaderFixture, WindowsLoadDynamicLibraryMatchesClass)
|
{
|
CHECK_EQUAL(classDynLib, palDynLib);
|
}
|
|
TEST(WindowsCloseLoadedLibraryMatchesClass)
|
{
|
// Note: not using fixture for this test, because order is important.
|
void* palDynLib = UnityPalLibraryLoaderLoadDynamicLibrary(WINDOWS_DL_NAME, RTLD_LAZY);
|
bool palResult = UnityPalLibraryLoaderCloseLoadedLibrary(&palDynLib);
|
Il2CppNativeString libName(il2cpp::utils::StringUtils::Utf8ToNativeString(WINDOWS_DL_NAME));
|
void* classDynLib = il2cpp::os::LibraryLoader::LoadDynamicLibrary(STRING_TO_STRINGVIEW(libName));
|
bool classResult = il2cpp::os::LibraryLoader::CloseLoadedLibrary(classDynLib);
|
CHECK_EQUAL(classResult, palResult);
|
}
|
|
TEST_FIXTURE(WindowsLoaderFixture, WindowsGetFunctionPointerMatchesClass)
|
{
|
palMethodPointer = UnityPalLibraryLoaderGetFunctionPointer(classDynLib, WINDOWS_FUNC_NAME);
|
classMethodPointer = il2cpp::os::LibraryLoader::GetFunctionPointer(classDynLib, WINDOWS_FUNC_NAME);
|
CHECK_EQUAL(classMethodPointer, palMethodPointer);
|
}
|
|
#endif // WINDOWS
|
}
|
|
#endif // ENABLE_UNIT_TESTS
|