blob: 45898a1651d058e1754331d8358d34298ee6b461 [file]
/**
*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:dev@celix.apache.org">Apache Celix Project Team</a>
* \copyright Apache License, Version 2.0
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.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"
#include "celix_log.h"
framework_logger_pt logger = (framework_logger_pt) 0x42;
}
int main(int argc, char** argv) {
return RUN_ALL_TESTS(argc, argv);
}
static char* my_strdup(const char* s) {
if (s == NULL) {
return NULL;
}
size_t len = strlen(s);
char *d = (char*) calloc(len + 1, sizeof(char));
if (d == NULL) {
return NULL;
}
strncpy(d, s, len);
return d;
}
TEST_GROUP(service_tracker) {
void setup(void) {
}
void teardown() {
mock().checkExpectations();
mock().clear();
}
};
TEST(service_tracker, create) {
celix_status_t status;
service_tracker_pt tracker = NULL;
bundle_context_pt context = (bundle_context_pt) 0x123;
char * service = my_strdup("service");
status = serviceTracker_create(context, service, NULL, &tracker);
LONGS_EQUAL(CELIX_SUCCESS, status);
POINTERS_EQUAL(context, tracker->context);
POINTERS_EQUAL(NULL, tracker->customizer);
POINTERS_EQUAL(NULL, tracker->listener);
POINTERS_EQUAL(tracker, tracker->tracker);
STRCMP_EQUAL("(objectClass=service)", tracker->filter);
serviceTracker_destroy(tracker);
free(service);
}
TEST(service_tracker, createWithCustomizer) {
celix_status_t status;
service_tracker_pt tracker = NULL;
bundle_context_pt context = (bundle_context_pt) 0x123;
char * service = my_strdup("service");
service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
status = serviceTracker_create(context, service, customizer, &tracker);
LONGS_EQUAL(CELIX_SUCCESS, status);
POINTERS_EQUAL(context, tracker->context);
POINTERS_EQUAL(customizer, tracker->customizer);
POINTERS_EQUAL(NULL, tracker->listener);
POINTERS_EQUAL(tracker, tracker->tracker);
STRCMP_EQUAL("(objectClass=service)", tracker->filter);
mock().expectOneCall("serviceTrackerCustomizer_destroy")
.withParameter("customizer", customizer);
serviceTracker_destroy(tracker);
free(service);
}
TEST(service_tracker, createWithFilter) {
celix_status_t status;
service_tracker_pt tracker = NULL;
bundle_context_pt context = (bundle_context_pt) 0x123;
char * filter = my_strdup("(objectClass=test)");
status = serviceTracker_createWithFilter(context, filter, NULL, &tracker);
LONGS_EQUAL(CELIX_SUCCESS, status);
POINTERS_EQUAL(context, tracker->context);
POINTERS_EQUAL(NULL, tracker->customizer);
POINTERS_EQUAL(NULL, tracker->listener);
POINTERS_EQUAL(tracker, tracker->tracker);
STRCMP_EQUAL("(objectClass=test)", tracker->filter);
serviceTracker_destroy(tracker);
free(filter);
}
TEST(service_tracker, createWithFilterWithCustomizer) {
celix_status_t status;
service_tracker_pt tracker = NULL;
bundle_context_pt context = (bundle_context_pt) 0x123;
service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
char * filter = my_strdup("(objectClass=test)");
status = serviceTracker_createWithFilter(context, filter, customizer, &tracker);
LONGS_EQUAL(CELIX_SUCCESS, status);
POINTERS_EQUAL(context, tracker->context);
POINTERS_EQUAL(customizer, tracker->customizer);
POINTERS_EQUAL(NULL, tracker->listener);
POINTERS_EQUAL(tracker, tracker->tracker);
STRCMP_EQUAL("(objectClass=test)", tracker->filter);
mock().expectOneCall("serviceTrackerCustomizer_destroy")
.withParameter("customizer", customizer);
serviceTracker_destroy(tracker);
free(filter);
}
TEST(service_tracker, destroy) {
celix_status_t status;
service_tracker_pt tracker = NULL;
bundle_context_pt context = (bundle_context_pt) 0x123;
char * filter = my_strdup("(objectClass=test)");
status = serviceTracker_createWithFilter(context, filter, NULL, &tracker);
LONGS_EQUAL(CELIX_SUCCESS, status);
service_listener_pt listener = (service_listener_pt) calloc(1, sizeof(serviceListener));
tracker->listener = listener;
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
status = serviceTracker_destroy(tracker);
LONGS_EQUAL(CELIX_SUCCESS, status);
free(filter);
}
TEST(service_tracker, open) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * filter = my_strdup("(objectClass=service)");
service_tracker_pt tracker = NULL;
serviceTracker_createWithFilter(context, filter, NULL, &tracker);
array_list_pt refs = NULL;
arrayList_create(&refs);
mock().strictOrder();
mock()
.expectOneCall("bundleContext_getServiceReferences")
.withParameter("context", context)
.withParameter("serviceName", (char *) NULL)
.withParameter("filter", "(objectClass=service)")
.withOutputParameterReturning("service_references", &refs, sizeof(refs));
mock()
.expectOneCall("bundleContext_addServiceListener")
.withParameter("context", context)
.withParameter("filter", "(objectClass=service)")
.ignoreOtherParameters();
serviceTracker_open(tracker);
CHECK(tracker->listener != NULL);
// No services should be found
LONGS_EQUAL(0, arrayList_size(tracker->trackedServices));
mock().expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.ignoreOtherParameters();
serviceTracker_destroy(tracker);
free(filter);
}
TEST(service_tracker, open_withRefs) {
celix_status_t status;
service_tracker_pt tracker = NULL;
bundle_context_pt context = (bundle_context_pt) 0x123;
char * filter = my_strdup("(objectClass=test)");
status = serviceTracker_createWithFilter(context, filter, NULL, &tracker);
LONGS_EQUAL(CELIX_SUCCESS, status);
tracker->listener = NULL;
array_list_pt refs = NULL;
arrayList_create(&refs);
service_reference_pt ref = (service_reference_pt) malloc(sizeof(*ref));
arrayList_add(refs, ref);
void *src = (void *) 0x345;
mock()
.expectOneCall("bundleContext_getServiceReferences")
.withParameter("context", context)
.withParameter("serviceName", (char *) NULL)
.withParameter("filter", filter)
.withOutputParameterReturning("service_references", &refs, sizeof(refs));
mock()
.expectOneCall("bundleContext_addServiceListener")
.withParameter("context", context)
.withParameter("filter", filter)
.ignoreOtherParameters();
mock()
.expectOneCall("bundleContext_retainServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
mock()
.expectOneCall("bundleContext_getService")
.withParameter("context", context)
.withParameter("reference", ref)
.withOutputParameterReturning("service_instance", &src, sizeof(src));
serviceTracker_open(tracker);
CHECK(tracker->listener != NULL);
tracked_pt get_tracked = (tracked_pt) arrayList_get(tracker->trackedServices, 0);
POINTERS_EQUAL(src, get_tracked->service);
POINTERS_EQUAL(ref, get_tracked->reference);
// One service should be found
LONGS_EQUAL(1, arrayList_size(tracker->trackedServices));
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.ignoreOtherParameters();
serviceTracker_destroy(tracker);
free(ref);
free(get_tracked);
free(filter);
}
TEST(service_tracker, open_withRefsAndTracked) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
service_reference_pt ref = (service_reference_pt) 0x02;
entry->reference = ref;
arrayList_add(tracker->trackedServices, entry);
array_list_pt refs = NULL;
arrayList_create(&refs);
arrayList_add(refs, ref);
mock()
.expectOneCall("bundleContext_getServiceReferences")
.withParameter("context", context)
.withParameter("serviceName", (char *) NULL)
.withParameter("filter", "(objectClass=service_name)")
.withOutputParameterReturning("service_references", &refs, sizeof(refs));
mock()
.expectOneCall("bundleContext_addServiceListener")
.withParameter("context", context)
.withParameter("filter", "(objectClass=service_name)")
.ignoreOtherParameters();
mock()
.expectOneCall("bundleContext_retainServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
bool equal = true;
mock()
.expectOneCall("serviceReference_equals")
.withParameter("reference", ref)
.withParameter("compareTo", ref)
.withOutputParameterReturning("equal", &equal, sizeof(equal))
.andReturnValue(CELIX_SUCCESS);
serviceTracker_open(tracker);
CHECK(tracker->listener != NULL);
// One service should be found
LONGS_EQUAL(1, arrayList_size(tracker->trackedServices));
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.ignoreOtherParameters();
serviceTracker_destroy(tracker);
free(entry);
free(service);
}
TEST(service_tracker, close) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener));
tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
service_reference_pt ref = (service_reference_pt) 0x02;
tracker->listener = listener;
entry->service = (void *) 0x03;
entry->reference = ref;
arrayList_add(tracker->trackedServices, entry);
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
bool equal = true;
mock()
.expectOneCall("serviceReference_equals")
.withParameter("reference", ref)
.withParameter("compareTo", ref)
.withOutputParameterReturning("equal", &equal, sizeof(equal))
.andReturnValue(CELIX_SUCCESS);
bool result = true;
mock()
.expectOneCall("bundleContext_ungetService")
.withParameter("context", context)
.withParameter("reference", ref)
.withOutputParameterReturning("result", &result, sizeof(result))
.andReturnValue(CELIX_SUCCESS);
mock()
.expectOneCall("bundleContext_ungetServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
celix_status_t status;
status = serviceTracker_close(tracker);
LONGS_EQUAL(CELIX_SUCCESS, status);
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
serviceTracker_destroy(tracker);
free(service);
}
TEST(service_tracker, getServiceReference) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
service_reference_pt reference = (service_reference_pt) 0x02;
service_reference_pt reference2 = (service_reference_pt) 0x03;
service_reference_pt get_reference;
tracked_pt tracked = (tracked_pt) malloc(sizeof(*tracked));
tracked_pt tracked2 = (tracked_pt) malloc(sizeof(*tracked2));
tracked->reference = reference;
tracked2->reference = reference2;
arrayList_add(tracker->trackedServices, tracked);
arrayList_add(tracker->trackedServices, tracked2);
get_reference = serviceTracker_getServiceReference(tracker);
//test for either of the references
if(get_reference != reference && get_reference != reference2){
FAIL("unknown reference");
}
serviceTracker_destroy(tracker);
free(service);
free(tracked);
free(tracked2);
}
TEST(service_tracker, getServiceReferenceNull) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
service_reference_pt reference = serviceTracker_getServiceReference(tracker);
POINTERS_EQUAL(NULL, reference);
serviceTracker_destroy(tracker);
free(service);
}
TEST(service_tracker, getServiceReferences) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
service_reference_pt reference = (service_reference_pt) 0x02;
service_reference_pt reference2 = (service_reference_pt) 0x03;
service_reference_pt get_reference;
tracked_pt tracked = (tracked_pt) malloc(sizeof(*tracked));
tracked_pt tracked2 = (tracked_pt) malloc(sizeof(*tracked2));
array_list_pt get_references;
tracked->reference = reference;
tracked2->reference = reference2;
arrayList_add(tracker->trackedServices, tracked);
arrayList_add(tracker->trackedServices, tracked2);
get_references = serviceTracker_getServiceReferences(tracker);
//test for the references, in no specific order
get_reference = (service_reference_pt) arrayList_get(get_references, 0);
if(get_reference == reference){
get_reference = (service_reference_pt) arrayList_get(get_references, 1);
POINTERS_EQUAL(reference2, get_reference);
} else {
POINTERS_EQUAL(reference2, get_reference);
get_reference = (service_reference_pt) arrayList_get(get_references, 1);
POINTERS_EQUAL(reference, get_reference);
}
arrayList_destroy(get_references);
serviceTracker_destroy(tracker);
free(service);
free(tracked);
free(tracked2);
}
TEST(service_tracker, getService) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
tracked_pt entry = (tracked_pt) malloc(sizeof(*entry));
service_reference_pt ref = (service_reference_pt) 0x02;
entry->reference = ref;
void * actual_service = (void*) 0x32;
entry->service = actual_service;
arrayList_add(tracker->trackedServices, entry);
tracked_pt entry2 = (tracked_pt) malloc(sizeof(*entry));
service_reference_pt ref2 = (service_reference_pt) 0x52;
entry2->reference = ref2;
arrayList_add(tracker->trackedServices, entry2);
void *get_service = serviceTracker_getService(tracker);
POINTERS_EQUAL(actual_service, get_service);
serviceTracker_destroy(tracker);
free(entry);
free(entry2);
free(service);
}
TEST(service_tracker, getServiceNull) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
void * get_service = serviceTracker_getService(tracker);
POINTERS_EQUAL(NULL, get_service);
serviceTracker_destroy(tracker);
free(service);
}
TEST(service_tracker, getServices) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
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(tracker->trackedServices, 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(tracker->trackedServices, 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));
arrayList_destroy(services);
serviceTracker_destroy(tracker);
free(entry);
free(entry2);
free(service);
}
TEST(service_tracker, getServiceByReference) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
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(tracker->trackedServices, entry);
bool equal = true;
mock()
.expectOneCall("serviceReference_equals")
.withParameter("reference", ref)
.withParameter("compareTo", ref)
.withOutputParameterReturning("equal", &equal, sizeof(equal))
.andReturnValue(4);
//.ignoreOtherParameters();
void * get_service = serviceTracker_getServiceByReference(tracker, ref);
POINTERS_EQUAL(0x31, get_service);
serviceTracker_destroy(tracker);
free(entry);
free(service);
}
TEST(service_tracker, getServiceByReferenceNull) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
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(tracker->trackedServices, entry);
bool equal = false;
mock()
.expectOneCall("serviceReference_equals")
.withParameter("reference", ref)
.withOutputParameterReturning("equal", &equal, sizeof(equal))
.ignoreOtherParameters()
.andReturnValue(CELIX_SUCCESS)
.withCallOrder(1);
void * get_service = serviceTracker_getServiceByReference(tracker, ref);
POINTERS_EQUAL(NULL, get_service);
serviceTracker_destroy(tracker);
free(entry);
free(service);
}
TEST(service_tracker, serviceChangedRegistered) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener));
tracker->listener = listener;
listener->handle = tracker;
service_reference_pt ref = (service_reference_pt) 0x51;
service_event_pt event = (service_event_pt) malloc(sizeof(*event));
event->type = OSGI_FRAMEWORK_SERVICE_EVENT_REGISTERED;
event->reference = ref;
mock()
.expectOneCall("bundleContext_retainServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
void *src = (void *) 0x345;
mock()
.expectOneCall("bundleContext_getService")
.withParameter("context", context)
.withParameter("reference", ref)
.withOutputParameterReturning("service_instance", &src, sizeof(src))
.andReturnValue(CELIX_SUCCESS);
serviceTracker_serviceChanged(listener, event);
tracked_pt get_tracked = (tracked_pt) arrayList_get(tracker->trackedServices, 0);
POINTERS_EQUAL(src, get_tracked->service);
POINTERS_EQUAL(ref, get_tracked->reference);
//cleanup
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
serviceTracker_destroy(tracker);
free(get_tracked);
free(event);
free(service);
}
TEST(service_tracker, serviceChangedModified) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener));
tracker->listener = listener;
listener->handle = tracker;
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(tracker->trackedServices, entry);
service_event_pt event = (service_event_pt) malloc(sizeof(*event));
event->type = OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED;
event->reference = ref;
mock()
.expectOneCall("bundleContext_retainServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
bool equal = true;
mock()
.expectOneCall("serviceReference_equals")
.withParameter("reference", ref)
.withOutputParameterReturning("equal", &equal, sizeof(equal))
.ignoreOtherParameters()
.andReturnValue(CELIX_SUCCESS);
serviceTracker_serviceChanged(listener, event);
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
serviceTracker_destroy(tracker);
free(entry);
free(event);
free(service);
}
TEST(service_tracker, serviceChangedUnregistering) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener));
tracker->listener = listener;
listener->handle = tracker;
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(tracker->trackedServices, entry);
service_event_pt event = (service_event_pt) malloc(sizeof(*event));
event->type = OSGI_FRAMEWORK_SERVICE_EVENT_UNREGISTERING;
event->reference = ref;
bool equal = true;
mock()
.expectOneCall("serviceReference_equals")
.withParameter("reference", ref)
.withParameter("compareTo", ref)
.withOutputParameterReturning("equal", &equal, sizeof(equal))
.andReturnValue(CELIX_SUCCESS);
bool result = true;
mock()
.expectOneCall("bundleContext_ungetService")
.withParameter("context", context)
.withParameter("reference", ref)
.withOutputParameterReturning("result", &result, sizeof(result))
.andReturnValue(CELIX_SUCCESS);
mock()
.expectOneCall("bundleContext_ungetServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
serviceTracker_serviceChanged(listener, event);
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
serviceTracker_destroy(tracker);
free(event);
free(service);
}
TEST(service_tracker, serviceChangedModifiedEndmatch) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
serviceTracker_create(context, service, NULL, &tracker);
service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener));
tracker->listener = listener;
listener->handle = tracker;
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(tracker->trackedServices, entry);
service_event_pt event = (service_event_pt) malloc(sizeof(*event));
event->type = OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED_ENDMATCH;
event->reference = ref;
serviceTracker_serviceChanged(listener, event);
//cleanup
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
serviceTracker_destroy(tracker);
free(entry);
free(event);
free(service);
}
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) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
serviceTracker_create(context, service, customizer, &tracker);
service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener));
tracker->listener = listener;
listener->handle = tracker;
service_reference_pt ref = (service_reference_pt) 0x51;
service_event_pt event = (service_event_pt) malloc(sizeof(*event));
event->type = OSGI_FRAMEWORK_SERVICE_EVENT_REGISTERED;
event->reference = ref;
mock()
.expectOneCall("bundleContext_retainServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
void * handle = (void*) 0x60;
mock()
.expectOneCall("serviceTrackerCustomizer_getHandle")
.withParameter("customizer", customizer)
.withOutputParameterReturning("handle", &handle, sizeof(handle))
.andReturnValue(CELIX_SUCCESS);
void *function = (void *) serviceDependency_addingService;
mock()
.expectOneCall("serviceTrackerCustomizer_getAddingFunction")
.withParameter("customizer", customizer)
.withOutputParameterReturning("function", &function, sizeof(function))
.andReturnValue(CELIX_SUCCESS);
mock()
.expectOneCall("serviceTrackerCustomizer_getHandle")
.withParameter("customizer", customizer)
.withOutputParameterReturning("handle", &handle, sizeof(handle))
.andReturnValue(CELIX_SUCCESS);
void *function2 = (void *) serviceDependency_addedService;
mock()
.expectOneCall("serviceTrackerCustomizer_getAddedFunction")
.withParameter("customizer", customizer)
.withOutputParameterReturning("function", &function2, sizeof(function))
.andReturnValue(CELIX_SUCCESS);
serviceTracker_serviceChanged(listener, event);
tracked_pt get_tracked = (tracked_pt) arrayList_get(tracker->trackedServices, 0);
POINTERS_EQUAL(0x45, get_tracked->service);
POINTERS_EQUAL(ref, get_tracked->reference);
//cleanup
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
mock()
.expectOneCall("serviceTrackerCustomizer_destroy")
.withParameter("customizer", customizer);
serviceTracker_destroy(tracker);
free(get_tracked);
free(event);
free(service);
}
extern "C" {
celix_status_t serviceDependency_modifiedService(void * handle, service_reference_pt reference, void * service) {
return CELIX_SUCCESS;
}
}
TEST(service_tracker, serviceChangedModifiedCustomizer) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
serviceTracker_create(context, service, customizer, &tracker);
service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener));
tracker->listener = listener;
listener->handle = tracker;
//adding_callback_pt adding_func = NULL;
//added_callback_pt added_func = NULL;
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(tracker->trackedServices, entry);
service_event_pt event = (service_event_pt) malloc(sizeof(*event));
event->type = OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED;
event->reference = ref;
bool equal = true;
mock()
.expectOneCall("bundleContext_retainServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
mock()
.expectOneCall("serviceReference_equals")
.withParameter("reference", ref)
.withOutputParameterReturning("equal", &equal, sizeof(equal))
.ignoreOtherParameters()
.andReturnValue(CELIX_SUCCESS);
void * handle = (void*) 0x60;
/* this branch is not covered here, unlike earlier faulty tests
mock()
.expectOneCall("serviceTrackerCustomizer_getHandle")
.withParameter("customizer", customizer)
.withOutputParameterReturning("handle", &handle, sizeof(handle))
.andReturnValue(CELIX_SUCCESS);
mock()
.expectOneCall("serviceTrackerCustomizer_getAddingFunction")
.withParameter("customizer", customizer)
.withOutputParameterReturning("function", &adding_func, sizeof(adding_func))
.andReturnValue(CELIX_SUCCESS);
mock()
.expectOneCall("serviceTrackerCustomizer_getAddedFunction")
.withParameter("customizer", customizer)
.withOutputParameterReturning("function", &added_func, sizeof(added_func));
mock()
.expectOneCall("bundleContext_getService")
.withParameter("context", context)
.withParameter("reference", ref)
.withOutputParameterReturning("service_instance", &entry->service, sizeof(entry->service));
*/
mock()
.expectOneCall("serviceTrackerCustomizer_getHandle")
.withParameter("customizer", customizer)
.withOutputParameterReturning("handle", &handle, sizeof(handle))
.andReturnValue(CELIX_SUCCESS);
void *function = (void *) serviceDependency_modifiedService;
mock()
.expectOneCall("serviceTrackerCustomizer_getModifiedFunction")
.withParameter("customizer", customizer)
.withOutputParameterReturning("function", &function, sizeof(function))
.andReturnValue(CELIX_SUCCESS);
serviceTracker_serviceChanged(listener, event);
//cleanup
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
mock()
.expectOneCall("serviceTrackerCustomizer_destroy")
.withParameter("customizer", customizer);
serviceTracker_destroy(tracker);
free(entry);
free(event);
free(service);
}
extern "C" {
celix_status_t serviceDependency_removedService(void * handle, service_reference_pt reference, void * service) {
return CELIX_SUCCESS;
}
}
TEST(service_tracker, serviceChangedUnregisteringCustomizer) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
serviceTracker_create(context, service, customizer, &tracker);
service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener));
tracker->listener = listener;
listener->handle = tracker;
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(tracker->trackedServices, entry);
service_event_pt event = (service_event_pt) malloc(sizeof(*event));
event->type = OSGI_FRAMEWORK_SERVICE_EVENT_UNREGISTERING;
event->reference = ref;
bool equal = true;
mock()
.expectOneCall("serviceReference_equals")
.withParameter("reference", ref)
.withParameter("compareTo", ref)
.withOutputParameterReturning("equal", &equal, sizeof(equal))
.andReturnValue(CELIX_SUCCESS);
void * handle = (void*) 0x60;
mock()
.expectOneCall("serviceTrackerCustomizer_getHandle")
.withParameter("customizer", customizer)
.withOutputParameterReturning("handle", &handle, sizeof(handle))
.andReturnValue(CELIX_SUCCESS);
void *function = (void*) serviceDependency_removedService;
mock()
.expectOneCall("serviceTrackerCustomizer_getRemovedFunction")
.withParameter("customizer", customizer)
.withOutputParameterReturning("function", &function , sizeof(function))
.andReturnValue(CELIX_SUCCESS);
bool result = true;
mock()
.expectOneCall("bundleContext_ungetService")
.withParameter("context", context)
.withParameter("reference", ref)
.withOutputParameterReturning("result", &result, sizeof(result));
mock()
.expectOneCall("bundleContext_ungetServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
serviceTracker_serviceChanged(listener, event);
//clean up
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
mock()
.expectOneCall("serviceTrackerCustomizer_destroy")
.withParameter("customizer", customizer);
serviceTracker_destroy(tracker);
free(event);
free(service);
}
TEST(service_tracker, serviceChangedUnregisteringCustomizerNoFunc) {
bundle_context_pt context= (bundle_context_pt) 0x01;
char * service = my_strdup("service_name");
service_tracker_pt tracker = NULL;
service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20;
serviceTracker_create(context, service, customizer, &tracker);
service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener));
tracker->listener = listener;
listener->handle = tracker;
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(tracker->trackedServices, entry);
service_event_pt event = (service_event_pt) malloc(sizeof(*event));
event->type = OSGI_FRAMEWORK_SERVICE_EVENT_UNREGISTERING;
event->reference = ref;
bool equals = true;
mock()
.expectOneCall("serviceReference_equals")
.withParameter("reference", ref)
.withParameter("compareTo", ref)
.withOutputParameterReturning("equal", &equals, sizeof(equals));
void * handle = (void*) 0x60;
mock()
.expectOneCall("serviceTrackerCustomizer_getHandle")
.withParameter("customizer", customizer)
.withOutputParameterReturning("handle", &handle, sizeof(handle));
void *function = NULL;
mock()
.expectOneCall("serviceTrackerCustomizer_getRemovedFunction")
.withParameter("customizer", customizer)
.withOutputParameterReturning("function", &function, sizeof(function));
bool result = true;
mock()
.expectOneCall("bundleContext_ungetService")
.withParameter("context", context)
.withParameter("reference", ref)
.withOutputParameterReturning("result", &result, sizeof(result));
mock()
.expectOneCall("bundleContext_ungetServiceReference")
.withParameter("context", context)
.withParameter("reference", ref);
serviceTracker_serviceChanged(listener, event);
mock()
.expectOneCall("bundleContext_removeServiceListener")
.withParameter("context", context)
.withParameter("listener", listener)
.andReturnValue(CELIX_SUCCESS);
mock()
.expectOneCall("serviceTrackerCustomizer_destroy")
.withParameter("customizer", customizer);
serviceTracker_destroy(tracker);
free(event);
free(service);
}