You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by ab...@apache.org on 2013/10/02 11:16:55 UTC
svn commit: r1528394 [4/4] - in /incubator/celix/trunk: cmake/ framework/
framework/private/mock/ framework/private/resources-test/
framework/private/test/ framework/public/include/
Added: incubator/celix/trunk/framework/private/test/service_tracker_test.cpp
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/test/service_tracker_test.cpp?rev=1528394&view=auto
==============================================================================
--- incubator/celix/trunk/framework/private/test/service_tracker_test.cpp (added)
+++ incubator/celix/trunk/framework/private/test/service_tracker_test.cpp Wed Oct 2 09:16:54 2013
@@ -0,0 +1,832 @@
+/**
+ *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.
+ */
+/*
+ * service_tracker_test.cpp
+ *
+ * \date Feb 6, 2013
+ * \author <a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "CppUTest/TestHarness.h"
+#include "CppUTest/TestHarness_c.h"
+#include "CppUTest/CommandLineTestRunner.h"
+#include "CppUTestExt/MockSupport.h"
+
+extern "C"
+{
+#include "service_tracker_private.h"
+#include "service_reference_private.h"
+}
+
+int main(int argc, char** argv) {
+ return RUN_ALL_TESTS(argc, argv);
+}
+
+TEST_GROUP(service_tracker) {
+ apr_pool_t *pool;
+
+ void setup(void) {
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+ }
+
+ void teardown() {
+ apr_pool_destroy(pool);
+ mock().checkExpectations();
+ mock().clear();
+ }
+};
+
+TEST(service_tracker, create) {
+ celix_status_t status;
+ service_tracker_pt tracker = NULL;
+ bundle_context_pt ctx = (bundle_context_pt) 0x123;
+ std::string service = "service";
+ status = serviceTracker_create(pool, ctx, (char *) service.c_str(), NULL, &tracker);
+
+ LONGS_EQUAL(CELIX_SUCCESS, status);
+ POINTERS_EQUAL(ctx, tracker->context);
+ POINTERS_EQUAL(NULL, tracker->customizer);
+ POINTERS_EQUAL(NULL, tracker->listener);
+ POINTERS_EQUAL(pool, tracker->pool);
+ POINTERS_EQUAL(tracker, tracker->tracker);
+ STRCMP_EQUAL("(objectClass=service)", tracker->filter);
+}
+
+TEST(service_tracker, createWithFilter) {
+ celix_status_t status;
+ service_tracker_pt tracker = NULL;
+ bundle_context_pt ctx = (bundle_context_pt) 0x123;
+ std::string filter = "(objectClass=test)";
+ status = serviceTracker_createWithFilter(pool, ctx, (char *) filter.c_str(), NULL, &tracker);
+
+ LONGS_EQUAL(CELIX_SUCCESS, status);
+ POINTERS_EQUAL(ctx, tracker->context);
+ POINTERS_EQUAL(NULL, tracker->customizer);
+ POINTERS_EQUAL(NULL, tracker->listener);
+ POINTERS_EQUAL(pool, tracker->pool);
+ POINTERS_EQUAL(tracker, tracker->tracker);
+ STRCMP_EQUAL("(objectClass=test)", tracker->filter);
+}
+
+TEST(service_tracker, destroy) {
+ celix_status_t status;
+ service_tracker_pt tracker = NULL;
+ bundle_context_pt ctx = (bundle_context_pt) 0x123;
+ std::string filter = "(objectClass=test)";
+ status = serviceTracker_createWithFilter(pool, ctx, (char *) filter.c_str(), NULL, &tracker);
+ service_listener_pt listener = (service_listener_pt) 0x20;
+ tracker->listener = listener;
+
+ mock()
+ .expectOneCall("bundleContext_removeServiceListener")
+ .withParameter("context", ctx)
+ .withParameter("listener", listener)
+ .andReturnValue(CELIX_SUCCESS);
+}
+
+TEST(service_tracker, open) {
+ // Without initial services and no customizer
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ std::string filter = "(objectClass=service)";
+ tracker->filter = (char *) filter.c_str();
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+
+ array_list_pt refs = NULL;
+ arrayList_create(pool, &refs);
+
+ mock().strictOrder();
+ mock()
+ .expectOneCall("bundleContext_getServiceReferences")
+ .withParameter("context", ctx)
+ .withParameter("serviceName", (char *) NULL)
+ .withParameter("filter", "(objectClass=service)")
+ .andOutputParameter("service_references", refs)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("bundleContext_addServiceListener")
+ .withParameter("context", ctx)
+ .withParameter("filter", "(objectClass=service)")
+ .ignoreOtherParameters()
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_open(tracker);
+ CHECK(tracker->listener != NULL);
+
+ // No services should be found
+ LONGS_EQUAL(0, arrayList_size(tracker->tracked));
+}
+
+TEST(service_tracker, open_withRefs) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ tracker->customizer = NULL;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ std::string filter = "(objectClass=service)";
+ tracker->filter = (char *) filter.c_str();
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+// // add tracked to tracker->tracked
+// tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+// entry->service = (void *) 0x31;
+// service_reference_pt ref = (service_reference_pt) 0x51;
+// entry->reference = ref;
+// arrayList_add(tracked, entry);
+// tracked_pt entry2 = (tracked_pt) malloc(sizeof(*entry));
+// entry2->service = (void *) 0x32;
+// service_reference_pt ref2 = (service_reference_pt) 0x52;
+// entry2->reference = ref2;
+// arrayList_add(tracked, entry2);
+
+ array_list_pt refs = NULL;
+ arrayList_create(pool, &refs);
+ service_reference_pt ref = (service_reference_pt) apr_palloc(pool, sizeof(*ref));
+ arrayList_add(refs, ref);
+ void *src = (void *) 0x345;
+
+// mock().strictOrder();
+ mock()
+ .expectOneCall("bundleContext_getServiceReferences")
+ .withParameter("context", ctx)
+ .withParameter("serviceName", (char *) NULL)
+ .withParameter("filter", "(objectClass=service)")
+ .andOutputParameter("service_references", refs)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("bundleContext_addServiceListener")
+ .withParameter("context", ctx)
+ .withParameter("filter", "(objectClass=service)")
+ .ignoreOtherParameters()
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("bundleContext_getService")
+ .withParameter("context", ctx)
+ .withParameter("reference", ref)
+ .andOutputParameter("service_instance", src)
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_open(tracker);
+ CHECK(tracker->listener != NULL);
+
+ // One service should be found
+ LONGS_EQUAL(1, arrayList_size(tracker->tracked));
+}
+
+TEST(service_tracker, open_withRefsAndTracked) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ tracker->customizer = NULL;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ std::string filter = "(objectClass=service)";
+ tracker->filter = (char *) filter.c_str();
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+ // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ array_list_pt refs = NULL;
+ arrayList_create(pool, &refs);
+ arrayList_add(refs, ref);
+ void *src = (void *) 0x345;
+
+// mock().strictOrder();
+ mock()
+ .expectOneCall("bundleContext_getServiceReferences")
+ .withParameter("context", ctx)
+ .withParameter("serviceName", (char *) NULL)
+ .withParameter("filter", "(objectClass=service)")
+ .andOutputParameter("service_references", refs)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("bundleContext_addServiceListener")
+ .withParameter("context", ctx)
+ .withParameter("filter", "(objectClass=service)")
+ .ignoreOtherParameters()
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceReference_equals")
+ .withParameter("reference", ref)
+ .andOutputParameter("equal", true)
+ .ignoreOtherParameters()
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_open(tracker);
+ CHECK(tracker->listener != NULL);
+
+ // One service should be found
+ LONGS_EQUAL(1, arrayList_size(tracker->tracked));
+}
+
+TEST(service_tracker, close) {
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->customizer = NULL;
+ bundle_context_pt ctx = (bundle_context_pt) 0x345;
+ tracker->context = ctx;
+ // new tracker->listener
+ service_listener_pt listener = (service_listener_pt) 0x42;
+ tracker->listener = (service_listener_pt) listener;
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+ // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ mock()
+ .expectOneCall("bundleContext_removeServiceListener")
+ .withParameter("context", ctx)
+ .withParameter("listener", listener)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceReference_equals")
+ .withParameter("reference", ref)
+ .withParameter("compareTo", ref)
+ .andOutputParameter("equal", true)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("bundleContext_ungetService")
+ .withParameter("context", ctx)
+ .withParameter("reference", ref)
+ .andOutputParameter("result", true)
+ .andReturnValue(CELIX_SUCCESS);
+
+ serviceTracker_close(tracker);
+}
+
+TEST(service_tracker, getServiceReference) {
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+ // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+ tracked_pt entry2 = (tracked_pt) malloc(sizeof(*entry));
+ entry2->service = (void *) 0x32;
+ service_reference_pt ref2 = (service_reference_pt) 0x52;
+ entry2->reference = ref2;
+ arrayList_add(tracked, entry2);
+
+ service_reference_pt reference = serviceTracker_getServiceReference(tracker);
+ POINTERS_EQUAL(ref, reference);
+}
+
+TEST(service_tracker, getServiceReferenceNull) {
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+
+ service_reference_pt reference = serviceTracker_getServiceReference(tracker);
+ POINTERS_EQUAL(NULL, reference);
+}
+
+TEST(service_tracker, getServiceReferences) {
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+ // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+ tracked_pt entry2 = (tracked_pt) malloc(sizeof(*entry));
+ entry2->service = (void *) 0x32;
+ service_reference_pt ref2 = (service_reference_pt) 0x52;
+ entry2->reference = ref2;
+ arrayList_add(tracked, entry2);
+
+ array_list_pt references = serviceTracker_getServiceReferences(tracker);
+ LONGS_EQUAL(2, arrayList_size(references));
+ POINTERS_EQUAL(ref, arrayList_get(references, 0));
+ POINTERS_EQUAL(ref2, arrayList_get(references, 1));
+}
+
+TEST(service_tracker, getService) {
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+ // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+ tracked_pt entry2 = (tracked_pt) malloc(sizeof(*entry));
+ entry2->service = (void *) 0x32;
+ service_reference_pt ref2 = (service_reference_pt) 0x52;
+ entry2->reference = ref2;
+ arrayList_add(tracked, entry2);
+
+ void *service = serviceTracker_getService(tracker);
+ POINTERS_EQUAL(0x31, service);
+}
+
+TEST(service_tracker, getServiceNull) {
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+
+ void *service = serviceTracker_getService(tracker);
+ POINTERS_EQUAL(NULL, service);
+}
+
+TEST(service_tracker, getServices) {
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+ // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+ tracked_pt entry2 = (tracked_pt) malloc(sizeof(*entry));
+ entry2->service = (void *) 0x32;
+ service_reference_pt ref2 = (service_reference_pt) 0x52;
+ entry2->reference = ref2;
+ arrayList_add(tracked, entry2);
+
+ array_list_pt services = serviceTracker_getServices(tracker);
+ LONGS_EQUAL(2, arrayList_size(services));
+ POINTERS_EQUAL(0x31, arrayList_get(services, 0));
+ POINTERS_EQUAL(0x32, arrayList_get(services, 1));
+}
+
+TEST(service_tracker, getServiceByReference) {
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+ // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ mock()
+ .expectOneCall("serviceReference_equals")
+ .withParameter("reference", ref)
+ .andOutputParameter("equal", true)
+ .ignoreOtherParameters()
+ .andReturnValue(4)
+ .withCallOrder(1);
+ void *service = serviceTracker_getServiceByReference(tracker, ref);
+ POINTERS_EQUAL(0x31, service);
+}
+
+TEST(service_tracker, getServiceByReferenceNull) {
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+ // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ mock()
+ .expectOneCall("serviceReference_equals")
+ .withParameter("reference", ref)
+ .andOutputParameter("equal", false)
+ .ignoreOtherParameters()
+ .andReturnValue(CELIX_SUCCESS)
+ .withCallOrder(1);
+ void *service = serviceTracker_getServiceByReference(tracker, ref);
+ POINTERS_EQUAL(NULL, service);
+}
+
+TEST(service_tracker, serviceChangedRegistered) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ tracker->customizer = NULL;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ service_listener_pt listener = (service_listener_pt) apr_palloc(pool, sizeof(*listener));
+ tracker->listener = listener;
+ listener->handle = tracker;
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ void *src = (void *) 0x345;
+
+ service_event_pt event = (service_event_pt) apr_palloc(pool, sizeof(*event));
+ event->type = SERVICE_EVENT_REGISTERED;
+ event->reference = ref;
+
+ mock()
+ .expectOneCall("bundleContext_getService")
+ .withParameter("context", ctx)
+ .withParameter("reference", ref)
+ .andOutputParameter("service_instance", src)
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_serviceChanged(listener, event);
+}
+
+TEST(service_tracker, serviceChangedModified) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ tracker->customizer = NULL;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ service_listener_pt listener = (service_listener_pt) apr_palloc(pool, sizeof(*listener));
+ tracker->listener = listener;
+ listener->handle = tracker;
+
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+// // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ service_event_pt event = (service_event_pt) apr_palloc(pool, sizeof(*event));
+ event->type = SERVICE_EVENT_MODIFIED;
+ event->reference = ref;
+
+ mock()
+ .expectOneCall("serviceReference_equals")
+ .withParameter("reference", ref)
+ .andOutputParameter("equal", true)
+ .ignoreOtherParameters()
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_serviceChanged(listener, event);
+}
+
+TEST(service_tracker, serviceChangedUnregistering) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ tracker->customizer = NULL;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ service_listener_pt listener = (service_listener_pt) apr_palloc(pool, sizeof(*listener));
+ tracker->listener = listener;
+ listener->handle = tracker;
+
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+// // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ service_event_pt event = (service_event_pt) apr_palloc(pool, sizeof(*event));
+ event->type = SERVICE_EVENT_UNREGISTERING;
+ event->reference = ref;
+
+ mock()
+ .expectOneCall("serviceReference_equals")
+ .withParameter("reference", ref)
+ .withParameter("compareTo", ref)
+ .andOutputParameter("equal", true)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("bundleContext_ungetService")
+ .withParameter("context", ctx)
+ .withParameter("reference", ref)
+ .andOutputParameter("result", true)
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_serviceChanged(listener, event);
+}
+
+TEST(service_tracker, serviceChangedModifiedEndmatch) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ service_listener_pt listener = (service_listener_pt) apr_palloc(pool, sizeof(*listener));
+ tracker->listener = listener;
+ listener->handle = tracker;
+
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+// // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ service_event_pt event = (service_event_pt) apr_palloc(pool, sizeof(*event));
+ event->type = SERVICE_EVENT_MODIFIED_ENDMATCH;
+ event->reference = ref;
+
+ serviceTracker_serviceChanged(listener, event);
+}
+
+extern "C" {
+ celix_status_t serviceDependency_addingService(void * handle, service_reference_pt reference, void **service) {
+ *service = (void*) 0x45;
+ return CELIX_SUCCESS;
+ }
+
+ celix_status_t serviceDependency_addedService(void * handle, service_reference_pt reference, void *service) {
+ return CELIX_SUCCESS;
+ }
+}
+
+TEST(service_tracker, serviceChangedRegisteredCustomizer) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ service_listener_pt listener = (service_listener_pt) apr_palloc(pool, sizeof(*listener));
+ tracker->listener = listener;
+ listener->handle = tracker;
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+ service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
+ tracker->customizer = customizer;
+
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ void *src = (void *) 0x345;
+
+ void * handle = (void*) 0x60;
+
+ service_event_pt event = (service_event_pt) apr_palloc(pool, sizeof(*event));
+ event->type = SERVICE_EVENT_REGISTERED;
+ event->reference = ref;
+
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getHandle")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("handle", handle)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getAddingFunction")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("function", (void *) serviceDependency_addingService)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getHandle")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("handle", handle)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getAddedFunction")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("function", (void *) serviceDependency_addedService)
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_serviceChanged(listener, event);
+}
+
+
+extern "C" {
+ celix_status_t serviceDependency_modifiedService(void * handle, service_reference_pt reference, void * service) {
+ return CELIX_SUCCESS;
+ }
+}
+
+TEST(service_tracker, serviceChangedModifiedCustomizer) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ service_listener_pt listener = (service_listener_pt) apr_palloc(pool, sizeof(*listener));
+ tracker->listener = listener;
+ listener->handle = tracker;
+ service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
+ tracker->customizer = customizer;
+
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+// // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ service_event_pt event = (service_event_pt) apr_palloc(pool, sizeof(*event));
+ event->type = SERVICE_EVENT_MODIFIED;
+ event->reference = ref;
+
+ void * handle = (void*) 0x60;
+
+ mock()
+ .expectOneCall("serviceReference_equals")
+ .withParameter("reference", ref)
+ .andOutputParameter("equal", true)
+ .ignoreOtherParameters()
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getHandle")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("handle", handle)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getModifiedFunction")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("function", (void *) serviceDependency_modifiedService)
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_serviceChanged(listener, event);
+}
+
+extern "C" {
+ celix_status_t serviceDependency_removedService(void * handle, service_reference_pt reference, void * service) {
+ return CELIX_SUCCESS;
+ }
+}
+
+TEST(service_tracker, serviceChangedUnregisteringCustomizer) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ service_listener_pt listener = (service_listener_pt) apr_palloc(pool, sizeof(*listener));
+ tracker->listener = listener;
+ listener->handle = tracker;
+ service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
+ tracker->customizer = customizer;
+
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+// // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ service_event_pt event = (service_event_pt) apr_palloc(pool, sizeof(*event));
+ event->type = SERVICE_EVENT_UNREGISTERING;
+ event->reference = ref;
+
+ void * handle = (void*) 0x60;
+
+ mock()
+ .expectOneCall("serviceReference_equals")
+ .withParameter("reference", ref)
+ .withParameter("compareTo", ref)
+ .andOutputParameter("equal", true)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getHandle")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("handle", handle)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getRemovedFunction")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("function", (void *) serviceDependency_removedService)
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_serviceChanged(listener, event);
+}
+
+TEST(service_tracker, serviceChangedUnregisteringCustomizerNoFunc) {
+ // With one initial service
+ // new tracker
+ service_tracker_pt tracker = (service_tracker_pt) apr_palloc(pool, sizeof(*tracker));
+ tracker->pool = pool;
+ bundle_context_pt ctx = (bundle_context_pt) 0x10;
+ tracker->context = ctx;
+ service_listener_pt listener = (service_listener_pt) apr_palloc(pool, sizeof(*listener));
+ tracker->listener = listener;
+ listener->handle = tracker;
+ service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
+ tracker->customizer = customizer;
+
+ // new tracker->tracked
+ array_list_pt tracked = NULL;
+ arrayList_create(pool, &tracked);
+ tracker->tracked = tracked;
+// // add tracked to tracker->tracked
+ tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
+ entry->service = (void *) 0x31;
+ service_reference_pt ref = (service_reference_pt) 0x51;
+ entry->reference = ref;
+ arrayList_add(tracked, entry);
+
+ service_event_pt event = (service_event_pt) apr_palloc(pool, sizeof(*event));
+ event->type = SERVICE_EVENT_UNREGISTERING;
+ event->reference = ref;
+
+ void * handle = (void*) 0x60;
+
+ mock()
+ .expectOneCall("serviceReference_equals")
+ .withParameter("reference", ref)
+ .withParameter("compareTo", ref)
+ .andOutputParameter("equal", true)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getHandle")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("handle", handle)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("serviceTrackerCustomizer_getRemovedFunction")
+ .withParameter("customizer", customizer)
+ .andOutputParameter("function", (void *) NULL)
+ .andReturnValue(CELIX_SUCCESS);
+ mock()
+ .expectOneCall("bundleContext_ungetService")
+ .withParameter("context", ctx)
+ .withParameter("reference", ref)
+ .andOutputParameter("result", true)
+ .andReturnValue(CELIX_SUCCESS);
+ serviceTracker_serviceChanged(listener, event);
+}
+
+
+
Added: incubator/celix/trunk/framework/private/test/utils_test.cpp
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/test/utils_test.cpp?rev=1528394&view=auto
==============================================================================
--- incubator/celix/trunk/framework/private/test/utils_test.cpp (added)
+++ incubator/celix/trunk/framework/private/test/utils_test.cpp Wed Oct 2 09:16:54 2013
@@ -0,0 +1,203 @@
+/**
+ *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.
+ */
+/*
+ * utils_test.cpp
+ *
+ * \date Feb 6, 2013
+ * \author <a href="mailto:celix-dev@incubator.apache.org">Apache Celix Project Team</a>
+ * \copyright Apache License, Version 2.0
+ */
+#include "CppUTest/TestHarness.h"
+#include "CppUTest/TestHarness_c.h"
+#include "CppUTest/CommandLineTestRunner.h"
+
+extern "C"
+{
+#include "utils.h"
+}
+
+int main(int argc, char** argv) {
+ return RUN_ALL_TESTS(argc, argv);
+}
+
+TEST_GROUP(utils) {
+
+ void setup(void) {
+ }
+
+ void teardown() {
+ }
+};
+
+TEST(utils, stringHash) {
+ std::string toHash = "abc";
+ unsigned int hash;
+ hash = utils_stringHash((void *) toHash.c_str());
+ LONGS_EQUAL(446371745, hash);
+
+ toHash = "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz";
+ hash = utils_stringHash((void *) toHash.c_str());
+ LONGS_EQUAL(1508668412, hash);
+
+ toHash = "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz";
+ hash = utils_stringHash((void *) toHash.c_str());
+ LONGS_EQUAL(829630780, hash);
+}
+
+TEST(utils, stringEquals) {
+ // Compare with equal strings
+ std::string org = "abc";
+ std::string cmp = "abc";
+
+ int result = utils_stringEquals((void *) org.c_str(), (void *) cmp.c_str());
+ CHECK(result);
+
+ // Compare with no equal strings
+ cmp = "abcd";
+
+ result = utils_stringEquals((void *) org.c_str(), (void *) cmp.c_str());
+ CHECK(!result);
+
+ // Compare with numeric strings
+ org = "123";
+ cmp = "123";
+
+ result = utils_stringEquals((void *) org.c_str(), (void *) cmp.c_str());
+ CHECK(result);
+
+ // Compare with long strings
+ org = "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz";
+ cmp = "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
+ "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz";
+
+ result = utils_stringEquals((void *) org.c_str(), (void *) cmp.c_str());
+ CHECK(result);
+}
+
+TEST(utils, stringTrim) {
+ // Multiple whitespaces, before, after and in between
+ std::string toTrim = " a b c ";
+ char *result = utils_stringTrim((char*) toTrim.c_str());
+
+ STRCMP_EQUAL("a b c", result);
+
+ // No whitespaces
+ toTrim = "abc";
+ result = utils_stringTrim((char*) toTrim.c_str());
+
+ STRCMP_EQUAL("abc", result);
+
+ // Only whitespace before
+ toTrim = " abc";
+ result = utils_stringTrim((char*) toTrim.c_str());
+
+ STRCMP_EQUAL("abc", result);
+
+ // Only whitespace after
+ toTrim = "abc ";
+ result = utils_stringTrim((char*) toTrim.c_str());
+
+ STRCMP_EQUAL("abc", result);
+
+ // Whitespace other then space (tab, cr..).
+ toTrim = "\tabc \n asdf \n";
+ result = utils_stringTrim((char*) toTrim.c_str());
+
+ STRCMP_EQUAL("abc \n asdf", result);
+}
+
+TEST(utils, isNumeric) {
+ // Check numeric string
+ std::string toCheck = "42";
+
+ bool result;
+ celix_status_t status = utils_isNumeric((char *) toCheck.c_str(), &result);
+ LONGS_EQUAL(CELIX_SUCCESS, status);
+ CHECK_C(result);
+
+ // Check non numeric string
+ toCheck = "42b";
+ status = utils_isNumeric((char *) toCheck.c_str(), &result);
+ LONGS_EQUAL(CELIX_SUCCESS, status);
+ CHECK_C(!result);
+}
+
+
Modified: incubator/celix/trunk/framework/private/test/version_range_test.cpp
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/test/version_range_test.cpp?rev=1528394&r1=1528393&r2=1528394&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/test/version_range_test.cpp (original)
+++ incubator/celix/trunk/framework/private/test/version_range_test.cpp Wed Oct 2 09:16:54 2013
@@ -64,7 +64,8 @@ extern "C"
}
int main(int argc, char** argv) {
- return RUN_ALL_TESTS(argc, argv);
+ RUN_ALL_TESTS(argc, argv);
+ return 0;
}
TEST_GROUP(version_range) {
@@ -180,7 +181,8 @@ TEST(version_range, parse) {
.withParameter("versionStr", "7.8.9")
.andOutputParameter("version", high);
- status = versionRange_parse(pool, "[1.2.3, 7.8.9]", &range);
+ std::string version = "[1.2.3, 7.8.9]";
+ status = versionRange_parse(pool, (char *) version.c_str(), &range);
LONGS_EQUAL(CELIX_SUCCESS, status);
}
Modified: incubator/celix/trunk/framework/public/include/service_event.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/public/include/service_event.h?rev=1528394&r1=1528393&r2=1528394&view=diff
==============================================================================
--- incubator/celix/trunk/framework/public/include/service_event.h (original)
+++ incubator/celix/trunk/framework/public/include/service_event.h Wed Oct 2 09:16:54 2013
@@ -29,11 +29,6 @@
#ifndef SERVICE_EVENT_H_
#define SERVICE_EVENT_H_
-typedef enum serviceEventType service_event_type_e;
-typedef struct serviceEvent *service_event_pt;
-
-#include "service_reference.h"
-
enum serviceEventType
{
SERVICE_EVENT_REGISTERED = 0x00000001,
@@ -42,6 +37,12 @@ enum serviceEventType
SERVICE_EVENT_MODIFIED_ENDMATCH = 0x00000008,
};
+typedef enum serviceEventType service_event_type_e;
+
+typedef struct serviceEvent *service_event_pt;
+
+#include "service_reference.h"
+
#include "service_reference.h"
struct serviceEvent {