summaryrefslogtreecommitdiffstats
path: root/sal/qa/osl/module
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sal/qa/osl/module/osl_Module.cxx376
-rw-r--r--sal/qa/osl/module/osl_Module_Const.h46
-rw-r--r--sal/qa/osl/module/osl_Module_DLL.cxx32
3 files changed, 454 insertions, 0 deletions
diff --git a/sal/qa/osl/module/osl_Module.cxx b/sal/qa/osl/module/osl_Module.cxx
new file mode 100644
index 000000000..f440a7151
--- /dev/null
+++ b/sal/qa/osl/module/osl_Module.cxx
@@ -0,0 +1,376 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you 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 .
+ */
+
+// include files
+
+#include "osl_Module_Const.h"
+
+using namespace osl;
+
+/** get dll file URL.
+*/
+static OUString getDllURL()
+{
+#if defined(_WIN32) // lib in Unix and lib in Windows are not same in file name.
+ OUString libPath( "test_Module_DLL.dll" );
+#else
+ OUString libPath( "libtest_Module_DLL.so" );
+#endif
+
+ OUString dirPath, dllPath;
+ osl::Module::getUrlFromAddress(
+ reinterpret_cast<oslGenericFunction>(&getDllURL), dirPath);
+ dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') + 1);
+ osl::FileBase::getAbsoluteFileURL( dirPath, libPath, dllPath );
+
+ return dllPath;
+}
+
+namespace osl_Module
+{
+ namespace {
+
+ /** class and member function that is available for module test :
+ */
+
+ class testClass
+ {
+ public:
+ static void myFunc()
+ {
+ printf("#Sun Microsystem\n");
+ };
+ };
+
+ }
+
+ /** testing the methods:
+ Module();
+ Module( const OUString& strModuleName, sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT);
+ */
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ bool bRes, bRes1;
+
+ void ctors_none( )
+ {
+ ::osl::Module aMod;
+ bRes = aMod.is();
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor without parameter.",
+ !bRes );
+ }
+
+ void ctors_name_mode( )
+ {
+ OUString aFileURL;
+ bRes = osl::Module::getUrlFromAddress(
+ reinterpret_cast<oslGenericFunction>(
+ &osl_Module::testClass::myFunc),
+ aFileURL);
+
+ if ( !bRes )
+ {
+ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", false );
+ }
+
+ ::osl::Module aMod( aFileURL );
+ bRes = aMod.is( );
+ aMod.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with load action.",
+ bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_name_mode );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class ctors
+
+ /** testing the methods:
+ static sal_Bool getUrlFromAddress(void * addr, OUString & libraryUrl)
+ */
+ class getUrlFromAddress : public CppUnit::TestFixture
+ {
+ public:
+ bool bRes, bRes1;
+
+ void getUrlFromAddress_001( )
+ {
+ OUString aFileURL;
+ bRes = osl::Module::getUrlFromAddress(
+ reinterpret_cast<oslGenericFunction>(
+ &osl_Module::testClass::myFunc),
+ aFileURL);
+ if ( !bRes )
+ {
+ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", false );
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test get Module URL from address.",
+ bRes );
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test get Module URL from address.",
+ 0 < aFileURL.lastIndexOf('/') );
+ }
+
+ void getUrlFromAddress_002( )
+ {
+#if !defined( MACOSX )
+ // TODO: Find out why this fails on macOS
+ ::osl::Module aMod( getDllURL( ) );
+ FuncPtr pFunc = reinterpret_cast<FuncPtr>(aMod.getSymbol( "firstfunc" ));
+
+ OUString aFileURL;
+ bRes = osl::Module::getUrlFromAddress(
+ reinterpret_cast<oslGenericFunction>(pFunc), aFileURL);
+ if ( !bRes )
+ {
+ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", false );
+ }
+ aMod.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load an external library, get its function address and get its URL.",
+ bRes );
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load an external library, get its function address and get its URL.",
+ 0 < aFileURL.lastIndexOf('/') );
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load an external library, get its function address and get its URL.",
+ aFileURL.equalsIgnoreAsciiCase( getDllURL( ) ) );
+#endif
+ }
+
+ /* tester comments: another case is getFunctionSymbol_001*/
+
+ CPPUNIT_TEST_SUITE( getUrlFromAddress );
+ CPPUNIT_TEST( getUrlFromAddress_001 );
+ CPPUNIT_TEST( getUrlFromAddress_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getUrlFromAddress
+
+ /** testing the method:
+ sal_Bool SAL_CALL load( const OUString& strModuleName,
+ sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT)
+ */
+ class load : public CppUnit::TestFixture
+ {
+ public:
+ bool bRes, bRes1;
+
+ void load_001( )
+ {
+ ::osl::Module aMod( getDllURL( ) );
+ ::osl::Module aMod1;
+
+ aMod1.load( getDllURL( ) );
+ bRes = oslModule(aMod) == oslModule(aMod1);
+ aMod.unload( );
+ aMod1.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load function should do the same thing as constructor with library name.",
+ bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( load );
+ CPPUNIT_TEST( load_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class load
+
+ /** testing the method:
+ void SAL_CALL unload()
+ */
+ class unload : public CppUnit::TestFixture
+ {
+ public:
+ bool bRes, bRes1;
+
+ void unload_001( )
+ {
+ ::osl::Module aMod( getDllURL( ) );
+
+ aMod.unload( );
+ bRes = oslModule(aMod) ==nullptr;
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: unload function should do the same thing as destructor.",
+ bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( unload );
+ CPPUNIT_TEST( unload_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class unload
+
+ /** testing the methods:
+ sal_Bool SAL_CALL is() const
+ */
+ class is : public CppUnit::TestFixture
+ {
+ public:
+ bool bRes, bRes1;
+
+ void is_001( )
+ {
+ OUString aFileURL;
+ bRes = osl::Module::getUrlFromAddress(
+ reinterpret_cast<oslGenericFunction>(
+ osl_Module::testClass::myFunc),
+ aFileURL);
+ if ( !bRes )
+ {
+ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module - using executable instead", false );
+ }
+
+ ::osl::Module aMod;
+ bRes = aMod.is( );
+ aMod.load( aFileURL );
+ bRes1 = aMod.is( );
+ aMod.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test if a module is a loaded module.",
+ !bRes );
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test if a module is a loaded module.",
+ bRes1 );
+ }
+ CPPUNIT_TEST_SUITE( is );
+ CPPUNIT_TEST( is_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class is
+
+ /** testing the methods:
+ void* SAL_CALL getSymbol( const OUString& strSymbolName)
+ */
+ class getSymbol : public CppUnit::TestFixture
+ {
+ public:
+ bool bRes;
+
+ void getSymbol_001( )
+ {
+#if !defined( MACOSX )
+ // TODO: Find out why this fails on macOS
+ ::osl::Module aMod( getDllURL( ) );
+ FuncPtr pFunc = reinterpret_cast<FuncPtr>(aMod.getSymbol( "firstfunc" ));
+ bRes = false;
+ if ( pFunc )
+ bRes = pFunc( bRes );
+ aMod.unload();
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load a dll and call one function in it.",
+ bRes );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( getSymbol );
+ CPPUNIT_TEST( getSymbol_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getSymbol
+
+ /** testing the methods:
+ operator oslModule() const
+ */
+ class optr_oslModule : public CppUnit::TestFixture
+ {
+ public:
+ bool bRes, bRes1;
+
+ void optr_oslModule_001( )
+ {
+#if !defined( MACOSX )
+ // TODO: Find out why this fails on macOS
+ ::osl::Module aMod;
+ bRes = ( static_cast<oslModule>(aMod) == nullptr );
+
+ aMod.load( getDllURL( ) );
+ bRes1 = static_cast<oslModule>(aMod) != nullptr;
+
+ aMod.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: the m_Module of a Module instance will be NULL when is not loaded, it will not be NULL after loaded.",
+ bRes );
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: the m_Module of a Module instance will be NULL when is not loaded, it will not be NULL after loaded.",
+ bRes1 );
+#endif
+ }
+
+ void optr_oslModule_002( )
+ {
+#if !defined( MACOSX )
+ // TODO: Find out why this fails on macOS
+ ::osl::Module aMod( getDllURL( ) );
+ OUString funcName( "firstfunc" );
+
+ FuncPtr pFunc = reinterpret_cast<FuncPtr>(osl_getSymbol( static_cast<oslModule>(aMod), funcName.pData ));
+ bRes = false;
+ if ( pFunc )
+ bRes = pFunc( bRes );
+
+ aMod.unload();
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: use m_Module to call osl_getSymbol() function.",
+ bRes );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( optr_oslModule );
+ CPPUNIT_TEST( optr_oslModule_001 );
+ CPPUNIT_TEST( optr_oslModule_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class optr_oslModule
+
+ /** testing the methods:
+ oslGenericFunction SAL_CALL getFunctionSymbol( const OUString& ustrFunctionSymbolName )
+ */
+ class getFunctionSymbol : public CppUnit::TestFixture
+ {
+ public:
+ bool bRes, bRes1;
+
+ void getFunctionSymbol_001( )
+ {
+#if !defined( MACOSX )
+ // TODO: Find out why this fails on macOS
+ ::osl::Module aMod( getDllURL( ) );
+ oslGenericFunction oslFunc = aMod.getFunctionSymbol( "firstfunc" );
+ OUString aLibraryURL;
+ bRes = ::osl::Module::getUrlFromAddress( oslFunc, aLibraryURL);
+ aMod.unload();
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load a dll and get its function addr and get its URL.",
+ bRes );
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load a dll and get its function addr and get its URL.",
+ aLibraryURL.equalsIgnoreAsciiCase( getDllURL() ) );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( getFunctionSymbol );
+ CPPUNIT_TEST( getFunctionSymbol_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getFunctionSymbol
+
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Module::ctors);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Module::getUrlFromAddress);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Module::load);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Module::unload);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Module::is);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Module::getSymbol);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Module::optr_oslModule);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Module::getFunctionSymbol);
+
+} // namespace osl_Module
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sal/qa/osl/module/osl_Module_Const.h b/sal/qa/osl/module/osl_Module_Const.h
new file mode 100644
index 000000000..3434d439f
--- /dev/null
+++ b/sal/qa/osl/module/osl_Module_Const.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you 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 .
+ */
+
+#ifndef INCLUDED_SAL_QA_OSL_MODULE_OSL_MODULE_CONST_H
+#define INCLUDED_SAL_QA_OSL_MODULE_OSL_MODULE_CONST_H
+
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+#include <osl/module.hxx>
+#include <osl/file.hxx>
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#if defined(UNX) // Unix
+# include <unistd.h>
+#elif defined(_WIN32) // Windows
+# include <io.h>
+#endif
+
+# define FILE_PREFIX "file:///"
+
+// function pointer type.
+
+typedef sal_Bool (* FuncPtr )( sal_Bool );
+
+#endif // INCLUDED_SAL_QA_OSL_MODULE_OSL_MODULE_CONST_H
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sal/qa/osl/module/osl_Module_DLL.cxx b/sal/qa/osl/module/osl_Module_DLL.cxx
new file mode 100644
index 000000000..59f30b137
--- /dev/null
+++ b/sal/qa/osl/module/osl_Module_DLL.cxx
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you 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 .
+ */
+
+#include "osl_Module_Const.h"
+
+#include <stdio.h>
+#include <sal/types.h>
+
+// This module contains no tests. It is loaded as a dynamic library by
+// osl_Module.
+// But we instantiate a test plugin to fake the build process.
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool firstfunc(sal_Bool) { return true; }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */