This is an automated email from the ASF dual-hosted git repository. clebertsuconic pushed a commit to branch new-logging in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit 5abd4ef52a87e678f59765d9f0d6c1dc1f8bc45f Author: Robbie Gemmell <[email protected]> AuthorDate: Wed Jul 6 17:32:47 2022 +0100 make a start on restoring AssertionLoggerHandler to get tests going --- .../artemis/logs/AssertionLoggerHandler.java | 68 ------- artemis-journal/pom.xml | 6 + artemis-unit-test-support/pom.xml | 5 + .../artemis/logs/AssertionLoggerHandler.java | 224 +++++++++++++++++++++ .../integration/server/SimpleStartStopTest.java | 5 +- 5 files changed, 237 insertions(+), 71 deletions(-) diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AssertionLoggerHandler.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AssertionLoggerHandler.java deleted file mode 100644 index ca41f1bf37..0000000000 --- a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AssertionLoggerHandler.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.activemq.artemis.logs; - -import java.util.logging.Level; - - -public class AssertionLoggerHandler { - - public void close() throws SecurityException { - } - - public static boolean hasLevel(Level level) { - return false; - } - - public static boolean findText(long mstimeout, String... text) { - return false; - } - - /** - * Find a line that contains the parameters passed as an argument - * - * @param text - * @return - */ - public static boolean findText(final String... text) { - return false; - } - - public static int countText(final String... text) { - return 0; - } - - public static boolean matchText(final String pattern) { - return false; - } - - public static final void clear() { - } - - public static final void startCapture() { - } - - /** - * - * @param individualMessages enables counting individual messages. - */ - public static final void startCapture(boolean individualMessages) { - } - - public static final void stopCapture() { - } -} diff --git a/artemis-journal/pom.xml b/artemis-journal/pom.xml index 9b3028fbca..4d520480dd 100644 --- a/artemis-journal/pom.xml +++ b/artemis-journal/pom.xml @@ -89,5 +89,11 @@ <artifactId>junit</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.activemq</groupId> + <artifactId>artemis-unit-test-support</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> </dependencies> </project> diff --git a/artemis-unit-test-support/pom.xml b/artemis-unit-test-support/pom.xml index 91264ec7c4..4ab3314a69 100644 --- a/artemis-unit-test-support/pom.xml +++ b/artemis-unit-test-support/pom.xml @@ -41,5 +41,10 @@ <artifactId>slf4j-api</artifactId> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-slf4j-impl</artifactId> + <scope>provided</scope> + </dependency> </dependencies> </project> diff --git a/artemis-unit-test-support/src/main/java/org/apache/activemq/artemis/logs/AssertionLoggerHandler.java b/artemis-unit-test-support/src/main/java/org/apache/activemq/artemis/logs/AssertionLoggerHandler.java new file mode 100644 index 0000000000..4bb25932f2 --- /dev/null +++ b/artemis-unit-test-support/src/main/java/org/apache/activemq/artemis/logs/AssertionLoggerHandler.java @@ -0,0 +1,224 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.activemq.artemis.logs; + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Pattern; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; + +/** + * This class contains a tool where programs could intercept for LogMessage given an interval of time between {@link #startCapture()} + * and {@link #stopCapture()} + * + * Be careful with this use as this is intended for testing only (such as testcases) + */ +public class AssertionLoggerHandler extends AbstractAppender { + + public enum LogLevel { + ERROR(Level.ERROR), + WARN(Level.WARN), + INFO(Level.INFO), + DEBUG(Level.DEBUG), + TRACE(Level.TRACE); + + Level implLevel; + + private LogLevel(Level implLevel) { + this.implLevel = implLevel; + } + + private Level toImplLevel() { + return implLevel; + } + } + + private static final Map<String, LogEvent> messages = new ConcurrentHashMap<>(); + private static List<String> traceMessages; + private static volatile boolean capture = false; + + protected AssertionLoggerHandler(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); + } + + @Override + public void append(LogEvent event) { + if (capture) { + //TODO: see getFormattedMessage() around handling StringBuilderFormattable interface as well, check it out + String formattedMessage = event.getMessage().getFormattedMessage(); + messages.put(formattedMessage, event); + if (traceMessages != null) { + traceMessages.add(formattedMessage); + } + } + } + + @Override + public void stop() { + super.stop(); + // TODO Do we need to do anything here? Set capture false and clear? + } + + /** + * is there any record matching Level? + * + * @param level + * @return + */ + public static boolean hasLevel(LogLevel level) { + Level implLevel = level.toImplLevel(); + + for (LogEvent event : messages.values()) { + if (implLevel.equals(event.getLevel())) { + return true; + } + } + + return false; + } + + public static boolean findText(long mstimeout, String... text) { + + long timeMax = System.currentTimeMillis() + mstimeout; + do { + if (findText(text)) { + return true; + } + } + while (timeMax > System.currentTimeMillis()); + + return false; + + } + + /** + * Find a line that contains the parameters passed as an argument + * + * @param text + * @return + */ + public static boolean findText(final String... text) { + for (Map.Entry<String, LogEvent> entry : messages.entrySet()) { + String key = entry.getKey(); + boolean found = true; + + for (String txtCheck : text) { + found = key.contains(txtCheck); + if (!found) { + // If the main log message doesn't contain what we're looking for let's look in the message from the exception (if there is one). + Throwable throwable = entry.getValue().getThrown(); + if (throwable != null && throwable.getMessage() != null) { + found = throwable.getMessage().contains(txtCheck); + if (!found) { + break; + } + } else { + break; + } + } + } + + if (found) { + return true; + } + } + + return false; + } + + public static int countText(final String... text) { + int found = 0; + if (traceMessages != null) { + for (String str : traceMessages) { + for (String txtCheck : text) { + if (str.contains(txtCheck)) { + found++; + } + } + } + } else { + for (Map.Entry<String, LogEvent> entry : messages.entrySet()) { + String key = entry.getKey(); + + for (String txtCheck : text) { + if (key.contains(txtCheck)) { + found++; + } + } + } + } + + return found; + } + + public static boolean matchText(final String pattern) { + Pattern r = Pattern.compile(pattern); + + for (Map.Entry<String, LogEvent> entry : messages.entrySet()) { + if (r.matcher(entry.getKey()).matches()) { + return true; + } else { + Throwable throwable = entry.getValue().getThrown(); + if (throwable != null && throwable.getMessage() != null) { + if (r.matcher(throwable.getMessage()).matches()) { + return true; + } + } + } + } + + return false; + } + + public static final void clear() { + messages.clear(); + if (traceMessages != null) { + traceMessages.clear(); + } + } + + public static final void startCapture() { + startCapture(false); + } + + /** + * + * @param individualMessages enables counting individual messages. + */ + public static final void startCapture(boolean individualMessages) { + clear(); + if (individualMessages) { + traceMessages = new LinkedList<>(); + } + capture = true; + } + + public static final void stopCapture() { + capture = false; + clear(); + traceMessages = null; + } +} diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/SimpleStartStopTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/SimpleStartStopTest.java index 9b375ebe5d..f4b0a4a80f 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/SimpleStartStopTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/SimpleStartStopTest.java @@ -23,11 +23,10 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.logs.AssertionLoggerHandler; +import org.apache.activemq.artemis.logs.AssertionLoggerHandler.LogLevel; import org.apache.activemq.artemis.tests.util.ActiveMQTestBase; -import org.junit.Ignore; import org.junit.Test; -@Ignore("Needs updated to account for logging impl changes") //TODO: reinstate public class SimpleStartStopTest extends ActiveMQTestBase { /** @@ -52,7 +51,7 @@ public class SimpleStartStopTest extends ActiveMQTestBase { } // There shouldn't be any error from starting / stopping the server - //TODO: assertFalse("There shouldn't be any error for just starting / stopping the server", AssertionLoggerHandler.hasLevel(Level.ERROR)); + assertFalse("There shouldn't be any error for just starting / stopping the server", AssertionLoggerHandler.hasLevel(LogLevel.ERROR)); assertFalse(AssertionLoggerHandler.findText("AMQ224008")); HashMap<Integer, AtomicInteger> records = this.internalCountJournalLivingRecords(server.getConfiguration(), false);
