You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2020/03/09 12:40:58 UTC

[celix] 02/02: #91 Refactors rsa tests, so that the individual test can be run separately and fixes an issue with recursive calls and double frees in libdfi.

This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/#91_rsa_enum_issue
in repository https://gitbox.apache.org/repos/asf/celix.git

commit 410d959abf76d7a1649ebc7a3ded6427958a382d
Author: Pepijn Noltes <pe...@gmail.com>
AuthorDate: Mon Mar 9 13:37:15 2020 +0100

    #91 Refactors rsa tests, so that the individual test can be run separately and fixes an issue with recursive calls and double frees in libdfi.
---
 .../gtest/src/rsa_client_server_tests.cc           | 113 ++++++++++++++++-----
 libs/dfi/src/dyn_type.c                            |   3 +-
 2 files changed, 90 insertions(+), 26 deletions(-)

diff --git a/bundles/remote_services/remote_service_admin_dfi/gtest/src/rsa_client_server_tests.cc b/bundles/remote_services/remote_service_admin_dfi/gtest/src/rsa_client_server_tests.cc
index 9c99504..9c42951 100644
--- a/bundles/remote_services/remote_service_admin_dfi/gtest/src/rsa_client_server_tests.cc
+++ b/bundles/remote_services/remote_service_admin_dfi/gtest/src/rsa_client_server_tests.cc
@@ -64,50 +64,89 @@ extern "C" {
         celix_frameworkFactory_destroyFramework(clientFramework);
     }
 
-    static void testCallback(void *handle __attribute__((unused)), void *svc) {
+    static void testComplex(void *handle __attribute__((unused)), void *svc) {
         auto *tst = static_cast<tst_service_t *>(svc);
 
-        bool ok;
-
-        bool discovered = tst->isCalcDiscovered(tst->handle);
+        bool discovered = tst->isRemoteExampleDiscovered(tst->handle);
         ASSERT_TRUE(discovered);
 
-        ok = tst->testCalculator(tst->handle);
+        bool ok = tst->testRemoteComplex(tst->handle);
         ASSERT_TRUE(ok);
+    };
+
+    static void testAction(void *handle __attribute__((unused)), void *svc) {
+        auto *tst = static_cast<tst_service_t *>(svc);
 
-        discovered = tst->isRemoteExampleDiscovered(tst->handle);
+        bool discovered = tst->isRemoteExampleDiscovered(tst->handle);
         ASSERT_TRUE(discovered);
 
-        ok = tst->testRemoteComplex(tst->handle);
+        bool ok = tst->testRemoteAction(tst->handle);
         ASSERT_TRUE(ok);
+    };
+
+    static void testNumbers(void *handle __attribute__((unused)), void *svc) {
+        auto *tst = static_cast<tst_service_t *>(svc);
 
-        ok = tst->testRemoteAction(tst->handle);
+        bool discovered = tst->isRemoteExampleDiscovered(tst->handle);
+        ASSERT_TRUE(discovered);
+
+        bool ok = tst->testRemoteNumbers(tst->handle);
         ASSERT_TRUE(ok);
+    };
 
-        ok = tst->testRemoteNumbers(tst->handle);
+    static void testString(void *handle __attribute__((unused)), void *svc) {
+        auto *tst = static_cast<tst_service_t *>(svc);
+
+        bool discovered = tst->isRemoteExampleDiscovered(tst->handle);
+        ASSERT_TRUE(discovered);
+
+        bool ok = tst->testRemoteString(tst->handle);
         ASSERT_TRUE(ok);
+    };
+
+    static void testEnum(void *handle __attribute__((unused)), void *svc) {
+        auto *tst = static_cast<tst_service_t *>(svc);
 
-        ok = tst->testRemoteString(tst->handle);
+        bool discovered = tst->isRemoteExampleDiscovered(tst->handle);
+        ASSERT_TRUE(discovered);
+
+        bool ok = tst->testRemoteEnum(tst->handle);
         ASSERT_TRUE(ok);
+    };
 
-        ok = tst->testRemoteConstString(tst->handle);
+    static void testConstString(void *handle __attribute__((unused)), void *svc) {
+        auto *tst = static_cast<tst_service_t *>(svc);
+
+        bool discovered = tst->isRemoteExampleDiscovered(tst->handle);
+        ASSERT_TRUE(discovered);
+
+        bool ok = tst->testRemoteConstString(tst->handle);
         ASSERT_TRUE(ok);
+    };
+
+    static void testCalculator(void *handle __attribute__((unused)), void *svc) {
+        auto *tst = static_cast<tst_service_t *>(svc);
 
-        //TODO fix for apple dfi handling, see issue #91
-//        ok = tst->testRemoteEnum(tst->handle);
-//        ASSERT_TRUE(ok);
+        bool ok;
+
+        bool discovered = tst->isCalcDiscovered(tst->handle);
+        ASSERT_TRUE(discovered);
+
+        ok = tst->testCalculator(tst->handle);
+        ASSERT_TRUE(ok);
     };
 
-    static void test(void) {
-        celix_service_use_options_t opts{};
-        opts.filter.serviceName = TST_SERVICE_NAME;
-        opts.use = testCallback;
-        opts.filter.ignoreServiceLanguage = true;
-        opts.waitTimeoutInSeconds = 2;
-        bool called = celix_bundleContext_useServiceWithOptions(clientContext, &opts);
-        ASSERT_TRUE(called);
-    }
+}
 
