summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sonar-testing-harness/src/main/java/org/sonar/test/i18n/BundleSynchronizedMatcher.java35
-rw-r--r--sonar-testing-harness/src/main/java/org/sonar/test/i18n/I18nMatchers.java47
-rw-r--r--sonar-testing-harness/src/test/java/org/sonar/test/i18n/BundleSynchronizedTest.java20
-rw-r--r--sonar-testing-harness/src/test/resources/version.properties2
4 files changed, 93 insertions, 11 deletions
diff --git a/sonar-testing-harness/src/main/java/org/sonar/test/i18n/BundleSynchronizedMatcher.java b/sonar-testing-harness/src/main/java/org/sonar/test/i18n/BundleSynchronizedMatcher.java
index 8d794b01dfc..23baf7771d5 100644
--- a/sonar-testing-harness/src/main/java/org/sonar/test/i18n/BundleSynchronizedMatcher.java
+++ b/sonar-testing-harness/src/main/java/org/sonar/test/i18n/BundleSynchronizedMatcher.java
@@ -33,7 +33,9 @@ import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collection;
+import java.util.MissingResourceException;
import java.util.Properties;
+import java.util.ResourceBundle;
import java.util.Set;
import org.apache.commons.io.IOUtils;
@@ -163,17 +165,38 @@ public class BundleSynchronizedMatcher extends BaseMatcher<String> {
}
protected File getBundleFileFromGithub(String defaultBundleName) {
- File bundle = new File("target/l10n/download/" + defaultBundleName);
+ File localBundle = new File("target/l10n/download/" + defaultBundleName);
try {
- saveUrl(remote_file_path + defaultBundleName, bundle);
+ String sonarVersion = getSonarVersionFromBundle();
+ String remoteFile = computeGitHubURL(defaultBundleName, sonarVersion);
+ saveUrlToLocalFile(remoteFile, localBundle);
} catch (MalformedURLException e) {
fail("Could not download the original core bundle at: " + remote_file_path + defaultBundleName);
} catch (IOException e) {
fail("Could not download the original core bundle at: " + remote_file_path + defaultBundleName);
}
- assertThat("File 'target/tmp/" + defaultBundleName + "' has been downloaded but does not exist.", bundle, notNullValue());
- assertThat("File 'target/tmp/" + defaultBundleName + "' has been downloaded but does not exist.", bundle.exists(), is(true));
- return bundle;
+ assertThat("File 'target/tmp/" + defaultBundleName + "' has been downloaded but does not exist.", localBundle, notNullValue());
+ assertThat("File 'target/tmp/" + defaultBundleName + "' has been downloaded but does not exist.", localBundle.exists(), is(true));
+ return localBundle;
+ }
+
+ protected String computeGitHubURL(String defaultBundleName, String sonarVersion) {
+ String computedURL = remote_file_path + defaultBundleName;
+ if (sonarVersion != null && !sonarVersion.startsWith("${") && !sonarVersion.contains("-SNAPSHOT")) {
+ computedURL = computedURL.replace("/master/", "/" + sonarVersion + "/");
+ }
+ return computedURL;
+ }
+
+ protected String getSonarVersionFromBundle() {
+ String version = null;
+ try {
+ ResourceBundle bundle = ResourceBundle.getBundle("version");
+ version = bundle.getString("sonar.version");
+ } catch (MissingResourceException e) {
+ // no problem, we won't use any specific version
+ }
+ return version;
}
protected File getBundleFileFromClasspath(String bundleName) {
@@ -194,7 +217,7 @@ public class BundleSynchronizedMatcher extends BaseMatcher<String> {
return CORE_BUNDLES.contains(defaultBundleName);
}
- private void saveUrl(String url, File localFile) throws MalformedURLException, IOException {
+ private void saveUrlToLocalFile(String url, File localFile) throws MalformedURLException, IOException {
if (localFile.exists()) {
localFile.delete();
}
diff --git a/sonar-testing-harness/src/main/java/org/sonar/test/i18n/I18nMatchers.java b/sonar-testing-harness/src/main/java/org/sonar/test/i18n/I18nMatchers.java
index 6d24a634eb6..90bc31e817e 100644
--- a/sonar-testing-harness/src/main/java/org/sonar/test/i18n/I18nMatchers.java
+++ b/sonar-testing-harness/src/main/java/org/sonar/test/i18n/I18nMatchers.java
@@ -19,12 +19,57 @@
*/
package org.sonar.test.i18n;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
+import org.sonar.test.TestUtils;
+
+import com.google.common.collect.Maps;
+
public final class I18nMatchers {
private I18nMatchers() {
}
- public static BundleSynchronizedMatcher isBundleSynchronized() {
+ public static BundleSynchronizedMatcher isBundleUpToDate() {
return new BundleSynchronizedMatcher();
}
+
+ public static void assertAllBundlesUpToDate() {
+ File bundleFolder = TestUtils.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 = Maps.newHashMap();
+ 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(StringUtils.join(failedAssertionMessages.keySet(), ", "));
+ message.append("\n\n");
+ message.append(StringUtils.join(failedAssertionMessages.values(), "\n\n"));
+ fail(message.toString());
+ }
+
+ }
+
}
diff --git a/sonar-testing-harness/src/test/java/org/sonar/test/i18n/BundleSynchronizedTest.java b/sonar-testing-harness/src/test/java/org/sonar/test/i18n/BundleSynchronizedTest.java
index 73d6e310689..3edc655ddfd 100644
--- a/sonar-testing-harness/src/test/java/org/sonar/test/i18n/BundleSynchronizedTest.java
+++ b/sonar-testing-harness/src/test/java/org/sonar/test/i18n/BundleSynchronizedTest.java
@@ -25,7 +25,7 @@ import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-import static org.sonar.test.i18n.I18nMatchers.isBundleSynchronized;
+import static org.sonar.test.i18n.I18nMatchers.isBundleUpToDate;
import java.io.File;
import java.util.Collection;
@@ -48,18 +48,18 @@ public class BundleSynchronizedTest {
// The case of a Sonar plugin that embeds all the bundles for every language
public void testBundlesInsideSonarPlugin() {
// synchronized bundle
- assertThat("myPlugin_fr_CA.properties", isBundleSynchronized());
+ assertThat("myPlugin_fr_CA.properties", isBundleUpToDate());
assertFalse(new File("target/l10n/myPlugin_fr_CA.properties.report.txt").exists());
// missing keys
try {
- assertThat("myPlugin_fr.properties", isBundleSynchronized());
+ assertThat("myPlugin_fr.properties", isBundleUpToDate());
assertTrue(new File("target/l10n/myPlugin_fr.properties.report.txt").exists());
} catch (AssertionError e) {
assertThat(e.getMessage(), containsString("Missing keys are:\n\t- second.prop"));
}
// unnecessary many keys
try {
- assertThat("myPlugin_fr_QB.properties", isBundleSynchronized());
+ assertThat("myPlugin_fr_QB.properties", isBundleUpToDate());
assertTrue(new File("target/l10n/myPlugin_fr_QB.properties.report.txt").exists());
} catch (AssertionError e) {
assertThat(e.getMessage(), containsString("The following keys do not exist in the default bundle:\n\t- fourth.prop"));
@@ -127,4 +127,16 @@ public class BundleSynchronizedTest {
diffs = matcher.retrieveMissingKeys(qbBundle, defaultBundle);
assertThat(diffs.size(), is(0));
}
+
+ @Test
+ public void testComputeGitHubURL() throws Exception {
+ assertThat(
+ matcher.computeGitHubURL("core.properties", null),
+ is("https://raw.github.com/SonarSource/sonar/master/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties"));
+ assertThat(
+ matcher.computeGitHubURL("core.properties", "2.11-SNAPSHOT"),
+ is("https://raw.github.com/SonarSource/sonar/master/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties"));
+ assertThat(matcher.computeGitHubURL("core.properties", "2.10"),
+ is("https://raw.github.com/SonarSource/sonar/2.10/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties"));
+ }
}
diff --git a/sonar-testing-harness/src/test/resources/version.properties b/sonar-testing-harness/src/test/resources/version.properties
new file mode 100644
index 00000000000..f57ea3a66e4
--- /dev/null
+++ b/sonar-testing-harness/src/test/resources/version.properties
@@ -0,0 +1,2 @@
+# The version here in this test file does not matter as the Harmcrest matcher will always look at master if there's a "-SNAPSHOT" suffix
+sonar.version=2.11-SNAPSHOT \ No newline at end of file