/* * SonarQube * Copyright (C) 2009-2017 SonarSource SA * mailto:info AT sonarsource DOT com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.sonar.test.i18n; import java.io.File; import java.net.URL; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.FileUtils; import org.sonar.test.TestUtils; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; public final class I18nMatchers { private I18nMatchers() { } /** * Returns a matcher which checks that a translation bundle is up to date with the corresponding default one found in the classpath. * * @return the matcher */ public static BundleSynchronizedMatcher isBundleUpToDate() { return new BundleSynchronizedMatcher(); } /** * Checks that all the translation bundles found on the classpath are up to date with the corresponding default ones found in the classpath. */ public static void assertBundlesUpToDate() { File bundleFolder = getResource(BundleSynchronizedMatcher.L10N_PATH); if (bundleFolder == null || !bundleFolder.isDirectory()) { fail("No bundle found in: " + BundleSynchronizedMatcher.L10N_PATH); } Collection<File> bundles = FileUtils.listFiles(bundleFolder, new String[] {"properties"}, false); Map<String, String> failedAssertionMessages = new HashMap<>(); for (File bundle : bundles) { String bundleName = bundle.getName(); if (bundleName.indexOf('_') > 0) { try { assertThat(bundleName, isBundleUpToDate()); } catch (AssertionError e) { failedAssertionMessages.put(bundleName, e.getMessage()); } } } if (!failedAssertionMessages.isEmpty()) { StringBuilder message = new StringBuilder(); message.append(failedAssertionMessages.size()); message.append(" bundles are not up-to-date: "); message.append(String.join(", ", failedAssertionMessages.keySet())); message.append("\n\n"); message.append(String.join("\n\n", failedAssertionMessages.values())); fail(message.toString()); } } private static File getResource(String path) { String resourcePath = path; if (!resourcePath.startsWith("/")) { resourcePath = "/" + resourcePath; } URL url = TestUtils.class.getResource(resourcePath); if (url != null) { return FileUtils.toFile(url); } return null; } }