+template<typename F>
+static void test(F&& f) {
+    celix_service_use_options_t opts{};
+    opts.filter.serviceName = TST_SERVICE_NAME;
+    opts.use = f;
+    opts.filter.ignoreServiceLanguage = true;
+    opts.waitTimeoutInSeconds = 2;
+    bool called = celix_bundleContext_useServiceWithOptions(clientContext, &opts);
+    ASSERT_TRUE(called);
 }
 
 class RsaDfiClientServerTests : public ::testing::Test {
@@ -122,6 +161,30 @@ public:
 };
 
 
-TEST_F(RsaDfiClientServerTests, Test1) {
-    test();
+TEST_F(RsaDfiClientServerTests, TestRemoteCalculator) {
+    test(testCalculator);
+}
+
+TEST_F(RsaDfiClientServerTests, TestRemoteComplex) {
+    test(testComplex);
+}
+
+TEST_F(RsaDfiClientServerTests, TestRemoteNumbers) {
+    test(testNumbers);
+}
+
+TEST_F(RsaDfiClientServerTests, TestRemoteString) {
+    test(testString);
+}
+
+TEST_F(RsaDfiClientServerTests, TestRemoteConstString) {
+    test(testConstString);
+}
+
+TEST_F(RsaDfiClientServerTests, TestRemoteEnum) {
+    test(testEnum);
+}
+
+TEST_F(RsaDfiClientServerTests, TestRemoteAction) {
+    test(testAction);
 }
diff --git a/libs/dfi/src/dyn_type.c b/libs/dfi/src/dyn_type.c
index 09cca39..4f93fb9 100644
--- a/libs/dfi/src/dyn_type.c
+++ b/libs/dfi/src/dyn_type.c
@@ -679,7 +679,8 @@ void dynType_deepFree(dyn_type *type, void *loc, bool alsoDeleteSelf) {
         char *text = NULL;
         switch (type->type) {
             case DYN_TYPE_REF:
-                dynType_deepFree(type->ref.ref, loc, alsoDeleteSelf);
+                //NOTE: do not recursively forward asloDeleteSelf, because this is already handled in this function)
+                dynType_deepFree(type->ref.ref, loc, false);
                 break;
             case DYN_TYPE_COMPLEX :
                 dynType_freeComplexType(type, loc);