/* * 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 java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import static org.testng.Assert.*; 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.MockApacheBinaryInfo; import org.rhq.plugins.apache.util.MockProcessInfo; import org.rhq.plugins.apache.util.RuntimeApacheConfiguration; /** * * * @author Lukas Krejci */ @Test public class RuntimeConfigurationTest { private File tmpDir; private static final String[] CONDITIONAL_CONFIGURATION_TEST_FILES = { "runtime-config/conditional/httpd.conf", "runtime-config/conditional/ifdefine-defined.conf", "runtime-config/conditional/ifdefine-undefined.conf", "runtime-config/conditional/ifmodule-loaded.conf", "runtime-config/conditional/ifmodule-not-loaded.conf", "runtime-config/conditional/ifversion.conf", "runtime-config/conditional/nested-mess.conf" }; private static final String[] INCLUSION_ORDER_CONFIGURATION_TEST_FILES = { "runtime-config/incl-order/a.conf", "runtime-config/incl-order/b.conf", "runtime-config/incl-order/c.conf", "runtime-config/incl-order/httpd.conf" }; @BeforeClass public void copyConfigurationFiles() throws Exception { tmpDir = FileUtil.createTempDirectory("apache-runtime-config-tests", null, null); for (String path : CONDITIONAL_CONFIGURATION_TEST_FILES) { copyResourceToFile(path, new File(tmpDir, path)); } for (String path : INCLUSION_ORDER_CONFIGURATION_TEST_FILES) { copyResourceToFile(path, new File(tmpDir, path)); } } @AfterClass public void deleteConfigurationFiles() throws IOException { FileUtils.purge(tmpDir, true); } public void testConditionalInclusion() { MockApacheBinaryInfo binfo = new MockApacheBinaryInfo(); binfo.setVersion("2.2.17"); binfo.setRoot(new File(tmpDir, "runtime-config/conditional").getAbsolutePath()); MockProcessInfo pinfo = new MockProcessInfo(); pinfo.setCommandLine(new String[] { "blahblah", "-D", "DEFINED" }); ApacheDirectiveTree tree = ApacheServerDiscoveryComponent.parseRuntimeConfiguration(new File(tmpDir, "runtime-config/conditional/httpd.conf").getAbsolutePath(), pinfo, binfo); List<VhostSpec> vhosts = VhostSpec.detect(tree); List<VhostSpec> expectedVhosts = new ArrayList<VhostSpec>(); expectedVhosts.add(new VhostSpec(Collections.singleton("127.0.0.1:100"), "ifdefine.defined")); expectedVhosts.add(new VhostSpec(Collections.singleton("127.0.0.1:300"), "ifmodule.loaded.source-file")); expectedVhosts.add(new VhostSpec(Collections.singleton("127.0.0.1:301"), "ifmodule.loaded.module-name")); expectedVhosts.add(new VhostSpec(Collections.singleton("127.0.0.1:501"), "ifversion.module-loaded.implied-equals")); expectedVhosts.add(new VhostSpec(Collections.singleton("127.0.0.1:502"), "ifversion.module-loaded.equals")); expectedVhosts.add(new VhostSpec(Collections.singleton("127.0.0.1:503"), "ifversion.module-loaded.not-equals")); expectedVhosts.add(new VhostSpec(Collections.singleton("127.0.0.1:504"), "ifversion.module-loaded.regex")); expectedVhosts.add(new VhostSpec(Collections.singleton("127.0.0.1:505"), "ifversion.module-loaded.implied-regex")); expectedVhosts .add(new VhostSpec(Collections.singleton("127.0.0.1:602"), "ifdefine.ifmodule.loaded.source-file")); expectedVhosts .add(new VhostSpec(Collections.singleton("127.0.0.1:603"), "ifdefine.ifmodule.loaded.module-name")); assertEquals(vhosts, expectedVhosts); } public void testInclusionOrder() { MockApacheBinaryInfo binfo = new MockApacheBinaryInfo(); binfo.setVersion("2.2.17"); binfo.setRoot(new File(tmpDir, "runtime-config/incl-order").getAbsolutePath()); MockProcessInfo pinfo = new MockProcessInfo(); pinfo.setCommandLine(new String[] { "blahblah" }); ApacheDirectiveTree tree = ApacheServerDiscoveryComponent.parseRuntimeConfiguration(new File(tmpDir, "runtime-config/incl-order/httpd.conf").getAbsolutePath(), pinfo, binfo); List<ApacheDirective> listens = tree.search("/Listen"); assertEquals(listens.size(), 3, "There should be 3 listen directives"); assertEquals(listens.get(0).getValuesAsString(), "80"); assertEquals(listens.get(1).getValuesAsString(), "81"); assertEquals(listens.get(2).getValuesAsString(), "82"); } 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); } } private static class VhostSpec { public List<String> definition; public String serverName; public static List<VhostSpec> detect(ApacheDirectiveTree tree) { List<VhostSpec> ret = new ArrayList<VhostSpec>(); for (ApacheDirective vhost : tree.search("/<VirtualHost")) { ret.add(new VhostSpec(vhost)); } return ret; } public VhostSpec(ApacheDirective vhost) { definition = vhost.getValues(); List<ApacheDirective> serverNames = vhost.getChildByName("ServerName"); if (serverNames.size() > 0) { serverName = serverNames.get(0).getValuesAsString(); } } public VhostSpec(Collection<String> definition, String serverName) { this.definition = new ArrayList<String>(definition); this.serverName = serverName; } @Override public String toString() { return "VhostSpec[serverName='" + serverName + "', definition=" + definition + "]"; } @Override public int hashCode() { return serverName.hashCode(); } @Override public boolean equals(Object other) { if (other == this) { return true; } if (!(other instanceof VhostSpec)) { return false; } VhostSpec o = (VhostSpec) other; return serverName.equals(o.serverName) && definition.equals(o.definition); } } }