package net.i2p.util; /* * free (adj.): unencumbered; not under the control of others * Written by jrandom in 2003 and released into the public domain * with no warranty of any kind, either expressed or implied. * It probably won't make your computer catch on fire, or eat * your children, but it might. Use at your own risk. * */ import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; import java.util.Properties; import junit.framework.TestCase; import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; /** * @author Comwiz */ public class LogSettingsTest extends TestCase { private Properties p; private Log log; private I2PAppContext _context; private File f; private String origMinimumOnScreenLevel; private String origLogSettings; /** * Sets up the test fixture. * * Called before every test case method. */ protected void setUp() throws IOException { _context = I2PAppContext.getGlobalContext(); log = _context.logManager().getLog(LogSettingsTest.class); p = new Properties(); f = new File("logger.config"); if(!f.exists()){ FileWriter temp = new FileWriter(f); temp.close(); } DataHelper.loadProps(p, f); origMinimumOnScreenLevel = p.getProperty("logger.record.net.i2p.util.LogSettingsTest", Log.STR_ERROR); origLogSettings = p.getProperty("logger.minimumOnScreenLevel", Log.STR_CRIT); } protected void tearDown() throws IOException{ p.setProperty("logger.record.net.i2p.util.LogSettingsTest", origMinimumOnScreenLevel); p.setProperty("logger.minimumOnScreenLevel", origLogSettings); DataHelper.storeProps(p, f); System.gc(); } public void testDebug() throws IOException { p.setProperty("logger.record.net.i2p.util.LogSettingsTest", Log.toLevelString(Log.DEBUG)); p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG)); DataHelper.storeProps(p, f); _context.logManager().rereadConfig(); PipedInputStream pin = new PipedInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(pin)); PrintStream systemOut = System.out; PrintStream pout = new PrintStream(new PipedOutputStream(pin)); System.setOut(pout); try { log.debug("DEBUG" + ": debug"); log.info("DEBUG" + ": info"); log.warn("DEBUG" + ": warn"); log.error("DEBUG" + ": error"); log.log(Log.CRIT, "DEBUG" + ": crit"); _context.logManager().flush(); // Wait for the LogWriter to flush, then write extra stuff so // the test doesn't hang on failure try { Thread.sleep(1000); } catch (InterruptedException ie) {} for (int i = 0; i < 5; i++) pout.println(""); pout.flush(); String l1 = in.readLine(); String l2 = in.readLine(); String l3 = in.readLine(); String l4 = in.readLine(); String l5 = in.readLine(); assertTrue( l1.matches(".*DEBUG: debug") && l2.matches(".*DEBUG: info") && l3.matches(".*DEBUG: warn") && l4.matches(".*DEBUG: error") && l5.matches(".*DEBUG: crit") ); } finally { System.setOut(systemOut); pout.close(); } } public void testInfo() throws IOException { p.setProperty("logger.record.net.i2p.util.LogSettingsTest", Log.toLevelString(Log.INFO)); p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG)); DataHelper.storeProps(p, f); _context.logManager().rereadConfig(); PipedInputStream pin = new PipedInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(pin)); PrintStream systemOut = System.out; PrintStream pout = new PrintStream(new PipedOutputStream(pin)); System.setOut(pout); try { log.debug("INFO" + ": debug"); log.info("INFO" + ": info"); log.warn("INFO" + ": warn"); log.error("INFO" + ": error"); log.log(Log.CRIT, "INFO" + ": crit"); _context.logManager().flush(); // Wait for the LogWriter to flush, then write extra stuff so // the test doesn't hang on failure try { Thread.sleep(1000); } catch (InterruptedException ie) {} for (int i = 0; i < 4; i++) pout.println(""); pout.flush(); String l1 = in.readLine(); String l2 = in.readLine(); String l3 = in.readLine(); String l4 = in.readLine(); assertTrue( l1.matches(".*INFO: info") && l2.matches(".*INFO: warn") && l3.matches(".*INFO: error") && l4.matches(".*INFO: crit") ); } finally { System.setOut(systemOut); pout.close(); } } public void testWarn() throws IOException { p.setProperty("logger.record.net.i2p.util.LogSettingsTest", Log.toLevelString(Log.WARN)); p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG)); DataHelper.storeProps(p, f); _context.logManager().rereadConfig(); PipedInputStream pin = new PipedInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(pin)); PrintStream systemOut = System.out; PrintStream pout = new PrintStream(new PipedOutputStream(pin)); System.setOut(pout); try { log.debug("WARN" + ": debug"); log.info("WARN" + ": info"); log.warn("WARN" + ": warn"); log.error("WARN" + ": error"); log.log(Log.CRIT, "WARN" + ": crit"); _context.logManager().flush(); // Wait for the LogWriter to flush, then write extra stuff so // the test doesn't hang on failure try { Thread.sleep(1000); } catch (InterruptedException ie) {} for (int i = 0; i < 3; i++) pout.println(""); pout.flush(); String l1 = in.readLine(); String l2 = in.readLine(); String l3 = in.readLine(); assertTrue( l1.matches(".*WARN: warn") && l2.matches(".*WARN: error") && l3.matches(".*WARN: crit") ); } finally { System.setOut(systemOut); pout.close(); } } public void testError() throws IOException{ p.setProperty("logger.record.net.i2p.util.LogSettingsTest", Log.toLevelString(Log.ERROR)); p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG)); DataHelper.storeProps(p, f); _context.logManager().rereadConfig(); PipedInputStream pin = new PipedInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(pin)); PrintStream systemOut = System.out; PrintStream pout = new PrintStream(new PipedOutputStream(pin)); System.setOut(pout); try { log.debug("ERROR" + ": debug"); log.info("ERROR" + ": info"); log.warn("ERROR" + ": warn"); log.error("ERROR" + ": error"); log.log(Log.CRIT, "ERROR" + ": crit"); _context.logManager().flush(); // Wait for the LogWriter to flush, then write extra stuff so // the test doesn't hang on failure try { Thread.sleep(1000); } catch (InterruptedException ie) {} for (int i = 0; i < 2; i++) pout.println(""); pout.flush(); String l1 = in.readLine(); String l2 = in.readLine(); assertTrue( l1.matches(".*ERROR: error") && l2.matches(".*ERROR: crit") ); } finally { System.setOut(systemOut); pout.close(); } } public void testCrit() throws IOException { p.setProperty("logger.record.net.i2p.util.LogSettingsTest", Log.toLevelString(Log.CRIT)); p.setProperty("logger.minimumOnScreenLevel", Log.toLevelString(Log.DEBUG)); DataHelper.storeProps(p, f); _context.logManager().rereadConfig(); PipedInputStream pin = new PipedInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(pin)); PrintStream systemOut = System.out; PrintStream pout = new PrintStream(new PipedOutputStream(pin)); System.setOut(pout); try { log.debug("CRIT" + ": debug"); log.info("CRIT" + ": info"); log.warn("CRIT" + ": warn"); log.error("CRIT" + ": error"); log.log(Log.CRIT, "CRIT" + ": crit"); _context.logManager().flush(); // Wait for the LogWriter to flush, then write extra stuff so // the test doesn't hang on failure try { Thread.sleep(1000); } catch (InterruptedException ie) {} pout.println(""); pout.flush(); String l1 = in.readLine(); assertTrue( l1.matches(".*CRIT: crit") ); } finally { System.setOut(systemOut); pout.close(); } } }