package org.bouncycastle.i18n.test; import junit.framework.TestCase; import org.bouncycastle.i18n.LocaleString; import org.bouncycastle.i18n.LocalizedMessage; import org.bouncycastle.i18n.MissingEntryException; import org.bouncycastle.i18n.filter.HTMLFilter; import org.bouncycastle.i18n.filter.TrustedInput; import org.bouncycastle.util.encoders.Hex; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.Date; import java.util.Locale; import java.util.TimeZone; public class LocalizedMessageTest extends TestCase { private static final String TEST_RESOURCE = "org.bouncycastle.i18n.test.I18nTestMessages"; private static final String UTF8_TEST_RESOURCE = "org.bouncycastle.i18n.test.I18nUTF8TestMessages"; /* * test message id's */ private static final String timeTestId = "time"; private static final String argsTestId = "arguments"; private static final String localeTestId = "hello"; private static final String missingTestId = "missing"; private static final String filterTestId = "filter"; private static final String utf8TestId = "utf8"; /* * Test method for 'org.bouncycastle.i18n.LocalizedMessage.getEntry(String, * Locale, TimeZone)' */ public void testGetEntry() { LocalizedMessage msg; // test different locales msg = new LocalizedMessage(TEST_RESOURCE, localeTestId); assertEquals("Hello world.", msg.getEntry("text", Locale.ENGLISH, TimeZone.getDefault())); assertEquals("Hallo Welt.", msg.getEntry("text", Locale.GERMAN, TimeZone.getDefault())); // test arguments Object[] args = new Object[] { "Nobody" }; msg = new LocalizedMessage(TEST_RESOURCE, argsTestId, args); assertEquals("My name is Nobody.", msg.getEntry("text", Locale.ENGLISH, TimeZone.getDefault())); assertEquals("Mein Name ist Nobody.", msg.getEntry("text", Locale.GERMAN, TimeZone.getDefault())); // test timezones // test date 17. Aug. 13:12:00 GMT Date testDate = new Date(1155820320000l); args = new Object[] { new TrustedInput(testDate) }; msg = new LocalizedMessage(TEST_RESOURCE, timeTestId, args); assertEquals("It's 1:12:00 PM GMT at Aug 17, 2006.", msg.getEntry( "text", Locale.ENGLISH, TimeZone.getTimeZone("GMT"))); // NOTE: Older JDKs appear to use '.' as the time separator for German locale assertEquals("Es ist 13:12 Uhr GMT am 17.08.2006.", msg.getEntry( "text", Locale.GERMAN, TimeZone.getTimeZone("GMT")).replace("13.12", "13:12")); // test time with filter args = new Object[] { new TrustedInput(testDate) }; msg = new LocalizedMessage(TEST_RESOURCE, timeTestId, args); msg.setFilter(new HTMLFilter()); assertEquals("It's 1:12:00 PM GMT at Aug 17, 2006.", msg.getEntry( "text", Locale.ENGLISH, TimeZone.getTimeZone("GMT"))); // NOTE: Older JDKs appear to use '.' as the time separator for German locale assertEquals("Es ist 13:12 Uhr GMT am 17.08.2006.", msg.getEntry( "text", Locale.GERMAN, TimeZone.getTimeZone("GMT")).replace("13.12", "13:12")); // test number args = new Object[] { new TrustedInput(new Float(0.2)) }; msg = new LocalizedMessage(TEST_RESOURCE, "number", args); assertEquals("20%", msg.getEntry("text", Locale.ENGLISH, TimeZone.getDefault())); // test filters String untrusted = "<script>doBadThings()</script>"; args = new Object[] { untrusted }; msg = new LocalizedMessage(TEST_RESOURCE,filterTestId,args); msg.setFilter(new HTMLFilter()); assertEquals("The following part should contain no HTML tags: " + "<script>doBadThings()</script>", msg.getEntry("text",Locale.ENGLISH, TimeZone.getDefault())); // test missing entry msg = new LocalizedMessage(TEST_RESOURCE, missingTestId); try { String text = msg.getEntry("text", Locale.UK, TimeZone .getDefault()); fail(); } catch (MissingEntryException e) { // System.out.println(e.getDebugMsg()); } // test missing entry try { URLClassLoader cl = URLClassLoader.newInstance(new URL[] {new URL("file:///nonexistent/")}); msg = new LocalizedMessage(TEST_RESOURCE, missingTestId); msg.setClassLoader(cl); try { String text = msg.getEntry("text", Locale.UK, TimeZone .getDefault()); fail(); } catch (MissingEntryException e) { // System.out.println(e.getDebugMsg()); } } catch (MalformedURLException e) { } // test utf8 try { // String expectedUtf8 = "some umlauts äöüèéà"; String expectedUtf8 = new String(Hex.decode("736f6d6520756d6c6175747320c3a4c3b6c3bcc3a8c3a9c3a0"), "UTF-8"); msg = new LocalizedMessage(UTF8_TEST_RESOURCE, utf8TestId, "UTF-8"); assertEquals(expectedUtf8, msg.getEntry("text", Locale.GERMAN, TimeZone.getDefault())); } catch (UnsupportedEncodingException e) { } } public void testLocalizedArgs() { LocaleString ls = new LocaleString(TEST_RESOURCE, "name"); // without filter Object[] args = new Object[] { ls }; LocalizedMessage msg = new LocalizedMessage(TEST_RESOURCE, argsTestId, args); assertEquals("My name is John.", msg.getEntry("text", Locale.ENGLISH, TimeZone.getDefault())); assertEquals("Mein Name ist Hans.", msg.getEntry("text", Locale.GERMAN, TimeZone.getDefault())); // with filter msg.setFilter(new HTMLFilter()); assertEquals("My name is John.", msg.getEntry("text", Locale.ENGLISH, TimeZone.getDefault())); assertEquals("Mein Name ist Hans.", msg.getEntry("text", Locale.GERMAN, TimeZone.getDefault())); // add extra args LocaleString lsExtra = new LocaleString(TEST_RESOURCE, "hello.text"); msg.setExtraArguments(new Object[] {" ", lsExtra}); assertEquals("My name is John. Hello world.", msg.getEntry("text", Locale.ENGLISH, TimeZone.getDefault())); assertEquals("Mein Name ist Hans. Hallo Welt.", msg.getEntry("text", Locale.GERMAN, TimeZone.getDefault())); // missing localized arg try { ls = new LocaleString(TEST_RESOURCE, "noname"); args = new Object[] { ls }; msg = new LocalizedMessage(TEST_RESOURCE, argsTestId, args); msg.getEntry("text", Locale.ENGLISH, TimeZone.getDefault()); fail(); } catch (MissingEntryException e) { assertEquals("Can't find entry noname in resource file org.bouncycastle.i18n.test.I18nTestMessages.", e.getMessage()); } } }