blob: 171493b666f1efb89b6d5e9eb3ebf02e3047eb87 [file] [log] [blame]
/*******************************************************************************
* 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.nano.core.internal.blueprint;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import org.junit.Test;
import org.osgi.framework.Version;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventConstants;
import org.eclipse.virgo.nano.core.internal.blueprint.ApplicationContextDependencyMonitor;
import org.eclipse.virgo.medic.test.eventlog.LoggedEvent;
import org.eclipse.virgo.medic.test.eventlog.MockEventLogger;
import org.eclipse.virgo.test.stubs..framework.StubBundle;
/**
*/
public class ApplicationContextDependencyMonitorTests {
private final MockEventLogger eventLogger = new MockEventLogger();
private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
private final ApplicationContextDependencyMonitor dependencyMonitor = new ApplicationContextDependencyMonitor(executor, eventLogger);
private final StubBundle bundle = new StubBundle("the.bundle", new Version(1, 2, 3));
@Test
public void loggingOfWaitingEventForMandatoryService() throws InterruptedException {
Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
this.dependencyMonitor.handleEvent(event);
Thread.sleep(6000);
List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
assertEquals(1, loggedEvents.size());
LoggedEvent loggedEvent = loggedEvents.get(0);
assertEquals("KE0100W", loggedEvent.getCode());
Object[] inserts = loggedEvent.getInserts();
assertEquals(4, inserts.length);
assertEquals("theBean", inserts[0]);
assertEquals(this.bundle.getSymbolicName(), inserts[1]);
assertEquals(this.bundle.getVersion(), inserts[2]);
assertEquals("filter", inserts[3]);
}
@Test
public void loggingOfWaitingEventForOptionalService() throws InterruptedException {
Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", false));
this.dependencyMonitor.handleEvent(event);
Thread.sleep(6000);
List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
assertEquals(1, loggedEvents.size());
LoggedEvent loggedEvent = loggedEvents.get(0);
assertEquals("KE0100W", loggedEvent.getCode());
Object[] inserts = loggedEvent.getInserts();
assertEquals(4, inserts.length);
assertEquals("theBean", inserts[0]);
assertEquals(this.bundle.getSymbolicName(), inserts[1]);
assertEquals(this.bundle.getVersion(), inserts[2]);
assertEquals("filter", inserts[3]);
}
@Test
public void loggingOfDependencySatisfied() throws InterruptedException {
Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
this.dependencyMonitor.handleEvent(event);
Thread.sleep(6000);
event = new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", createProperties());
this.dependencyMonitor.handleEvent(event);
List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
assertEquals(2, loggedEvents.size());
LoggedEvent loggedEvent = loggedEvents.get(1);
assertEquals("KE0101I", loggedEvent.getCode());
Object[] inserts = loggedEvent.getInserts();
assertEquals(4, inserts.length);
assertEquals("theBean", inserts[0]);
assertEquals(this.bundle.getSymbolicName(), inserts[1]);
assertEquals(this.bundle.getVersion(), inserts[2]);
assertEquals("filter", inserts[3]);
}
@Test
public void loggingOfMandatoryDependencyTimedOut() throws InterruptedException {
Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
this.dependencyMonitor.handleEvent(event);
Thread.sleep(6000);
event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties("filter", "theBean", true));
this.dependencyMonitor.handleEvent(event);
List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
assertEquals(2, loggedEvents.size());
LoggedEvent loggedEvent = loggedEvents.get(1);
assertEquals("KE0102E", loggedEvent.getCode());
Object[] inserts = loggedEvent.getInserts();
assertEquals(4, inserts.length);
assertEquals("theBean", inserts[0]);
assertEquals(this.bundle.getSymbolicName(), inserts[1]);
assertEquals(this.bundle.getVersion(), inserts[2]);
assertEquals("filter", inserts[3]);
}
@Test
public void loggingOfOptionalDependencyTimedOut() throws InterruptedException {
Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", false));
this.dependencyMonitor.handleEvent(event);
Thread.sleep(6000);
event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties("filter", "theBean", false));
this.dependencyMonitor.handleEvent(event);
List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
assertEquals(2, loggedEvents.size());
LoggedEvent loggedEvent = loggedEvents.get(1);
assertEquals("KE0102E", loggedEvent.getCode());
Object[] inserts = loggedEvent.getInserts();
assertEquals(4, inserts.length);
assertEquals("theBean", inserts[0]);
assertEquals(this.bundle.getSymbolicName(), inserts[1]);
assertEquals(this.bundle.getVersion(), inserts[2]);
assertEquals("filter", inserts[3]);
}
@Test
public void containerCreationFailureRemovesTickers() throws InterruptedException {
Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
this.dependencyMonitor.handleEvent(event);
event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties());
this.dependencyMonitor.handleEvent(event);
Thread.sleep(3000);
assertFalse(this.eventLogger.getCalled());
}
@Test
public void containerCreationDrivesOutstandingTickers() throws InterruptedException {
Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
this.dependencyMonitor.handleEvent(event);
Thread.sleep(6000);
event = new Event("org/osgi/service/blueprint/container/CREATED", createProperties());
this.dependencyMonitor.handleEvent(event);
List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
assertEquals(2, loggedEvents.size());
LoggedEvent loggedEvent = loggedEvents.get(1);
assertEquals("KE0101I", loggedEvent.getCode());
Object[] inserts = loggedEvent.getInserts();
assertEquals(4, inserts.length);
assertEquals("theBean", inserts[0]);
assertEquals(this.bundle.getSymbolicName(), inserts[1]);
assertEquals(this.bundle.getVersion(), inserts[2]);
assertEquals("filter", inserts[3]);
}
@Test
public void dependencyThatIsSatisfiedQuicklyLogsNothing() throws InterruptedException {
Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("filter", "theBean", true));
this.dependencyMonitor.handleEvent(event);
event = new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", createProperties());
this.dependencyMonitor.handleEvent(event);
Thread.sleep(3000);
List<LoggedEvent> loggedEvents = this.eventLogger.getLoggedEvents();
assertEquals(0, loggedEvents.size());
}
@Test
public void slowServicesAreGivenLongerToBecomeAvailable() throws InterruptedException {
Event event = new Event("org/osgi/service/blueprint/container/WAITING", createProperties("(org.eclipse.virgo.server.slowservice=true)",
"theBean", true));
this.dependencyMonitor.handleEvent(event);
Thread.sleep(3000);
assertFalse(this.eventLogger.getCalled());
}
@Test
public void containerCreatedNotWaiting() {
Event event = new Event("org/osgi/service/blueprint/container/CREATED", createProperties());
this.dependencyMonitor.handleEvent(event);
}
@Test
public void changeInUnsatisfiedDependenciesNotWaiting() {
Event event = new Event("org/osgi/service/blueprint/container/GRACE_PERIOD", createProperties());
this.dependencyMonitor.handleEvent(event);
}
@Test
public void serviceDependenciesTimedOutNotWaiting() {
Event event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties("filter", "theBean", false));
this.dependencyMonitor.handleEvent(event);
}
@Test
public void containerCreationFailedNotWaiting() {
Event event = new Event("org/osgi/service/blueprint/container/FAILURE", createProperties());
this.dependencyMonitor.handleEvent(event);
}
@SuppressWarnings("unchecked")
private Dictionary<String, ?> createProperties(String filter, String beanName, boolean mandatory) {
Dictionary properties = createProperties();
properties.put("dependencies", new String[] { filter });
properties.put("bean.name", new String[] { beanName });
properties.put("mandatory", new boolean[] { mandatory });
return properties;
}
@SuppressWarnings("unchecked")
private Dictionary<String, ?> createProperties() {
Dictionary properties = new Hashtable();
properties.put(EventConstants.BUNDLE, this.bundle);
return properties;
}
}