From: Waldemar Kozaczuk <[email protected]>
Committer: Waldemar Kozaczuk <[email protected]>
Branch: master

tests: tweak tst-dlfcn.cc to make it work with glibc

This patch tweaks tst-dlfcn.cc to make it work with both glibc
and OSv libc:

- compare dli_sname returned by dladdr() with _IO_vfprintf when built
  with glibc

- call dlerror() to clear any old error conditions before calling
  dlopen()

- take into account differences between what exact error message is
  reported by dlerror() when built with glibc

Signed-off-by: Waldemar Kozaczuk <[email protected]>

---
diff --git a/tests/tst-dlfcn.cc b/tests/tst-dlfcn.cc
--- a/tests/tst-dlfcn.cc
+++ b/tests/tst-dlfcn.cc
@@ -52,15 +52,27 @@ BOOST_AUTO_TEST_CASE(test_dladdr)
     BOOST_REQUIRE(vfprintf != info.dli_saddr);
 
     BOOST_REQUIRE(dladdr(adj_addr(vfprintf, 0), &info) != 0);
+#ifdef LINUX
+    BOOST_CHECK_EQUAL("_IO_vfprintf", info.dli_sname);
+#else
     BOOST_CHECK_EQUAL("vfprintf", info.dli_sname);
+#endif
     BOOST_CHECK_EQUAL(vfprintf, info.dli_saddr);
 
     BOOST_REQUIRE(dladdr(adj_addr(vfprintf, 2), &info) != 0);
+#ifdef LINUX
+    BOOST_CHECK_EQUAL("_IO_vfprintf", info.dli_sname);
+#else
     BOOST_CHECK_EQUAL("vfprintf", info.dli_sname);
+#endif
     BOOST_CHECK_EQUAL(vfprintf, info.dli_saddr);
 
     BOOST_REQUIRE(dladdr(adj_addr(vfprintf, 4), &info) != 0);
+#ifdef LINUX
+    BOOST_CHECK_EQUAL("_IO_vfprintf", info.dli_sname);
+#else
     BOOST_CHECK_EQUAL("vfprintf", info.dli_sname);
+#endif
     BOOST_CHECK_EQUAL(vfprintf, info.dli_saddr);
 }
 
@@ -201,25 +213,36 @@ BOOST_AUTO_TEST_CASE(dlsym_handle_global_sym)
 {
     // check that we do not look into global group
     // when looking up symbol by handle
+    dlerror();
     void* handle = dlopen("/tests/libtest_empty.so", RTLD_NOW);
     dlopen("libtest_with_dependency.so", RTLD_NOW | RTLD_GLOBAL);
     void* sym = dlsym(handle, "getRandomNumber");
     BOOST_REQUIRE(sym == nullptr);
-    auto err_msg = std::string(dlerror());
+    auto dl_err = dlerror();
+    BOOST_REQUIRE(dl_err != nullptr);
+    auto err_msg = std::string(dl_err);
     BOOST_TEST_CONTEXT(err_msg)
+#ifdef LINUX
+    BOOST_REQUIRE_NE(err_msg.find("undefined symbol: getRandomNumber"),
+            std::string::npos);
+#else
     BOOST_REQUIRE_NE(err_msg.find("dlsym: symbol getRandomNumber not found"),
             std::string::npos);
-    // BOOST_REQUIRE_NE(err_msg.find("undefined symbol: getRandomNumber"),
-    //         std::string::npos);
+#endif
 
+    dlerror();
     sym = dlsym(handle, "DlSymTestFunction");
     BOOST_REQUIRE(sym == nullptr);
-    err_msg = std::string(dlerror());
+    dl_err = dlerror();
+    err_msg = std::string(dl_err);
     BOOST_TEST_CONTEXT(err_msg)
+#ifdef LINUX
+    BOOST_REQUIRE_NE(err_msg.find("undefined symbol: DlSymTestFunction"),
+            std::string::npos);
+#else
     BOOST_REQUIRE_NE(err_msg.find("dlsym: symbol DlSymTestFunction not found"),
             std::string::npos);
-    // BOOST_REQUIRE_NE(err_msg.find("undefined symbol: DlSymTestFunction"),
-    //         std::string::npos);
+#endif
     dlclose(handle);
 }
 
@@ -229,14 +252,20 @@ BOOST_AUTO_TEST_CASE(dlsym_handle_empty_symbol)
     void* handle = dlopen("/tests/libtest_dlsym_from_this.so", RTLD_NOW);
     BOOST_TEST_CONTEXT(dlerror())
     BOOST_REQUIRE(handle != nullptr);
+    dlerror();
     void* sym = dlsym(handle, "");
     BOOST_REQUIRE(sym == nullptr);
-    auto err_msg = std::string(dlerror());
+    auto dl_err = dlerror();
+    BOOST_REQUIRE(dl_err != nullptr);
+    auto err_msg = std::string(dl_err);
     BOOST_TEST_CONTEXT(err_msg)
+#ifdef LINUX
+    BOOST_REQUIRE_NE(err_msg.find("undefined symbol: "),
+            std::string::npos);
+#else
     BOOST_REQUIRE_NE(err_msg.find("dlsym: symbol  not found"),
             std::string::npos);
-    // BOOST_REQUIRE_NE(err_msg.find("undefined symbol: "),
-    //         std::string::npos);
+#endif
     dlclose(handle);
 }
 

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/0000000000007abba3060c84e464%40google.com.

Reply via email to