/*
* 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.core.platform;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Nullable;
import org.apache.commons.io.FileUtils;
import org.assertj.core.api.Assertions;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.ZipUtils;
import org.sonar.updatecenter.common.PluginManifest;
import org.sonar.updatecenter.common.Version;
import static com.google.common.collect.Ordering.natural;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
public class PluginInfoTest {
@Rule
public TemporaryFolder temp = new TemporaryFolder();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void test_RequiredPlugin() throws Exception {
PluginInfo.RequiredPlugin plugin = PluginInfo.RequiredPlugin.parse("java:1.1");
assertThat(plugin.getKey()).isEqualTo("java");
assertThat(plugin.getMinimalVersion().getName()).isEqualTo("1.1");
assertThat(plugin.toString()).isEqualTo("java:1.1");
assertThat(plugin.equals(PluginInfo.RequiredPlugin.parse("java:1.2"))).isTrue();
assertThat(plugin.equals(PluginInfo.RequiredPlugin.parse("php:1.2"))).isFalse();
try {
PluginInfo.RequiredPlugin.parse("java");
fail();
} catch (IllegalArgumentException expected) {
// ok
}
}
@Test
public void test_comparison() {
PluginInfo java1 = new PluginInfo("java").setVersion(Version.create("1.0"));
PluginInfo java2 = new PluginInfo("java").setVersion(Version.create("2.0"));
PluginInfo javaNoVersion = new PluginInfo("java");
PluginInfo cobol = new PluginInfo("cobol").setVersion(Version.create("1.0"));
PluginInfo noVersion = new PluginInfo("noVersion");
List<PluginInfo> plugins = Arrays.asList(java1, cobol, javaNoVersion, noVersion, java2);
List<PluginInfo> ordered = natural().sortedCopy(plugins);
Assertions.assertThat(ordered.get(0)).isSameAs(cobol);
Assertions.assertThat(ordered.get(1)).isSameAs(javaNoVersion);
Assertions.assertThat(ordered.get(2)).isSameAs(java1);
Assertions.assertThat(ordered.get(3)).isSameAs(java2);
Assertions.assertThat(ordered.get(4)).isSameAs(noVersion);
}
@Test
public void test_equals() {
PluginInfo java1 = new PluginInfo("java").setVersion(Version.create("1.0"));
PluginInfo java2 = new PluginInfo("java").setVersion(Version.create("2.0"));
PluginInfo javaNoVersion = new PluginInfo("java");
PluginInfo cobol = new PluginInfo("cobol").setVersion(Version.create("1.0"));
assertThat(java1.equals(java1)).isTrue();
assertThat(java1.equals(java2)).isFalse();
assertThat(java1.equals(javaNoVersion)).isFalse();
assertThat(java1.equals(cobol)).isFalse();
assertThat(java1.equals("java:1.0")).isFalse();
assertThat(java1.equals(null)).isFalse();
assertThat(javaNoVersion.equals(javaNoVersion)).isTrue();
assertThat(java1.hashCode()).isEqualTo(java1.hashCode());
assertThat(javaNoVersion.hashCode()).isEqualTo(javaNoVersion.hashCode());
}
/**
* SNAPSHOT versions of SonarQube are built on local developer machines only.
* All other build environments have unique release versions (6.3.0.12345).
*/
@Test
public void test_compatibility_with_snapshot_version_of_sonarqube() throws IOException {
// plugins compatible with 5.6 LTS
assertThat(withMinSqVersion("5.6").isCompatibleWith("6.3-SNAPSHOT")).isTrue();
assertThat(withMinSqVersion("5.6.1").isCompatibleWith("6.3-SNAPSHOT")).isTrue();
// plugin build with old release candidates of SonarQube (RC technical versions have been removed
// in SonarQube 6.3)
assertThat(withMinSqVersion("5.6-RC1").isCompatibleWith("6.3-SNAPSHOT")).isTrue();
assertThat(withMinSqVersion("6.2-RC1").isCompatibleWith("6.3-SNAPSHOT")).isTrue();
// plugin built with snapshot version of SonarQube
assertThat(withMinSqVersion("5.6-SNAPSHOT").isCompatibleWith("6.3-SNAPSHOT")).isTrue();
assertThat(withMinSqVersion("6.3-SNAPSHOT").isCompatibleWith("6.3-SNAPSHOT")).isTrue();
assertThat(withMinSqVersion("6.4-SNAPSHOT").isCompatibleWith("6.3-SNAPSHOT")).isFalse();
// plugin built with SonarQube releases
assertThat(withMinSqVersion("6.3.0.5000").isCompatibleWith("6.3-SNAPSHOT")).isTrue();
assertThat(withMinSqVersion("6.3.1.5000").isCompatibleWith("6.3-SNAPSHOT")).isTrue();
assertThat(withMinSqVersion("6.3.1.5000").isCompatibleWith("6.4-SNAPSHOT")).isTrue();
assertThat(withMinSqVersion("6.4.0.5000").isCompatibleWith("6.3-SNAPSHOT")).isFalse();
// no constraint
assertThat(withMinSqVersion(null).isCompatibleWith("6.3-SNAPSHOT")).isTrue();
}
/**
* @see #test_compatibility_with_snapshot_version_of_sonarqube
*/
@Test
public void test_compatibility_with_release_version_of_sonarqube() throws IOException {
// plugins compatible with 5.6 LTS
assertThat(withMinSqVersion("5.6").isCompatibleWith("6.3.0.5000")).isTrue();
assertThat(withMinSqVersion("5.6.1").isCompatibleWith("6.3.0.5000")).isTrue();
// plugin build with old release candidates of SonarQube (RC technical versions have been removed
// in SonarQube 6.3)
assertThat(withMinSqVersion("5.6-RC1").isCompatibleWith("6.3.0.5000")).isTrue();
assertThat(withMinSqVersion("6.2-RC1").isCompatibleWith("6.3.0.5000")).isTrue();
// plugin built with snapshot version of SonarQube
assertThat(withMinSqVersion("5.6-SNAPSHOT").isCompatibleWith("6.3.0.5000")).isTrue();
assertThat(withMinSqVersion("6.3-SNAPSHOT").isCompatibleWith("6.3.0.5000")).isTrue();
assertThat(withMinSqVersion("6.3-SNAPSHOT").isCompatibleWith("6.3.1.6000")).isTrue();
assertThat(withMinSqVersion("6.4-SNAPSHOT").isCompatibleWith("6.3.0.5000")).isFalse();
// plugin built with SonarQube releases
assertThat(withMinSqVersion("6.3.0.5000").isCompatibleWith("6.3.0.4000")).isFalse();
assertThat(withMinSqVersion("6.3.0.5000").isCompatibleWith("6.3.0.5000")).isTrue();
assertThat(withMinSqVersion("6.3.0.5000").isCompatibleWith("6.3.1.6000")).isTrue();
assertThat(withMinSqVersion("6.4.0.7000").isCompatibleWith("6.3.0.5000")).isFalse();
// no constraint
assertThat(withMinSqVersion(null).isCompatibleWith("6.3.0.5000")).isTrue();
}
@Test
public void create_from_minimal_manifest() throws Exception {
PluginManifest manifest = new PluginManifest();
manifest.setKey("java");
manifest.setVersion("1.0");
manifest.setName("Java");
manifest.setMainClass("org.foo.FooPlugin");
File jarFile = temp.newFile();
PluginInfo pluginInfo = PluginInfo.create(jarFile, manifest);
assertThat(pluginInfo.getKey()).isEqualTo("java");
assertThat(pluginInfo.getName()).isEqualTo("Java");
assertThat(pluginInfo.getVersion().getName()).isEqualTo("1.0");
assertThat(pluginInfo.getJarFile()).isSameAs(jarFile);
assertThat(pluginInfo.getMainClass()).isEqualTo("org.foo.FooPlugin");
assertThat(pluginInfo.getBasePlugin()).isNull();
assertThat(pluginInfo.getDescription()).isNull();
assertThat(pluginInfo.getHomepageUrl()).isNull();
assertThat(pluginInfo.getImplementationBuild()).isNull();
assertThat(pluginInfo.getIssueTrackerUrl()).isNull();
assertThat(pluginInfo.getLicense()).isNull();
assertThat(pluginInfo.getOrganizationName()).isNull();
assertThat(pluginInfo.getOrganizationUrl()).isNull();
assertThat(pluginInfo.getMinimalSqVersion()).isNull();
assertThat(pluginInfo.getRequiredPlugins()).isEmpty();
assertThat(pluginInfo.isSonarLintSupported()).isFalse();
}
@Test
public void create_from_complete_manifest() throws Exception {
PluginManifest manifest = new PluginManifest();
manifest.setKey("fbcontrib");
manifest.setVersion("2.0");
manifest.setName("Java");
manifest.setMainClass("org.fb.FindbugsPlugin");
manifest.setBasePlugin("findbugs");
manifest.setSonarVersion("4.5.1");
manifest.setDescription("the desc");
manifest.setHomepage("http://fbcontrib.org");
manifest.setImplementationBuild("SHA1");
manifest.setLicense("LGPL");
manifest.setOrganization("SonarSource");
manifest.setOrganizationUrl("http://sonarsource.com");
manifest.setIssueTrackerUrl("http://jira.com");
manifest.setRequirePlugins(new String[] {"java:2.0", "pmd:1.3"});
manifest.setSonarLintSupported(true);
File jarFile = temp.newFile();
PluginInfo pluginInfo = PluginInfo.create(jarFile, manifest);
assertThat(pluginInfo.getBasePlugin()).isEqualTo("findbugs");
assertThat(pluginInfo.getDescription()).isEqualTo("the desc");
assertThat(pluginInfo.getHomepageUrl()).isEqualTo("http://fbcontrib.org");
assertThat(pluginInfo.getImplementationBuild()).isEqualTo("SHA1");
assertThat(pluginInfo.getIssueTrackerUrl()).isEqualTo("http://jira.com");
assertThat(pluginInfo.getLicense()).isEqualTo("LGPL");
assertThat(pluginInfo.getOrganizationName()).isEqualTo("SonarSource");
assertThat(pluginInfo.getOrganizationUrl()).isEqualTo("http://sonarsource.com");
assertThat(pluginInfo.getMinimalSqVersion().getName()).isEqualTo("4.5.1");
assertThat(pluginInfo.getRequiredPlugins()).extracting("key").containsOnly("java", "pmd");
assertThat(pluginInfo.isSonarLintSupported()).isTrue();
}
@Test
public void create_from_file() {
File checkstyleJar = FileUtils.toFile(getClass().getResource("/org/sonar/core/platform/sonar-checkstyle-plugin-2.8.jar"));
PluginInfo checkstyleInfo = PluginInfo.create(checkstyleJar);
assertThat(checkstyleInfo.getName()).isEqualTo("Checkstyle");
assertThat(checkstyleInfo.getMinimalSqVersion()).isEqualTo(Version.create("2.8"));
}
@Test
public void test_toString() throws Exception {
PluginInfo pluginInfo = new PluginInfo("java").setVersion(Version.create("1.1"));
assertThat(pluginInfo.toString()).isEqualTo("[java / 1.1]");
pluginInfo.setImplementationBuild("SHA1");
assertThat(pluginInfo.toString()).isEqualTo("[java / 1.1 / SHA1]");
}
/**
* The English bundle plugin was removed in 5.2. L10n plugins do not need to declare
* it as base plugin anymore
*/
@Test
public void l10n_plugins_should_not_extend_english_plugin() {
PluginInfo pluginInfo = new PluginInfo("l10nfr").setBasePlugin("l10nen");
assertThat(pluginInfo.getBasePlugin()).isNull();
}
@Test
public void fail_when_jar_is_not_a_plugin() throws IOException {
// this JAR has a manifest but is not a plugin
File jarRootDir = temp.newFolder();
FileUtils.write(new File(jarRootDir, "META-INF/MANIFEST.MF"), "Build-Jdk: 1.6.0_15");
File jar = temp.newFile();
ZipUtils.zipDir(jarRootDir, jar);
expectedException.expect(MessageException.class);
expectedException.expectMessage("File is not a plugin. Please delete it and restart: " + jar.getAbsolutePath());
PluginInfo.create(jar);
}
PluginInfo withMinSqVersion(@Nullable String version) {
PluginInfo pluginInfo = new PluginInfo("foo");
if (version != null) {
pluginInfo.setMinimalSqVersion(Version.create(version));
}
return pluginInfo;
}
}