/* * JBoss, Home of Professional Open Source. * Copyright 2016, Red Hat Middleware LLC, 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 org.apache.http.HttpStatus; import org.jboss.as.controller.PathAddress; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM; import org.jboss.as.controller.operations.common.Util; import static org.jboss.as.test.manualmode.logging.AbstractLoggingTestCase.executeOperation; import static org.jboss.as.test.manualmode.logging.AbstractLoggingTestCase.getResponse; import org.jboss.as.test.shared.TimeoutUtil; import org.jboss.as.test.syslogserver.BlockedAllProtocolsSyslogServerEventHandler; import org.jboss.as.test.syslogserver.TCPSyslogServerConfig; import org.jboss.as.test.syslogserver.UDPSyslogServerConfig; import org.jboss.dmr.ModelNode; import org.junit.Assert; import org.productivity.java.syslog4j.SyslogConstants; import org.productivity.java.syslog4j.server.SyslogServer; import org.productivity.java.syslog4j.server.SyslogServerConfigIF; import org.productivity.java.syslog4j.server.SyslogServerIF; /** * @author olukas */ public abstract class AbstractSyslogReconnectionTestCase extends AbstractLoggingTestCase { protected static final int SYSLOG_UDP_PORT = 10514; protected static final int SYSLOG_TCP_PORT = 10515; protected static final String SYSLOG_UDP_HANDLER_NAME = "SYSLOG_UDP_HANDLER"; protected static final String SYSLOG_TCP_HANDLER_NAME = "SYSLOG_TCP_HANDLER"; protected static final int ADJUSTED_SECOND = TimeoutUtil.adjust(1000); protected static SyslogServerIF udpServer; protected static SyslogServerIF tcpServer; protected String host; protected void setupServer() throws Exception { //setup application server for TCP syslog PathAddress tcpSyslogAddress = PathAddress.pathAddress() .append(SUBSYSTEM, "logging") .append("custom-handler", SYSLOG_TCP_HANDLER_NAME); ModelNode tcpSyslogHandler = Util.createAddOperation(tcpSyslogAddress); tcpSyslogHandler.get("class").set("org.jboss.logmanager.handlers.SyslogHandler"); tcpSyslogHandler.get("module").set("org.jboss.logmanager"); tcpSyslogHandler.get("formatter").set("%-5p [%c] (%t) %s%E%n"); tcpSyslogHandler.get("encoding").set("ISO-8859-1"); tcpSyslogHandler.get("enabled").set("true"); ModelNode tcpSyslogProperties = tcpSyslogHandler.get("properties"); tcpSyslogProperties.get("appName").set("Wildfly"); tcpSyslogProperties.get("facility").set("LOCAL_USE_5"); tcpSyslogProperties.get("serverHostname").set(host); tcpSyslogProperties.get("hostname").set("-"); tcpSyslogProperties.get("port").set(SYSLOG_TCP_PORT); tcpSyslogProperties.get("syslogType").set("RFC5424"); tcpSyslogProperties.get("protocol").set("TCP"); tcpSyslogProperties.get("messageDelimiter").set("-"); tcpSyslogProperties.get("useMessageDelimiter").set("true"); executeOperation(tcpSyslogHandler); //setup application server for UDP syslog PathAddress udpSyslogAddress = PathAddress.pathAddress() .append(SUBSYSTEM, "logging") .append("syslog-handler", SYSLOG_UDP_HANDLER_NAME); ModelNode udpSyslogHandler = Util.createAddOperation(udpSyslogAddress); udpSyslogHandler.get("enabled").set("true"); udpSyslogHandler.get("app-name").set("Wildfly"); udpSyslogHandler.get("facility").set("LOCAL_USE_5"); udpSyslogHandler.get("server-address").set(host); udpSyslogHandler.get("hostname").set("-"); udpSyslogHandler.get("port").set(SYSLOG_UDP_PORT); udpSyslogHandler.get("syslog-format").set("RFC5424"); executeOperation(udpSyslogHandler); // add logging category PathAddress categoryLoggerAddress = PathAddress.pathAddress() .append(SUBSYSTEM, "logging") .append("logger", LoggingServiceActivator.class.getPackage().getName()); ModelNode registerTcpSyslogHandler = Util.createAddOperation(categoryLoggerAddress); registerTcpSyslogHandler.get("level").set("INFO"); registerTcpSyslogHandler.get("handlers").add(SYSLOG_TCP_HANDLER_NAME); registerTcpSyslogHandler.get("handlers").add(SYSLOG_UDP_HANDLER_NAME); executeOperation(registerTcpSyslogHandler); } protected void tearDownServer() throws Exception { PathAddress categoryLoggerAddress = PathAddress.pathAddress() .append(SUBSYSTEM, "logging") .append("logger", LoggingServiceActivator.class.getPackage().getName()); executeOperation(Util.createRemoveOperation(categoryLoggerAddress)); PathAddress udpAddress = PathAddress.pathAddress() .append(SUBSYSTEM, "logging") .append("syslog-handler", SYSLOG_UDP_HANDLER_NAME); executeOperation(Util.createRemoveOperation(udpAddress)); PathAddress tcpAddress = PathAddress.pathAddress() .append(SUBSYSTEM, "logging") .append("custom-handler", SYSLOG_TCP_HANDLER_NAME); executeOperation(Util.createRemoveOperation(tcpAddress)); } private static SyslogServerIF createAndStartSyslogInstance(SyslogServerConfigIF config, String host, int port, String protocol) { config.setUseStructuredData(true); config.setHost(host); config.setPort(port); config.addEventHandler(new BlockedAllProtocolsSyslogServerEventHandler(protocol)); SyslogServerIF syslogServer = SyslogServer.createInstance(protocol, config); SyslogServer.getThreadedInstance(protocol); return syslogServer; } protected static void startSyslogServers(String host) throws InterruptedException { udpServer = createAndStartSyslogInstance( new UDPSyslogServerConfig(), host, SYSLOG_UDP_PORT, SyslogConstants.UDP); tcpServer = createAndStartSyslogInstance( new TCPSyslogServerConfig(), host, SYSLOG_TCP_PORT, SyslogConstants.TCP); // reconnection timeout is 5sec for TCP syslog handler Thread.sleep(6 * ADJUSTED_SECOND); } protected static void stopSyslogServers() throws InterruptedException { SyslogServer.shutdown(); if (udpServer != null) { udpServer.setThread(null); udpServer.getConfig().removeAllEventHandlers(); } if (tcpServer != null) { tcpServer.setThread(null); tcpServer.getConfig().removeAllEventHandlers(); } // wait for 1 second to stop syslog server instances properly Thread.sleep(1 * ADJUSTED_SECOND); } protected void makeLog() throws Exception { int statusCode = getResponse("someLogMessage"); Assert.assertTrue("Invalid response statusCode: " + statusCode, statusCode == HttpStatus.SC_OK); } /** * This is expected behavior when syslog is offline. When syslog goes down then at least two TCP messages are needed for * success reconnect and even number of UDP messages is needed as well. * * @throws Exception */ protected void makeLog_syslogIsOffline() throws Exception { makeLog(); makeLog(); if (isSolaris()) { makeLog(); makeLog(); } } private static boolean isSolaris() { String osName = System.getProperty("os.name"); if (osName == null) { Assert.fail("Can't get the operating system name"); } return (osName.indexOf("Solaris") > -1) || (osName.indexOf("solaris") > -1) || (osName.indexOf("SunOS") > -1); } }