/** * Copyright (C) 2008 Progress Software, Inc. All rights reserved. * http://fusesource.com * * The software in this package is published under the terms of the AGPL license * a copy of which has been included with this distribution in the license.txt file. */ package org.fusesource.cloudmix.controller.provisioning; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; import junit.framework.TestCase; import org.easymock.EasyMock; import org.easymock.IAnswer; import org.fusesource.cloudmix.common.ControllerDataProvider; import org.fusesource.cloudmix.common.controller.AgentController; import org.fusesource.cloudmix.common.controller.FeatureController; import org.fusesource.cloudmix.common.controller.ProfileController; import org.fusesource.cloudmix.common.dto.AgentDetails; import org.fusesource.cloudmix.common.dto.ProfileDetails; public class DefaultGridControllerTest extends TestCase { public void testSetDataProviderAlsoSetsReferenceToController() { SimpleControllerDataProvider dp = new SimpleControllerDataProvider(); DefaultGridController gc = new DefaultGridController(); assertNull(dp.getGrid()); gc.setDataProvider(dp); assertSame(gc, dp.getGrid()); } public void testAddProfile() throws Exception { ControllerDataProvider dp = EasyMock.createMock(ControllerDataProvider.class); DefaultGridController gc = new DefaultGridController(); final ProfileDetails pd = new ProfileDetails("testing"); EasyMock.expect(dp.addProfile((String) EasyMock.anyObject(), (ProfileController) EasyMock.anyObject())). andAnswer(new IAnswer<ProfileController>() { public ProfileController answer() throws Throwable { String id = (String) EasyMock.getCurrentArguments()[0]; assertEquals("testing", id); ProfileController pc = (ProfileController) EasyMock.getCurrentArguments()[1]; assertEquals(pd, pc.getDetails()); return pc; } }); dp.setGrid(gc); EasyMock.replay(dp); gc.setDataProvider(dp); gc.addProfile(pd); EasyMock.verify(dp); } public void testRemoveProfile() throws Exception { ControllerDataProvider dp = EasyMock.createMock(ControllerDataProvider.class); DefaultGridController gc = new DefaultGridController(); EasyMock.expect(dp.removeProfile("production")).andReturn( new ProfileController(gc, new ProfileDetails("production"))); dp.setGrid(gc); // TODO bit of a hack but the default implementation invokes getFeatures by default EasyMock.expect(dp.getFeatures()).andReturn(new ArrayList<FeatureController>()); EasyMock.replay(dp); gc.setDataProvider(dp); gc.removeProfile("production"); EasyMock.verify(dp); } public void testAgentTrackers() throws Exception { ControllerDataProvider dp = EasyMock.createMock(ControllerDataProvider.class); DefaultGridController gc = new DefaultGridController(); AgentController ac1 = new AgentController(gc, new AgentDetails()); ac1.markActive(); AgentController ac2 = new AgentController(gc, new AgentDetails()); AgentController ac3 = new AgentController(gc, new AgentDetails()); ac3.markActive(); Set<AgentController> agents = new HashSet<AgentController>(); agents.addAll(Arrays.asList(ac1, ac2, ac3)); dp.setGrid(gc); EasyMock.expect(dp.getAgents()).andReturn(agents); EasyMock.replay(dp); gc.setDataProvider(dp); Set<AgentController> expectedAgents = new HashSet<AgentController>(); expectedAgents.addAll(Arrays.asList(ac1, ac3)); assertEquals(expectedAgents, new HashSet<AgentController>(gc.agentTrackers())); EasyMock.verify(dp); } public void testAgentTrackers2() { ControllerDataProvider dp = EasyMock.createMock(ControllerDataProvider.class); DefaultGridController gc = new DefaultGridController(); AgentDetails ad1 = new AgentDetails(); ad1.setProfile("testing"); AgentController ac1 = new AgentController(gc, ad1); ac1.markActive(); AgentDetails ad2 = new AgentDetails(); ad2.setProfile("production"); AgentController ac2 = new AgentController(gc, ad2); ac2.markActive(); AgentDetails ad3 = new AgentDetails(); ad3.setProfile("production"); AgentController ac3 = new AgentController(gc, ad3); ac3.markActive(); Set<AgentController> agents = new HashSet<AgentController>(); agents.addAll(Arrays.asList(ac1, ac2, ac3)); dp.setGrid(gc); EasyMock.expect(dp.getAgents()).andReturn(agents).anyTimes(); EasyMock.replay(dp); gc.setDataProvider(dp); assertEquals(Collections.singletonList(ac1), gc.agentTrackers("testing")); assertEquals(new HashSet<AgentController>(Arrays.asList(ac2, ac3)), new HashSet<AgentController>(gc.agentTrackers("production"))); assertEquals(Collections.emptyList(), gc.agentTrackers("default")); EasyMock.verify(dp); } public void testAddAgentDetails() { DefaultGridController gc = new DefaultGridController(); AgentDetails ad = new AgentDetails(); ad.setProfile("testing"); ad.setHostname("somehost.somedomain"); ad.setPid(12345); assertNull("Precondition failed", ad.getId()); gc.addAgentDetails(ad); String id = ad.getId(); assertTrue(id.startsWith("testing_somehost")); AgentController ac = gc.getDataProvider().getAgent(id); assertSame(ad, ac.getDetails()); assertNotNull(ac.getHistory()); } public void testUpdateAgentDetails() { DefaultGridController gc = new DefaultGridController(); AgentDetails ad = new AgentDetails(); gc.updateAgentDetails("a1", ad); // should not bomb AgentController ac = new AgentController(gc, null); gc.getDataProvider().addAgent("a1", ac); assertNull("Precondition failed", gc.getAgentDetails("a1")); gc.updateAgentDetails("a1", ad); assertSame(ad, gc.getAgentDetails("a1")); assertEquals("a1", ad.getId()); } public void testGetAgentsAssignedToFeature() { DefaultGridController gc = new DefaultGridController(); ControllerDataProvider dp = gc.getDataProvider(); assertEquals(0, gc.getAgentsAssignedToFeature("f1").size()); assertEquals(0, gc.getAgentsAssignedToFeature("f1", "production", false).size()); AgentDetails ad1 = new AgentDetails(); ad1.setId("a1"); ad1.setProfile("production"); AgentController a1 = new AgentController(gc, ad1); a1.getFeatures().add("f2"); dp.addAgent("a1", a1); AgentDetails ad2 = new AgentDetails(); ad2.setId("a2"); ad2.setProfile("default"); AgentController a2 = new AgentController(gc, ad2); a2.getFeatures().add("f1"); dp.addAgent("a2", a2); AgentDetails ad3 = new AgentDetails(); ad3.setId("a3"); AgentController a3 = new AgentController(gc, ad3); a3.getFeatures().add("f1"); dp.addAgent("a3", a3); AgentDetails ad4 = new AgentDetails(); ad4.setId("a4"); ad4.setProfile("production"); AgentController a4 = new AgentController(gc, ad4); a4.getFeatures().add("f1"); a4.getFeatures().add("f2"); dp.addAgent("a4", a4); assertEquals("No agents should be reported since none are active", 0, gc.getAgentsAssignedToFeature("f1", "default", false).size()); // activate all agents a1.markActive(); a2.markActive(); a3.markActive(); a4.markActive(); assertEquals(new HashSet<String>(Arrays.asList("a2", "a3")), new HashSet<String>(gc.getAgentsAssignedToFeature("f1", "default", false))); assertEquals(new HashSet<String>(Arrays.asList("a4")), new HashSet<String>(gc.getAgentsAssignedToFeature("f1", "production", false))); assertEquals(new HashSet<String>(Arrays.asList("a1", "a4")), new HashSet<String>(gc.getAgentsAssignedToFeature("f2", "production", false))); assertEquals(new HashSet<String>(Arrays.asList("a2", "a3", "a4")), new HashSet<String>(gc.getAgentsAssignedToFeature("f1"))); } }