/*
* Copyright (c) Fabien Hermenier
*
* 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 java.util.Random;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* Tests for SimpleConfiguration.
*
* @author Fabien Hermenier
*/
@Test(groups = "unit")
public class TestSimpleConfiguration {
/**
* 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 Configuration makeDefaultConfiguration() {
Configuration c = new SimpleConfiguration();
for (int i = 0; i < 10; i++) {
VirtualMachine vm = new SimpleVirtualMachine("VM" + i, 1, 1024, 2);
Node n = new SimpleNode("N" + i, 2, 100, 4096);
c.addOnline(n);
c.setRunOn(vm, n);
}
for (int i = 0; i < 5; i++) {
c.addOnline(new SimpleNode("N1" + i, 1, 100, 4096));
}
for (int i = 0; i < 5; i++) {
c.addOffline(new SimpleNode("-N1" + i, 1, 100, 4096));
}
for (int i = 10; i < 15; i++) {
c.addWaiting(new SimpleVirtualMachine("VM" + i, 1, 0, 1024));
}
for (int i = 15; i < 20; i++) {
c.setSleepOn(new SimpleVirtualMachine("VM" + i, 1, 0, 1024), c.getOnlines().get("N" + (i - 10)));
}
return c;
}
/**
* Test getNodes().
*/
public void testGetOnlines() {
Configuration c = new SimpleConfiguration();
Assert.assertEquals(c.getOnlines().size(), 0);
c = makeDefaultConfiguration();
Assert.assertEquals(c.getOnlines().size(), 15);
}
/**
* Test getRunnings().
*/
public void testGetRunnings() {
Configuration c = 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() {
Configuration c = makeDefaultConfiguration();
Assert.assertEquals(c.getSleepings().size(), 5);
Assert.assertEquals(c.getSleepings(c.getOnlines().get("N5")).size(), 1);
}
/**
* Tets getWaitings().
*/
public void testGetWaitings() {
Configuration c = makeDefaultConfiguration();
Assert.assertEquals(c.getWaitings().size(), 5);
}
/**
* Test equals() when the configurations are the same.
*/
public void testEquals() {
Configuration c = makeDefaultConfiguration();
Configuration c2 = makeDefaultConfiguration();
Assert.assertEquals(c2, c);
}
/**
* Test equals() when the configuration are not the same, for several reasons.
*/
public void testNotEquals() {
Configuration c = makeDefaultConfiguration();
Configuration c2 = makeDefaultConfiguration();
//c2 has an additional VM
c2.addWaiting(new SimpleVirtualMachine("new", 1, 2, 3));
Assert.assertNotSame(c2, c);
//Affectations are not the same
c2 = makeDefaultConfiguration();
c2.setRunOn(c2.getRunnings().get(0), c2.getOnlines().get(0));
Assert.assertNotSame(c2, c);
//c2 has not the same nodes
c2 = makeDefaultConfiguration();
c2.addOffline(new SimpleNode("NX", 1, 2, 3));
Assert.assertNotSame(c2, c);
}
/**
* Test the copy constructor.
*/
public void testCopyConstructor() {
Configuration c = makeDefaultConfiguration();
Configuration copy = c.clone();
//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));
}
//Check
//TODO: Make modification in the source and check cloning
Node n = new SimpleNode("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.getLocation(vm), c.getLocation(vm));
}
public void testAddOnline() {
Configuration c = new SimpleConfiguration();
Node n1 = new SimpleNode("N1", 1, 2, 3);
c.addOnline(n1);
Assert.assertTrue(c.getAllNodes().contains(n1));
Assert.assertTrue(c.getOnlines().contains(n1));
Assert.assertEquals(c.getRunnings(n1).size(), 0);
Assert.assertEquals(c.getSleepings(n1).size(), 0);
Assert.assertTrue(c.isOnline(n1));
}
/**
* Test addOnline in several conditions.
*/
public void testAddOnline2() {
Configuration c = makeDefaultConfiguration();
Node n = new SimpleNode("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 SimpleNode("-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() {
Configuration c = makeDefaultConfiguration();
Node n = new SimpleNode("-N30", 1, 2, 3);
Assert.assertEquals(c.getOfflines().size(), 5);
c.addOffline(n);
Assert.assertEquals(c.getAllNodes().get("-N30"), n);
Assert.assertEquals(c.getOfflines().size(), 6);
Assert.assertTrue(c.getOfflines().contains(n));
//A node that is online.
n = new SimpleNode("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 SimpleNode("N3", 1, 2, 3);
Assert.assertFalse(c.addOffline(n));
Assert.assertFalse(c.getOfflines().contains(n));
Assert.assertEquals(c.getAllNodes().get("N3"), n);
}
/**
* Test getAffected().
*/
public void testVMStateConsistency() {
Configuration c = makeDefaultConfiguration();
for (VirtualMachine vm : c.getAllVirtualMachines()) {
if (c.isRunning(vm)) {
Node n = c.getLocation(vm);
Assert.assertTrue(c.getRunnings(n).contains(vm));
Assert.assertTrue(c.getRunnings().contains(vm));
} else if (c.isSleeping(vm)) {
Node n = c.getLocation(vm);
Assert.assertTrue(c.getSleepings(n).contains(vm));
Assert.assertTrue(c.getSleepings().contains(vm));
}
}
for (int i = 0; i < 10; i++) {
Node n = c.getOnlines().get("N" + i);
VirtualMachine vm = c.getRunnings().get("VM" + i);
Assert.assertEquals(c.getLocation(vm), n);
}
}
/**
* Dummy test for toString, to avoid NullPointerException.
*/
public void testToString() {
Configuration c = makeDefaultConfiguration();
System.err.println(c.toString());
Assert.assertNotNull(c.toString());
}
/**
* Tests for setRunOn() in several conditions.
*/
public void testSetRunOn() {
Configuration c = new SimpleConfiguration();
Node n = new SimpleNode("N1", 1, 2, 3);
VirtualMachine vm = new SimpleVirtualMachine("VM1", 1, 2, 3);
c.addOnline(n);
Assert.assertTrue(c.setRunOn(vm, n));
Assert.assertTrue(c.getAllVirtualMachines().contains(vm));
Assert.assertTrue(c.getRunnings().contains(vm));
Assert.assertTrue(c.getRunnings(n).contains(vm));
Assert.assertTrue(c.isRunning(vm));
c = makeDefaultConfiguration();
vm = new SimpleVirtualMachine("toto", 1, 2, 3);
n = c.getOnlines().get(0);
Assert.assertTrue(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.getLocation(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 SimpleVirtualMachine("op", 1, 2, 3);
n = c.getOfflines().get(0);
Assert.assertFalse(c.setRunOn(vm, n));
Assert.assertFalse(c.getRunnings().contains(vm));
Assert.assertFalse(c.getRunnings(n).contains(vm));
Assert.assertNotSame(c.getLocation(vm), n);
//Relocation of a VM
c.setRunOn(vm, c.getOnlines().get(c.getOnlines().size() - 1));
Assert.assertEquals(c.getLocation(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 SimpleVirtualMachine("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.getLocation(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.getLocation(vm), n);
//Test with a VM that was running
vm = c.getRunnings().get("VM1");
Node oldNode = c.getLocation(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.getLocation(vm), n);
//Test on a offline node
vm = new SimpleVirtualMachine("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.getLocation(vm), n);
//Test on a unknown node
}
/**
* Test addWaiting() in several situations.
*/
public void testAddWaiting() {
Configuration c = new SimpleConfiguration();
VirtualMachine vm = new SimpleVirtualMachine("VM1", 1, 1, 1);
c.addWaiting(vm);
Assert.assertTrue(c.getAllVirtualMachines().contains(vm));
Assert.assertTrue(c.getWaitings().contains(vm));
Assert.assertTrue(c.isWaiting(vm));
c = makeDefaultConfiguration();
vm = new SimpleVirtualMachine("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.getLocation(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.getLocation(vm);
c.addWaiting(vm);
Assert.assertFalse(c.getSleepings().contains(vm));
Assert.assertFalse(c.getSleepings(oldNode).contains(vm));
Assert.assertTrue(c.getWaitings().contains(vm));
}
/**
* Test getLocation().
*/
public void testGetLocation() {
Configuration c = makeDefaultConfiguration();
Assert.assertEquals(c.getLocation(new SimpleVirtualMachine("VM0", 1, 2, 3)), c.getOnlines().get("N0"));
Assert.assertNull(c.getLocation(new SimpleVirtualMachine("zob", 1, 2, 3)));
Assert.assertEquals(c.getLocation(new SimpleVirtualMachine("VM15", 1, 2, 3)), c.getOnlines().get("N5"));
Assert.assertNull(c.getLocation(new SimpleVirtualMachine("zob", 1, 2, 3)));
}
/**
* Test remove().
*/
public void testRemove() {
Configuration c = new SimpleConfiguration();
Node n1 = new SimpleNode("n1", 1, 2, 3);
VirtualMachine vm1 = new SimpleVirtualMachine("VM1", 1, 2, 3);
c.addOnline(n1);
c.setRunOn(vm1, n1);
c.remove(vm1);
Assert.assertFalse(c.getRunnings().contains(vm1));
Assert.assertFalse(c.getAllVirtualMachines().contains(vm1));
Assert.assertFalse(c.getRunnings(n1).contains(vm1));
Assert.assertNull(c.getLocation(vm1));
}
/**
* Random modifications on a cloned configuration.
* The original should not be modified
*/
public void testClone() {
Random rnd = new Random();
Configuration c = makeDefaultConfiguration();
Configuration c2 = c.clone();
Assert.assertEquals(c, c2);
String expected = c.toString();
for (int i = 0; i < c2.getRunnings().size(); i++) {
int idx = rnd.nextInt(c2.getRunnings().size());
VirtualMachine vm = c2.getRunnings().get(idx);
int nIdx = rnd.nextInt(c2.getOnlines().size());
Node n = c2.getOnlines().get(nIdx);
//System.out.println(vm.getName() + " from " + c2.getLocation(vm).getName() + " to " + n.getName());
c2.setRunOn(vm, n);
Assert.assertEquals(c.toString(), expected);
}
}
}