package com.processpuzzle.application.domain;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeThat;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
import com.processpuzzle.application.domain.Application.ExecutionStatus;
import com.processpuzzle.application.domain.Application.InstallationStatus;
import com.processpuzzle.commons.persistence.RepositoryResultSet;
import com.processpuzzle.litest.template.DefaultApplicationFixture;
import com.processpuzzle.sharedfixtures.domaintier.DomainTierTestConfiguration;
public class ApplicationManagerTest {
private static final String NEW_APPLICATION_NAME = InstallationTestApplication.class.getSimpleName();
private static final String APPLICATION_REPOSITOTRY_STORAGE_PATH = DomainTierTestConfiguration.APPLICATION_REPOSITORY_STORAGE_PATH;
private static final String CONFIGURATION_DESCRIPTOR_PATH = DomainTierTestConfiguration.APPLICATION_CONFIGURATION_DESCRIPTOR_PATH;
private Application alreadyInstalledApplication;
private ApplicationManager applicationManager;
private ApplicationRepository applicationRepository;
private DefaultApplicationFixture<Application> installedApplicationFixture;
private Application newApplication;
private ResourceLoader resourceLoader;
@Before
public void beforEachTests() throws InstantiationException {
resourceLoader = new DefaultResourceLoader();
applicationManager = new ApplicationManager( APPLICATION_REPOSITOTRY_STORAGE_PATH, resourceLoader );
installedApplicationFixture = new InstalledAndStoppedApplicationFixture();
installedApplicationFixture.setUp();
instantiateApplicationRepository();
}
@After
public void afterEachTests() {
installedApplicationFixture.tearDown();
deleteAllApplicationsFromRepository();
newApplication = null;
alreadyInstalledApplication = null;
applicationManager = null;
}
@Ignore @Test
public void install_InstallsApplication() throws ApplicationInstallationException, ApplicationUninstallationException {
// EXCERCISE:
assumeThat( applicationIsInRepository( NEW_APPLICATION_NAME ), is( false ) );
newApplication = applicationManager.install( NEW_APPLICATION_NAME, InstallationTestApplication.class, CONFIGURATION_DESCRIPTOR_PATH );
// VERIFY:
assertThat( newApplication.getExecutionStatus(), equalTo( ExecutionStatus.running ) );
assertThat( newApplication.getInstallationStatus(), equalTo( InstallationStatus.installed ) );
assertThat( applicationIsInRepository( NEW_APPLICATION_NAME ), is( true ) );
// TEAR DOWN:
applicationManager.unInstall( newApplication );
assumeThat( applicationIsInRepository( NEW_APPLICATION_NAME ), is( false ) );
}
@Test
public void install_OnlyStartsApplicationIfAlreadyInstalled() throws ApplicationInstallationException {
// EXCERCISE:
assumeThat( applicationIsInRepository( installedApplicationFixture.getApplicationName() ), is( true ) );
assumeThat( applicationStatusInRepository( installedApplicationFixture.getApplicationName() ), equalTo( ExecutionStatus.stopped ) );
alreadyInstalledApplication = applicationManager.install( installedApplicationFixture.getApplicationName(), AlreadyInstalledApplication.class, CONFIGURATION_DESCRIPTOR_PATH );
// VERIFY:
assertThat( alreadyInstalledApplication.getExecutionStatus(), equalTo( ExecutionStatus.running ) );
assertThat( applicationStatusInRepository( installedApplicationFixture.getApplicationName() ), equalTo( ExecutionStatus.running ) );
}
@Test
public void start_UpdatesApplicationStatusInRepository() throws ApplicationException, ConfusingApplicationStatusException {
// EXCERCISE:
assumeThat( applicationStatusInRepository( installedApplicationFixture.getApplicationName() ), equalTo( ExecutionStatus.stopped ) );
alreadyInstalledApplication = applicationManager.start( installedApplicationFixture.getApplicationName() );
// VERIFY:
assertThat( alreadyInstalledApplication.getExecutionStatus(), equalTo( ExecutionStatus.running ) );
assertThat( applicationStatusInRepository( installedApplicationFixture.getApplicationName() ), equalTo( ExecutionStatus.running ) );
}
@Test( expected = ConfusingApplicationStatusException.class )
public void start_ThrowsExceptionWhenApplicationIsNotInstalled() throws ApplicationException, ConfusingApplicationStatusException {
applicationManager.start( NEW_APPLICATION_NAME );
}
@Test
public void stop_UpdatesApplicationStatusInReposiotry() throws ApplicationException, ConfusingApplicationStatusException {
// EXCERCISE:
alreadyInstalledApplication = applicationManager.start( installedApplicationFixture.getApplicationName() );
applicationManager.stop( alreadyInstalledApplication );
// VERIFY:
assertThat( alreadyInstalledApplication.getExecutionStatus(), equalTo( ExecutionStatus.stopped ) );
assertThat( applicationStatusInRepository( installedApplicationFixture.getApplicationName() ), equalTo( ExecutionStatus.stopped ) );
}
// Private helper methods
private boolean applicationIsInRepository( String applicationName ) {
if( applicationRepository.findByName( applicationName ) != null )
return true;
else
return false;
}
private ExecutionStatus applicationStatusInRepository( String applicationName ) {
Application application = applicationRepository.findByName( applicationName );
return application.getExecutionStatus();
}
private void deleteAllApplicationsFromRepository() {
RepositoryResultSet<Application> applications = applicationRepository.findAll( null );
for( Application application : applications ){
applicationRepository.delete( application );
}
}
private void instantiateApplicationRepository() {
try{
applicationRepository = ApplicationRepository.getInstance( APPLICATION_REPOSITOTRY_STORAGE_PATH, resourceLoader );
}catch( InstantiationException e ){
e.printStackTrace();
}
}
protected void openHsqlManager() {
org.hsqldb.util.DatabaseManagerSwing.main(new String[] { "--url", "jdbc:hsqldb:mem:mymemdb", "--noexit" });
}
}