package org.marketcetera.util.log; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import java.util.Locale; import java.util.Properties; import org.apache.commons.lang.SerializationException; import org.apache.commons.lang.SerializationUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Level; import org.apache.log4j.spi.LoggingEvent; import org.junit.Before; import org.junit.Test; import org.marketcetera.util.test.TestCaseBase; import static org.junit.Assert.*; import static org.marketcetera.util.test.EqualityAssert.*; import static org.marketcetera.util.test.SerializableAssert.*; /** * @author tlerios@marketcetera.com * @since 0.5.0 * @version $Id: I18NMessageProviderTest.java 16154 2012-07-14 16:34:05Z colin $ */ /* $License$ */ public class I18NMessageProviderTest extends TestCaseBase { private static final String TEST_CATEGORY= I18NMessageProvider.class.getName(); private static final String TEST_LOCATION= TEST_CATEGORY; private static final String TEST_MEM_PROVIDER= "classloader_prv"; @Before public void setupI18NMessageProviderTest() { ActiveLocale.setProcessLocale(Locale.ROOT); setLevel(TEST_CATEGORY,Level.ERROR); } @Test public void idIsValid() { assertEquals("a",(new I18NMessageProvider("a")).getProviderId()); } @Test public void equality() { assertEquality(new I18NMessageProvider("a"), new I18NMessageProvider("a"), new I18NMessageProvider("b")); assertSerializable(TestMessages.PROVIDER); } @Test public void deserialization() { byte[] serialized=SerializationUtils.serialize (new I18NMessageProvider("nonexistent_prv")); try { SerializationUtils.deserialize(serialized); fail(); } catch (SerializationException ex) { assertEquals(IOException.class,ex.getCause().getClass()); } } @Test public void retrievals() { assertEquals ("Hello",TestMessages.PROVIDER. getText(TestMessages.HELLO_MSG)); assertEquals ("Hello World!",TestMessages.PROVIDER. getText(TestMessages.HELLO_TITLE,"World")); assertEquals ("Bonjour",TestMessages.PROVIDER. getText(Locale.FRENCH,TestMessages.HELLO_MSG)); assertEquals ("Bonjour Le Monde!",TestMessages.PROVIDER. getText(Locale.FRENCH,TestMessages.HELLO_TITLE,"Le Monde")); Locale saved=Locale.getDefault(); try { Locale.setDefault(Locale.ROOT); assertEquals ("Hello",TestMessages.PROVIDER. getText(Locale.GERMAN,TestMessages.HELLO_MSG)); Locale.setDefault(Locale.JAPANESE); assertEquals ("Hello",TestMessages.PROVIDER. getText(Locale.GERMAN,TestMessages.HELLO_MSG)); Locale.setDefault(Locale.FRENCH); assertEquals ("Bonjour",TestMessages.PROVIDER. getText(Locale.GERMAN,TestMessages.HELLO_MSG)); } finally { Locale.setDefault(saved); } assertEquals ("Hello a {0} 'a' \"a\" b!",TestMessages.PROVIDER. getText(TestMessages.HELLO_ECHO,"a","b")); assertEquals ("Bonjour a {0} 'a' \"a\" {1}!",TestMessages.PROVIDER. getText(Locale.FRENCH,TestMessages.HELLO_ECHO,"a")); assertEquals ("Bonjour a {0} 'a' \"a\" b!",TestMessages.PROVIDER. getText(Locale.FRENCH,TestMessages.HELLO_ECHO,"a","b","c")); assertEquals ("There are no orders ma'am.",TestMessages.PROVIDER. getText(TestMessages.CHOICE_MSG,0)); assertEquals ("There is just one order ma'am.",TestMessages.PROVIDER. getText(TestMessages.CHOICE_MSG,1)); assertEquals ("There are 2 orders ma'am.",TestMessages.PROVIDER. getText(TestMessages.CHOICE_MSG,2)); assertEquals ("Pas des ordres ma'am.",TestMessages.PROVIDER. getText(Locale.FRENCH,TestMessages.CHOICE_MSG,0)); assertEquals ("Seulemont un ordre ma'am.",TestMessages.PROVIDER. getText(Locale.FRENCH,TestMessages.CHOICE_MSG,1)); assertEquals ("Il y a 2 ordres ma'am.",TestMessages.PROVIDER. getText(Locale.FRENCH,TestMessages.CHOICE_MSG,2)); assertEquals ("Hello {0}!",TestMessages.PROVIDER. getText(TestMessages.HELLO_TITLE,(Object[])null)); assertEquals ("Hello null!",TestMessages.PROVIDER. getText(TestMessages.HELLO_TITLE,(Object)null)); ActiveLocale.setProcessLocale(Locale.FRENCH); assertEquals ("Bonjour",TestMessages.PROVIDER. getText(TestMessages.HELLO_MSG)); assertEquals ("Bonjour Le Monde!",TestMessages.PROVIDER. getText(TestMessages.HELLO_TITLE,"Le Monde")); } @Test public void nonexistentMappingFile() { I18NMessageProvider provider=new I18NMessageProvider("nonexistent_prv"); Iterator<LoggingEvent> events=getAppender().getEvents().iterator(); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Message file missing: provider 'nonexistent_prv'; base name "+ "'nonexistent_prv"+I18NMessageProvider.MESSAGE_FILE_EXTENSION+"'", TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Abnormal exception: stack trace",TEST_LOCATION); assertFalse(events.hasNext()); getAppender().clear(); assertEquals ("provider 'nonexistent_prv'; id 'nonexistent_msg'; entry 'msg'; "+ "parameters ()", provider.getText(TestMessages.NONEXISTENT)); assertSingleEvent (Level.ERROR,TEST_CATEGORY, "Message not found: "+ "provider 'nonexistent_prv'; id 'nonexistent_msg'; entry 'msg'; "+ "parameters ()",TEST_LOCATION); } @Test public void nonexistentMessage() { assertEquals ("provider 'util_log_test'; id 'nonexistent_msg'; entry 'msg'; "+ "parameters ('a')", TestMessages.PROVIDER.getText(TestMessages.NONEXISTENT,"a")); assertSingleEvent (Level.ERROR,TEST_CATEGORY, "Message not found: provider 'util_log_test'; "+ "id 'nonexistent_msg'; "+ "entry 'msg'; parameters ('a')",TEST_LOCATION); ActiveLocale.setProcessLocale(Locale.FRENCH); assertEquals ("provider 'util_log_test'; id 'nonexistent_msg'; entry 'msg'; "+ "parameters ('a')", TestMessages.PROVIDER.getText(TestMessages.NONEXISTENT,"a")); assertSingleEvent (Level.ERROR,TEST_CATEGORY, "Message n'a pas \u00E9t\u00E9 trouv\u00E9e: fournisseur "+ "'util_log_test'; "+ "identit\u00E9 'nonexistent_msg'; entr\u00E9e 'msg'; "+ "param\u00E8tres ('a')",TEST_LOCATION); } @Test public void customClassLoader() throws Exception { // Verify that the resource is not available. I18NMessageProvider provider=new I18NMessageProvider(TEST_MEM_PROVIDER); Iterator<LoggingEvent> events=getAppender().getEvents().iterator(); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Message file missing: provider '"+TEST_MEM_PROVIDER+ "'; base name '"+TEST_MEM_PROVIDER+ I18NMessageProvider.MESSAGE_FILE_EXTENSION+"'",TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Abnormal exception: stack trace",TEST_LOCATION); assertFalse(events.hasNext()); getAppender().clear(); // Create a provider with a custom classloader. Properties messages=new Properties(); messages.put("hello.msg","Hello"); messages.put("hello.title","Hello {0}!"); ByteArrayOutputStream output=new ByteArrayOutputStream(); try { messages.store(output,StringUtils.EMPTY); } finally { output.close(); } final byte[] inputStream=output.toByteArray(); final String propertiesName=TEST_MEM_PROVIDER+ I18NMessageProvider.MESSAGE_FILE_EXTENSION+".properties"; provider=new I18NMessageProvider(TEST_MEM_PROVIDER,new ClassLoader() { @Override public InputStream getResourceAsStream (String name) { if (propertiesName.equals(name)) { return new ByteArrayInputStream(inputStream); } return super.getResourceAsStream(name); } }); assertNoEvents(); // Messages can now be translated. I18NLoggerProxy logger=new I18NLoggerProxy(provider); I18NMessage0P helloMsg=new I18NMessage0P(logger,"hello"); I18NMessage1P helloTitle=new I18NMessage1P(logger,"hello","title"); Locale saved=Locale.getDefault(); try { Locale.setDefault(Locale.ROOT); assertEquals("Hello",provider.getText(helloMsg)); assertEquals("Hello World!",provider.getText(helloTitle,"World")); } finally { Locale.setDefault(saved); } } /* * EXTREME TEST 1: run alone (no other tests in the same file, * and no other units test) after uncommenting sections in main * class. @Test public void nonexistentSystemMappingFile() { assertEquals ("provider 'util_log_test'; id 'nonexistent_msg'; entry 'msg'; "+ "parameters ('a')", TestMessages.PROVIDER.getText(TestMessages.NONEXISTENT,"a")); Iterator<LoggingEvent> events=getAppender().getEvents().iterator(); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Message file missing: provider 'util_log_test'; "+ "base name 'util_log_test_message'",TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Abnormal exception: stack trace",TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Message file missing: provider 'util_log'; "+ "base name 'util_log_message'",TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Abnormal exception: stack trace",TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Corrupted/unavailable message map",TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Message missing: provider 'util_log_test'; "+ "id 'nonexistent_msg'; "+ "entry 'msg'; parameters ('a')",TEST_LOCATION); assertFalse(events.hasNext()); } */ /* * EXTREME TEST 2: run alone (no other tests in the same file, * and no other units test) after uncommenting sections in main * class. @Test public void exceptionThrown() { assertEquals ("provider 'util_log_test'; id 'nonexistent_msg'; entry 'msg'; "+ "parameters ('a')", TestMessages.PROVIDER.getText(TestMessages.NONEXISTENT,"a")); Iterator<LoggingEvent> events=getAppender().getEvents().iterator(); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Corrupted/unavailable message map",TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Abnormal exception: stack trace",TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Abnormal exception: provider 'util_log_test'; "+ "id 'nonexistent_msg'; "+ "entry 'msg'; parameters ('a')",TEST_LOCATION); assertEvent (events.next(),Level.ERROR,TEST_CATEGORY, "Abnormal exception: stack trace",TEST_LOCATION); assertFalse(events.hasNext()); } */ }