/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
package org.mozilla.gecko.sync.log.writers.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.CountDownLatch;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mozilla.gecko.sync.Logger;
import org.mozilla.gecko.sync.log.writers.LevelFilteringLogWriter;
import org.mozilla.gecko.sync.log.writers.LogWriter;
import org.mozilla.gecko.sync.log.writers.PrintLogWriter;
import org.mozilla.gecko.sync.log.writers.SimpleTagLogWriter;
import org.mozilla.gecko.sync.log.writers.StringLogWriter;
import org.mozilla.gecko.sync.log.writers.ThreadLocalTagLogWriter;
import android.util.Log;
public class TestLogWriters {
public static final String TEST_LOG_TAG_1 = "TestLogTag1";
public static final String TEST_LOG_TAG_2 = "TestLogTag2";
public static final String TEST_MESSAGE_1 = "LOG TEST MESSAGE one";
public static final String TEST_MESSAGE_2 = "LOG TEST MESSAGE two";
public static final String TEST_MESSAGE_3 = "LOG TEST MESSAGE three";
@Before
public void setUp() {
Logger.stopLoggingToAll();
}
@After
public void tearDown() {
Logger.stopLoggingToAll();
}
@Test
public void testStringLogWriter() {
StringLogWriter lw = new StringLogWriter();
Logger.error(TEST_LOG_TAG_1, TEST_MESSAGE_1, new RuntimeException());
Logger.startLoggingTo(lw);
Logger.error(TEST_LOG_TAG_1, TEST_MESSAGE_2);
Logger.warn(TEST_LOG_TAG_1, TEST_MESSAGE_2);
Logger.info(TEST_LOG_TAG_1, TEST_MESSAGE_2);
Logger.debug(TEST_LOG_TAG_1, TEST_MESSAGE_2);
Logger.trace(TEST_LOG_TAG_1, TEST_MESSAGE_2);
Logger.stopLoggingTo(lw);
Logger.error(TEST_LOG_TAG_2, TEST_MESSAGE_3, new RuntimeException());
String s = lw.toString();
assertFalse(s.contains("RuntimeException"));
assertFalse(s.contains(".java"));
assertTrue(s.contains(TEST_LOG_TAG_1));
assertFalse(s.contains(TEST_LOG_TAG_2));
assertFalse(s.contains(TEST_MESSAGE_1));
assertTrue(s.contains(TEST_MESSAGE_2));
assertFalse(s.contains(TEST_MESSAGE_3));
}
@Test
public void testSingleTagLogWriter() {
final String SINGLE_TAG = "XXX";
StringLogWriter lw = new StringLogWriter();
Logger.startLoggingTo(new SimpleTagLogWriter(SINGLE_TAG, lw));
Logger.error(TEST_LOG_TAG_1, TEST_MESSAGE_1);
Logger.warn(TEST_LOG_TAG_2, TEST_MESSAGE_2);
String s = lw.toString();
for (String line : s.split("\n")) {
assertTrue(line.startsWith(SINGLE_TAG));
}
assertTrue(s.startsWith(SINGLE_TAG + " :: E :: " + TEST_LOG_TAG_1));
}
@Test
public void testLevelFilteringLogWriter() {
StringLogWriter lw = new StringLogWriter();
assertFalse(new LevelFilteringLogWriter(Log.WARN, lw).shouldLogVerbose(TEST_LOG_TAG_1));
assertTrue(new LevelFilteringLogWriter(Log.VERBOSE, lw).shouldLogVerbose(TEST_LOG_TAG_1));
Logger.startLoggingTo(new LevelFilteringLogWriter(Log.WARN, lw));
Logger.error(TEST_LOG_TAG_1, TEST_MESSAGE_2);
Logger.warn(TEST_LOG_TAG_1, TEST_MESSAGE_2);
Logger.info(TEST_LOG_TAG_1, TEST_MESSAGE_2);
Logger.debug(TEST_LOG_TAG_1, TEST_MESSAGE_2);
Logger.trace(TEST_LOG_TAG_1, TEST_MESSAGE_2);
String s = lw.toString();
assertTrue(s.contains(PrintLogWriter.ERROR));
assertTrue(s.contains(PrintLogWriter.WARN));
assertFalse(s.contains(PrintLogWriter.INFO));
assertFalse(s.contains(PrintLogWriter.DEBUG));
assertFalse(s.contains(PrintLogWriter.VERBOSE));
}
@Test
public void testThreadLocalLogWriter() throws InterruptedException {
final InheritableThreadLocal<String> logTag = new InheritableThreadLocal<String>() {
@Override
protected String initialValue() {
return "PARENT";
}
};
final StringLogWriter stringLogWriter = new StringLogWriter();
final LogWriter logWriter = new ThreadLocalTagLogWriter(logTag, stringLogWriter);
try {
Logger.startLoggingTo(logWriter);
Logger.info("parent tag before", "parent message before");
int threads = 3;
final CountDownLatch latch = new CountDownLatch(threads);
for (int thread = 0; thread < threads; thread++) {
final int threadNumber = thread;
new Thread(new Runnable() {
@Override
public void run() {
try {
logTag.set("CHILD" + threadNumber);
Logger.info("child tag " + threadNumber, "child message " + threadNumber);
} finally {
latch.countDown();
}
}
}).start();
}
latch.await();
Logger.info("parent tag after", "parent message after");
String s = stringLogWriter.toString();
String[] lines = s.split("\n");
assertEquals(5, lines.length);
assertEquals("PARENT :: I :: parent tag before :: parent message before", lines[0]);
assertEquals("PARENT :: I :: parent tag after :: parent message after", lines[4]);
for (int thread = 0; thread < threads; thread++) {
assertTrue(s.contains("CHILD" + thread + " :: I :: child tag " + thread + " :: child message " + thread));
}
} finally {
Logger.stopLoggingTo(logWriter);
}
}
}