/**
* NOTE: This copyright does *not* cover user programs that use Hyperic
* program services by normal system calls through the application
* program interfaces provided as part of the Hyperic Plug-in Development
* Kit or the Hyperic Client Development Kit - this is merely considered
* normal use of the program, and does *not* fall under the heading of
* "derived work".
*
* Copyright (C) [2010], VMware, Inc.
* This file is part of Hyperic.
*
* Hyperic is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program 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 General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
*/
package org.hyperic.hq.web.admin.managers;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hyperic.hq.appdef.Agent;
import org.hyperic.hq.appdef.server.session.AgentPluginStatus;
import org.hyperic.hq.appdef.server.session.AgentPluginStatusEnum;
import org.hyperic.hq.appdef.server.session.Platform;
import org.hyperic.hq.appdef.shared.AgentManager;
import org.hyperic.hq.authz.shared.ResourceManager;
import org.hyperic.hq.bizapp.shared.AppdefBoss;
import org.hyperic.hq.bizapp.shared.AuthzBoss;
import org.hyperic.hq.common.shared.HQConstants;
import org.hyperic.hq.common.shared.ServerConfigManager;
import org.hyperic.hq.product.Plugin;
import org.hyperic.hq.product.shared.PluginManager;
import org.hyperic.hq.product.shared.PluginTypeEnum;
import org.hyperic.hq.web.BaseControllerTest;
import org.hyperic.util.ConfigPropertyException;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.ui.ExtendedModelMap;
import org.springframework.ui.Model;
public class PluginManagerControllerTest extends BaseControllerTest {
private PluginManagerController pluginManagerController;
private PluginManager mockPluginManager;
private AgentManager mockAgentManager;
private ResourceManager mockResourceManager;
private AppdefBoss mockAppdefBoss;
private AuthzBoss mockAuthzBoss;
private ServerConfigManager mockServerConfigManager;
private static SimpleDateFormat format;
private static Date date1 = new Date();
private static Date date2 = new Date();
@BeforeClass
public static void beforeClass(){
format = new SimpleDateFormat("MM/dd/yyyy hh:mm aa zzz");
try {
date1 = format.parse("01/15/2011 06:00 PM PST");
date2 = format.parse("01/01/2010 06:30 PM PST");
} catch (ParseException e) {
e.printStackTrace();
}
}
@Before
public void setup(){
super.setUp();
mockPluginManager = createMock(PluginManager.class);
mockAgentManager = createMock(AgentManager.class);
mockResourceManager = createMock(ResourceManager.class);
mockAppdefBoss = getMockAppdefBoss();
mockAuthzBoss = getMockAuthzBoss();
mockServerConfigManager = createMock(ServerConfigManager.class);
pluginManagerController = new PluginManagerController(mockAppdefBoss, mockAuthzBoss,
mockPluginManager, mockAgentManager,mockResourceManager, mockServerConfigManager);
}
@Test
public void testMechanismOff() throws ConfigPropertyException{
Model model =new ExtendedModelMap();
expect(mockPluginManager.getStatusesByAgentId(AgentPluginStatusEnum.SYNC_FAILURE)).andStubReturn(getStatusesByAgentId());
expect(mockPluginManager.getAllPlugins()).andStubReturn(new ArrayList<Plugin>());
expect(mockPluginManager.getPluginRollupStatus()).andStubReturn(new HashMap<Integer, Map<AgentPluginStatusEnum, Integer>>());
expect(mockPluginManager.isPluginSyncEnabled()).andStubReturn(false);
expect(mockPluginManager.getCustomPluginDir()).andStubReturn(new File("/root/hq/test"));
expect(mockAgentManager.getNumAutoUpdatingAgents()).andReturn(Long.parseLong("0"));
expect(mockAgentManager.getAgentCountUsed()).andStubReturn(Integer.parseInt("0"));
expect(mockAgentManager.getAgentCountUsed()).andStubReturn(Integer.parseInt("0"));
expect(mockAgentManager.getNumOldAgents()).andStubReturn(Long.parseLong("0"));
String serverVersion = "4.5.6.BUILD-SNAPSHOT";
expect(mockServerConfigManager.getPropertyValue(HQConstants.ServerVersion)).andStubReturn(serverVersion);
replay(mockAgentManager);
replay(mockPluginManager);
replay(mockServerConfigManager);
String toPage = pluginManagerController.index(model);
Map<String,Object> map = model.asMap();
Map<String, Object> info = (Map<String, Object>)map.get("info");
assertEquals("should be direct to admin/managers/plugin page.", "admin/managers/plugin",toPage);
assertEquals("total agent count should be 0",Long.valueOf(0),info.get("totalAgentCount"));
assertEquals("syncable agent count should be 0",Long.valueOf(0),info.get("syncableAgentCount"));
assertEquals("server version should be " + serverVersion,serverVersion,info.get("serverVersion"));
assertTrue("mechanismOn should be false", !(Boolean)map.get("mechanismOn"));
assertEquals("instruction should be admin.managers.plugin.mechanism.off",
"admin.managers.plugin.mechanism.off",
map.get("instruction"));
}
@Test
public void testMechanismOn() throws ConfigPropertyException{
Model model =new ExtendedModelMap();
expect(mockPluginManager.getStatusesByAgentId(AgentPluginStatusEnum.SYNC_FAILURE)).andStubReturn(getStatusesByAgentId());
expect(mockPluginManager.getAllPlugins()).andStubReturn(getAllPlugins());
expect(mockPluginManager.getPluginRollupStatus()).andStubReturn(getPluginRollupStatus());
expect(mockPluginManager.isPluginSyncEnabled()).andStubReturn(true);
expect(mockPluginManager.getCustomPluginDir()).andStubReturn(new File("/root/hq/test"));
expect(mockAgentManager.getNumAutoUpdatingAgents()).andStubReturn(Long.parseLong("3"));
expect(mockAgentManager.getAgentCountUsed()).andStubReturn(Integer.parseInt("3"));
expect(mockAgentManager.getNumOldAgents()).andStubReturn(Long.parseLong("0"));
String serverVersion = "4.5.6.BUILD-SNAPSHOT";
expect(mockServerConfigManager.getPropertyValue(HQConstants.ServerVersion)).andStubReturn(serverVersion);
replay(mockAgentManager);
replay(mockPluginManager);
replay(mockServerConfigManager);
String toPage = pluginManagerController.index(model);
Map<String,Object> map = model.asMap();
Map<String, Object> info = (Map<String, Object>)map.get("info");
assertEquals("should be direct to admin/managers/plugin page.", "admin/managers/plugin",toPage);
assertTrue("mechanismOn should be true", (Boolean)map.get("mechanismOn"));
assertEquals("total agent count should be 3",Long.valueOf(3),info.get("totalAgentCount"));
assertEquals("syncable agent count should be 3",Long.valueOf(3),info.get("syncableAgentCount"));
assertEquals("server version should be " + serverVersion,serverVersion,info.get("serverVersion"));
assertEquals("instruction should be admin.managers.plugin.instructions",
"admin.managers.plugin.instructions", map.get("instruction"));
assertEquals("file path should be /root/hq/test","/root/hq/test",""+map.get("customDir"));
}
@Test
public void testAgentSummary(){
expect(mockPluginManager.getStatusesByAgentId(AgentPluginStatusEnum.SYNC_FAILURE)).andStubReturn(getStatusesByAgentId());
replay(mockPluginManager);
List<String> summaries = pluginManagerController.getAgentStatusSummary();
assertEquals("There should be only two agents in summary",2,summaries.size());
assertEquals("agentX's name should be 3.3.3.3","3.3.3.3",summaries.get(0));
assertEquals("agentZ's name should be 5.5.5.5","5.5.5.5",summaries.get(1));
}
@Test
public void testInfoNull() throws ConfigPropertyException{
expect(mockPluginManager.getStatusesByAgentId(AgentPluginStatusEnum.SYNC_FAILURE)).andStubReturn(null);
expect(mockAgentManager.getNumAutoUpdatingAgents()).andReturn(Long.parseLong("0"));
expect(mockAgentManager.getAgentCountUsed()).andStubReturn(Integer.parseInt("0"));
expect(mockAgentManager.getNumOldAgents()).andStubReturn(Long.parseLong("0"));
String serverVersion = "4.5.6.BUILD-SNAPSHOT";
expect(mockServerConfigManager.getPropertyValue(HQConstants.ServerVersion)).andStubReturn(serverVersion);
replay(mockPluginManager);
replay(mockAgentManager);
replay(mockServerConfigManager);
Map<String, Object> info = pluginManagerController.getAgentInfo();
assertEquals("agentErrorCount should be 0",0,info.get("agentErrorCount"));
assertEquals("total agent count should be 0",Long.valueOf(0),info.get("totalAgentCount"));
assertEquals("syncable agent count should be 0",Long.valueOf(0),info.get("syncableAgentCount"));
}
@Test
public void testInfo() throws ConfigPropertyException{
expect(mockPluginManager.getStatusesByAgentId(AgentPluginStatusEnum.SYNC_FAILURE)).andStubReturn(getStatusesByAgentId());
expect(mockAgentManager.getNumAutoUpdatingAgents()).andReturn(Long.parseLong("3"));
expect(mockAgentManager.getAgentCountUsed()).andStubReturn(Integer.parseInt("4"));
expect(mockAgentManager.getNumOldAgents()).andStubReturn(Long.parseLong("1"));
String serverVersion = "4.5.6.BUILD-SNAPSHOT";
expect(mockServerConfigManager.getPropertyValue(HQConstants.ServerVersion)).andStubReturn(serverVersion);
replay(mockPluginManager);
replay(mockAgentManager);
replay(mockServerConfigManager);
Map<String, Object> info = pluginManagerController.getAgentInfo();
assertEquals("total agent count should be 4",Long.valueOf(4),info.get("totalAgentCount"));
assertEquals("syncable agent count should be 3",Long.valueOf(3),info.get("syncableAgentCount"));
assertEquals("agentErrorCount should be 2",2,info.get("agentErrorCount"));
}
@Test
public void testPluginSummaries() throws ParseException{
List<Plugin> plugins = getAllPlugins();
expect(mockPluginManager.getAllPlugins()).andReturn(plugins);
expect(mockPluginManager.getPluginRollupStatus()).andReturn(getPluginRollupStatus());
expect(mockPluginManager.getPluginType(plugins.get(0))).andReturn(getPluginType(0));
expect(mockPluginManager.getPluginType(plugins.get(1))).andReturn(getPluginType(2));//pluginType is set before plugin list sort by status
expect(mockPluginManager.getPluginType(plugins.get(2))).andReturn(getPluginType(1));
replay(mockPluginManager);
List<Map<String, Object>> summaries = pluginManagerController.getPluginSummaries();
assertEquals("plugin-a: inProgressAgentCount should be 0",0,summaries.get(0).get("inProgressAgentCount"));
assertEquals("plugin-a: allAgentCount should be 101",101,summaries.get(0).get("allAgentCount"));
assertEquals("plugin-a: successAgentCount should be 100",100,summaries.get(0).get("successAgentCount"));
assertEquals("plugin-a: errorAgentCount should be 1",1,summaries.get(0).get("errorAgentCount"));
assertEquals("plugin-a: inProgress should be false",false,summaries.get(0).get("inProgress"));
assertEquals("plugin-a: updatedDate should be ...", date1.getTime(), format.parse(summaries.get(0).get("updatedDate").toString()).getTime());
assertEquals("plugin-a: initialDeployDate should be ...",format.format(date2),""+summaries.get(0).get("initialDeployDate"));
assertEquals("plugin-a: id should be 1",1,summaries.get(0).get("id"));
assertEquals("plugin-a: name should be plugin-a","plugin-a",summaries.get(0).get("name"));
assertEquals("plugin-a: is server plugin",true, summaries.get(0).get("isServerPlugin"));
assertEquals("plugin-a: is not custom plugin",false, summaries.get(0).get("isCustomPlugin"));
//make sure plugins are sorted by status
assertEquals("plugin-c: name should be plugin-c","plugin-c",summaries.get(1).get("name"));
assertEquals("plugin-c: inProgressAgentCount should be 4",4,summaries.get(1).get("inProgressAgentCount"));
assertEquals("plugin-c: allAgentCount should be 7",7,summaries.get(1).get("allAgentCount"));
assertEquals("plugin-c: successAgentCount should be 0",0,summaries.get(1).get("successAgentCount"));
assertEquals("plugin-c: errorAgentCount should be 3",3,summaries.get(1).get("errorAgentCount"));
assertEquals("plugin-c: inProgress should be true",true,summaries.get(1).get("inProgress"));
assertEquals("plugin-c: id should be 3",3,summaries.get(1).get("id"));
assertEquals("plugin-c: is not server plugin",false, summaries.get(1).get("isServerPlugin"));
assertEquals("plugin-c: is custom plugin",true, summaries.get(1).get("isCustomPlugin"));
assertEquals("plugin-b: name should be plugin-b","plugin-b",summaries.get(2).get("name"));
assertEquals("plugin-b: inProgressAgentCount should be 0",0,summaries.get(2).get("inProgressAgentCount"));
assertEquals("plugin-b: allAgentCount should be 99",99,summaries.get(2).get("allAgentCount"));
assertEquals("plugin-b: successAgentCount should be 99",99,summaries.get(2).get("successAgentCount"));
assertEquals("plugin-b: errorAgentCount should be 0",0,summaries.get(2).get("errorAgentCount"));
assertEquals("plugin-b: inProgress should be false",false,summaries.get(2).get("inProgress"));
assertEquals("plugin-b: id should be 2",2,summaries.get(2).get("id"));
assertEquals("plugin-b: is not server plugin",false, summaries.get(2).get("isServerPlugin"));
assertEquals("plugin-b: is not custom plugin",false, summaries.get(2).get("isCustomPlugin"));
}
private Collection<PluginTypeEnum> getPluginType(int index){
Collection<PluginTypeEnum> result = new ArrayList<PluginTypeEnum>();
switch (index){
case 0:
result.add(PluginTypeEnum.SERVER_PLUGIN);
return result;
case 1:
result.add(PluginTypeEnum.CUSTOM_PLUGIN);
result.add(PluginTypeEnum.DEFAULT_PLUGIN);
return result;
case 2:
return result;
}
return null;
}
@Test
public void testAgentStatus(){
expect(mockPluginManager.getStatusesByPluginId(3, AgentPluginStatusEnum.SYNC_FAILURE)).andStubReturn(getErrorAgentStatusList());
expect(mockPluginManager.getStatusesByPluginId(3, AgentPluginStatusEnum.SYNC_IN_PROGRESS)).andStubReturn(getInProgressAgentStatusList());
replay(mockPluginManager);
List<Map<String, Object>> result = pluginManagerController.getAgentStatus(3, "","inprogress");
assertEquals("result should be 1",1,result.size());
}
@Test
public void testAgentStatusWithKeyword(){
expect(mockPluginManager.getStatusesByPluginId(3, AgentPluginStatusEnum.SYNC_FAILURE)).andStubReturn(getErrorAgentStatusList());
expect(mockPluginManager.getStatusesByPluginId(3, AgentPluginStatusEnum.SYNC_IN_PROGRESS)).andStubReturn(getInProgressAgentStatusList());
replay(mockPluginManager);
List<Map<String, Object>> result = pluginManagerController.getAgentStatus(3, "xx","inprogress");
assertEquals("result should be empty",0,result.size());
}
@Test
public void testDeletePluginResouceCount(){
List<Plugin> plugins = getAllPlugins();
expect(mockPluginManager.getPluginById(1)).andStubReturn(plugins.get(0));
expect(mockPluginManager.getPluginById(2)).andStubReturn(plugins.get(1));
expect(mockPluginManager.getPluginById(3)).andStubReturn(plugins.get(2));
expect(mockResourceManager.getResourceCountByPlugin(plugins)).andStubReturn(getResourceCounts());
replay(mockPluginManager);
replay(mockResourceManager);
List<Map<String, String>> result = pluginManagerController.getResourceCount("1,2,3");
assertEquals("There should be only two entries",2,result.size());
assertEquals("The first one should be plugin-a (id=1) ","1",result.get(0).get("pluginId"));
assertEquals("plugin-a should have 200 count","200",result.get(0).get("count"));
assertEquals("The second one should be plugin-c (id=3) ","3",result.get(1).get("pluginId"));
assertEquals("plugin-a should have 1 count","1",result.get(1).get("count"));
}
private Map<String, Long> getResourceCounts(){
Map<String, Long> result = new HashMap<String,Long>();
result.put("plugin-a", (long)200);
result.put("plugin-c", (long)1);
return result;
}
private Map<Integer, AgentPluginStatus> getStatusesByAgentId(){
Map<Integer, AgentPluginStatus> result = new HashMap<Integer, AgentPluginStatus>();
AgentPluginStatus statusX = new AgentPluginStatus();
Agent agentX = new Agent();
Collection <Platform> platformsX = new ArrayList<Platform>();
agentX.setPlatforms(platformsX);
agentX.setAddress("3.3.3.3");
statusX.setAgent(agentX);
AgentPluginStatus statusZ = new AgentPluginStatus();
Agent agentZ = new Agent();
Collection <Platform> platformsZ = new ArrayList<Platform>();
agentZ.setPlatforms(platformsZ);
agentZ.setAddress("5.5.5.5");
statusZ.setAgent(agentZ);
result.put(new Integer(0), statusX);
result.put(new Integer(2), statusZ);
return result;
}
private Collection<AgentPluginStatus> getErrorAgentStatusList(){
Collection<AgentPluginStatus> result = new ArrayList<AgentPluginStatus>();
AgentPluginStatus apCZ = new AgentPluginStatus();
Agent agentZ = new Agent();
Collection <Platform> platformsZ = new ArrayList<Platform>();
agentZ.setPlatforms(platformsZ);
agentZ.setAddress("5.5.5.5");
apCZ.setAgent(agentZ);
apCZ.setLastSyncAttempt(date1.getTime());
result.add(apCZ);
return result;
}
private Collection<AgentPluginStatus> getInProgressAgentStatusList(){
Collection<AgentPluginStatus> result = new ArrayList<AgentPluginStatus>();
AgentPluginStatus apCX = new AgentPluginStatus();
Agent agentX = new Agent();
Collection <Platform> platformsX = new ArrayList<Platform>();
agentX.setPlatforms(platformsX);
agentX.setAddress("3.3.3.3");
apCX.setAgent(agentX);
apCX.setLastSyncAttempt(date2.getTime());
result.add(apCX);
return result;
}
private HashMap<Integer, Map<AgentPluginStatusEnum, Integer>> getPluginRollupStatus(){
HashMap<Integer, Map<AgentPluginStatusEnum, Integer>> rollupStatus =
new HashMap<Integer, Map<AgentPluginStatusEnum, Integer>>();
Map<AgentPluginStatusEnum, Integer> pluginA = new HashMap<AgentPluginStatusEnum, Integer>();
pluginA.put(AgentPluginStatusEnum.SYNC_SUCCESS, 100);
pluginA.put(AgentPluginStatusEnum.SYNC_IN_PROGRESS, 0);
pluginA.put(AgentPluginStatusEnum.SYNC_FAILURE, 1);
Map<AgentPluginStatusEnum, Integer> pluginB = new HashMap<AgentPluginStatusEnum, Integer>();
pluginB.put(AgentPluginStatusEnum.SYNC_SUCCESS, 99);
pluginB.put(AgentPluginStatusEnum.SYNC_IN_PROGRESS, 0);
pluginB.put(AgentPluginStatusEnum.SYNC_FAILURE, 0);
Map<AgentPluginStatusEnum, Integer> pluginC = new HashMap<AgentPluginStatusEnum, Integer>();
pluginC.put(AgentPluginStatusEnum.SYNC_SUCCESS, 0);
pluginC.put(AgentPluginStatusEnum.SYNC_IN_PROGRESS, 4);
pluginC.put(AgentPluginStatusEnum.SYNC_FAILURE, 3);
rollupStatus.put(1, pluginA);
rollupStatus.put(2, pluginB);
rollupStatus.put(3, pluginC);
return rollupStatus;
}
private List<Plugin> getAllPlugins(){
List<Plugin> plugins = new ArrayList<Plugin>();
Plugin pluginA = new Plugin();
pluginA.setName("plugin-a");
pluginA.setId(1);
pluginA.setModifiedTime(date1.getTime());
pluginA.setCreationTime(date2.getTime());
plugins.add(pluginA);
Plugin pluginB = new Plugin();
pluginB.setName("plugin-b");
pluginB.setId(2);
plugins.add(pluginB);
Plugin pluginC = new Plugin();
pluginC.setName("plugin-c");
pluginC.setId(3);
plugins.add(pluginC);
return plugins;
}
}