/* * JBoss, Home of Professional Open Source. * Copyright 2015, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.test.manualmode.logging; import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; import java.util.Map; import javax.inject.Inject; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.client.ModelControllerClient; import org.jboss.as.controller.client.Operation; import org.jboss.as.controller.client.helpers.Operations; import org.jboss.as.controller.client.helpers.standalone.ServerDeploymentHelper.ServerDeploymentException; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.test.shared.TestSuiteEnvironment; import org.jboss.dmr.ModelNode; import org.jboss.msc.service.ServiceActivator; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.Assert; import org.junit.BeforeClass; import org.wildfly.core.testrunner.ServerController; /** * @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a> */ public abstract class AbstractLoggingTestCase { public static final String DEPLOYMENT_NAME = "logging-test.jar"; public static final PathElement SUBSYSTEM_PATH = PathElement.pathElement(ModelDescriptionConstants.SUBSYSTEM, "logging"); public static final PathAddress SUBSYSTEM_ADDRESS = PathAddress.pathAddress(SUBSYSTEM_PATH); @Inject protected ServerController container; protected static ModelControllerClient client; @BeforeClass public static void configureClient() { client = TestSuiteEnvironment.getModelControllerClient(); } static JavaArchive createDeployment() { return createDeployment(LoggingServiceActivator.class, LoggingServiceActivator.DEPENDENCIES); } static JavaArchive createDeployment(final Map<String, String> manifestEntries) { return createDeployment(LoggingServiceActivator.class, manifestEntries, LoggingServiceActivator.DEPENDENCIES); } static JavaArchive createDeployment(final Class<? extends ServiceActivator> serviceActivator, final Class<?>... classes) { return createDeployment(serviceActivator, Collections.<String, String>emptyMap(), classes); } static JavaArchive createDeployment(final Class<? extends ServiceActivator> serviceActivator, final Map<String, String> manifestEntries, final Class<?>... classes) { final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, DEPLOYMENT_NAME); archive.addClasses(classes); archive.addAsServiceProviderAndClasses(ServiceActivator.class, serviceActivator); boolean addDeps = true; final StringBuilder manifest = new StringBuilder(); for (String key : manifestEntries.keySet()) { if ("Dependencies".equals(key)) { addDeps = false; manifest.append(key) .append(": ") .append("io.undertow.core,") .append(manifestEntries.get(key)) .append('\n'); } else { manifest.append(key) .append(": ") .append(manifestEntries.get(key)) .append('\n'); } } if (addDeps) { manifest.append("Dependencies: io.undertow.core"); } archive.addAsResource(new StringAsset(manifest.toString()), "META-INF/MANIFEST.MF"); return archive; } public static ModelNode executeOperation(final ModelNode op) throws IOException { ModelNode result = client.execute(op); if (!Operations.isSuccessfulOutcome(result)) { Assert.assertTrue(Operations.getFailureDescription(result).toString(), false); } return result; } public static ModelNode executeOperation(final Operation op) throws IOException { ModelNode result = client.execute(op); if (!Operations.isSuccessfulOutcome(result)) { Assert.assertTrue(Operations.getFailureDescription(result).toString(), false); } return result; } public static String resolveRelativePath(final String relativePath) { final ModelNode address = PathAddress.pathAddress( PathElement.pathElement(ModelDescriptionConstants.PATH, relativePath) ).toModelNode(); final ModelNode result; try { final ModelNode op = Operations.createReadAttributeOperation(address, ModelDescriptionConstants.PATH); result = client.execute(op); if (Operations.isSuccessfulOutcome(result)) { return Operations.readResult(result).asString(); } } catch (IOException e) { throw new RuntimeException(e); } throw new RuntimeException(Operations.getFailureDescription(result).asString()); } public static Path getAbsoluteLogFilePath(final String filename) { return Paths.get(resolveRelativePath("jboss.server.log.dir"), filename); } /** * Deploys the {@link #createDeployment() default} archive to the running server. * * @throws ServerDeploymentException if an error occurs deploying the archive */ public void deploy() throws ServerDeploymentException { deploy(createDeployment(), DEPLOYMENT_NAME); } /** * Deploys the {@link #createDeployment() default} archive to the running server. * * @param runtimeName the runtime name for the deployment * * @throws ServerDeploymentException if an error occurs deploying the archive */ public void deploy(final String runtimeName) throws ServerDeploymentException { deploy(createDeployment(), runtimeName); } /** * Deploys the archive to the running server. * * @param archive the archive to deploy * * @throws ServerDeploymentException if an error occurs deploying the archive */ public void deploy(final Archive<?> archive) throws ServerDeploymentException { deploy(archive, DEPLOYMENT_NAME); } /** * Deploys the archive to the running server. * * @param archive the archive to deploy * @param runtimeName the runtime name for the deployment * * @throws ServerDeploymentException if an error occurs deploying the archive */ public void deploy(final Archive<?> archive, final String runtimeName) throws ServerDeploymentException { container.deploy(archive, runtimeName); } /** * Undeploys the default application from the running server. * * @throws ServerDeploymentException if an error occurs undeploying the application */ public void undeploy() throws ServerDeploymentException { undeploy(DEPLOYMENT_NAME); } /** * Undeploys the application from the running server. * * @param runtimeName the runtime name * * @throws ServerDeploymentException if an error occurs undeploying the application */ public void undeploy(final String runtimeName) throws ServerDeploymentException { container.undeploy(runtimeName); } public static ModelNode createAddress(final String resourceKey, final String resourceName) { return PathAddress.pathAddress( SUBSYSTEM_PATH, PathElement.pathElement(resourceKey, resourceName) ).toModelNode(); } public static ModelNode createAddress(final String... paths) { PathAddress address = SUBSYSTEM_ADDRESS; for (int i = 0; i < paths.length; i++) { final String key = paths[i]; if (++i < paths.length) { address = address.append(PathElement.pathElement(key, paths[i])); } else { address = address.append(PathElement.pathElement(key)); } } return address.toModelNode(); } /** * Creates a new URL with the default context from {@link org.jboss.as.test.shared.TestSuiteEnvironment#getHttpUrl()} * and a query parameter of {@code msg} with a value of the argument. The argument will be encoded in UTF-8. * * @param msg the non-encoded message to send * @param params an optional list of extra parameters to add to the URL. * * @return a URL to send to the server * * @throws java.io.UnsupportedEncodingException if the UTF-8 encoding is not supported * @throws java.net.MalformedURLException if the URL is malformed */ public static URL createUrl(final String msg, final Map<String, String> params) throws UnsupportedEncodingException, MalformedURLException { final StringBuilder spec = new StringBuilder("?msg=").append(URLEncoder.encode(msg, "utf-8")); for (String key : params.keySet()) { spec.append('&').append(key); final String value = params.get(URLEncoder.encode(key, "utf-8")); if (value != null) { spec.append('=').append(URLEncoder.encode(value, "utf-8")); } } return new URL(TestSuiteEnvironment.getHttpUrl(), spec.toString()); } /** * {@link AbstractLoggingTestCase#createUrl(String, java.util.Map) Creates} a URL with the message provided and * opens a connection * to the sever returning the response code. * * @param msg the non-encoded message to send * * @return the response code from the server * * @throws java.io.IOException if there was an error creating the URL or connecting to he server * @see #createUrl(String, java.util.Map) * @see #getResponse(java.net.URL) */ public static int getResponse(final String msg) throws IOException { return getResponse(createUrl(msg, Collections.<String, String>emptyMap())); } /** * {@link AbstractLoggingTestCase#createUrl(String, java.util.Map) Creates} a URL with the message provided and * opens a connection * to the sever returning the response code. * * @param msg the non-encoded message to send * * @return the response code from the server * * @throws java.io.IOException if there was an error creating the URL or connecting to he server * @see #createUrl(String, java.util.Map) * @see #getResponse(java.net.URL) */ public static int getResponse(final String msg, final Map<String, String> params) throws IOException { return getResponse(createUrl(msg, params)); } /** * Opens a connection to the server and returns the response code. * * @param url the URL to connect to * * @return the response code from the server * * @throws java.io.IOException if an error occurs connecting to the server */ public static int getResponse(final URL url) throws IOException { return ((HttpURLConnection) url.openConnection()).getResponseCode(); } static void checkLogs(final String msg, final Path file, final boolean expected) throws Exception { boolean logFound = false; if (Files.exists(file)) { try (final BufferedReader reader = Files.newBufferedReader(file, StandardCharsets.UTF_8)) { String line; while ((line = reader.readLine()) != null) { if (line.contains(msg)) { logFound = true; break; } } } } Assert.assertEquals(String.format("Message '%s' found in %s", msg, file), expected, logFound); } }