summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormark.j.leonard <mark.j.leonard@gmail.com>2019-02-12 13:36:16 +0000
committermark.j.leonard <mark.j.leonard@gmail.com>2019-02-12 13:36:16 +0000
commite4fab0c8c5928a876c46a6ae91d36ee2a0d41278 (patch)
treefec3865932ee4735f2699c2a815cbc96efb014c8
parent23f2d88d594b342d2ca07590431ea3a06f0fe73c (diff)
Improve JUnit tests for the application logger
Rework the logger tests to simplify the code and to improve error messages in the case of failure. Change-Id: Ic55077bb8ac7bc7d10559cb1ddd652a6a15f3dca Issue-ID: AAI-2057 Signed-off-by: mark.j.leonard <mark.j.leonard@gmail.com>
-rw-r--r--src/test/java/org/onap/aai/validation/logging/LogReader.java60
-rw-r--r--src/test/java/org/onap/aai/validation/logging/TestApplicationLogger.java115
2 files changed, 92 insertions, 83 deletions
diff --git a/src/test/java/org/onap/aai/validation/logging/LogReader.java b/src/test/java/org/onap/aai/validation/logging/LogReader.java
index 096221d..9faf0fb 100644
--- a/src/test/java/org/onap/aai/validation/logging/LogReader.java
+++ b/src/test/java/org/onap/aai/validation/logging/LogReader.java
@@ -1,20 +1,24 @@
-/*
- * ============LICENSE_START===================================================
- * Copyright (c) 2018 Amdocs
- * ============================================================================
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2018-2019 European Software Marketing Ltd.
+ * ================================================================================
* Licensed 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
+ * 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.
- * ============LICENSE_END=====================================================
+ * ============LICENSE_END=========================================================
*/
+
package org.onap.aai.validation.logging;
import java.io.BufferedReader;
@@ -25,31 +29,23 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.time.StopWatch;
-import org.junit.Assert;
public class LogReader {
- private Map<String, Path> cachedLogMap = new HashMap<>();
- private Map<String, BufferedReader> readersMap = new HashMap<>();
private BufferedReader cachedReader;
+ private Path cachedLog;
public LogReader(String logDirectory, String logFilePrefix) throws IOException {
cachedReader = getReader(logDirectory, logFilePrefix);
}
private BufferedReader getReader(String logDirectory, String logFilePrefix) throws IOException {
- BufferedReader reader = readersMap.get(logFilePrefix);
- if (reader == null) {
- reader = new BufferedReader(new FileReader(getLogFile(logDirectory, logFilePrefix)));
- while (reader.readLine() != null) {
- // Consume all lines
- }
- readersMap.put(logFilePrefix, reader);
+ BufferedReader reader = new BufferedReader(new FileReader(getLogFile(logDirectory, logFilePrefix)));
+ while (reader.readLine() != null) {
+ // Consume all lines
}
return reader;
}
@@ -59,24 +55,24 @@ public class LogReader {
* @return the most recently created log file.
* @throws IOException
*/
- public File getLogFile(String logDirectory, String filenamePrefix) throws IOException {
- Path cachedLog = cachedLogMap.get(filenamePrefix);
-
- if (cachedLog == null) {
- Optional<Path> latestFilePath = Files.list(Paths.get(logDirectory))
- .filter(f -> Files.isDirectory(f) == false && f.getFileName().toString().startsWith(filenamePrefix))
- .max(Comparator.comparingLong(f -> f.toFile().lastModified()));
- if (latestFilePath.isPresent()) {
- cachedLog = latestFilePath.get();
- } else {
- throw new IOException("No validation log files were found!");
- }
+ private File getLogFile(String logDirectory, String filenamePrefix) throws IOException {
+ Optional<Path> latestFilePath = Files.list(Paths.get(logDirectory))
+ .filter(f -> Files.isDirectory(f) == false //
+ && f.getFileName().toString().startsWith(filenamePrefix)
+ && !f.getFileName().toString().endsWith(".zip"))
+ .max(Comparator.comparingLong(f -> f.toFile().lastModified()));
+ if (latestFilePath.isPresent()) {
+ cachedLog = latestFilePath.get();
+ } else {
+ throw new IOException("No validation log files were found!");
}
return cachedLog.toFile();
}
/**
+ * Read newly appended lines from the log.
+ *
* @return new lines appended to the log file
* @throws IOException
*/
@@ -85,8 +81,8 @@ public class LogReader {
stopwatch.start();
while (!cachedReader.ready()) {
- if (stopwatch.getTime() > TimeUnit.SECONDS.toMillis(30)) {
- Assert.fail("Test took too long");
+ if (stopwatch.getTime() > TimeUnit.SECONDS.toMillis(10)) {
+ throw new IOException("Test took too long - waiting on " + cachedLog);
}
// else keep waiting
}
diff --git a/src/test/java/org/onap/aai/validation/logging/TestApplicationLogger.java b/src/test/java/org/onap/aai/validation/logging/TestApplicationLogger.java
index a5876f2..c20d121 100644
--- a/src/test/java/org/onap/aai/validation/logging/TestApplicationLogger.java
+++ b/src/test/java/org/onap/aai/validation/logging/TestApplicationLogger.java
@@ -2,8 +2,8 @@
* ============LICENSE_START=======================================================
* org.onap.aai
* ================================================================================
- * Copyright © 2018-2019 AT&T Intellectual Property. All rights reserved.
- * Copyright © 2018-2019 European Software Marketing Ltd.
+ * Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2018-2019 European Software Marketing Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,14 +24,15 @@ package org.onap.aai.validation.logging;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.CoreMatchers.startsWith;
import static org.hamcrest.MatcherAssert.assertThat;
import java.io.IOException;
-import java.nio.file.Paths;
import java.util.Arrays;
import org.apache.commons.lang.time.StopWatch;
+import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TestName;
import org.mockito.Mockito;
import org.onap.aai.cl.api.LogFields;
import org.onap.aai.cl.api.Logger;
@@ -41,26 +42,42 @@ import org.springframework.http.HttpHeaders;
/**
* Simple test to log each of the validation messages in turn.
- *
+ *
* This version tests only the error logger at INFO level.
*
*/
public class TestApplicationLogger {
+ @Rule
+ public TestName name = new TestName();
+
static {
System.setProperty("APP_HOME", ".");
}
/**
+ * Ensure that all of the EELF log files exist (and any log file rollover takes place) so that we can successfully
+ * read from the log files (during the Test method).
+ */
+ @Before
+ public void createLogFiles() {
+ final String startMessage = "begin testing " + name.getMethodName();
+ LogHelper.INSTANCE.debug(startMessage);
+ LogHelper.INSTANCE.info(ApplicationMsgs.MESSAGE_AUDIT, startMessage);
+ LogHelper.INSTANCE.logMetrics(startMessage);
+ LogHelper.INSTANCE.logAuditSuccess(startMessage);
+ }
+
+ /**
* Check that each message can be logged and that (by implication of successful logging) there is a corresponding
* resource (message format).
- *
+ *
* @throws IOException
*/
@Test
public void logAllMessages() throws IOException {
Logger logger = LogHelper.INSTANCE;
- String logDirectory = getLogDirectory();
+ String logDirectory = LogHelper.getLogDirectory();
LogReader errorReader = new LogReader(logDirectory, "error");
LogReader debugReader = new LogReader(logDirectory, "debug");
String[] args = {"1", "2", "3", "4"};
@@ -79,8 +96,10 @@ public class TestApplicationLogger {
validateLoggedMessage(msg, errorReader, "WARN");
}
- logger.debug(msg, args);
- validateLoggedMessage(msg, debugReader, "DEBUG");
+ if (logger.isDebugEnabled()) {
+ logger.debug(msg, args);
+ validateLoggedMessage(msg, debugReader, "DEBUG");
+ }
// The trace level is not enabled
logger.trace(msg, args);
@@ -90,27 +109,28 @@ public class TestApplicationLogger {
/**
* Check that each message can be logged and that (by implication of successful logging) there is a corresponding
* resource (message format).
- *
+ *
* @throws IOException
*/
@Test
public void logDebugMessages() throws IOException {
- LogReader reader = new LogReader(getLogDirectory(), "debug");
+ org.junit.Assume.assumeTrue(LogHelper.INSTANCE.isDebugEnabled());
+ LogReader reader = new LogReader(LogHelper.getLogDirectory(), "debug");
LogHelper.INSTANCE.debug("a message");
- String s = reader.getNewLines();
- assertThat(s, is(notNullValue()));
+ String str = reader.getNewLines();
+ assertThat(str, is(notNullValue()));
}
/**
* Check logAudit with HTTP headers
- *
+ *
* @throws IOException
*/
@Test
public void logAuditMessage() throws IOException {
- LogHelper logger = LogHelper.INSTANCE;
- LogReader reader = new LogReader(getLogDirectory(), "audit");
+ final LogHelper logger = LogHelper.INSTANCE;
+ final LogReader reader = new LogReader(LogHelper.getLogDirectory(), "audit");
HttpHeaders headers = Mockito.mock(HttpHeaders.class);
Mockito.when(headers.getFirst("X-ECOMP-RequestID")).thenReturn("ecomp-request-id");
@@ -118,58 +138,58 @@ public class TestApplicationLogger {
// Call logAudit without first calling startAudit
logger.logAuditSuccess("first call: bob");
- String s = reader.getNewLines();
- assertThat(s, is(notNullValue()));
- assertThat("audit message log level", s, containsString("INFO"));
- assertThat("audit message content", s, containsString("bob"));
+ String str = reader.getNewLines();
+ assertThat(str, is(notNullValue()));
+ assertThat("audit message log level", str, containsString("INFO"));
+ assertThat("audit message content", str, containsString("bob"));
// This time call the start method
logger.startAudit(headers, null);
logger.logAuditSuccess("second call: foo");
- s = reader.getNewLines();
- assertThat(s, is(notNullValue()));
- assertThat("audit message log level", s, containsString("INFO"));
- assertThat("audit message content", s, containsString("foo"));
- assertThat("audit message content", s, containsString("ecomp-request-id"));
- assertThat("audit message content", s, containsString("app-id"));
+ str = reader.getNewLines();
+ assertThat(str, is(notNullValue()));
+ assertThat("audit message log level", str, containsString("INFO"));
+ assertThat("audit message content", str, containsString("foo"));
+ assertThat("audit message content", str, containsString("ecomp-request-id"));
+ assertThat("audit message content", str, containsString("app-id"));
}
/**
* Check logAudit with no HTTP headers
- *
+ *
* @throws IOException
*/
@Test
public void logAuditMessageWithoutHeaders() throws IOException {
LogHelper logger = LogHelper.INSTANCE;
- LogReader reader = new LogReader(getLogDirectory(), "audit");
+ LogReader reader = new LogReader(LogHelper.getLogDirectory(), "audit");
logger.startAudit(null, null);
logger.logAuditSuccess("foo");
- String s = reader.getNewLines();
- assertThat(s, is(notNullValue()));
- assertThat("audit message log level", s, containsString("INFO"));
- assertThat("audit message content", s, containsString("foo"));
+ String str = reader.getNewLines();
+ assertThat(str, is(notNullValue()));
+ assertThat("audit message log level", str, containsString("INFO"));
+ assertThat("audit message content", str, containsString("foo"));
}
/**
* Check logMetrics
- *
+ *
* @throws IOException
*/
@Test
public void logMetricsMessage() throws IOException {
- LogReader reader = new LogReader(getLogDirectory(), "metrics");
+ LogReader reader = new LogReader(LogHelper.getLogDirectory(), "metrics");
LogHelper logger = LogHelper.INSTANCE;
logger.logMetrics("metrics: fred");
- String s = reader.getNewLines();
- assertThat(s, is(notNullValue()));
- assertThat("metrics message log level", s, containsString("INFO"));
- assertThat("metrics message content", s, containsString("fred"));
+ String str = reader.getNewLines();
+ assertThat(str, is(notNullValue()));
+ assertThat("metrics message log level", str, containsString("INFO"));
+ assertThat("metrics message content", str, containsString("fred"));
}
@Test
public void logMetricsMessageWithStopwatch() throws IOException {
- LogReader reader = new LogReader(getLogDirectory(), "metrics");
+ LogReader reader = new LogReader(LogHelper.getLogDirectory(), "metrics");
LogHelper logger = LogHelper.INSTANCE;
StopWatch stopWatch = new StopWatch();
stopWatch.start();
@@ -206,16 +226,9 @@ public class TestApplicationLogger {
}
}
- private String getLogDirectory() {
- String logDirectory = LogHelper.getLogDirectory();
- assertThat(Paths.get(logDirectory).toAbsolutePath().toString(),
- startsWith(Paths.get(System.getProperty("APP_HOME")).toAbsolutePath().toString()));
- return logDirectory;
- }
-
/**
* Call a logger method which is expected to throw an UnsupportedOperationException
- *
+ *
* @param logMethod
* @param dummyMsg
*/
@@ -231,15 +244,15 @@ public class TestApplicationLogger {
/**
* Assert that a log message was logged to the expected log file at the expected severity
- *
+ *
* @param msg
* @param reader
* @param severity
* @throws IOException
*/
private void validateLoggedMessage(ApplicationMsgs msg, LogReader reader, String severity) throws IOException {
- String s = reader.getNewLines();
- assertThat(s, is(notNullValue()));
- assertThat(msg.toString() + " log level", s, containsString(severity));
+ String str = reader.getNewLines();
+ assertThat(str, is(notNullValue()));
+ assertThat(msg.toString() + " log level", str, containsString(severity));
}
}