/* * RHQ Management Platform * Copyright (C) 2005-2011 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.plugins.apache; import static org.testng.Assert.assertEquals; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.rhq.core.pluginapi.util.FileUtils; import org.rhq.core.util.file.FileUtil; import org.rhq.core.util.stream.StreamUtil; import org.rhq.plugins.apache.parser.ApacheConfigReader; import org.rhq.plugins.apache.parser.ApacheDirective; import org.rhq.plugins.apache.parser.ApacheDirectiveTree; import org.rhq.plugins.apache.parser.ApacheParser; import org.rhq.plugins.apache.parser.ApacheParserImpl; import org.rhq.plugins.apache.util.HttpdAddressUtility; import org.rhq.plugins.apache.util.MockApacheBinaryInfo; import org.rhq.plugins.apache.util.MockProcessInfo; /** * * * @author Lukas Krejci */ @Test public class SnmpMappingTest { private File tmpDir; private static final String[] VHOST_NAMES_CONFIGURATION_TEST_FILES = { "snmp-mapping/httpd.conf", "snmp-mapping/vhost-with-servername-by-ip.conf", "snmp-mapping/vhost-with-servername-by-unresolvable-hostname.conf", "snmp-mapping/vhost-without-servername-resolvable-ip.conf", "snmp-mapping/vhost-without-servername-unresolvable-hostname.conf", "snmp-mapping/vhost-without-servername-unresolvable-ip.conf" }; private static final String[] EXPECTED_SNMP_NAMES = { "the-main-server-name:42", //httpd.conf "12.34.56.78:0", //vhost-with-servername-by-ip.conf "this-will-never-resolve.weird-server.net:90", //vhost-with-servername-by-unresolvable-hostname.conf "<<<LOCALHOST>>>:1002", //vhost-without-servernama-resolvable-ip.conf "bogus_host_without_forward_dns:42", //vhost-without-servername-unresolvable-hostname.conf "bogus_host_without_reverse_dns:1003" //vhost-without-servername-unresolvable-ip.conf }; @BeforeClass public void copyConfigurationFiles() throws Exception { tmpDir = FileUtil.createTempDirectory("apache-runtime-config-tests", null, null); for (String path : VHOST_NAMES_CONFIGURATION_TEST_FILES) { copyResourceToFile(path, new File(tmpDir, path)); } } @BeforeClass public void initExpectedResults() throws Exception { String localhost = InetAddress.getByName("127.0.0.1").getHostName(); for (int i = 0; i < EXPECTED_SNMP_NAMES.length; ++i) { EXPECTED_SNMP_NAMES[i] = EXPECTED_SNMP_NAMES[i].replaceAll("<<<LOCALHOST>>>", localhost); } } @AfterClass public void deleteConfigurationFiles() throws IOException { FileUtils.purge(tmpDir, true); } public void testVhostNames() { MockApacheBinaryInfo binfo = new MockApacheBinaryInfo(); binfo.setVersion("2.2.17"); binfo.setRoot(new File(tmpDir, "snmp-mapping").getAbsolutePath()); MockProcessInfo pinfo = new MockProcessInfo(); pinfo.setCommandLine(new String[] { "blahblah" }); ApacheDirectiveTree tree = ApacheServerDiscoveryComponent.parseRuntimeConfiguration( new File(tmpDir, "snmp-mapping/httpd.conf").getAbsolutePath(), pinfo, binfo); HttpdAddressUtility addrUtil = HttpdAddressUtility.get("2.2.17"); List<ApacheDirective> vhosts = tree.search("/<VirtualHost"); List<String> snmpNames = new ArrayList<String>(vhosts.size() + 1); snmpNames.add(addrUtil.getHttpdInternalMainServerAddressRepresentation(tree).toString(false, false)); for (ApacheDirective vhost : vhosts) { String vhostDef = vhost.getValues().get(0); String serverName = null; List<ApacheDirective> serverNames = vhost.getChildByName("ServerName"); if (serverNames.size() > 0) { serverName = serverNames.get(serverNames.size() - 1).getValuesAsString(); } snmpNames.add(addrUtil.getHttpdInternalVirtualHostAddressRepresentation(tree, vhostDef, serverName) .toString(false, false)); } assertEquals(snmpNames, Arrays.asList(EXPECTED_SNMP_NAMES)); } private void copyResourceToFile(String resourcePath, File destination) throws IOException { InputStream input = getClass().getClassLoader().getResourceAsStream(resourcePath); if (input != null) { destination.getParentFile().mkdirs(); destination.createNewFile(); StreamUtil.copy(input, new BufferedOutputStream(new FileOutputStream(destination)), true); } } }