/* * #%L * Wisdom-Framework * %% * Copyright (C) 2013 - 2014 Wisdom Framework * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package org.wisdom.i18n; import org.assertj.core.data.MapEntry; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.ow2.chameleon.testing.helpers.OSGiHelper; import org.wisdom.api.i18n.InternationalizationService; import org.wisdom.test.parents.WisdomTest; import javax.inject.Inject; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.ops4j.pax.tinybundles.core.TinyBundles.bundle; /** * Check the behavior of the internationalization service. */ public class InternationalizationServiceSingletonIT extends WisdomTest { @Inject private InternationalizationService service; @Inject private BundleContext context; private OSGiHelper osgi; private List<Bundle> bundles; @Before public void setUp() { osgi = new OSGiHelper(context); bundles = new ArrayList<>(); } @After public void tearDown() { for(Bundle bundle : bundles) { try { bundle.uninstall(); } catch (BundleException e) { // Ignore it } } try { osgi.dispose(); } catch (Exception e) { // Ignore it } } /** * The test bundle contains the src/test/resources/i18n folder, so contains 2 resource bundles. */ @Test public void testDetectionOfFilesFromTheTestBundle() { assertThat(service).isNotNull(); Map<String, String> messages = service.getAllMessages(Locale.FRENCH); assertThat(messages).contains( MapEntry.entry("welcome", "bonjour"), MapEntry.entry("lang", "français"), MapEntry.entry("autre", "autre"), MapEntry.entry("extra", "extra") ); messages = service.getAllMessages(Locale.CHINA); assertThat(messages).contains( MapEntry.entry("welcome", "hello"), MapEntry.entry("lang", "english"), MapEntry.entry("extra", "extra") ); assertThat(messages).doesNotContainKey("autre"); } @Test public void testManagementOfABundleContainingInternationalizationFiles() throws FileNotFoundException, BundleException { Bundle bundle = osgi.installAndStart("local:/i18n", bundle() .add("i18n/app.properties", new FileInputStream("src/test/resources/integration/app.properties")) .add("i18n/app_fr.properties", new FileInputStream("src/test/resources/integration/app_fr.properties")) .build()); bundles.add(bundle); Map<String, String> messages = service.getAllMessages(Locale.FRENCH); assertThat(messages).contains( MapEntry.entry("app.name", "mon application") ); messages = service.getAllMessages(Locale.CHINA); assertThat(messages).contains( MapEntry.entry("app.name", "my application") ); messages = service.getAllMessages(Locale.ENGLISH); assertThat(messages).contains( MapEntry.entry("app.name", "my application") ); messages = service.getAllMessages(Locale.GERMAN); assertThat(messages).contains( MapEntry.entry("app.name", "my application") ); bundle.stop(); messages = service.getAllMessages(Locale.FRENCH); assertThat(messages).doesNotContainKey("app.name"); messages = service.getAllMessages(Locale.GERMAN); assertThat(messages).doesNotContainKey("app.name"); } /** * In this test, a first bundle provides the default and french resources, while another one provides the german * version. */ @Test public void testWithTwoBundles() throws FileNotFoundException, BundleException { Bundle bundle1 = osgi.installAndStart("local:/i18n", bundle() .add("i18n/app.properties", new FileInputStream("src/test/resources/integration/app.properties")) .add("i18n/app_fr.properties", new FileInputStream("src/test/resources/integration/app_fr.properties")) .build()); bundles.add(bundle1); Bundle bundle2 = osgi.installAndStart("local:/i18n_de", bundle() .add("i18n/app_de.properties", new FileInputStream("src/test/resources/integration/app_de.properties")) .build()); bundles.add(bundle2); Map<String, String> messages = service.getAllMessages(Locale.FRENCH); assertThat(messages).contains( MapEntry.entry("app.name", "mon application") ); messages = service.getAllMessages(Locale.CHINA); assertThat(messages).contains( MapEntry.entry("app.name", "my application") ); messages = service.getAllMessages(Locale.ENGLISH); assertThat(messages).contains( MapEntry.entry("app.name", "my application") ); messages = service.getAllMessages(Locale.GERMAN); assertThat(messages).contains( MapEntry.entry("app.name", "Meine Software") ); bundle1.stop(); messages = service.getAllMessages(Locale.FRENCH); assertThat(messages).doesNotContainKey("app.name"); messages = service.getAllMessages(Locale.GERMAN); assertThat(messages).containsEntry("app.name", "Meine Software"); bundle2.stop(); messages = service.getAllMessages(Locale.GERMAN); assertThat(messages).doesNotContainEntry("app.name", "Meine Software"); } }