/* * Sakuli - Testing and Monitoring-Tool for Websites and common UIs. * * Copyright 2013 - 2015 the original author or authors. * * 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 * * 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.sakuli; import org.apache.commons.io.FileUtils; import org.sakuli.datamodel.actions.LogLevel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; import java.io.IOException; import java.net.URISyntaxException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.spi.FileSystemProvider; import java.util.List; import static org.testng.Assert.assertEquals; /** * @author Tobias Schneck */ public abstract class AbstractLogAwareTest { private static final Logger LOGGER = LoggerFactory.getLogger(BaseTest.class); public static String getResource(String resourceName) { return getResource(resourceName, BaseTest.class); } public static String getResource(String resourceName, Class<?> resourceClass) { try { return Paths.get(resourceClass.getResource(resourceName).toURI()).toString(); } catch (URISyntaxException | NullPointerException e) { LOGGER.error("could not resolve resource '{}' from classpath '{}'", resourceName, e); return null; } } public static void deleteFile(Path logFile) { FileSystemProvider provider = logFile.getFileSystem().provider(); try { provider.deleteIfExists(logFile); } catch (IOException e) { //do nothing } } public static String getLastLineWithContent(Path file, String s) throws IOException { waitForLogFile(file); List<String> lines = FileUtils.readLines(file.toFile(), Charset.forName("UTF-8")); if (!lines.isEmpty()) { for (int i = lines.size() - 1; i >= 0; i--) { String line = lines.get(i); if (line.contains(s)) { return line; } } } return ""; } public static String getLastLineOfLogFile(Path file) throws IOException { waitForLogFile(file); List<String> lines = FileUtils.readLines(file.toFile(), Charset.forName("UTF-8")); return lines.isEmpty() ? "" : lines.get(lines.size() - 1); } public static String getLastLineOfLogFile(Path file, int lastLines) throws IOException { waitForLogFile(file); List<String> lines = FileUtils.readLines(file.toFile(), Charset.forName("UTF-8")); StringBuilder result = new StringBuilder(); if (!lines.isEmpty()) { final int elements = lines.size() - 1; for (int i = 0; i < lines.size(); i++) { if (elements - i <= lastLines) { result.append(lines.get(i)).append("\n"); } } } return result.toString(); } public static void setSystemProperty(String value, String key) { if (value != null) { System.setProperty(key, value); } else { System.clearProperty(key); } } /** * Set the property 'log.level.sakuli' for the file 'sakuli-log-config.xml'. * * @param logLevel as String e.g. 'DEBUG' */ public static void setSakuliLogLevel(String logLevel) { setSystemProperty(logLevel, "log.level.sakuli"); } /** * Set the property 'log.level.sikuli' for the file 'sakuli-log-config.xml'. * * @param logLevel as String e.g. 'DEBUG' */ public static void setSikuliLogLevel(String logLevel) { setSystemProperty(logLevel, "log.level.sikuli"); } public static void setSahiLogLevel(String logLevel) { setSystemProperty(logLevel, "log.level.sahi"); } private static void waitForLogFile(Path file) { if (!Files.exists(file)) { try { Thread.sleep(10000); } catch (InterruptedException e) { LOGGER.error("Thread.sleep error", e); } } } @BeforeSuite(alwaysRun = true) public void setLogLevel() throws Exception { setSakuliLogLevel("DEBUG"); setSikuliLogLevel("DEBUG"); setSahiLogLevel("DEBUG"); } @AfterSuite(alwaysRun = true) public void removeLogLevel() throws Exception { setSakuliLogLevel(null); setSikuliLogLevel(null); setSahiLogLevel(null); } protected synchronized void assertLastLine(Path logFile, String filter, LogLevel logLevel, String expectedMessage) throws IOException { String preFix = null; switch (logLevel) { case ERROR: preFix = "ERROR"; break; case INFO: preFix = "INFO "; break; case DEBUG: preFix = "DEBUG"; break; case WARNING: preFix = "WARN "; break; } String lastLineOfLogFile = AbstractLogAwareTest.getLastLineWithContent(logFile, filter); assertEquals(lastLineOfLogFile.substring(0, 5), preFix); assertEquals(lastLineOfLogFile.substring(lastLineOfLogFile.indexOf("]") + 4), expectedMessage); } }