/**
* This file is part of CloudML [ http://cloudml.org ]
*
* Copyright (C) 2012 - SINTEF ICT
* Contact: Franck Chauvel <franck.chauvel@sintef.no>
*
* Module: root
*
* CloudML is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* CloudML is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with CloudML. If not, see
* <http://www.gnu.org/licenses/>.
*/
package test.cloudml.indicators;
import org.cloudml.core.Component;
import org.cloudml.core.Deployment;
import org.cloudml.core.Property;
import org.cloudml.core.samples.SshClientServer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.cloudml.indicators.Robustness;
import org.cloudml.indicators.Selection;
import org.cloudml.indicators.TrioExporter;
import static org.cloudml.core.builders.Commons.aVMInstance;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
/**
* Test the computation of robustness.
*
* We assume here that TRIO's robustness calculations are correct and we
* therefore only test for a correct generation of a Trio model out of a CloudML
* deployment.
*/
@RunWith(JUnit4.class)
public class RobustnessTest {
@Test
public void robustnessOfOneClientOneServer() {
final Deployment cloudml = SshClientServer.
getOneClientConnectedToOneServer()
.build();
final Robustness robustness = Robustness.of(cloudml, Selection.INTERNAL, Selection.EXTERNAL);
assertThat("Wrong robustness",
robustness.value(),
is(closeTo(0.125, TOLERANCE)));
}
@Test
public void robustnessOfSelfRepairingOneClientOneServer() {
final Deployment cloudml = SshClientServer.
getOneClientConnectedToOneServer()
.build();
final Robustness robustness = Robustness.ofSelfRepairing(cloudml, Selection.INTERNAL, Selection.EXTERNAL);
assertThat("Wrong robustness",
robustness.value(),
is(closeTo(0.125, TOLERANCE)));
}
@Test
public void serviceRobustnessOfSelfRepairingOneClientOneServer() {
final Deployment ssh = SshClientServer.
getOneClientConnectedToOneServer()
.build();
final Component client = ssh.getComponents().firstNamed(SshClientServer.SSH_CLIENT);
client.getProperties().add(new Property(TrioExporter.IS_SERVICE, "true"));
final Component server = ssh.getComponents().firstNamed(SshClientServer.SSH_SERVER);
server.getProperties().add(new Property(TrioExporter.IS_SERVICE, "true"));
final Robustness internalRobustness = Robustness.ofSelfRepairing(ssh, Selection.INTERNAL, Selection.EXTERNAL);
final Robustness serviceRobustness = Robustness.ofSelfRepairing(ssh, Selection.SERVICE, Selection.NOT_SERVICE);
assertThat("Wrong robustness",
serviceRobustness.value(),
is(closeTo(internalRobustness.value(), TOLERANCE)));
}
@Test
public void robustnessOfOneClientOneOfTwoServers() {
final Deployment cloudml = SshClientServer.
getOneClientConnectedToOneServer()
.with(aVMInstance()
.named("VM3")
.ofType(SshClientServer.EC2_XLARGE_WINDOWS_7))
.build();
final Robustness robustness = Robustness.of(cloudml, Selection.INTERNAL, Selection.EXTERNAL);
assertThat("Wrong robustness",
robustness.value(),
is(closeTo(2D/9, TOLERANCE)));
}
@Test
public void robustnessOfSelfRepairingOneClientOneOfTwoServers() {
final Deployment cloudml = SshClientServer.
getOneClientConnectedToOneServer()
.with(aVMInstance()
.named("VM3")
.ofType(SshClientServer.EC2_XLARGE_WINDOWS_7))
.build();
final Robustness robustness = Robustness.ofSelfRepairing(cloudml, Selection.INTERNAL, Selection.EXTERNAL);
assertThat("Wrong robustness",
robustness.value(),
is(closeTo(7D / 18, TOLERANCE)));
}
private static final double TOLERANCE = 1e-2;
}