package com.youdevise.hudson.slavestatus;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import static junit.framework.Assert.fail;
@SuppressWarnings("serial")
public class MockLogger extends Logger implements Serializable {
private List<LogRecord> logRecords = new ArrayList<LogRecord>();
protected MockLogger() {
super("mock", null);
setLevel(Level.ALL);
}
@Override
public void log(LogRecord logRecord) {
logRecords.add(logRecord);
}
public void verifyLogs(LogRecord ... expectedLogRecords) {
if (logRecords.size() != expectedLogRecords.length) {
fail("Wrong number of log records - expected " + expectedLogRecords.length + ", got " + logRecords.size());
}
for (int i = 0; i < logRecords.size(); i++) {
compareLogRecords(expectedLogRecords[i], logRecords.get(i));
}
}
public LogRecord makeThrowableLogRecord(Level level, Throwable throwable) {
LogRecord logRecord = new LogRecord(level, "");
logRecord.setThrown(throwable);
return logRecord;
}
private void compareLogRecords(LogRecord expectedLogRecord, LogRecord actualLogRecord) {
String recordsString = String.format("expected: %s, actual: %s",
logRecordToString(expectedLogRecord),
logRecordToString(actualLogRecord));
if (expectedLogRecord.getLevel() != actualLogRecord.getLevel()) {
fail("Levels don't match - " + recordsString);
}
if (expectedLogRecord.getThrown() != null || actualLogRecord.getThrown() != null) {
if (expectedLogRecord.getThrown().getClass() != actualLogRecord.getThrown().getClass()) {
fail("Thrown objects don't match - " + recordsString);
}
} else {
if (!expectedLogRecord.getMessage().equals(actualLogRecord.getMessage())) {
fail("Messages don't match - " + recordsString);
}
}
}
private String logRecordToString(LogRecord logRecord) {
String thrownString = "";
if (logRecord.getThrown() != null) {
thrownString = String.format(" (threw %s)", logRecord.getThrown().getClass().getName());
}
return String.format("%s: %s%s",
logRecord.getLevel().getName(),
logRecord.getMessage(),
thrownString);
}
}