/*
* Copyright (c) 2009 Ecole des Mines de Nantes.
*
* This file is part of Entropy.
*
* Entropy 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.
*
* Entropy 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 Entropy. If not, see <http://www.gnu.org/licenses/>.
*/
package entropy.configuration;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* Unit tests for Configuration.
*
* @author Fabien Hermenier
*/
@Test(groups = {"unit"})
public class TestConfiguration {
/**
* Make a default configuration for test purpose.
* VM0 to VM9 are affected to node N0 to N9. Node N10 to N14 are unused
* VirtualMachine VM10 to VM14 are unaffected
*
* @return the configuration
*/
private static DefaultConfiguration makeDefaultConfiguration() {
DefaultConfiguration c = new DefaultConfiguration();
for (int i = 0; i < 10; i++) {
DefaultVirtualMachine vm = new DefaultVirtualMachine("VM" + i, 1, 1024, 2);
DefaultNode n = new DefaultNode("N" + i, 2, 100, 4096);
c.addOnline(n);
c.setRunOn(vm, n);
}
for (int i = 0; i < 5; i++) {
c.addOnline(new DefaultNode("N1" + i, 1, 100, 4096));
}
for (int i = 0; i < 5; i++) {
c.addOffline(new DefaultNode("-N1" + i, 1, 100, 4096));
}
for (int i = 10; i < 15; i++) {
c.addWaiting(new DefaultVirtualMachine("VM" + i, 1, 0, 1024));
}
for (int i = 15; i < 20; i++) {
c.setSleepOn(new DefaultVirtualMachine("VM" + i, 1, 0, 1024), c.getOnlines().get("N" + (i - 10)));
}
return c;
}
/**
* Test getNodes().
*/
public void testGetOnlines() {
Configuration c = new DefaultConfiguration();
Assert.assertEquals(c.getOnlines().size(), 0);
c = TestConfiguration.makeDefaultConfiguration();
Assert.assertEquals(c.getOnlines().size(), 15);
}
/**
* Test getRunnings().
*/
public void testGetRunnings() {
Configuration c = TestConfiguration.makeDefaultConfiguration();
Assert.assertEquals(c.getRunnings().size(), 10);
for (int i = 0; i < 10; i++) {
Node n = c.getOnlines().get("N" + i);
VirtualMachine vm = c.getRunnings().get("VM" + i);
Assert.assertEquals(c.getRunnings(n).size(), 1);
Assert.assertTrue(c.getRunnings(n).contains(vm));
}
}
/**
* Test getSleepings().
*/
public void testGetSleepings() {
DefaultConfiguration c = TestConfiguration.makeDefaultConfiguration();
Assert.assertEquals(c.getSleepings().size(), 5);
Assert.assertEquals(c.getSleepings(c.getOnlines().get("N5")).size(), 1);
}
/**
* Tets getWaitings().
*/
public void testGetWaitings() {
DefaultConfiguration c = TestConfiguration.makeDefaultConfiguration();
Assert.assertEquals(c.getWaitings().size(), 5);
}
/**
* Test equals() when the configurations are the same.
*/
public void testEquals() {
DefaultConfiguration c = TestConfiguration.makeDefaultConfiguration();
DefaultConfiguration c2 = TestConfiguration.makeDefaultConfiguration();
Assert.assertEquals(c2, c);
}
/**
* Test equals() when the configuration are not the same, for several reasons.
*/
public void testNotEquals() {
DefaultConfiguration c = TestConfiguration.makeDefaultConfiguration();
DefaultConfiguration c2 = TestConfiguration.makeDefaultConfiguration();
//c2 has an additional VM
c2.addWaiting(new DefaultVirtualMachine("new", 1, 2, 3));
Assert.assertNotSame(c2, c);
//Affectations are not the same
c2 = TestConfiguration.makeDefaultConfiguration();
c2.setRunOn(c2.getRunnings().get(0), c2.getOnlines().get(0));
Assert.assertNotSame(c2, c);
//c2 has not the same nodes
c2 = TestConfiguration.makeDefaultConfiguration();
c2.addOffline(new DefaultNode("NX", 1, 2, 3));
Assert.assertNotSame(c2, c);
}
/**
* Test the copy constructor.
*/
public void testCopyConstructor() {
Configuration c = TestConfiguration.makeDefaultConfiguration();
Configuration copy = new DefaultConfiguration(c);
//Basic check
Assert.assertEquals((Object) copy.getRunnings(), (Object) c.getRunnings());
Assert.assertEquals((Object) copy.getWaitings(), (Object) c.getWaitings());
Assert.assertEquals((Object) copy.getSleepings(), (Object) c.getSleepings());
Assert.assertEquals((Object) copy.getOnlines(), (Object) c.getOnlines());
Assert.assertEquals((Object) copy.getOfflines(), (Object) c.getOfflines());
for (Node n : c.getOnlines()) {
Assert.assertEquals((Object) c.getRunnings(n), (Object) copy.getRunnings(n));
Assert.assertEquals((Object) c.getSleepings(n), (Object) copy.getSleepings(n));
}
for (VirtualMachine vm : c.getSleepings()) {
Assert.assertEquals(c.getSleepingLocation(vm), copy.getSleepingLocation(vm));
Assert.assertEquals(c.getSleepingLocation(vm), copy.getSleepingLocation(vm));
}
for (VirtualMachine vm : c.getRunnings()) {
Assert.assertEquals(c.getRunningLocation(vm), copy.getRunningLocation(vm));
Assert.assertEquals(c.getRunningLocation(vm), copy.getRunningLocation(vm));
}
//Check
//TODO: Make modification in the source and check cloning
DefaultNode n = new DefaultNode("NY", 1, 2, 3);
copy.addOnline(n);
Assert.assertFalse(c.getOnlines().contains(n));
c.addOnline(n);
VirtualMachine vm = c.getRunnings().get("VM1");
c.setRunOn(vm, n);
Assert.assertNotSame(copy.getRunningLocation(vm), c.getRunningLocation(vm));
}
/**
* Test addOnline in several conditions.
*/
public void testAddOnline() {
Configuration c = TestConfiguration.makeDefaultConfiguration();
Node n = new DefaultNode("NA", 1, 2, 3);
c.addOnline(n);
Assert.assertEquals(c.getOnlines().size(), 16);
Assert.assertTrue(c.getOnlines().contains(n));
//A node that is offline.
n = new DefaultNode("-N0", 1, 2, 3);
c.addOnline(n);
Assert.assertEquals(c.getOnlines().size(), 17);
Assert.assertTrue(c.getOnlines().contains(n));
Assert.assertFalse(c.getOfflines().contains(n));
}
/**
* Test addOffline in several conditions.
*/
public void testAddOffline() {
DefaultConfiguration c = TestConfiguration.makeDefaultConfiguration();
DefaultNode n = new DefaultNode("-N30", 1, 2, 3);
Assert.assertEquals(c.getOfflines().size(), 5);
c.addOffline(n);
Assert.assertEquals(c.getOfflines().size(), 6);
Assert.assertTrue(c.getOfflines().contains(n));
//A node that is online.
n = new DefaultNode("N12", 1, 2, 3);
Assert.assertTrue(c.addOffline(n));
Assert.assertFalse(c.getOnlines().contains(n));
Assert.assertTrue(c.getOfflines().contains(n));
//A node that contains virtual machines. So should not be allowed
n = new DefaultNode("N3", 1, 2, 3);
Assert.assertFalse(c.addOffline(n));
Assert.assertFalse(c.getOfflines().contains(n));
}
/**
* Test getAffected().
*/
public void testGetPosition() {
Configuration c = TestConfiguration.makeDefaultConfiguration();
for (int i = 0; i < 10; i++) {
Node n = c.getOnlines().get("N" + i);
VirtualMachine vm = c.getRunnings().get("VM" + i);
Assert.assertEquals(c.getRunningLocation(vm), n);
}
}
/**
* Dummy test for toString, to avoid NullPointerException.
*/
public void testToString() {
Assert.assertNotNull(TestConfiguration.makeDefaultConfiguration().toString());
}
/**
* Tests for setRunOn() in several conditions.
*/
public void testSetRunOn() {
Configuration c = makeDefaultConfiguration();
VirtualMachine vm = new DefaultVirtualMachine("toto", 1, 2, 3);
Node n = c.getOnlines().get(0);
c.setRunOn(vm, n);
Assert.assertTrue(c.getRunnings().contains(vm));
Assert.assertTrue(c.getRunnings(n).contains(vm));
//Test with a VM that was waiting
vm = c.getWaitings().get("VM10");
c.setRunOn(vm, n);
Assert.assertFalse(c.getWaitings().contains(vm));
Assert.assertTrue(c.getRunnings().contains(vm));
Assert.assertTrue(c.getRunnings(n).contains(vm));
//Test with a VM that was sleeping
vm = c.getSleepings().get("VM15");
Node oldNode = c.getSleepingLocation(vm);
c.setRunOn(vm, n);
Assert.assertFalse(c.getSleepings().contains(vm));
Assert.assertFalse(c.getSleepings(oldNode).contains(vm));
Assert.assertTrue(c.getRunnings(n).contains(vm));
//Test on a offline node
vm = new DefaultVirtualMachine("op", 1, 2, 3);
n = c.getOfflines().get(0);
c.setRunOn(vm, n);
Assert.assertFalse(c.getRunnings().contains(vm));
Assert.assertFalse(c.getRunnings(n).contains(vm));
Assert.assertNotSame(c.getRunningLocation(vm), n);
//Relocation of a VM
c.setRunOn(vm, c.getOnlines().get(c.getOnlines().size() - 1));
Assert.assertEquals(c.getRunningLocation(vm), c.getOnlines().get(c.getOnlines().size() - 1));
Assert.assertFalse(c.getRunnings(c.getOnlines().get(0)).contains(vm));
Assert.assertTrue(c.getRunnings(c.getOnlines().get(c.getOnlines().size() - 1)).contains(vm));
}
/**
* Tests for setRunOn() in several conditions.
*/
public void testSetSleepOn() {
Configuration c = makeDefaultConfiguration();
VirtualMachine vm = new DefaultVirtualMachine("toto", 1, 2, 3);
Node n = c.getOnlines().get(0);
c.setSleepOn(vm, n);
Assert.assertTrue(c.getSleepings().contains(vm));
Assert.assertTrue(c.getSleepings(n).contains(vm));
Assert.assertEquals(c.getSleepingLocation(vm), n);
//Test with a VM that was waiting
vm = c.getWaitings().get("VM10");
c.setSleepOn(vm, n);
Assert.assertFalse(c.getWaitings().contains(vm));
Assert.assertTrue(c.getSleepings().contains(vm));
Assert.assertTrue(c.getSleepings(n).contains(vm));
Assert.assertEquals(c.getSleepingLocation(vm), n);
//Test with a VM that was running
vm = c.getRunnings().get("VM1");
Node oldNode = c.getRunningLocation(vm);
c.setSleepOn(vm, n);
Assert.assertFalse(c.getRunnings().contains(vm));
Assert.assertFalse(c.getRunnings(oldNode).contains(vm));
Assert.assertTrue(c.getSleepings(n).contains(vm));
Assert.assertEquals(c.getSleepingLocation(vm), n);
//Test on a offline node
vm = new DefaultVirtualMachine("op", 1, 2, 3);
n = c.getOfflines().get(0);
c.setSleepOn(vm, n);
Assert.assertFalse(c.getSleepings().contains(vm));
Assert.assertFalse(c.getSleepings(n).contains(vm));
Assert.assertNotSame(c.getSleepingLocation(vm), n);
//Test on a unknown node
}
/**
* Test addWaiting() in several situations.
*/
public void testAddWaiting() {
DefaultConfiguration c = makeDefaultConfiguration();
VirtualMachine vm = new DefaultVirtualMachine("hop", 1, 2, 3);
c.addWaiting(vm);
Assert.assertTrue(c.getWaitings().contains(vm));
//Test with a VM that was running
vm = c.getRunnings().get("VM1");
Node oldNode = c.getRunningLocation(vm);
c.addWaiting(vm);
Assert.assertFalse(c.getRunnings().contains(vm));
Assert.assertFalse(c.getRunnings(oldNode).contains(vm));
Assert.assertTrue(c.getWaitings().contains(vm));
//Test with a VM that was sleeping
vm = c.getSleepings().get("VM15");
oldNode = c.getSleepingLocation(vm);
c.addWaiting(vm);
Assert.assertFalse(c.getSleepings().contains(vm));
Assert.assertFalse(c.getSleepings(oldNode).contains(vm));
Assert.assertTrue(c.getWaitings().contains(vm));
}
/**
* Test getRunningLocation().
*/
public void testGetRunningLocation() {
DefaultConfiguration c = makeDefaultConfiguration();
Assert.assertEquals(c.getRunningLocation(new DefaultVirtualMachine("VM0", 1, 2, 3)), c.getOnlines().get("N0"));
Assert.assertNull(c.getRunningLocation(new DefaultVirtualMachine("zob", 1, 2, 3)));
}
/**
* Test getSleepingLocation().
*/
public void testGetSleepingLocation() {
DefaultConfiguration c = makeDefaultConfiguration();
Assert.assertEquals(c.getSleepingLocation(new DefaultVirtualMachine("VM15", 1, 2, 3)), c.getOnlines().get("N5"));
Assert.assertNull(c.getSleepingLocation(new DefaultVirtualMachine("zob", 1, 2, 3)));
}
/**
* Test remove().
*/
public void testRemove() {
DefaultConfiguration c = makeDefaultConfiguration();
DefaultNode n1 = new DefaultNode("n1", 1, 2, 3);
DefaultVirtualMachine vm1 = new DefaultVirtualMachine("VM1", 1, 2, 3);
c.addOnline(n1);
c.setRunOn(vm1, n1);
c.remove(vm1);
Assert.assertFalse(c.getRunnings().contains(vm1));
Assert.assertNull(c.getRunningLocation(vm1));
}
}