/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.update.internal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.easymock.EasyMock;
import org.junit.Test;
import de.rcenvironment.core.component.update.api.PersistentComponentDescription;
import de.rcenvironment.core.component.update.api.PersistentDescriptionFormatVersion;
import de.rcenvironment.core.component.update.spi.PersistentComponentDescriptionUpdater;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
/**
* Test cases for {@link PersistentComponentDescriptionUpdateServiceImpl}.
* @author Doreen Seider
*/
public class PersistentComponentDescriptionUpdateServiceImplTest {
private static final String[] COMPID_WITH_UPDATE = new String[] { "comp.id.update" };
private static final String[] COMPID_WITHOUT_UPDATE = new String[] { "comp.id.noupdate" };
private static final String[] COMPID_WITH_SILENT_UPDATE = new String[] { "comp.id.silentupdate" };
private static final String[] COMPID_WITHOUT_SILENT_UPDATE = new String[] { "comp.id.silentnoupdate" };
private PersistentComponentDescription updatedComponentDescription = EasyMock.createNiceMock(PersistentComponentDescription.class);
/**
* Test.
* @throws IOException on unexpected errors
* @throws RemoteOperationException on unexpected errors
**/
@Test
public void test() throws IOException, RemoteOperationException {
PersistentComponentDescriptionUpdater updater = new Updater();
PersistentComponentDescriptionUpdater nonUpdater = new NonUpdater();
PersistentComponentDescriptionUpdater silentUpdater = new SilentUpdater();
PersistentComponentDescriptionUpdater silentNonUpdater = new SilentNonUpdater();
PersistentComponentDescriptionUpdateServiceImpl updaterService = new PersistentComponentDescriptionUpdateServiceImpl();
updaterService.addPersistentComponentDescriptionUpdater(updater);
updaterService.addPersistentComponentDescriptionUpdater(nonUpdater);
updaterService.addPersistentComponentDescriptionUpdater(silentUpdater);
updaterService.addPersistentComponentDescriptionUpdater(silentNonUpdater);
List<PersistentComponentDescription> descriptions = new ArrayList<PersistentComponentDescription>();
PersistentComponentDescription descriptionWithoutUpdate = createComponentDescriptionWithoutUpdate();
descriptions.add(descriptionWithoutUpdate);
// must return false, because only NonUpdater should be asked via hasPersistentComponentDescriptionUpdate()
assertEquals(PersistentDescriptionFormatVersion.NONE,
updaterService.getFormatVersionsAffectedByUpdate(descriptions, false));
// must return false, because only NonUpdater should be asked via hasPersistentComponentDescriptionUpdate() and is not silent
assertEquals(PersistentDescriptionFormatVersion.NONE,
updaterService.getFormatVersionsAffectedByUpdate(descriptions, true));
PersistentComponentDescription descriptionWithUpdate = createComponentDescriptionWithUpdate();
descriptions.add(descriptionWithUpdate);
// must return true, because also Updater should be asked via hasPersistentComponentDescriptionUpdate()
assertEquals(PersistentDescriptionFormatVersion.BEFORE_VERSON_THREE,
updaterService.getFormatVersionsAffectedByUpdate(descriptions, false));
// must return false, because also Updater should be asked via hasPersistentComponentDescriptionUpdate() but is not silent
assertEquals(PersistentDescriptionFormatVersion.NONE,
updaterService.getFormatVersionsAffectedByUpdate(descriptions, true));
PersistentComponentDescription descriptionWithoutSilentUpdate = createComponentDescriptionWithoutSilentUpdate();
descriptions.add(descriptionWithoutSilentUpdate);
// must return false because there is no Updater with a silent update
assertEquals(PersistentDescriptionFormatVersion.NONE,
updaterService.getFormatVersionsAffectedByUpdate(descriptions, true));
PersistentComponentDescription descriptionWithSilentUpdate = createComponentDescriptionWithSilentUpdate();
descriptions.add(descriptionWithSilentUpdate);
// must return true because now there is an Updater with a silent update
assertEquals(PersistentDescriptionFormatVersion.BEFORE_VERSON_THREE,
updaterService.getFormatVersionsAffectedByUpdate(descriptions, true));
// fails if an performPersistentComponentDescriptionUpdate() of NonUpdater is called and thus, IllegalStateException is thrown
List<PersistentComponentDescription> udpatedDescriptions = updaterService
.performComponentDescriptionUpdates(PersistentDescriptionFormatVersion.BEFORE_VERSON_THREE, descriptions, false);
assertEquals(4, udpatedDescriptions.size());
assertTrue(udpatedDescriptions.contains(updatedComponentDescription));
assertTrue(udpatedDescriptions.contains(descriptionWithoutUpdate));
assertFalse(udpatedDescriptions.contains(descriptionWithUpdate));
updaterService.removePersistentComponentDescriptionUpdater(updater);
}
private PersistentComponentDescription createComponentDescriptionWithUpdate() {
PersistentComponentDescription description = EasyMock.createNiceMock(PersistentComponentDescription.class);
EasyMock.expect(description.getComponentIdentifier()).andReturn(COMPID_WITH_UPDATE[0]).anyTimes();
EasyMock.replay(description);
return description;
}
private PersistentComponentDescription createComponentDescriptionWithSilentUpdate() {
PersistentComponentDescription description = EasyMock.createNiceMock(PersistentComponentDescription.class);
EasyMock.expect(description.getComponentIdentifier()).andReturn(COMPID_WITH_SILENT_UPDATE[0]).anyTimes();
EasyMock.replay(description);
return description;
}
private PersistentComponentDescription createComponentDescriptionWithoutUpdate() {
PersistentComponentDescription description = EasyMock.createNiceMock(PersistentComponentDescription.class);
EasyMock.expect(description.getComponentIdentifier()).andReturn(COMPID_WITHOUT_UPDATE[0]).anyTimes();
EasyMock.replay(description);
return description;
}
private PersistentComponentDescription createComponentDescriptionWithoutSilentUpdate() {
PersistentComponentDescription description = EasyMock.createNiceMock(PersistentComponentDescription.class);
EasyMock.expect(description.getComponentIdentifier()).andReturn(COMPID_WITHOUT_SILENT_UPDATE[0]).anyTimes();
EasyMock.replay(description);
return description;
}
/**
* Dummy class representing updater which has an update.
* @author Doreen Seider
*/
class Updater implements PersistentComponentDescriptionUpdater {
@Override
public String[] getComponentIdentifiersAffectedByUpdate() {
return COMPID_WITH_UPDATE;
}
@Override
public int getFormatVersionsAffectedByUpdate(String persistentComponentDescriptionVersion, boolean silent) {
if (silent){
return PersistentDescriptionFormatVersion.NONE;
}
return PersistentDescriptionFormatVersion.BEFORE_VERSON_THREE;
}
@Override
public PersistentComponentDescription performComponentDescriptionUpdate(int formatVersion,
PersistentComponentDescription description, boolean silent)
throws IOException {
return updatedComponentDescription;
}
}
/**
* Dummy class representing updater which hasn't update.
* @author Doreen Seider
*/
class NonUpdater implements PersistentComponentDescriptionUpdater {
@Override
public String[] getComponentIdentifiersAffectedByUpdate() {
return COMPID_WITHOUT_UPDATE;
}
@Override
public int getFormatVersionsAffectedByUpdate(String persistentComponentDescriptionVersion, boolean silent) {
if (silent) {
return PersistentDescriptionFormatVersion.NONE;
}
return PersistentDescriptionFormatVersion.NONE;
}
@Override
public PersistentComponentDescription performComponentDescriptionUpdate(int formatVersion,
PersistentComponentDescription description, boolean silent)
throws IOException {
throw new IllegalStateException("should not be called because of having no update");
}
}
/**
* Dummy class representing updater which has an silent update.
* @author Sascha Zur
*/
class SilentUpdater implements PersistentComponentDescriptionUpdater {
@Override
public String[] getComponentIdentifiersAffectedByUpdate() {
return COMPID_WITH_SILENT_UPDATE;
}
@Override
public int getFormatVersionsAffectedByUpdate(String persistentComponentDescriptionVersion, boolean silent) {
if (silent) {
return PersistentDescriptionFormatVersion.BEFORE_VERSON_THREE;
}
return PersistentDescriptionFormatVersion.NONE;
}
@Override
public PersistentComponentDescription performComponentDescriptionUpdate(int formatVersion,
PersistentComponentDescription description, boolean silent)
throws IOException {
return updatedComponentDescription;
}
}
/**
* Dummy class representing updater which hasn't silent update.
* @author Sascha Zur
*/
class SilentNonUpdater implements PersistentComponentDescriptionUpdater {
@Override
public String[] getComponentIdentifiersAffectedByUpdate() {
return COMPID_WITHOUT_SILENT_UPDATE;
}
@Override
public int getFormatVersionsAffectedByUpdate(String persistentComponentDescriptionVersion, boolean silent) {
if (silent) {
return PersistentDescriptionFormatVersion.NONE;
}
return PersistentDescriptionFormatVersion.NONE;
}
@Override
public PersistentComponentDescription performComponentDescriptionUpdate(int formatVersion,
PersistentComponentDescription description, boolean silent)
throws IOException {
throw new IllegalStateException("should not be called because of having no update");
}
}
}