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 2019/09/10 19:56:43 UTC

[celix] branch develop updated: Updates dependency manager is active check and adds initial test for dm

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

pnoltes pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/celix.git


The following commit(s) were added to refs/heads/develop by this push:
     new 53d0813  Updates dependency manager is active check and adds initial test for dm
53d0813 is described below

commit 53d0813fe5bd5c4da620e715837ebf418d723fb9
Author: Pepijn Noltes <pe...@gmail.com>
AuthorDate: Tue Sep 10 21:56:15 2019 +0200

    Updates dependency manager is active check and adds initial test for dm
---
 libs/framework/include/celix_dependency_manager.h | 21 +++++--
 libs/framework/src/dm_component_impl.c            |  2 +-
 libs/framework/src/dm_dependency_manager_impl.c   | 34 ++++++++---
 libs/framework/tst/CMakeLists.txt                 |  1 +
 libs/framework/tst/dm_tests.cpp                   | 73 +++++++++++++++++++++++
 5 files changed, 118 insertions(+), 13 deletions(-)

diff --git a/libs/framework/include/celix_dependency_manager.h b/libs/framework/include/celix_dependency_manager.h
index 82ee3a1..a817ae4 100644
--- a/libs/framework/include/celix_dependency_manager.h
+++ b/libs/framework/include/celix_dependency_manager.h
@@ -70,11 +70,6 @@ celix_dependency_manager_info_t* celix_dependencyManager_createInfo(celix_depend
 celix_array_list_t * /*celix_dependency_manager_info_t entries*/ celix_dependencyManager_createInfos(celix_dependency_manager_t *manager);
 
 /**
- * Check if all components - for all bundles - are active (all required dependencies resolved).
- */
-bool celix_dependencyManager_allComponentsActive(celix_dependency_manager_t *manager);
-
-/**
  * Destroys a DM info struct.
  */
 void celix_dependencyManager_destroyInfo(celix_dependency_manager_t *manager, celix_dependency_manager_info_t *info);
@@ -84,6 +79,22 @@ void celix_dependencyManager_destroyInfo(celix_dependency_manager_t *manager, ce
  */
 void celix_dependencyManager_destroyInfos(celix_dependency_manager_t *manager, celix_array_list_t * infos /*entries celix_dependency_manager_info_t*/);
 
+
+/**
+ * Check if all components for the bundle of the dependency manager are active (all required dependencies resolved).
+ */
+bool celix_dependencyManager_areComponentsActive(celix_dependency_manager_t *manager);
+
+/**
+ * Check if all components - for all bundles - are active (all required dependencies resolved).
+ */
+bool celix_dependencyManager_allComponentsActive(celix_dependency_manager_t *manager);
+
+/**
+ * Return the nr of components for this dependency manager
+ */
+size_t celix_dependencyManager_nrOfComponents(celix_dependency_manager_t *manager);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/libs/framework/src/dm_component_impl.c b/libs/framework/src/dm_component_impl.c
index 3897fc9..1187928 100644
--- a/libs/framework/src/dm_component_impl.c
+++ b/libs/framework/src/dm_component_impl.c
@@ -1536,7 +1536,7 @@ void celix_dmComponent_destroyComponentInfo(dm_component_info_pt info) {
 
 bool celix_dmComponent_isActive(celix_dm_component_t *component) {
     pthread_mutex_lock(&component->mutex);
-    bool active = component->active;
+    bool active = component->state == DM_CMP_STATE_TRACKING_OPTIONAL;
     pthread_mutex_unlock(&component->mutex);
     return active;
 }
diff --git a/libs/framework/src/dm_dependency_manager_impl.c b/libs/framework/src/dm_dependency_manager_impl.c
index 3b0aa0f..f63eaf3 100644
--- a/libs/framework/src/dm_dependency_manager_impl.c
+++ b/libs/framework/src/dm_dependency_manager_impl.c
@@ -169,13 +169,11 @@ static void celix_dm_allComponentsActiveCallback(void *handle, const celix_bundl
 	celix_bundle_context_t *context = NULL;
 	bundle_getContext((celix_bundle_t*)bnd, &context);
 	celix_dependency_manager_t *mng = celix_bundleContext_getDependencyManager(context);
-	int size = celix_arrayList_size(mng->components);
-	for (int i = 0; i < size; i += 1) {
-		celix_dm_component_t *cmp = celix_arrayList_get(mng->components, i);
-		if (!celix_dmComponent_isActive(cmp)) {
-			*allActivePtr = false;
-		}
-	}
+    bool allActive = celix_dependencyManager_areComponentsActive(mng);
+    if (!allActive) {
+        *allActivePtr = false;
+    }
+    celixThreadMutex_lock(&mng->mutex);
 }
 
 bool celix_dependencyManager_allComponentsActive(celix_dependency_manager_t *manager) {
@@ -184,6 +182,28 @@ bool celix_dependencyManager_allComponentsActive(celix_dependency_manager_t *man
 	return allActive;
 }
 
+size_t celix_dependencyManager_nrOfComponents(celix_dependency_manager_t *mng) {
+    celixThreadMutex_lock(&mng->mutex);
+    size_t nr = (size_t)celix_arrayList_size(mng->components);
+    celixThreadMutex_unlock(&mng->mutex);
+    return nr;
+}
+
+bool celix_dependencyManager_areComponentsActive(celix_dependency_manager_t *mng) {
+    bool allActive = true;
+    celixThreadMutex_lock(&mng->mutex);
+    int size = celix_arrayList_size(mng->components);
+    for (int i = 0; i < size; i += 1) {
+        celix_dm_component_t *cmp = celix_arrayList_get(mng->components, i);
+        if (!celix_dmComponent_isActive(cmp)) {
+            allActive = false;
+            break;
+        }
+    }
+    celixThreadMutex_unlock(&mng->mutex);
+    return allActive;
+}
+
 void celix_dependencyManager_destroyInfo(celix_dependency_manager_t *manager __attribute__((unused)), celix_dependency_manager_info_t *info) {
 	for (int i = 0; i < celix_arrayList_size(info->components); i += 1) {
 		celix_dm_component_info_t *cmpinfo = (dm_component_info_pt)arrayList_get(info->components, i);
diff --git a/libs/framework/tst/CMakeLists.txt b/libs/framework/tst/CMakeLists.txt
index 76d0990..7bf8af6 100644
--- a/libs/framework/tst/CMakeLists.txt
+++ b/libs/framework/tst/CMakeLists.txt
@@ -27,6 +27,7 @@ add_executable(test_framework
     multiple_frameworks_test.cpp
     bundle_context_bundles_tests.cpp
     bundle_context_services_test.cpp
+    dm_tests.cpp
 )
 
 target_link_libraries(test_framework Celix::framework ${CURL_LIBRARIES} ${CPPUTEST_LIBRARY})
diff --git a/libs/framework/tst/dm_tests.cpp b/libs/framework/tst/dm_tests.cpp
new file mode 100644
index 0000000..4470aa4
--- /dev/null
+++ b/libs/framework/tst/dm_tests.cpp
@@ -0,0 +1,73 @@
+/**
+ *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
+ *
+ *Unless required by applicable law or agreed to in writing,
+ *software distributed under the License is distributed on an
+ *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ *specific language governing permissions and limitations
+ *under the License.
+ */
+
+#include "celix_api.h"
+
+#include <CppUTest/TestHarness.h>
+#include <CppUTest/CommandLineTestRunner.h>
+
+
+TEST_GROUP(DepenencyManagerTests) {
+    framework_t* fw = nullptr;
+    bundle_context_t *ctx = nullptr;
+    properties_t *properties = nullptr;
+
+    void setup() {
+        properties = properties_create();
+        properties_set(properties, "LOGHELPER_ENABLE_STDOUT_FALLBACK", "true");
+        properties_set(properties, "org.osgi.framework.storage.clean", "onFirstInit");
+        properties_set(properties, "org.osgi.framework.storage", ".cacheBundleContextTestFramework");
+
+        fw = celix_frameworkFactory_createFramework(properties);
+        ctx = framework_getContext(fw);
+    }
+
+    void teardown() {
+        celix_frameworkFactory_destroyFramework(fw);
+    }
+};
+
+TEST(DepenencyManagerTests, DmCreateComponent) {
+    auto *mng = celix_bundleContext_getDependencyManager(ctx);
+    auto *cmp = celix_dmComponent_create(ctx, "test1");
+    celix_dependencyManager_add(mng, cmp);
+
+    CHECK_EQUAL(1, celix_dependencyManager_nrOfComponents(mng));
+    CHECK_TRUE(celix_dependencyManager_allComponentsActive(mng));
+
+    cmp = celix_dmComponent_create(ctx, "test2");
+    celix_dependencyManager_add(mng, cmp);
+
+    CHECK_EQUAL(2, celix_dependencyManager_nrOfComponents(mng));
+    CHECK_TRUE(celix_dependencyManager_allComponentsActive(mng));
+}
+
+TEST(DepenencyManagerTests, TestCheckActive) {
+    auto *mng = celix_bundleContext_getDependencyManager(ctx);
+    auto *cmp = celix_dmComponent_create(ctx, "test1");
+
+    auto *dep = celix_dmServiceDependency_create();
+    celix_dmServiceDependency_setService(dep, "svcname", nullptr, nullptr);
+    celix_dmServiceDependency_setRequired(dep, true);
+    celix_dmComponent_addServiceDependency(cmp, dep); //required dep -> cmp not active
+
+
+    celix_dependencyManager_add(mng, cmp);
+    CHECK_FALSE(celix_dependencyManager_areComponentsActive(mng));
+}