blob: a84ad0606302ebfe196ff28978b193aebb37c0a9 [file] [log] [blame]
package org.robolectric.junit.rules;
import static org.hamcrest.CoreMatchers.instanceOf;
import android.util.Log;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.util.regex.Pattern;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.RuleChain;
import org.junit.runner.RunWith;
/** Tests for {@link ExpectedLogMessagesRule}. */
@RunWith(AndroidJUnit4.class)
public final class ExpectedLogMessagesRuleTest {
private final ExpectedLogMessagesRule rule = new ExpectedLogMessagesRule();
private final ExpectedException expectedException = ExpectedException.none();
@Rule public RuleChain chain = RuleChain.outerRule(expectedException).around(rule);
@Test
public void testExpectErrorLogDoesNotFail() {
Log.e("Mytag", "What's up");
rule.expectLogMessage(Log.ERROR, "Mytag", "What's up");
}
@Test
public void testExpectWarnLogDoesNotFail() {
Log.w("Mytag", "What's up");
rule.expectLogMessage(Log.WARN, "Mytag", "What's up");
}
@Test
public void testAndroidExpectedLogMessagesFailsWithMessage() {
expectedException.expect(AssertionError.class);
Log.e("Mytag", "What's up");
}
@Test
public void testAndroidExpectedLogMessagesDoesNotFailWithExpected() {
rule.expectErrorsForTag("Mytag");
Log.e("Mytag", "What's up");
}
@Test
public void testNoExpectedMessageFailsTest() {
expectedException.expect(AssertionError.class);
rule.expectLogMessage(Log.ERROR, "Mytag", "What's up");
}
@Test
public void testNoExpectedTagFailsTest() {
expectedException.expect(AssertionError.class);
rule.expectErrorsForTag("Mytag");
}
@Test
public void testExpectLogMessageWithThrowable() {
final Throwable throwable = new Throwable("lorem ipsum");
Log.e("Mytag", "What's up", throwable);
rule.expectLogMessageWithThrowable(Log.ERROR, "Mytag", "What's up", throwable);
}
@Test
public void testExpectLogMessageWithThrowableMatcher() {
final IllegalArgumentException exception = new IllegalArgumentException("lorem ipsum");
Log.e("Mytag", "What's up", exception);
rule.expectLogMessageWithThrowableMatcher(
Log.ERROR, "Mytag", "What's up", instanceOf(IllegalArgumentException.class));
}
@Test
public void testMultipleExpectLogMessagee() {
final Throwable throwable = new Throwable("lorem ipsum");
Log.e("Mytag", "What's up", throwable);
Log.e("Mytag", "Message 2");
Log.e("Mytag", "Message 3", throwable);
rule.expectLogMessageWithThrowable(Log.ERROR, "Mytag", "What's up", throwable);
rule.expectLogMessage(Log.ERROR, "Mytag", "Message 2");
rule.expectLogMessage(Log.ERROR, "Mytag", "Message 3");
}
@Test
public void testExpectedTagFailureOutput() {
Log.e("TAG1", "message1");
rule.expectErrorsForTag("TAG1");
rule.expectErrorsForTag("TAG3"); // Not logged
expectedException.expect(
new TypeSafeMatcher<AssertionError>() {
@Override
protected boolean matchesSafely(AssertionError error) {
return error.getMessage().contains("Expected, and observed: [TAG1]")
&& error.getMessage().contains("Expected, but not observed: [TAG3]");
}
@Override
public void describeTo(Description description) {
description.appendText("Matches ExpectedLogMessagesRule");
}
});
}
@Test
public void testExpectedLogMessageFailureOutput() {
Log.e("Mytag", "message1");
Log.e("Mytag", "message2"); // Not expected
rule.expectLogMessage(Log.ERROR, "Mytag", "message1");
rule.expectLogMessage(Log.ERROR, "Mytag", "message3"); // Not logged
expectedException.expect(
new TypeSafeMatcher<AssertionError>() {
@Override
protected boolean matchesSafely(AssertionError error) {
return error
.getMessage()
.matches(
"[\\s\\S]*Expected, and observed:\\s+\\[LogItem\\{"
+ "\\s+timeString='.+'"
+ "\\s+type=6"
+ "\\s+tag='Mytag'"
+ "\\s+msg='message1'"
+ "\\s+throwable=null"
+ "\\s+}]"
+ "[\\s\\S]*")
&& error
.getMessage()
.matches(
"[\\s\\S]*Observed, but not expected:\\s+\\[LogItem\\{"
+ "\\s+timeString='.+'"
+ "\\s+type=6"
+ "\\s+tag='Mytag'"
+ "\\s+msg='message2'"
+ "\\s+throwable=null"
+ "\\s+}][\\s\\S]*")
&& error
.getMessage()
.matches(
"[\\s\\S]*Expected, but not observed: \\[ExpectedLogItem\\{timeString='.+',"
+ " type=6, tag='Mytag', msg='message3'}]"
+ "[\\s\\S]*");
}
@Override
public void describeTo(Description description) {
description.appendText("Matches ExpectedLogMessagesRule");
}
});
}
@Test
public void testExpectedLogMessageWithMatcherFailureOutput() {
Log.e("Mytag", "message1");
Log.e("Mytag", "message2", new IllegalArgumentException()); // Not expected
rule.expectLogMessage(Log.ERROR, "Mytag", "message1");
rule.expectLogMessageWithThrowableMatcher(
Log.ERROR,
"Mytag",
"message2",
instanceOf(UnsupportedOperationException.class)); // Not logged
String expectedAndObservedPattern =
"[\\s\\S]*Expected, and observed:\\s+\\[LogItem\\{"
+ "\\s+timeString='.+'"
+ "\\s+type=6"
+ "\\s+tag='Mytag'"
+ "\\s+msg='message1'"
+ "\\s+throwable=null"
+ "\\s+}]"
+ "[\\s\\S]*";
String observedAndNotExpectedPattern =
"[\\s\\S]*Observed, but not expected:\\s+\\[LogItem\\{"
+ "\\s+timeString='.+'"
+ "\\s+type=6"
+ "\\s+tag='Mytag'"
+ "\\s+msg='message2'"
+ "\\s+throwable=java.lang.IllegalArgumentException"
+ "(\\s+at .*\\)\\R)+"
+ "\\s+}][\\s\\S]*";
String expectedNotObservedPattern =
"[\\s\\S]*Expected, but not observed:"
+ " \\[ExpectedLogItem\\{timeString='.+',"
+ " type=6, tag='Mytag', msg='message2', throwable="
+ ".*UnsupportedOperationException.*}][\\s\\S]*";
expectedException.expect(
new TypeSafeMatcher<AssertionError>() {
@Override
protected boolean matchesSafely(AssertionError error) {
return error.getMessage().matches(expectedAndObservedPattern)
&& error.getMessage().matches(observedAndNotExpectedPattern)
&& error.getMessage().matches(expectedNotObservedPattern);
}
@Override
public void describeTo(Description description) {
description.appendText(
"Matches ExpectedLogMessagesRule:\n"
+ expectedAndObservedPattern
+ "\n"
+ observedAndNotExpectedPattern
+ "\n"
+ expectedNotObservedPattern);
}
});
}
@Test
public void expectLogMessageWithPattern_duplicatePatterns() {
Log.e("Mytag", "message1");
rule.expectLogMessagePattern(Log.ERROR, "Mytag", Pattern.compile("message1"));
rule.expectLogMessagePattern(Log.ERROR, "Mytag", Pattern.compile("message1"));
}
}