00001 /* 00002 * Copyright (c) 2010, Willow Garage, Inc. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * * Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * * Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * * Neither the name of the Willow Garage, Inc. nor the names of its 00014 * contributors may be used to endorse or promote products derived from 00015 * this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00018 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00021 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00022 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00023 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00026 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00027 * POSSIBILITY OF SUCH DAMAGE. 00028 */ 00029 00030 #include <gtest/gtest.h> 00031 #include <ros/package.h> 00032 #include <ros/types.h> 00033 00034 #include <rve_dynlib/dynlib.h> 00035 00036 std::string g_package_path; 00037 00038 TEST(DynLib, loadUnload) 00039 { 00040 try 00041 { 00042 rve_dynlib::Handle h = rve_dynlib::load(g_package_path + "/lib/" + std::string(rve_dynlib::prefix()) + "test_library" + std::string(rve_dynlib::suffix())); 00043 rve_dynlib::unload(h); 00044 } 00045 catch(rve_dynlib::LibraryLoadException&) 00046 { 00047 FAIL(); 00048 } 00049 } 00050 00051 TEST(DynLib, failLoad) 00052 { 00053 try 00054 { 00055 rve_dynlib::load("some_random_library.so"); 00056 FAIL(); 00057 } 00058 catch(rve_dynlib::LibraryLoadException&) 00059 { 00060 SUCCEED(); 00061 } 00062 } 00063 00064 TEST(DynLib, getSymbol) 00065 { 00066 try 00067 { 00068 rve_dynlib::Handle h = rve_dynlib::load(g_package_path + "/lib/" + std::string(rve_dynlib::prefix()) + "test_library" + std::string(rve_dynlib::suffix())); 00069 00070 void* sym = rve_dynlib::getSymbol(h, "doubleEntryPoint"); 00071 00072 ASSERT_TRUE(sym); 00073 00074 uint32_t (*fp)(uint32_t) = (uint32_t (*)(uint32_t))sym; 00075 uint32_t doubled = (*fp)(5); 00076 EXPECT_EQ(doubled, 10U); 00077 00078 sym = rve_dynlib::getSymbol(h, "invalidEntryPoint"); 00079 EXPECT_FALSE(sym); 00080 00081 rve_dynlib::unload(h); 00082 } 00083 catch(rve_dynlib::LibraryLoadException&) 00084 { 00085 FAIL(); 00086 } 00087 } 00088 00089 int main(int argc, char** argv) 00090 { 00091 testing::InitGoogleTest(&argc, argv); 00092 00093 g_package_path = ros::package::getPath(ROS_PACKAGE_NAME); 00094 00095 return RUN_ALL_TESTS(); 00096 } 00097