/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.logging;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import com.google.common.base.Predicate;
/** A logger implementation for use in testing; all log messages are remembered, \
* but not written anywhere. The messages can then be inspected {@link #getMessages()}
* or certain assertions applied (see assertXxx methods on these instances) */
public class BufferLogger extends BaseLogger {
final String category;
Level level = Level.INFO;
List<Record> messages = Collections.synchronizedList(new ArrayList<Record>());
public static class Record {
Level level;
String message;
Throwable trace;
public Record(Level level, String message, Throwable trace) {
this.level = level;
this.message = message;
this.trace = trace;
}
public Level getLevel() {
return level;
}
public String getMessage() {
return message;
}
public Throwable getTrace() {
return trace;
}
}
public BufferLogger(String category) {
this.category = category;
}
public List<Record> getMessages() {
return messages;
}
/** throws AssertionError if the log does not contain the indicated fragment;
* otherwise returns a record which does satisfy the constraint
*/
public Record assertLogContains(String fragment) {
for (Record r: messages) {
if (r.getMessage()!=null && r.getMessage().contains(fragment)) return r;
}
throw new AssertionError("log did not contain expected '"+fragment+"'");
}
/** fails if log _does_ contain the indicated fragment */
public void assertLogDoesntContain(String fragment) {
for (Record r: messages) {
if (r.getMessage()!=null && r.getMessage().contains(fragment))
throw new AssertionError("log contained unexpected '"+fragment+"'");
}
}
/** throws AssertionError if the log does not contain the indicated fragment;
* otherwise returns a record which does satisfy the constraint
*/
public Record assertLogContains(Predicate<Record> test) {
for (Record r: messages) {
if (r.getMessage()!=null && test.apply(r)) return r;
}
throw new AssertionError("log did not contain any records satisfying expected predicate");
}
@Override
public String getCategory() {
return category;
}
public void setLevel(Level level) {
this.level = level;
}
public void setAllLevelsEnabled() {
level = Level.ALL;
}
public void setAllLevelsDisabled() {
level = Level.OFF;
}
@Override
public boolean isTraceEnabled() {
return level.intValue() <= Level.FINER.intValue();
}
@Override
public boolean isDebugEnabled() {
return level.intValue() <= Level.FINE.intValue();
}
@Override
public boolean isInfoEnabled() {
return level.intValue() <= Level.INFO.intValue();
}
@Override
public boolean isWarnEnabled() {
return level.intValue() <= Level.WARNING.intValue();
}
@Override
public boolean isErrorEnabled() {
return level.intValue() <= Level.SEVERE.intValue();
}
@Override
protected void logError(String message, Throwable e) {
getMessages().add(new Record(Level.SEVERE, message, e));
}
@Override
protected void logError(String message) {
getMessages().add(new Record(Level.SEVERE, message, null));
}
@Override
protected void logWarn(String message, Throwable e) {
getMessages().add(new Record(Level.WARNING, message, e));
}
@Override
protected void logWarn(String message) {
getMessages().add(new Record(Level.WARNING, message, null));
}
@Override
protected void logInfo(String message) {
getMessages().add(new Record(Level.INFO, message, null));
}
@Override
protected void logDebug(String message) {
getMessages().add(new Record(Level.FINE, message, null));
}
@Override
protected void logTrace(String message) {
getMessages().add(new Record(Level.FINER, message, null));
}
}