You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by bp...@apache.org on 2015/11/17 06:17:19 UTC

celix git commit: CELIX-293: add import/export test, minor bugfix

Repository: celix
Updated Branches:
  refs/heads/develop 437da02bc -> d2593f233


CELIX-293: add import/export test, minor bugfix


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/d2593f23
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/d2593f23
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/d2593f23

Branch: refs/heads/develop
Commit: d2593f233f2f80c5ceace4096bd2631827ee4fee
Parents: 437da02
Author: Bjoern Petri <bp...@apache.org>
Authored: Tue Nov 17 06:16:37 2015 +0100
Committer: Bjoern Petri <bp...@apache.org>
Committed: Tue Nov 17 06:16:37 2015 +0100

----------------------------------------------------------------------
 .../discovery/private/src/discovery.c           |   2 +-
 .../discovery_shm/private/src/discovery_impl.c  |   4 +-
 .../private/src/remote_service_admin_impl.c     |   7 +-
 .../private/test/rsa_client_server_tests.cpp    | 368 ++++++++++++++++---
 4 files changed, 325 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/d2593f23/remote_services/discovery/private/src/discovery.c
----------------------------------------------------------------------
diff --git a/remote_services/discovery/private/src/discovery.c b/remote_services/discovery/private/src/discovery.c
index ee3c293..e2415b4 100644
--- a/remote_services/discovery/private/src/discovery.c
+++ b/remote_services/discovery/private/src/discovery.c
@@ -225,7 +225,7 @@ celix_status_t discovery_removeDiscoveredEndpoint(discovery_pt discovery, endpoi
         status = celixThreadMutex_unlock(&discovery->discoveredServicesMutex);
 
         if (oldValue) {
-            status = discovery_informEndpointListeners(discovery, endpoint, false /* addingService */);
+            status = discovery_informEndpointListeners(discovery, endpoint, false /* removeService */);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/celix/blob/d2593f23/remote_services/discovery_shm/private/src/discovery_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/discovery_shm/private/src/discovery_impl.c b/remote_services/discovery_shm/private/src/discovery_impl.c
index 2befad3..2604595 100644
--- a/remote_services/discovery_shm/private/src/discovery_impl.c
+++ b/remote_services/discovery_shm/private/src/discovery_impl.c
@@ -134,9 +134,7 @@ celix_status_t discovery_stop(discovery_pt discovery) {
         status = endpointDiscoveryServer_destroy(discovery->server);
     }
 
-	if (status == CELIX_SUCCESS) {
-	    status = endpointDiscoveryPoller_destroy(discovery->poller);
-	}
+	endpointDiscoveryPoller_destroy(discovery->poller);
 
 	if (status == CELIX_SUCCESS) {
         hash_map_iterator_pt iter;

http://git-wip-us.apache.org/repos/asf/celix/blob/d2593f23/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c b/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
index 92d4594..c9771b0 100644
--- a/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
+++ b/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
@@ -838,9 +838,12 @@ celix_status_t remoteServiceAdmin_importService(remote_service_admin_pt admin, e
 }
 
 celix_status_t remoteServiceAdmin_removeImportedService(remote_service_admin_pt admin, import_registration_pt registration) {
-    celix_status_t status = CELIX_BUNDLE_EXCEPTION;
+    celix_status_t status = CELIX_SUCCESS;
 
     if (registration != NULL) {
+
+        celixThreadMutex_lock(&admin->importedServicesLock);
+
         ipc_segment_pt ipc = NULL;
         endpoint_description_pt endpointDescription = (endpoint_description_pt) registration->endpointDescription;
         import_registration_factory_pt registration_factory = (import_registration_factory_pt) hashMap_get(admin->importedServices, endpointDescription->service);
@@ -871,6 +874,8 @@ celix_status_t remoteServiceAdmin_removeImportedService(remote_service_admin_pt
                 importRegistrationFactory_destroy(&registration_factory);
             }
         }
+
+        celixThreadMutex_unlock(&admin->importedServicesLock);
     }
 
     return status;

http://git-wip-us.apache.org/repos/asf/celix/blob/d2593f23/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp b/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
index 2ee5c6c..1c10c72 100644
--- a/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
+++ b/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
@@ -35,83 +35,341 @@ extern "C" {
 #include "framework.h"
 #include "remote_service_admin.h"
 #include "calculator_service.h"
+#include "bundle.h"
 
-    static framework_pt serverFramework = NULL;
-    static bundle_context_pt serverContext = NULL;
+#define NUM_OF_BUNDLES          3
+#define DISCOVERY_CFG_NAME      "apache_celix_rsa_discovery_shm"
+#define RSA_HTTP_NAME           "apache_celix_remote_service_admin_shm"
+#define TOPOLOGY_MANAGER_NAME   "apache_celix_rs_topology_manager"
 
-    static framework_pt clientFramework = NULL;
-    static bundle_context_pt clientContext = NULL;
+static framework_pt serverFramework = NULL;
+static bundle_context_pt serverContext = NULL;
 
-    static void setupFm(void) {
-        int rc = 0;
+static framework_pt clientFramework = NULL;
+static bundle_context_pt clientContext = NULL;
+
+static void setupFm(void) {
+    int rc = 0;
+    bundle_pt bundle = NULL;
+
+    //server
+    rc = celixLauncher_launch("server.properties", &serverFramework);
+    CHECK_EQUAL(CELIX_SUCCESS, rc);
+
+    bundle = NULL;
+    rc = framework_getFrameworkBundle(serverFramework, &bundle);
+    CHECK_EQUAL(CELIX_SUCCESS, rc);
+
+    rc = bundle_getContext(bundle, &serverContext);
+    CHECK_EQUAL(CELIX_SUCCESS, rc);
+
+    //client
+    rc = celixLauncher_launch("client.properties", &clientFramework);
+    CHECK_EQUAL(CELIX_SUCCESS, rc);
+
+    bundle = NULL;
+    rc = framework_getFrameworkBundle(clientFramework, &bundle);
+    CHECK_EQUAL(CELIX_SUCCESS, rc);
+
+    rc = bundle_getContext(bundle, &clientContext);
+    CHECK_EQUAL(CELIX_SUCCESS, rc);
+}
+
+static void teardownFm(void) {
+    celixLauncher_stop(serverFramework);
+    celixLauncher_waitForShutdown(serverFramework);
+    celixLauncher_destroy(serverFramework);
+
+    celixLauncher_stop(clientFramework);
+    celixLauncher_waitForShutdown(clientFramework);
+    celixLauncher_destroy(clientFramework);
+
+    serverContext = NULL;
+    serverFramework = NULL;
+    clientContext = NULL;
+    clientFramework = NULL;
+}
+
+static void test1(void) {
+    celix_status_t status = CELIX_BUNDLE_EXCEPTION;
+    service_reference_pt ref = NULL;
+    calculator_service_pt calcService = NULL;
+    int retries = 12;
+
+    while (ref == NULL && retries > 0) {
+    	printf("Waiting for service .. %d\n", retries);
+		status = bundleContext_getServiceReference(clientContext, (char *) CALCULATOR_SERVICE, &ref);
+		usleep(1000000);
+		--retries;
+    }
+    CHECK_EQUAL(CELIX_SUCCESS, status);
+    CHECK(ref != NULL);
+
+    status = bundleContext_getService(clientContext, ref, (void **) &calcService);
+    CHECK_EQUAL(CELIX_SUCCESS, status);
+    CHECK(calcService != NULL);
+
+    double result = 0;
+    status = calcService->add(calcService->calculator, 2.0, 5.0, &result);
+    CHECK_EQUAL(CELIX_SUCCESS, status);
+    CHECK_EQUAL(7.0, result);
+
+    bundleContext_ungetService(clientContext, ref, NULL);
+    bundleContext_ungetServiceReference(clientContext, ref);
+}
+
+static celix_status_t getPermutations(long bundleIds[], int from, int to, array_list_pt permutations) {
+    celix_status_t status = CELIX_SUCCESS;
+    int i = 0;
+
+    if (from == to) {
+        long* permutation = (long*) calloc(to + 1, sizeof(bundleIds[0]));
+
+        if (!permutation) {
+            status = CELIX_ENOMEM;
+        } else {
+            for (; i <= to; i++) {
+                permutation[i] = bundleIds[i];
+            }
+
+            arrayList_add(permutations, permutation);
+        }
+    } else {
+        for (i = from; i <= to; i++) {
+            long fromOrg = bundleIds[from];
+            long iOrg = bundleIds[i];
+
+            bundleIds[from] = iOrg;
+            bundleIds[i] = fromOrg;
+
+            status = getPermutations(bundleIds, from + 1, to, permutations);
+
+            bundleIds[from] = fromOrg;
+            bundleIds[i] = iOrg;
+        }
+    }
+
+    return status;
+}
+
+static celix_status_t getRemoteServicesBundles(bundle_context_pt context, long rsaBundles[]) {
+    celix_status_t status;
+    array_list_pt bundles = NULL;
+
+    status = bundleContext_getBundles(clientContext, &bundles);
+
+    if (status == CELIX_SUCCESS) {
+        unsigned int size = arrayList_size(bundles);
+        unsigned int bundleCnt = 0;
+        unsigned int i;
+
+        for (i = 0; i < size; i++) {
+            module_pt module = NULL;
+            char *name = NULL;
+
+            bundle_pt bundle = (bundle_pt) arrayList_get(bundles, i);
+
+            status = bundle_getCurrentModule(bundle, &module);
+
+            if (status == CELIX_SUCCESS) {
+                status = module_getSymbolicName(module, &name);
+
+            }
+
+            if (status == CELIX_SUCCESS) {
+                if ((strcmp(name, DISCOVERY_CFG_NAME) == 0) || (strcmp(name, RSA_HTTP_NAME) == 0) || (strcmp(name, TOPOLOGY_MANAGER_NAME) == 0)) {
+                    bundle_archive_pt bundleArchive = NULL;
+                    long bundleId = -1;
+
+                    status = bundle_getArchive(bundle, &bundleArchive);
+
+                    if (status == CELIX_SUCCESS) {
+                        status = bundleArchive_getId(bundleArchive, &bundleId);
+                    }
+
+                    if (status == CELIX_SUCCESS) {
+                        rsaBundles[bundleCnt] = bundleId;
+                        ++bundleCnt;
+                    }
+                }
+            }
+        }
+
+        arrayList_destroy(bundles);
+    }
+
+    return status;
+}
+
+static celix_status_t stopStartPermutation(bundle_context_pt context, long* permutation) {
+    celix_status_t status = CELIX_SUCCESS;
+    int y = 0;
+
+    printf("Test stop/start permutation: ");
+
+    for (y = 0; (y < NUM_OF_BUNDLES) && (status == CELIX_SUCCESS); y++) {
         bundle_pt bundle = NULL;
 
-        //server
-        rc = celixLauncher_launch("server.properties", &serverFramework);
-        CHECK_EQUAL(CELIX_SUCCESS, rc);
+        status = bundleContext_getBundleById(context, permutation[y], &bundle);
+
+        if (status == CELIX_SUCCESS) {
+            module_pt module = NULL;
+            char *name = NULL;
 
-        bundle = NULL;
-        rc = framework_getFrameworkBundle(serverFramework, &bundle);
-        CHECK_EQUAL(CELIX_SUCCESS, rc);
+            status = bundle_getCurrentModule(bundle, &module);
 
-        rc = bundle_getContext(bundle, &serverContext);
-        CHECK_EQUAL(CELIX_SUCCESS, rc);
+            if (status == CELIX_SUCCESS) {
+                status = module_getSymbolicName(module, &name);
+                printf("%s (%ld) ", name, permutation[y]);
+            }
+        }
+    }
+    printf("\n");
 
+    // stop all bundles
+    if (status == CELIX_SUCCESS) {
+        for (y = 0; (y < NUM_OF_BUNDLES) && (status == CELIX_SUCCESS); y++) {
+            bundle_pt bundle = NULL;
 
-        //client
-        rc = celixLauncher_launch("client.properties", &clientFramework);
-        CHECK_EQUAL(CELIX_SUCCESS, rc);
+            status = bundleContext_getBundleById(context, permutation[y], &bundle);
 
-        bundle = NULL;
-        rc = framework_getFrameworkBundle(clientFramework, &bundle);
-        CHECK_EQUAL(CELIX_SUCCESS, rc);
+            if (status == CELIX_SUCCESS) {
+                printf("stop bundle: %ld\n", permutation[y]);
+                status = bundle_stop(bundle);
+            }
 
-        rc = bundle_getContext(bundle, &clientContext);
-        CHECK_EQUAL(CELIX_SUCCESS, rc);
+        }
     }
 
-    static void teardownFm(void) {
-        celixLauncher_stop(serverFramework);
-        celixLauncher_waitForShutdown(serverFramework);
-        celixLauncher_destroy(serverFramework);
+    //usleep(10000000);
+    // verify stop state
+    if (status == CELIX_SUCCESS) {
+        for (y = 0; (y < NUM_OF_BUNDLES) && (status == CELIX_SUCCESS); y++) {
+            bundle_pt bundle = NULL;
+
+            status = bundleContext_getBundleById(context, permutation[y], &bundle);
+
+            if (status == CELIX_SUCCESS) {
+                bundle_state_e state;
+                status = bundle_getState(bundle, &state);
+                module_pt module = NULL;
+                char *name = NULL;
 
-        celixLauncher_stop(clientFramework);
-        celixLauncher_waitForShutdown(clientFramework);
-        celixLauncher_destroy(clientFramework);
+                status = bundle_getCurrentModule(bundle, &module);
 
-        serverContext = NULL;
-        serverFramework = NULL;
-        clientContext = NULL;
-        clientFramework = NULL;
+                status = module_getSymbolicName(module, &name);
+
+                printf("bundle %s (%ld) has state %d (should be %d) \n", name, permutation[y], state, OSGI_FRAMEWORK_BUNDLE_RESOLVED);
+
+                if (state != OSGI_FRAMEWORK_BUNDLE_RESOLVED) {
+                    printf("bundle %ld has state %d (should be %d) \n", permutation[y], state, OSGI_FRAMEWORK_BUNDLE_RESOLVED);
+                    status = CELIX_ILLEGAL_STATE;
+                }
+            }
+
+        }
     }
 
-    static void test1(void) {
-        celix_status_t status;
-        service_reference_pt ref = NULL;
-        calculator_service_pt calcService = NULL;
-        usleep(2000000); //TODO use tracker
+    // start all bundles
+    if (status == CELIX_SUCCESS) {
 
-        status = bundleContext_getServiceReference(clientContext, (char *)CALCULATOR_SERVICE, &ref);
-        CHECK_EQUAL(CELIX_SUCCESS, status);
-        CHECK(ref != NULL);
+        for (y = 0; (y < NUM_OF_BUNDLES) && (status == CELIX_SUCCESS); y++) {
+            bundle_pt bundle = NULL;
+
+            status = bundleContext_getBundleById(context, permutation[y], &bundle);
+
+            if (status == CELIX_SUCCESS) {
+                printf("start bundle: %ld\n", permutation[y]);
+                status = bundle_start(bundle);
+            }
+
+        }
+    }
+
+    // verify started state
+    if (status == CELIX_SUCCESS) {
+        for (y = 0; (y < NUM_OF_BUNDLES) && (status == CELIX_SUCCESS); y++) {
+            bundle_pt bundle = NULL;
+
+            status = bundleContext_getBundleById(context, permutation[y], &bundle);
+
+            if (status == CELIX_SUCCESS) {
+                bundle_state_e state;
+                status = bundle_getState(bundle, &state);
+
+                if (state != OSGI_FRAMEWORK_BUNDLE_ACTIVE) {
+                    printf("bundle %ld has state %d (should be %d) \n", permutation[y], state, OSGI_FRAMEWORK_BUNDLE_ACTIVE);
+                    status = CELIX_ILLEGAL_STATE;
+                }
+            }
+
+        }
+    }
+
+    return status;
+}
 
-        status = bundleContext_getService(clientContext, ref, (void **)&calcService);
-        CHECK_EQUAL(CELIX_SUCCESS, status);
-        CHECK(calcService != NULL);
 
-        double result = 0;
-        status = calcService->add(calcService->calculator, 2.0, 5.0, &result);
+static void testImport(void) {
+    celix_status_t status;
+    array_list_pt bundlePermutations = NULL;
+    long rsaBundles[NUM_OF_BUNDLES];
+    unsigned int i;
+
+    arrayList_create(&bundlePermutations);
+
+    status = getRemoteServicesBundles(clientContext, rsaBundles);
+    CHECK_EQUAL(CELIX_SUCCESS, status);
+
+    status = getPermutations(rsaBundles, 0, NUM_OF_BUNDLES - 1, bundlePermutations);
+    CHECK_EQUAL(CELIX_SUCCESS, status);
+
+    for (i = 0; i < arrayList_size(bundlePermutations); ++i) {
+        long* singlePermutation = (long*) arrayList_get(bundlePermutations, i);
+
+        status = stopStartPermutation(clientContext, singlePermutation);
         CHECK_EQUAL(CELIX_SUCCESS, status);
-        CHECK_EQUAL(7.0, result);
 
-        bundleContext_ungetService(clientContext, ref, NULL);
-        bundleContext_ungetServiceReference(clientContext, ref);
+        // check whether calc service is available
+        test1();
+
+        free(singlePermutation);
     }
 
+    arrayList_destroy(bundlePermutations);
 }
 
+static void testExport(void) {
+    celix_status_t status;
+    array_list_pt bundlePermutations = NULL;
+    long rsaBundles[NUM_OF_BUNDLES];
+    unsigned int i;
+
+    arrayList_create(&bundlePermutations);
+
+    status = getRemoteServicesBundles(serverContext, rsaBundles);
+    CHECK_EQUAL(CELIX_SUCCESS, status);
+
+    status = getPermutations(rsaBundles, 0, NUM_OF_BUNDLES - 1, bundlePermutations);
+    CHECK_EQUAL(CELIX_SUCCESS, status);
+
+    for (i = 0; i < arrayList_size(bundlePermutations); ++i) {
+        long* singlePermutation = (long*) arrayList_get(bundlePermutations, i);
+
+        status = stopStartPermutation(serverContext, singlePermutation);
+        CHECK_EQUAL(CELIX_SUCCESS, status);
+
+        // check whether calc service is available
+        test1();
+
+        free(singlePermutation);
+    }
 
-TEST_GROUP(RsaHttpClientServerTests) {
+    arrayList_destroy(bundlePermutations);
+}
+}
+
+TEST_GROUP(RsaShmClientServerTests) {
     void setup() {
         setupFm();
     }
@@ -121,6 +379,14 @@ TEST_GROUP(RsaHttpClientServerTests) {
     }
 };
 
-TEST(RsaHttpClientServerTests, Test1) {
+TEST(RsaShmClientServerTests, Test1) {
     test1();
 }
+
+TEST(RsaShmClientServerTests, TestImport) {
+    testImport();
+}
+
+TEST(RsaShmClientServerTests, TestExport) {
+    testExport();
+}