package org.marketcetera.util.log;
import java.util.Locale;
import java.util.concurrent.Callable;
import org.junit.Before;
import org.junit.Test;
import org.marketcetera.util.test.TestCaseBase;
import static org.junit.Assert.*;
/**
* @author tlerios@marketcetera.com
* @since 0.6.0
* @version $Id: ActiveLocaleTest.java 16154 2012-07-14 16:34:05Z colin $
*/
/* $License$ */
public class ActiveLocaleTest
extends TestCaseBase
{
private static final Locale DEFAULT_LOCALE=
Locale.getDefault();
private static class LocaleHolder
{
private Locale mBeforeActiveLocale;
private Locale mAfterActiveLocale;
Locale getBeforeActiveLocale()
{
return mBeforeActiveLocale;
}
Locale getAfterActiveLocale()
{
return mAfterActiveLocale;
}
protected void setBeforeActiveLocale()
{
mBeforeActiveLocale=ActiveLocale.getLocale();
}
protected void setAfterActiveLocale()
{
mAfterActiveLocale=ActiveLocale.getLocale();
}
}
private static final class RunnableBase
extends LocaleHolder
implements Runnable
{
private Locale mSetLocale;
RunnableBase
(Locale setLocale)
{
mSetLocale=setLocale;
}
@Override
public void run()
{
setBeforeActiveLocale();
ActiveLocale.setThreadLocale(mSetLocale);
setAfterActiveLocale();
}
}
private static final class CallableBase
extends LocaleHolder
implements Callable<Integer>
{
private Locale mSetLocale;
CallableBase
(Locale setLocale)
{
mSetLocale=setLocale;
}
@Override
public Integer call()
{
setBeforeActiveLocale();
ActiveLocale.setThreadLocale(mSetLocale);
setAfterActiveLocale();
return 1;
}
}
private static final class RunnableProxy
extends LocaleHolder
implements Runnable
{
private Locale mSelfSetLocale;
private Locale mRunnableBaseSetLocale;
private RunnableBase mRunnableBase;
RunnableProxy
(Locale selfSetLocale,
Locale runnableBaseSetLocale)
{
mSelfSetLocale=selfSetLocale;
mRunnableBaseSetLocale=runnableBaseSetLocale;
}
RunnableBase getRunnableBase()
{
return mRunnableBase;
}
@Override
public void run()
{
setBeforeActiveLocale();
mRunnableBase=new RunnableBase(mRunnableBaseSetLocale);
ActiveLocale.runWithLocale(getRunnableBase(),mSelfSetLocale);
setAfterActiveLocale();
}
}
private static final class CallableProxy
extends LocaleHolder
implements Callable<Integer>
{
private Locale mSelfSetLocale;
private Locale mCallableBaseSetLocale;
private CallableBase mCallableBase;
CallableProxy
(Locale selfSetLocale,
Locale callableBaseSetLocale)
{
mSelfSetLocale=selfSetLocale;
mCallableBaseSetLocale=callableBaseSetLocale;
}
CallableBase getCallableBase()
{
return mCallableBase;
}
@Override
public Integer call()
throws Exception
{
setBeforeActiveLocale();
mCallableBase=new CallableBase(mCallableBaseSetLocale);
int result=
ActiveLocale.runWithLocale(getCallableBase(),mSelfSetLocale);
setAfterActiveLocale();
return result+2;
}
}
private static class LocaleHolderThread
extends Thread
{
private Locale mBeforeActiveLocale;
private Locale mAfterActiveLocale;
Locale getBeforeActiveLocale()
{
return mBeforeActiveLocale;
}
Locale getAfterActiveLocale()
{
return mAfterActiveLocale;
}
protected void setBeforeActiveLocale()
{
mBeforeActiveLocale=ActiveLocale.getLocale();
}
protected void setAfterActiveLocale()
{
mAfterActiveLocale=ActiveLocale.getLocale();
}
}
private static final class SimpleChildThread
extends LocaleHolderThread
{
private Locale mSetLocale;
SimpleChildThread
(Locale setLocale)
{
mSetLocale=setLocale;
}
@Override
public void run()
{
setBeforeActiveLocale();
ActiveLocale.setThreadLocale(mSetLocale);
setAfterActiveLocale();
}
}
private static final class SimpleChildThreadProxy
extends LocaleHolder
implements Runnable
{
private Locale mSetLocale;
private SimpleChildThread mSimpleChildThread;
SimpleChildThreadProxy
(Locale setLocale)
{
mSetLocale=setLocale;
}
SimpleChildThread getSimpleChildThread()
{
return mSimpleChildThread;
}
@Override
public void run()
{
setBeforeActiveLocale();
mSimpleChildThread=new SimpleChildThread(mSetLocale);
getSimpleChildThread().start();
try {
getSimpleChildThread().join();
} catch (InterruptedException ex) {
fail();
}
setAfterActiveLocale();
}
}
private static final class ComplexChildThread
extends LocaleHolderThread
{
private Locale mSelfSetLocale;
private Locale mRunnableBaseSetLocale;
private RunnableBase mRunnableBase;
ComplexChildThread
(Locale selfSetLocale,
Locale runnableBaseSetLocale)
{
mSelfSetLocale=selfSetLocale;
mRunnableBaseSetLocale=runnableBaseSetLocale;
}
RunnableBase getRunnableBase()
{
return mRunnableBase;
}
@Override
public void run()
{
setBeforeActiveLocale();
mRunnableBase=new RunnableBase(mRunnableBaseSetLocale);
ActiveLocale.runWithLocale(getRunnableBase(),mSelfSetLocale);
setAfterActiveLocale();
}
}
private static final class ComplexChildThreadProxy
extends LocaleHolder
implements Runnable
{
private Locale mSelfSetLocale;
private Locale mRunnableBaseSetLocale;
private ComplexChildThread mComplexChildThread;
ComplexChildThreadProxy
(Locale selfSetLocale,
Locale runnableBaseSetLocale)
{
mSelfSetLocale=selfSetLocale;
mRunnableBaseSetLocale=runnableBaseSetLocale;
}
ComplexChildThread getComplexChildThread()
{
return mComplexChildThread;
}
@Override
public void run()
{
setBeforeActiveLocale();
mComplexChildThread=new ComplexChildThread
(mSelfSetLocale,mRunnableBaseSetLocale);
getComplexChildThread().start();
try {
getComplexChildThread().join();
} catch (InterruptedException ex) {
fail();
}
setAfterActiveLocale();
}
}
private static void checkBasics
(Locale processLocale,
Locale activeLocale)
{
assertEquals(processLocale,ActiveLocale.getProcessLocale());
assertEquals(activeLocale,ActiveLocale.getLocale());
}
private static void checkRunnableSingle
(Locale processLocale,
Locale activeLocale,
Locale blockSetLocale,
Locale blockGetLocale,
Locale proxySetLocale,
Locale runnableGetBeforeLocale,
Locale runnableSetLocale,
Locale runnableGetAfterLocale)
{
RunnableProxy p=new RunnableProxy(proxySetLocale,runnableSetLocale);
ActiveLocale.runWithLocale(p,blockSetLocale);
checkBasics(processLocale,activeLocale);
assertEquals(blockGetLocale,p.getBeforeActiveLocale());
assertEquals(blockGetLocale,p.getAfterActiveLocale());
assertEquals(runnableGetBeforeLocale,
p.getRunnableBase().getBeforeActiveLocale());
assertEquals(runnableGetAfterLocale,
p.getRunnableBase().getAfterActiveLocale());
}
private static void checkRunnableAll
(Locale processLocale,
Locale activeLocale)
{
checkRunnableSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
Locale.JAPANESE,Locale.JAPANESE,
Locale.ITALIAN,Locale.ITALIAN);
checkRunnableSingle(processLocale,activeLocale,
null,activeLocale,
Locale.JAPANESE,Locale.JAPANESE,
Locale.ITALIAN,Locale.ITALIAN);
checkRunnableSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
null,Locale.KOREAN,
Locale.ITALIAN,Locale.ITALIAN);
checkRunnableSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
Locale.JAPANESE,Locale.JAPANESE,
null,Locale.KOREAN);
checkRunnableSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
null,Locale.KOREAN,
null,Locale.KOREAN);
checkRunnableSingle(processLocale,activeLocale,
null,activeLocale,
Locale.JAPANESE,Locale.JAPANESE,
null,activeLocale);
checkRunnableSingle(processLocale,activeLocale,
null,activeLocale,
null,activeLocale,
Locale.ITALIAN,Locale.ITALIAN);
checkRunnableSingle(processLocale,activeLocale,
null,activeLocale,
null,activeLocale,
null,activeLocale);
}
private static void checkCallableSingle
(Locale processLocale,
Locale activeLocale,
Locale blockSetLocale,
Locale blockGetLocale,
Locale proxySetLocale,
Locale callableGetBeforeLocale,
Locale callableSetLocale,
Locale callableGetAfterLocale)
throws Exception
{
CallableProxy p=new CallableProxy(proxySetLocale,callableSetLocale);
assertEquals(3,ActiveLocale.runWithLocale(p,blockSetLocale).intValue());
checkBasics(processLocale,activeLocale);
assertEquals(blockGetLocale,p.getBeforeActiveLocale());
assertEquals(blockGetLocale,p.getAfterActiveLocale());
assertEquals(callableGetBeforeLocale,
p.getCallableBase().getBeforeActiveLocale());
assertEquals(callableGetAfterLocale,
p.getCallableBase().getAfterActiveLocale());
}
private static void checkCallableAll
(Locale processLocale,
Locale activeLocale)
throws Exception
{
checkCallableSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
Locale.JAPANESE,Locale.JAPANESE,
Locale.ITALIAN,Locale.ITALIAN);
checkCallableSingle(processLocale,activeLocale,
null,activeLocale,
Locale.JAPANESE,Locale.JAPANESE,
Locale.ITALIAN,Locale.ITALIAN);
checkCallableSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
null,Locale.KOREAN,
Locale.ITALIAN,Locale.ITALIAN);
checkCallableSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
Locale.JAPANESE,Locale.JAPANESE,
null,Locale.KOREAN);
checkCallableSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
null,Locale.KOREAN,
null,Locale.KOREAN);
checkCallableSingle(processLocale,activeLocale,
null,activeLocale,
Locale.JAPANESE,Locale.JAPANESE,
null,activeLocale);
checkCallableSingle(processLocale,activeLocale,
null,activeLocale,
null,activeLocale,
Locale.ITALIAN,Locale.ITALIAN);
checkCallableSingle(processLocale,activeLocale,
null,activeLocale,
null,activeLocale,
null,activeLocale);
}
private static void checkSimpleChildSingle
(Locale processLocale,
Locale activeLocale,
Locale setLocale,
Locale getLocale)
throws Exception
{
SimpleChildThread t=new SimpleChildThread(setLocale);
t.start();
t.join();
checkBasics(processLocale,activeLocale);
assertEquals(activeLocale,t.getBeforeActiveLocale());
assertEquals(getLocale,t.getAfterActiveLocale());
}
private static void checkSimpleChildAll
(Locale processLocale,
Locale activeLocale)
throws Exception
{
Locale threadLocale=
((processLocale==null)?DEFAULT_LOCALE:processLocale);
checkSimpleChildSingle(processLocale,activeLocale,
Locale.ITALIAN,Locale.ITALIAN);
checkSimpleChildSingle(processLocale,activeLocale,
null,threadLocale);
}
private static void checkSimpleChildFromStackSingle
(Locale processLocale,
Locale activeLocale,
Locale blockSetLocale,
Locale blockGetLocale,
Locale childSetLocale,
Locale childGetAfterLocale)
{
SimpleChildThreadProxy p=new SimpleChildThreadProxy(childSetLocale);
ActiveLocale.runWithLocale(p,blockSetLocale);
checkBasics(processLocale,activeLocale);
assertEquals(blockGetLocale,p.getBeforeActiveLocale());
assertEquals(blockGetLocale,p.getAfterActiveLocale());
assertEquals(blockGetLocale,
p.getSimpleChildThread().getBeforeActiveLocale());
assertEquals(childGetAfterLocale,
p.getSimpleChildThread().getAfterActiveLocale());
}
private static void checkSimpleChildFromStackAll
(Locale processLocale,
Locale activeLocale)
{
Locale threadLocale=
((processLocale==null)?DEFAULT_LOCALE:processLocale);
checkSimpleChildFromStackSingle
(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
Locale.ITALIAN,Locale.ITALIAN);
checkSimpleChildFromStackSingle
(processLocale,activeLocale,
null,activeLocale,
Locale.ITALIAN,Locale.ITALIAN);
checkSimpleChildFromStackSingle
(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
null,threadLocale);
checkSimpleChildFromStackSingle
(processLocale,activeLocale,
null,activeLocale,
null,threadLocale);
}
private static void checkComplexChildSingle
(Locale processLocale,
Locale activeLocale,
Locale blockSetLocale,
Locale blockGetLocale,
Locale proxySetLocale,
Locale runnableGetBeforeLocale,
Locale runnableSetLocale,
Locale runnableGetAfterLocale)
{
ComplexChildThreadProxy p=new ComplexChildThreadProxy
(proxySetLocale,runnableSetLocale);
ActiveLocale.runWithLocale(p,blockSetLocale);
checkBasics(processLocale,activeLocale);
assertEquals(blockGetLocale,p.getBeforeActiveLocale());
assertEquals(blockGetLocale,p.getAfterActiveLocale());
assertEquals(blockGetLocale,
p.getComplexChildThread().getBeforeActiveLocale());
assertEquals(blockGetLocale,
p.getComplexChildThread().getAfterActiveLocale());
assertEquals(runnableGetBeforeLocale,
p.getComplexChildThread().getRunnableBase().
getBeforeActiveLocale());
assertEquals(runnableGetAfterLocale,
p.getComplexChildThread().getRunnableBase().
getAfterActiveLocale());
}
private static void checkComplexChildAll
(Locale processLocale,
Locale activeLocale)
{
checkComplexChildSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
Locale.JAPANESE,Locale.JAPANESE,
Locale.ITALIAN,Locale.ITALIAN);
checkComplexChildSingle(processLocale,activeLocale,
null,activeLocale,
Locale.JAPANESE,Locale.JAPANESE,
Locale.ITALIAN,Locale.ITALIAN);
checkComplexChildSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
null,Locale.KOREAN,
Locale.ITALIAN,Locale.ITALIAN);
checkComplexChildSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
Locale.JAPANESE,Locale.JAPANESE,
null,Locale.KOREAN);
checkComplexChildSingle(processLocale,activeLocale,
null,activeLocale,
null,activeLocale,
Locale.ITALIAN,Locale.ITALIAN);
checkComplexChildSingle(processLocale,activeLocale,
Locale.KOREAN,Locale.KOREAN,
null,Locale.KOREAN,
null,Locale.KOREAN);
checkComplexChildSingle(processLocale,activeLocale,
null,activeLocale,
Locale.JAPANESE,Locale.JAPANESE,
null,activeLocale);
checkComplexChildSingle(processLocale,activeLocale,
null,activeLocale,
null,activeLocale,
null,activeLocale);
}
@Before
public void setupActiveLocaleTest()
{
ActiveLocale.clear();
}
@Test
public void basics()
{
checkBasics(null,DEFAULT_LOCALE);
ActiveLocale.setProcessLocale(Locale.FRENCH);
checkBasics(Locale.FRENCH,Locale.FRENCH);
ActiveLocale.setThreadLocale(Locale.GERMAN);
checkBasics(Locale.FRENCH,Locale.GERMAN);
ActiveLocale.setProcessLocale(null);
checkBasics(null,Locale.GERMAN);
ActiveLocale.setThreadLocale(null);
checkBasics(null,DEFAULT_LOCALE);
ActiveLocale.setProcessLocale(Locale.FRENCH);
checkBasics(Locale.FRENCH,Locale.FRENCH);
ActiveLocale.pushLocale(Locale.GERMAN);
checkBasics(Locale.FRENCH,Locale.GERMAN);
ActiveLocale.pushLocale(Locale.KOREAN);
checkBasics(Locale.FRENCH,Locale.KOREAN);
ActiveLocale.pushLocale(Locale.JAPANESE);
checkBasics(Locale.FRENCH,Locale.JAPANESE);
ActiveLocale.setThreadLocale(Locale.ITALIAN);
checkBasics(Locale.FRENCH,Locale.ITALIAN);
ActiveLocale.setThreadLocale(null);
checkBasics(Locale.FRENCH,Locale.KOREAN);
ActiveLocale.popLocale();
checkBasics(Locale.FRENCH,Locale.KOREAN);
ActiveLocale.popLocale();
checkBasics(Locale.FRENCH,Locale.GERMAN);
ActiveLocale.popLocale();
checkBasics(Locale.FRENCH,Locale.FRENCH);
ActiveLocale.setProcessLocale(null);
checkBasics(null,DEFAULT_LOCALE);
}
@Test
public void runnable()
{
checkRunnableAll(null,DEFAULT_LOCALE);
ActiveLocale.setProcessLocale(Locale.FRENCH);
checkRunnableAll(Locale.FRENCH,Locale.FRENCH);
ActiveLocale.setThreadLocale(Locale.GERMAN);
checkRunnableAll(Locale.FRENCH,Locale.GERMAN);
ActiveLocale.setProcessLocale(null);
checkRunnableAll(null,Locale.GERMAN);
}
@Test
public void callable()
throws Exception
{
checkCallableAll(null,DEFAULT_LOCALE);
ActiveLocale.setProcessLocale(Locale.FRENCH);
checkCallableAll(Locale.FRENCH,Locale.FRENCH);
ActiveLocale.setThreadLocale(Locale.GERMAN);
checkCallableAll(Locale.FRENCH,Locale.GERMAN);
ActiveLocale.setProcessLocale(null);
checkCallableAll(null,Locale.GERMAN);
}
@Test
public void simpleChild()
throws Exception
{
checkSimpleChildAll(null,DEFAULT_LOCALE);
ActiveLocale.setProcessLocale(Locale.FRENCH);
checkSimpleChildAll(Locale.FRENCH,Locale.FRENCH);
ActiveLocale.setThreadLocale(Locale.GERMAN);
checkSimpleChildAll(Locale.FRENCH,Locale.GERMAN);
ActiveLocale.setProcessLocale(null);
checkSimpleChildAll(null,Locale.GERMAN);
}
@Test
public void simpleChildFromStack()
{
checkSimpleChildFromStackAll(null,DEFAULT_LOCALE);
ActiveLocale.setProcessLocale(Locale.FRENCH);
checkSimpleChildFromStackAll(Locale.FRENCH,Locale.FRENCH);
ActiveLocale.setThreadLocale(Locale.GERMAN);
checkSimpleChildFromStackAll(Locale.FRENCH,Locale.GERMAN);
ActiveLocale.setProcessLocale(null);
checkSimpleChildFromStackAll(null,Locale.GERMAN);
}
@Test
public void complexChild()
{
checkComplexChildAll(null,DEFAULT_LOCALE);
ActiveLocale.setProcessLocale(Locale.FRENCH);
checkComplexChildAll(Locale.FRENCH,Locale.FRENCH);
ActiveLocale.setThreadLocale(Locale.GERMAN);
checkComplexChildAll(Locale.FRENCH,Locale.GERMAN);
ActiveLocale.setProcessLocale(null);
checkComplexChildAll(null,Locale.GERMAN);
}
}