common-smartgears/src/test/java/test/application/StartupTest.java

232 lines
6.0 KiB
Java

package test.application;
import static app.Request.request;
import static org.gcube.smartgears.Constants.profile_file_path;
import static org.gcube.smartgears.lifecycle.application.ApplicationState.active;
import static org.gcube.smartgears.lifecycle.application.ApplicationState.failed;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.File;
import org.gcube.common.resources.gcore.Resource;
import org.gcube.informationsystem.publisher.ScopedPublisher;
import org.gcube.informationsystem.publisher.exception.RegistryNotFoundException;
import org.gcube.smartgears.Constants;
import org.gcube.smartgears.configuration.application.ApplicationConfiguration;
import org.gcube.smartgears.configuration.application.DefaultApplicationConfiguration;
import org.gcube.smartgears.context.application.ApplicationContext;
import org.gcube.smartgears.handlers.application.ApplicationEvent;
import org.gcube.smartgears.handlers.application.ApplicationLifecycleEvent.Start;
import org.gcube.smartgears.handlers.application.ApplicationLifecycleHandler;
import org.gcube.smartgears.handlers.application.RequestHandler;
import org.gcube.smartgears.persistence.LocalPersistence;
import org.junit.After;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mockito;
import app.SomeApp;
import utils.TestUtils.Box;
public class StartupTest {
SomeApp app = new SomeApp();
@After
public void teardown() {
app.stop();
}
@Test
public void succeedsWithDefaults() throws Exception {
app.useDefaultHandlers();
app.useDefaultExtensions();
ApplicationContext ctx = app.start();
assertEquals(active,ctx.lifecycle().state());
//profile is shared in servlet context
assertEquals(ctx,ctx.application().getAttribute(Constants.context_attribute));
}
@Test
public void stillStoresProfileWhenPublicationFails() throws Exception {
app.useDefaultHandlers();
ScopedPublisher failingPublisher = Mockito.mock(ScopedPublisher.class);
when(failingPublisher.create(any(Resource.class), Matchers.anyListOf(String.class))).thenThrow(new RegistryNotFoundException());
app.usePublisher(failingPublisher);
ApplicationContext ctx = app.start();
Thread.sleep(100); //a little bit of time for failure to propagate
//application has failed
assertEquals(failed,ctx.lifecycle().state());
//profile has been created
File file = ctx.configuration().persistence().file(profile_file_path);
assertTrue(file.exists());
}
@Test
@SuppressWarnings("all")
public void invokesLifecycleHandlers() {
ApplicationLifecycleHandler witness = mock(ApplicationLifecycleHandler.class);
app.handlers().set(witness);
//as we're using mocks, let us bypass JAXB configuration mechanisms
app.bypassHandlerDeployment();
app.start();
verify(witness).onEvent(any(ApplicationEvent.class));
}
@Test
@SuppressWarnings("all")
public void registersRequestsHandlers() {
Box<Boolean> handlerIsInvoked = new Box<Boolean>();
RequestHandler witness = mock(RequestHandler.class);
app.handlers().set(witness);
app.bypassHandlerDeployment();
app.start();
app.send(request());
//invoked for request and response
verify(witness,times(2)).onEvent(isA(ApplicationEvent.class));
}
//@Ignore //inexplicable sometimes fails as configuration is not removed
@Test
public void failsIfConfigurationIsInvalid() {
app.configuration().name(null).serviceClass(null).description(null).version(null).persistence(null);
ApplicationContext ctx = app.start();
assertEquals(failed,ctx.lifecycle().state());
}
@Test
public void failsIfHandlerFails() throws Throwable {
ApplicationLifecycleHandler failingHandler = mock(ApplicationLifecycleHandler.class);
doThrow(new RuntimeException("simulated handler failure")).when(failingHandler).onEvent(isA(Start.class));
app.handlers().set(failingHandler);
app.bypassHandlerDeployment();
ApplicationContext ctx = app.start();
assertEquals(failed,ctx.lifecycle().state());
}
@Test
public void canUseExternalConfiguration() {
app.asExternal();
app.start();
assertTrue(app.isActive());
}
@Test
public void canUseMergedConfiguration() {
ApplicationConfiguration config = new DefaultApplicationConfiguration();
config.persistence(new LocalPersistence(new File(".").getAbsolutePath()));
ApplicationContext context = app.start();
assertTrue(app.isActive());
app.withExternal(config);
assertEquals(config.persistence(),context.configuration().persistence());
}
@Test
public void failsIfAllStartScopesAreInvalid() throws Exception {
ApplicationConfiguration config = new DefaultApplicationConfiguration();
//config.startScopes("bad/scope","even/badder");
app.useDefaultHandlers();
ApplicationContext context = app.start();
app.withExternal(config);
assertEquals(failed,context.lifecycle().state());
}
@Test
public void canStartInVreScope() throws Exception {
ApplicationConfiguration config = new DefaultApplicationConfiguration();
//tring vre = "/"+app.containerConfiguration().infrastructure()+"/"+app.containerConfiguration().startVOs().get(0)+"/vre";
//config.startScopes(vre,"/bad/scope");
app.useDefaultHandlers();
ApplicationContext context = app.start();
app.withExternal(config);
assertEquals(active,context.lifecycle().state());
//Set<String> runningScopes = new HashSet<>(context.profile(GCoreEndpoint.class).scopes().asCollection());
//assertEquals(singleton(vre),runningScopes);
}
@Test(expected=RuntimeException.class)
public void failsIfConfigurationIsMissing() {
app.bypassConfigurationDeployment();
app.start();
}
}