package org.rhq.enterprise.server.discovery;
import static org.rhq.test.AssertUtils.assertCollectionEqualsNoOrder;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.jmock.Expectations;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.clientapi.server.discovery.InventoryReport;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
import org.rhq.core.domain.plugin.Plugin;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.shared.ResourceBuilder;
import org.rhq.core.domain.shared.ResourceTypeBuilder;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.resource.metadata.PluginManagerLocal;
import org.rhq.test.JMockTest;
public class DeletedResourceTypeFilterTest extends JMockTest {
SubjectManagerLocal subjectMgr;
ResourceTypeManagerLocal resourceTypeMgr;
PluginManagerLocal pluginMgr;
DeletedResourceTypeFilter filter;
@BeforeMethod
public void init() {
subjectMgr = context.mock(SubjectManagerLocal.class);
resourceTypeMgr = context.mock(ResourceTypeManagerLocal.class);
pluginMgr = context.mock(PluginManagerLocal.class);
}
@Test
public void acceptReportWithNoDeletedTypes() {
InventoryReport report = createReport();
report.addAddedRoot(new ResourceBuilder()
.createRandomServer()
.with(2).randomChildServices()
.build());
report.addAddedRoot(new ResourceBuilder()
.createRandomService()
.with(2).randomChildServices()
.build());
final List<Plugin> plugins = new ArrayList<Plugin>(getPluginsInReport(report.getAddedRoots()));
context.checking(new Expectations() {{
allowing(subjectMgr).getOverlord();
will(returnValue(new Subject("overlord", true, true)));
allowing(resourceTypeMgr).findResourceTypesByCriteria(with(aNonNull(Subject.class)),
with(aNonNull(ResourceTypeCriteria.class)));
will(returnValue(new PageList<ResourceType>()));
allowing(pluginMgr).getInstalledPlugins();
will(returnValue(plugins));
}});
filter = new DeletedResourceTypeFilter(subjectMgr, resourceTypeMgr, pluginMgr);
Set<ResourceType> staleTypes = filter.apply(report);
assertTrue(staleTypes.isEmpty(), "Expected filter to return empty set when report does not contain any " +
"deleted resource types, but filter returned " + staleTypes);
}
@Test
public void rejectReportWithDeletedTypes() {
ResourceType deletedServiceType = new ResourceTypeBuilder()
.createServiceResourceType()
.withName("TestService")
.withPlugin("TestPlugin")
.thatIsDeleted()
.build();
final PageList<ResourceType> deletedTypes = new PageList<ResourceType>();
deletedTypes.add(deletedServiceType);
InventoryReport report = createReport();
report.addAddedRoot(new ResourceBuilder()
.createRandomServer()
.withChildService()
.withName("ChildService")
.withUuid("c1")
.withResourceType(new ResourceTypeBuilder()
.createServiceResourceType()
.withName("TestService")
.withPlugin("TestPlugin")
.build())
.included()
.build());
final List<Plugin> plugins = new ArrayList<Plugin>(getPluginsInReport(report.getAddedRoots()));
context.checking(new Expectations() {{
allowing(subjectMgr).getOverlord();
will(returnValue(new Subject("overlord", true, true)));
allowing(resourceTypeMgr).findResourceTypesByCriteria(with(aNonNull(Subject.class)),
with(aNonNull(ResourceTypeCriteria.class)));
will(returnValue(deletedTypes));
allowing(pluginMgr).getInstalledPlugins();
will(returnValue(plugins));
}});
filter = new DeletedResourceTypeFilter(subjectMgr, resourceTypeMgr, pluginMgr);
Set<ResourceType> staleTypes = filter.apply(report);
assertCollectionEqualsNoOrder(staleTypes, deletedTypes, "Expected report to be rejected since it contains " +
"deleted resource types");
}
@Test
public void rejectReportWithPluginThatIsNotInstalled() {
InventoryReport report = createReport();
report.addAddedRoot(new ResourceBuilder()
.createRandomServer()
.with(2).randomChildServices()
.build());
report.addAddedRoot(new ResourceBuilder()
.createRandomService()
.withResourceType(new ResourceTypeBuilder()
.createServerResourceType()
.withName("StaleServer")
.withPlugin("DeletedPlugin")
.build())
.with(2).randomChildServices()
.build());
List<Plugin> plugins = new ArrayList<Plugin>(getPluginsInReport(report.getAddedRoots()));
final List<Plugin> installedPlugins = removePlugins(plugins, "DeletedPlugin");
context.checking(new Expectations() {{
allowing(subjectMgr).getOverlord();
will(returnValue(new Subject("overlord", true, true)));
allowing(resourceTypeMgr).findResourceTypesByCriteria(with(aNonNull(Subject.class)),
with(aNonNull(ResourceTypeCriteria.class)));
will(returnValue(new PageList<ResourceType>()));
allowing(pluginMgr).getInstalledPlugins();
will(returnValue(installedPlugins));
}});
filter = new DeletedResourceTypeFilter(subjectMgr, resourceTypeMgr, pluginMgr);
assertFalse(filter.apply(report).isEmpty(), "Expected filter to return non-empty since it contains a deleted " +
"plugin but empty set was returned");
}
InventoryReport createReport() {
Agent agent = new Agent("localhost", "localhost", 1234, "1234", "test-token");
return new InventoryReport(agent);
}
private Set<Plugin> getPluginsInReport(Set<Resource> resources) {
Set<Plugin> plugins = new HashSet<Plugin>();
for (Resource resource : resources) {
String name = resource.getResourceType().getPlugin();
plugins.add(new Plugin(name, "/plugins/" + name));
plugins.addAll(getPluginsInReport(resource.getChildResources()));
}
return plugins;
}
private List<Plugin> removePlugins(List<Plugin> plugins, String... pluginsToRemove) {
Set<String> removedPlugins = new HashSet<String>(Arrays.asList(pluginsToRemove));
List<Plugin> filteredPlugins = new ArrayList<Plugin>();
for (Plugin plugin : plugins) {
if (!removedPlugins.contains(plugin.getName())) {
filteredPlugins.add(plugin);
}
}
return filteredPlugins;
}
}