/* * 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 static entropy.configuration.Configurations.State.Runnings; import static entropy.configuration.Configurations.State.Sleepings; import java.io.IOException; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import org.testng.Assert; import org.testng.annotations.Test; import entropy.configuration.parser.ConfigurationSerializerException; import entropy.configuration.parser.PlainTextConfigurationSerializer; /** * Unit tests for Configurations. * * @author Fabien Hermenier */ @Test(groups = {"unit"}) public class TestConfigurations { private static final String RESOURCE_ROOT = "src/test/resources/entropy/configuration/TestConfigurations."; private Configuration makeConfiguration() { Configuration c = new SimpleConfiguration(); for (int i = 0; i < 10; i++) { Node n = new SimpleNode("N" + (i + 1), 1, 5, 5); c.addOnline(n); } c.addOffline(new SimpleNode("N11", 4, 4, 4)); c.setRunOn(new SimpleVirtualMachine("VM1", 1, 1, 1), c.getOnlines().get("N1")); c.setRunOn(new SimpleVirtualMachine("VM2", 1, 1, 1), c.getOnlines().get("N2")); c.setRunOn(new SimpleVirtualMachine("VM3", 1, 1, 1, 2, 2), c.getOnlines().get("N3")); c.setRunOn(new SimpleVirtualMachine("VM4", 1, 1, 1), c.getOnlines().get("N4")); c.setRunOn(new SimpleVirtualMachine("VM5", 1, 1, 1), c.getOnlines().get("N5")); c.setRunOn(new SimpleVirtualMachine("VM6", 1, 1, 1), c.getOnlines().get("N5")); c.setRunOn(new SimpleVirtualMachine("VM7", 1, 4, 4, 1, 1), c.getOnlines().get("N5")); c.setRunOn(new SimpleVirtualMachine("VM8", 1, 1, 1, 4, 4), c.getOnlines().get("N3")); c.setRunOn(new SimpleVirtualMachine("VM9", 1, 1, 1), c.getOnlines().get("N8")); c.setSleepOn(new SimpleVirtualMachine("VM10", 1, 1, 1), c.getOnlines().get("N2")); c.setSleepOn(new SimpleVirtualMachine("VM11", 1, 1, 1), c.getOnlines().get("N7")); return c; } public void testUsedNodes() { Configuration cfg = makeConfiguration(); ManagedElementSet<Node> ns = Configurations.usedNodes(cfg, EnumSet.of(Runnings)); Assert.assertEquals(ns.size(), 6); ns = Configurations.usedNodes(cfg, EnumSet.of(Sleepings)); Assert.assertEquals(ns.size(), 2); ns = Configurations.usedNodes(cfg, EnumSet.of(Runnings, Sleepings)); Assert.assertEquals(ns.size(), 7); } public void testUnusedNodes() { Configuration cfg = makeConfiguration(); ManagedElementSet<Node> ns = Configurations.unusedNodes(cfg, Runnings); Assert.assertEquals(ns.size(), 4); ns = Configurations.unusedNodes(cfg, Sleepings); Assert.assertEquals(ns.size(), 8); } public void testCurrentlyOverloadedNodes() { Configuration cfg = makeConfiguration(); ManagedElementSet<Node> ns = Configurations.currentlyOverloadedNodes(cfg); Assert.assertFalse(Configurations.isCurrentlyViable(cfg)); Assert.assertEquals(ns.size(), 1); Assert.assertEquals(ns.get(0).getName(), "N5"); cfg.remove(cfg.getRunnings().get("VM7")); Assert.assertTrue(Configurations.isCurrentlyViable(cfg)); } public void testFutureOverloadedNodes() { Configuration cfg = makeConfiguration(); Assert.assertFalse(Configurations.isFutureViable(cfg)); Assert.assertEquals(Configurations.futureOverloadedNodes(cfg).size(), 1); Assert.assertEquals(Configurations.futureOverloadedNodes(cfg).get(0).getName(), "N3"); cfg.remove(cfg.getRunnings().get("VM3")); Assert.assertTrue(Configurations.isFutureViable(cfg)); } public void testSubConfiguration() { Configuration cfg = makeConfiguration(); cfg.addWaiting(new SimpleVirtualMachine("VMXX", 1, 2, 3)); ManagedElementSet<Node> ns = new SimpleManagedElementSet<Node>(); ns.addAll(cfg.getOfflines()); ns.add(cfg.getAllNodes().get("N1")); ns.add(cfg.getAllNodes().get("N2")); ns.add(cfg.getAllNodes().get("N3")); ns.add(cfg.getAllNodes().get("N11")); ManagedElementSet<VirtualMachine> vms = new SimpleManagedElementSet<VirtualMachine>(); vms.add(cfg.getAllVirtualMachines().get("VM1")); vms.add(cfg.getAllVirtualMachines().get("VM2")); vms.add(cfg.getAllVirtualMachines().get("VM10")); vms.add(cfg.getAllVirtualMachines().get("VM3")); vms.add(cfg.getAllVirtualMachines().get("VM8")); vms.add(cfg.getAllVirtualMachines().get("VMXX")); try { Assert.assertEquals(Configurations.subConfiguration(cfg, cfg.getAllVirtualMachines(), cfg.getAllNodes()), cfg); Configuration c = Configurations.subConfiguration(cfg, vms, ns); for (VirtualMachine vm : vms) { Assert.assertEquals(c.getLocation(vm), cfg.getLocation(vm)); } for (Node n : ns) { Assert.assertEquals(c.getRunnings(n), cfg.getRunnings(n)); Assert.assertEquals(c.getSleepings(n), cfg.getSleepings(n)); } } catch (ConfigurationsException e) { Assert.fail(e.getMessage(), e); } //TODO: check some failures } /** * Test configuration merging with good sub configurations */ public void testGoodMerge() { try { Configuration c1 = PlainTextConfigurationSerializer.getInstance().read(RESOURCE_ROOT + "testMerge1.txt"); Configuration c2 = PlainTextConfigurationSerializer.getInstance().read(RESOURCE_ROOT + "testMerge2.txt"); Configuration expected = PlainTextConfigurationSerializer.getInstance().read(RESOURCE_ROOT + "testMerge-good.txt"); Configuration res = Configurations.merge(c1, c2); List<Configuration> l = new ArrayList<Configuration>(); l.add(c1); l.add(c2); Assert.assertEquals(res, expected); Assert.assertEquals(res, Configurations.merge(l)); } catch (Exception e) { Assert.fail(e.getMessage(), e); } } /** * Test configuration merging with non disjoint set of VMs */ @Test(expectedExceptions = {ConfigurationsException.class}) public void testBadMergeWithConflictingVMs() throws ConfigurationsException { try { Configuration c1 = PlainTextConfigurationSerializer.getInstance().read(RESOURCE_ROOT + "testMerge1.txt"); Configuration c2 = PlainTextConfigurationSerializer.getInstance().read(RESOURCE_ROOT + "testMerge3.txt"); Configurations.merge(c1, c2); } catch (IOException e) { Assert.fail(e.getMessage(), e); } catch (ConfigurationSerializerException e) { Assert.fail(e.getMessage(), e); } } /** * Test configuration merging with nodes in conflicting states */ @Test(expectedExceptions = {ConfigurationsException.class}) public void testBadMergeWithConflictingNodes() throws ConfigurationsException { try { Configuration c1 = PlainTextConfigurationSerializer.getInstance().read(RESOURCE_ROOT + "testMerge1.txt"); Configuration c2 = PlainTextConfigurationSerializer.getInstance().read(RESOURCE_ROOT + "testMerge4.txt"); Configurations.merge(c1, c2); } catch (IOException e) { Assert.fail(e.getMessage(), e); } catch (ConfigurationSerializerException e) { Assert.fail(e.getMessage(), e); } } }