@ -44,12 +44,16 @@
package org.eclipse.jgit.nls ;
package org.eclipse.jgit.nls ;
import static org.junit.Assert.assertEquals ;
import static org.junit.Assert.assertEquals ;
import static org.junit.Assert.assertNull ;
import static org.junit.Assert.assertSame ;
import static org.junit.Assert.assertSame ;
import java.util.Locale ;
import java.util.Locale ;
import java.util.concurrent.BrokenBarrierException ;
import java.util.concurrent.Callable ;
import java.util.concurrent.CyclicBarrier ;
import java.util.concurrent.CyclicBarrier ;
import java.util.concurrent.ExecutionException ;
import java.util.concurrent.ExecutorService ;
import java.util.concurrent.Executors ;
import java.util.concurrent.Future ;
import java.util.concurrent.TimeUnit ;
import org.junit.Test ;
import org.junit.Test ;
@ -106,43 +110,37 @@ public class NLSTest {
}
}
@Test
@Test
public void testParallelThreadsWithDifferentLocales ( ) throws InterruptedException {
public void testParallelThreadsWithDifferentLocales ( )
throws InterruptedException , ExecutionException {
final CyclicBarrier barrier = new CyclicBarrier ( 2 ) ;
final CyclicBarrier barrier = new CyclicBarrier ( 2 ) ;
class T extends Thread {
class GetBundle implements Callable < TranslationBundle > {
Locale locale ;
GermanTranslatedBundle bundle ;
private Locale locale ;
Exception e ;
T ( Locale locale ) {
GetBundle ( Locale locale ) {
this . locale = locale ;
this . locale = locale ;
}
}
@Override
public TranslationBundle call ( ) throws Exception {
public void run ( ) {
try {
NLS . setLocale ( locale ) ;
NLS . setLocale ( locale ) ;
barrier . await ( ) ; // wait for the other thread to set its locale
barrier . await ( ) ; // wait for the other thread to set its locale
bundle = GermanTranslatedBundle . get ( ) ;
return GermanTranslatedBundle . get ( ) ;
} catch ( InterruptedException e ) {
this . e = e ;
} catch ( BrokenBarrierException e ) {
this . e = e ;
}
}
}
}
}
T t1 = new T ( NLS . ROOT_LOCALE ) ;
ExecutorService pool = Executors . newFixedThreadPool ( 2 ) ;
T t2 = new T ( Locale . GERMAN ) ;
try {
t1 . start ( ) ;
Future < TranslationBundle > root = pool . submit ( new GetBundle (
t2 . start ( ) ;
NLS . ROOT_LOCALE ) ) ;
t1 . join ( ) ;
Future < TranslationBundle > german = pool . submit ( new GetBundle (
t2 . join ( ) ;
Locale . GERMAN ) ) ;
assertEquals ( NLS . ROOT_LOCALE , root . get ( ) . effectiveLocale ( ) ) ;
assertNull ( "t1 was interrupted or barrier was broken" , t1 . e ) ;
assertEquals ( Locale . GERMAN , german . get ( ) . effectiveLocale ( ) ) ;
assertNull ( "t2 was interrupted or barrier was broken" , t2 . e ) ;
} finally {
assertEquals ( NLS . ROOT_LOCALE , t1 . bundle . effectiveLocale ( ) ) ;
pool . shutdown ( ) ;
assertEquals ( Locale . GERMAN , t2 . bundle . effectiveLocale ( ) ) ;
pool . awaitTermination ( Long . MAX_VALUE , TimeUnit . SECONDS ) ;
}
}
}
}
}