2010-06-13 10:30:55 -04:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Name: tests/misc/dynamiclib.cpp
|
|
|
|
// Purpose: Test wxDynamicLibrary
|
|
|
|
// Author: Francesco Montorsi (extracted from console sample)
|
|
|
|
// Created: 2010-06-13
|
|
|
|
// Copyright: (c) 2010 wxWidgets team
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// headers
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#include "testprec.h"
|
|
|
|
|
|
|
|
#ifdef __BORLANDC__
|
|
|
|
# pragma hdrstop
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "wx/dynlib.h"
|
|
|
|
|
2012-10-24 19:13:38 -04:00
|
|
|
#ifdef __UNIX__
|
|
|
|
#include "wx/filename.h"
|
2012-10-24 19:41:04 -04:00
|
|
|
#include "wx/log.h"
|
2012-10-24 19:13:38 -04:00
|
|
|
#endif
|
|
|
|
|
2010-06-13 10:30:55 -04:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// test class
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class DynamicLibraryTestCase : public CppUnit::TestCase
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
DynamicLibraryTestCase() { }
|
|
|
|
|
|
|
|
private:
|
|
|
|
CPPUNIT_TEST_SUITE( DynamicLibraryTestCase );
|
|
|
|
CPPUNIT_TEST( Load );
|
|
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
|
|
|
|
void Load();
|
2015-04-23 07:49:01 -04:00
|
|
|
|
|
|
|
wxDECLARE_NO_COPY_CLASS(DynamicLibraryTestCase);
|
2010-06-13 10:30:55 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
// register in the unnamed registry so that these tests are run by default
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION( DynamicLibraryTestCase );
|
|
|
|
|
2011-04-30 06:57:04 -04:00
|
|
|
// also include in its own registry so that these tests can be run alone
|
2010-06-13 10:30:55 -04:00
|
|
|
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( DynamicLibraryTestCase, "DynamicLibraryTestCase" );
|
|
|
|
|
|
|
|
void DynamicLibraryTestCase::Load()
|
|
|
|
{
|
2012-03-04 15:31:42 -05:00
|
|
|
#if defined(__WINDOWS__)
|
2010-06-13 10:30:55 -04:00
|
|
|
static const wxChar *LIB_NAME = wxT("kernel32.dll");
|
|
|
|
static const wxChar *FUNC_NAME = wxT("lstrlenA");
|
|
|
|
#elif defined(__UNIX__)
|
2010-06-20 11:24:01 -04:00
|
|
|
#ifdef __DARWIN__
|
|
|
|
static const wxChar *LIB_NAME = wxT("/usr/lib/libc.dylib");
|
|
|
|
#else
|
2010-06-13 10:30:55 -04:00
|
|
|
// weird: using just libc.so does *not* work!
|
|
|
|
static const wxChar *LIB_NAME = wxT("/lib/libc.so.6");
|
2010-06-20 11:24:01 -04:00
|
|
|
#endif
|
2010-06-13 10:30:55 -04:00
|
|
|
static const wxChar *FUNC_NAME = wxT("strlen");
|
2012-10-24 19:13:38 -04:00
|
|
|
|
|
|
|
if ( !wxFileName::Exists(LIB_NAME) )
|
|
|
|
{
|
|
|
|
wxLogWarning("Shared library \"%s\" doesn't exist, "
|
|
|
|
"skipping DynamicLibraryTestCase::Load() test.");
|
|
|
|
return;
|
|
|
|
}
|
2010-06-13 10:30:55 -04:00
|
|
|
#else
|
|
|
|
#error "don't know how to test wxDllLoader on this platform"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
wxDynamicLibrary lib(LIB_NAME);
|
|
|
|
CPPUNIT_ASSERT( lib.IsLoaded() );
|
|
|
|
|
|
|
|
typedef int (wxSTDCALL *wxStrlenType)(const char *);
|
|
|
|
wxStrlenType pfnStrlen = (wxStrlenType)lib.GetSymbol(FUNC_NAME);
|
|
|
|
|
|
|
|
wxString errMsg = wxString::Format("ERROR: function '%s' wasn't found in '%s'.\n",
|
|
|
|
FUNC_NAME, LIB_NAME);
|
|
|
|
CPPUNIT_ASSERT_MESSAGE( errMsg.ToStdString(), pfnStrlen );
|
|
|
|
|
|
|
|
// Call the function dynamically loaded
|
|
|
|
CPPUNIT_ASSERT( pfnStrlen("foo") == 3 );
|
|
|
|
|
2012-03-04 15:31:42 -05:00
|
|
|
#ifdef __WINDOWS__
|
2010-06-13 10:30:55 -04:00
|
|
|
static const wxChar *FUNC_NAME_AW = wxT("lstrlen");
|
|
|
|
|
|
|
|
typedef int (wxSTDCALL *wxStrlenTypeAorW)(const wxChar *);
|
|
|
|
wxStrlenTypeAorW
|
|
|
|
pfnStrlenAorW = (wxStrlenTypeAorW)lib.GetSymbolAorW(FUNC_NAME_AW);
|
|
|
|
|
|
|
|
wxString errMsg2 = wxString::Format("ERROR: function '%s' wasn't found in '%s'.\n",
|
|
|
|
FUNC_NAME_AW, LIB_NAME);
|
|
|
|
CPPUNIT_ASSERT_MESSAGE( errMsg2.ToStdString(), pfnStrlenAorW );
|
|
|
|
|
|
|
|
CPPUNIT_ASSERT( pfnStrlenAorW(wxT("foobar")) == 6 );
|
2012-03-04 15:31:42 -05:00
|
|
|
#endif // __WINDOWS__
|
2010-06-13 10:30:55 -04:00
|
|
|
}
|