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());
}
*/
}