/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.agent.dm.internal;
import static org.easymock.EasyMock.createNiceMock;
import static org.junit.Assert.assertTrue;
import java.util.Dictionary;
import java.util.Hashtable;
import org.junit.Test;
import org.osgi.framework.Filter;
import org.osgi.framework.Version;
import org.osgi.service.event.Event;
import org.springframework.context.ApplicationContext;
import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextClosedEvent;
import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextFailedEvent;
import org.eclipse.gemini.blueprint.context.event.OsgiBundleContextRefreshedEvent;
import org.eclipse.gemini.blueprint.extender.event.BootstrappingDependencyEvent;
import org.eclipse.gemini.blueprint.service.importer.OsgiServiceDependency;
import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyEvent;
import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitEndedEvent;
import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitStartingEvent;
import org.eclipse.gemini.blueprint.service.importer.event.OsgiServiceDependencyWaitTimedOutEvent;
import org.eclipse.virgo.kernel.agent.dm.internal.BlueprintEventPostingOsgiBundleApplicationContextListener;
import org.eclipse.virgo.test.stubs.framework.StubBundle;
import org.eclipse.virgo.test.stubs.service.event.StubEventAdmin;
import org.eclipse.virgo.test.stubs.support.ObjectClassFilter;
/**
*/
public class BlueprintEventPostingOsgiBundleApplicationContextListenerTests {
private static final int TYPE_CREATED = 1;
private static final int TYPE_DESTROYED = 4;
private static final int TYPE_FAILURE = 5;
private static final int TYPE_GRACE_PERIOD = 6;
private static final int TYPE_WAITING = 7;
private final StubEventAdmin eventAdmin = new StubEventAdmin();
private final BlueprintEventPostingOsgiBundleApplicationContextListener listener = new BlueprintEventPostingOsgiBundleApplicationContextListener(eventAdmin);
private final ApplicationContext applicationContext = createNiceMock(ApplicationContext.class);
private final StubBundle bundle = new StubBundle("foo", new Version(1,2,3));
@Test
public void contextRefreshedPostsCreatedEvent() {
OsgiBundleContextRefreshedEvent event = new OsgiBundleContextRefreshedEvent(applicationContext, bundle);
listener.onOsgiApplicationEvent(event);
assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/CREATED", createEventProperties(event.getTimestamp(), TYPE_CREATED)), 1000));
}
@Test
public void contextCreationFailedPostsFailureEvent() {
Throwable cause = new Throwable();
OsgiBundleContextFailedEvent event = new OsgiBundleContextFailedEvent(applicationContext, bundle, cause);
listener.onOsgiApplicationEvent(event);
assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/FAILURE", createEventProperties(null, event.getTimestamp(), cause, TYPE_FAILURE)), 1000));
}
@Test
public void contextClosedPostsDestroyedEvent() {
OsgiBundleContextClosedEvent event = new OsgiBundleContextClosedEvent(applicationContext, bundle);
listener.onOsgiApplicationEvent(event);
assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/DESTROYED", createEventProperties(event.getTimestamp(), TYPE_DESTROYED)), 1000));
}
@Test
public void startOfWaitOnServicePostsWaitingEvent() {
final Filter filter = new ObjectClassFilter(Integer.class);
OsgiServiceDependency serviceDependency = new StubOsgiServiceDependency(filter);
OsgiServiceDependencyEvent serviceDependencyEvent = new OsgiServiceDependencyWaitStartingEvent(applicationContext, serviceDependency, 1000);
BootstrappingDependencyEvent event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
listener.onOsgiApplicationEvent(event);
Dictionary<String, Object> properties = createEventProperties(serviceDependency, event.getTimestamp(), TYPE_WAITING);
assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/WAITING", properties), 1000));
}
@Test
public void waitTimeoutPostsFailureEvent() {
final Filter filter = new ObjectClassFilter(Integer.class);
OsgiServiceDependency serviceDependency = new StubOsgiServiceDependency(filter);
OsgiServiceDependencyEvent serviceDependencyEvent = new OsgiServiceDependencyWaitStartingEvent(applicationContext, serviceDependency, 1000);
BootstrappingDependencyEvent event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
listener.onOsgiApplicationEvent(event);
serviceDependencyEvent = new OsgiServiceDependencyWaitTimedOutEvent(applicationContext, serviceDependency, 1000);
event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
listener.onOsgiApplicationEvent(event);
Dictionary<String, Object> properties = createEventProperties(serviceDependency, event.getTimestamp(), TYPE_FAILURE);
assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/FAILURE", properties), 1000));
}
@Test
public void endOfWaitOnServicePostsGracePeriodEvent() {
final Filter integerFilter = new ObjectClassFilter(Integer.class);
final Filter booleanFilter = new ObjectClassFilter(Boolean.class);
sendWaitStartingEvent(booleanFilter);
sendWaitStartingEvent(integerFilter);
long timestamp = sendWaitEndedEvent(booleanFilter);
Dictionary<String, Object> properties = createEventProperties(new StubOsgiServiceDependency(integerFilter), timestamp, TYPE_GRACE_PERIOD);
assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", properties), 1000));
timestamp = sendWaitEndedEvent(integerFilter);
properties = createEventProperties(timestamp, TYPE_GRACE_PERIOD);
assertTrue(eventAdmin.awaitSendingOfEvent(new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", properties), 1000));
}
private void sendWaitStartingEvent(Filter filter) {
OsgiServiceDependency serviceDependency = new StubOsgiServiceDependency(filter);
OsgiServiceDependencyEvent serviceDependencyEvent = new OsgiServiceDependencyWaitStartingEvent(applicationContext, serviceDependency, 1000);
BootstrappingDependencyEvent event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
listener.onOsgiApplicationEvent(event);
}
private long sendWaitEndedEvent(Filter filter) {
OsgiServiceDependency serviceDependency = new StubOsgiServiceDependency(filter);
OsgiServiceDependencyEvent serviceDependencyEvent = new OsgiServiceDependencyWaitEndedEvent(this.applicationContext, serviceDependency, 1000);
BootstrappingDependencyEvent event = new BootstrappingDependencyEvent(applicationContext, bundle, serviceDependencyEvent);
listener.onOsgiApplicationEvent(event);
return event.getTimestamp();
}
private Dictionary<String, Object> createEventProperties(long timestamp, int type) {
return createEventProperties(null, timestamp, null, type);
}
private Dictionary<String, Object> createEventProperties(OsgiServiceDependency serviceDependency, long timestamp, int type) {
return createEventProperties(serviceDependency, timestamp, null, type);
}
private Dictionary<String, Object> createEventProperties(OsgiServiceDependency serviceDependency, long timestamp, Throwable cause, int type) {
Dictionary<String, Object> properties = new Hashtable<String, Object>();
properties.put("bundle", bundle);
properties.put("bundle.id", bundle.getBundleId());
properties.put("bundle.symbolicName", bundle.getSymbolicName());
properties.put("bundle.version", bundle.getVersion());
properties.put("timestamp", timestamp);
properties.put("type", type);
if (cause != null) {
properties.put("exception", cause);
}
if (serviceDependency != null) {
properties.put("dependencies", new String[] {serviceDependency.getServiceFilter().toString()});
properties.put("bean.name", new String[] {serviceDependency.getBeanName()});
properties.put("mandatory", new boolean[] {serviceDependency.isMandatory()});
}
return properties;
}
private static final class StubOsgiServiceDependency implements OsgiServiceDependency {
private final Filter filter;
private StubOsgiServiceDependency(Filter filter) {
this.filter = filter;
}
public String getBeanName() {
return "bean";
}
public Filter getServiceFilter() {
return filter;
}
public boolean isMandatory() {
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((filter == null) ? 0 : filter.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
StubOsgiServiceDependency other = (StubOsgiServiceDependency) obj;
if (filter == null) {
if (other.filter != null)
return false;
} else if (!filter.equals(other.filter))
return false;
return true;
}
}
}