/* (c) 2014 - 2015 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.util;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.reset;
import static org.easymock.classextension.EasyMock.verify;
import static org.hamcrest.Matchers.anything;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasProperty;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.*;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import org.easymock.Capture;
import org.easymock.IAnswer;
import org.geotools.util.logging.LoggerAdapter;
import org.junit.Rule;
import org.junit.Test;
import org.junit.internal.AssumptionViolatedException;
import org.junit.rules.ExpectedException;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
public class LoggerRuleTest {
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void testDoNothingUntilRun() {
Logger log = createMock("log",Logger.class);
Description desc = createMock("desc",Description.class);
Statement base = createMock("base", Statement.class);
replay(log, desc, base);
LoggerRule rule = new LoggerRule(log, Level.FINE);
rule.apply(base, desc);
verify(log, desc, base);
}
@Test
public void testCleansUp() throws Throwable {
final Logger log = createMock("log",Logger.class);
Description desc = createMock("desc",Description.class);
Statement base = createMock("base", Statement.class);
expect(log.getLevel()).andReturn(Level.OFF);
log.setLevel(Level.FINE); expectLastCall().once();
final Capture<Handler> handlerCap = new Capture<>();
log.addHandler(capture(handlerCap)); expectLastCall().once();
base.evaluate();expectLastCall().andAnswer(new IAnswer<Void>(){
@Override
public Void answer() throws Throwable {
verify(log);
reset(log);
log.removeHandler(handlerCap.getValue()); expectLastCall().once();
log.setLevel(Level.OFF); expectLastCall().once();
replay(log);
return null;
}
});
replay(log, desc, base);
LoggerRule rule = new LoggerRule(log, Level.FINE);
Statement s = rule.apply(base, desc);
s.evaluate();
verify(log, desc, base);
}
@Test
public void testCleansUpAfterException() throws Throwable {
final Logger log = createMock("log",Logger.class);
Description desc = createMock("desc",Description.class);
Statement base = createMock("base", Statement.class);
expect(log.getLevel()).andReturn(Level.OFF);
log.setLevel(Level.FINE); expectLastCall().once();
final Capture<Handler> handlerCap = new Capture<>();
final Exception ex = new IllegalArgumentException();
log.addHandler(capture(handlerCap)); expectLastCall().once();
base.evaluate();expectLastCall().andAnswer(new IAnswer<Void>(){
@Override
public Void answer() throws Throwable {
verify(log);
reset(log);
log.removeHandler(handlerCap.getValue()); expectLastCall().once();
log.setLevel(Level.OFF); expectLastCall().once();
replay(log);
throw ex;
}
});
replay(log, desc, base);
LoggerRule rule = new LoggerRule(log, Level.FINE);
Statement s = rule.apply(base, desc);
exception.expect(sameInstance(ex));
try {
s.evaluate();
} finally {
verify(log, desc, base);
}
}
@Test
public void testRecordsLogs() throws Throwable {
final Logger log = createMock("log",Logger.class);
Description desc = createMock("desc",Description.class);
Statement base = createMock("base", Statement.class);
expect(log.getLevel()).andReturn(Level.OFF);
log.setLevel(Level.FINE); expectLastCall().once();
final Capture<Handler> handlerCap = new Capture<>();
final Exception ex = new IllegalArgumentException();
final LogRecord record = createMock("record1", LogRecord.class);
log.addHandler(capture(handlerCap)); expectLastCall().once();
base.evaluate();expectLastCall().andAnswer(new IAnswer<Void>(){
@Override
public Void answer() throws Throwable {
verify(log);
reset(log);
log.removeHandler(handlerCap.getValue()); expectLastCall().once();
log.setLevel(Level.OFF); expectLastCall().once();
handlerCap.getValue().publish(record);
assertThat(((LoggerRule)handlerCap.getValue()).records(), contains(record));
replay(log);
return null;
}
});
replay(log, desc, base);
LoggerRule rule = new LoggerRule(log, Level.FINE);
Statement s = rule.apply(base, desc);
s.evaluate();
verify(log, desc, base);
}
@Test
public void testAssertFail() throws Throwable {
final Logger log = createMock("log",Logger.class);
Description desc = createMock("desc",Description.class);
Statement base = createMock("base", Statement.class);
expect(log.getLevel()).andReturn(Level.OFF);
log.setLevel(Level.FINE); expectLastCall().once();
final Capture<Handler> handlerCap = new Capture<>();
final LogRecord record = createMock("record1", LogRecord.class);
log.addHandler(capture(handlerCap)); expectLastCall().once();
base.evaluate();expectLastCall().andAnswer(new IAnswer<Void>(){
@Override
public Void answer() throws Throwable {
verify(log);
reset(log);
log.removeHandler(handlerCap.getValue()); expectLastCall().once();
log.setLevel(Level.OFF); expectLastCall().once();
replay(log);
handlerCap.getValue().publish(record);
((LoggerRule)handlerCap.getValue()).assertLogged(sameInstance(record));
((LoggerRule)handlerCap.getValue()).assertLogged(not(anything()));
return null;
}
});
replay(log, desc, base);
LoggerRule rule = new LoggerRule(log, Level.FINE);
Statement s = rule.apply(base, desc);
try {
s.evaluate();
fail("Expected Assertion Exception");
} catch (AssertionError ex){
assertThat(ex, hasProperty("message", containsString("Expected record")));
} finally {
verify(log, desc, base);
}
}
@Test
public void testAssertPass() throws Throwable {
final Logger log = createMock("log",Logger.class);
Description desc = createMock("desc",Description.class);
Statement base = createMock("base", Statement.class);
expect(log.getLevel()).andReturn(Level.OFF);
log.setLevel(Level.FINE); expectLastCall().once();
final Capture<Handler> handlerCap = new Capture<>();
final LogRecord record = createMock("record1", LogRecord.class);
log.addHandler(capture(handlerCap)); expectLastCall().once();
base.evaluate();expectLastCall().andAnswer(new IAnswer<Void>(){
@Override
public Void answer() throws Throwable {
verify(log);
reset(log);
log.removeHandler(handlerCap.getValue()); expectLastCall().once();
log.setLevel(Level.OFF); expectLastCall().once();
replay(log);
handlerCap.getValue().publish(record);
((LoggerRule)handlerCap.getValue()).assertLogged(sameInstance(record));
return null;
}
});
replay(log, desc, base);
LoggerRule rule = new LoggerRule(log, Level.FINE);
Statement s = rule.apply(base, desc);
try {
s.evaluate();
} finally {
verify(log, desc, base);
}
}
@Test
public void testAdapter() throws Throwable {
final Logger log = createMock("log",LoggerAdapter.class);
Description desc = createMock("desc",Description.class);
Statement base = createMock("base", Statement.class);
expect(log.getLevel()).andReturn(Level.OFF);
log.setLevel(Level.FINE); expectLastCall().once();
final Capture<Handler> handlerCap = new Capture<>();
final LogRecord record = createMock("record1", LogRecord.class);
log.addHandler(capture(handlerCap)); expectLastCall().once();
base.evaluate();expectLastCall().andAnswer(new IAnswer<Void>(){
@Override
public Void answer() throws Throwable {
verify(log);
reset(log);
log.removeHandler(handlerCap.getValue()); expectLastCall().once();
log.setLevel(Level.OFF); expectLastCall().once();
replay(log);
handlerCap.getValue().publish(record);
((LoggerRule)handlerCap.getValue()).assertLogged(sameInstance(record));
return null;
}
});
replay(log, desc, base);
LoggerRule rule = new LoggerRule(log, Level.FINE);
Statement s = rule.apply(base, desc);
try {
s.evaluate();
} catch (AssumptionViolatedException ex) {
if(!ex.getMessage().equals("LoggerRule can't capture logs for LoggerAdapter")) {
throw ex;
}
// Eventually hopefully we can handle this case and we can fail if this particular
// assumption failure occurs. For now it's a pass rather than an ignore.
} finally {
verify(log, desc, base);
}
}
}