/* * Copyright 2016 ThoughtWorks, Inc. * * 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 com.thoughtworks.go.util; import java.io.Closeable; import java.util.ArrayList; import java.util.List; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; public class LogFixture extends AppenderSkeleton implements Closeable { private List<String> messages = new ArrayList<>(); private List<LoggingEvent> events = new ArrayList<>(); private Logger logger; private LogFixture(Class aClass, Level level) { this(Logger.getLogger(aClass), level); } private LogFixture(Logger logger, Level level) { this.logger = logger; logger.addAppender(this); logger.setLevel(level); } public static LogFixture logFixtureFor(Class aClass, Level level) { return new LogFixture(aClass, level); } public static LogFixture logFixtureForRootLogger(Level level) { return new LogFixture(Logger.getRootLogger(), level); } public static LogFixture logFixtureForRails() { return new LogFixture(Logger.getLogger("com.thoughtworks.go.server.Rails"), Level.ALL); } public void close() { logger.removeAppender(this); } protected synchronized void append(LoggingEvent event) { events.add(event); messages.add(event.getRenderedMessage()); } public boolean requiresLayout() { return false; } public String[] getMessages() { return messages.toArray(new String[messages.size()]); } public void clear() { messages.clear(); } public String getLog() { return ArrayUtil.join(getMessages()); } public synchronized boolean contains(Level level, String message) { for (LoggingEvent event : events) { if (event.getLevel().equals(level) && event.getMessage().toString().contains(message)) { return true; } } return false; } public synchronized String allLogs() { StringBuilder builder = new StringBuilder(); for (LoggingEvent event : events) { builder.append(event.getLevel()).append(" - ").append(event.getMessage()).append("\n"); if (event.getThrowableInformation() != null) { for (String s : event.getThrowableStrRep()) { builder.append(s).append("\n"); } } } return builder.toString(); } }