/*******************************************************************************
* Copyright (c) 2012 VMWare, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMWare, Inc. - initial API and implementation
*******************************************************************************/
package org.grails.ide.eclipse.commands.test;
import java.util.Arrays;
import java.util.Collection;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.JavaCore;
import org.grails.ide.eclipse.commands.GrailsCommandUtils;
import org.grails.ide.eclipse.core.internal.classpath.GrailsPlugin;
import org.grails.ide.eclipse.core.internal.classpath.GrailsPluginInstaller;
import org.grails.ide.eclipse.core.internal.classpath.GrailsPluginUtil;
import org.grails.ide.eclipse.core.internal.classpath.GrailsPluginsListManager;
import org.grails.ide.eclipse.core.model.GrailsVersion;
import org.springsource.ide.eclipse.commons.frameworks.core.internal.plugins.PluginVersion;
import org.springsource.ide.eclipse.commons.frameworks.test.util.ACondition;
import org.grails.ide.eclipse.test.util.GrailsTest;
/**
* @author Andrew Eisenberg
* @author Kris De Volder
* @since 2.5.3
*/
public class PluginInstallerTests extends AbstractPluginInstallerTest {
GrailsPluginsListManager manager;
Collection<GrailsPlugin> plugins;
private IProject installable;
private IProject common;
@Override
protected void setUp() throws Exception {
super.setUp();
ensureDefaultGrailsVersion(GrailsVersion.MOST_RECENT);
installable = ensureProject("installable");
common = ensureProject("common", true);
manager = GrailsPluginsListManager.getGrailsPluginsListManager(installable);
plugins = manager.generateList(false);
}
public void testInstallExternalPlugin() throws Exception {
assertPluginsInstalled(GrailsTest.defaultPlugins());
IStatus status = GrailsPluginInstaller.performPluginChanges(null, getLatestPluginVersions("feeds"), installable, null);
GrailsTest.assertStatusOK(status);
assertPluginsInstalled(GrailsTest.join(GrailsTest.defaultPlugins(), "feeds"));
status = GrailsPluginInstaller.performPluginChanges(getLatestPluginVersions("feeds"), null, installable, null);
GrailsTest.assertStatusOK(status);
}
public void testInstallInPlacePlugin() throws Exception {
assertPluginsInstalled(GrailsTest.defaultPlugins());
IStatus status = GrailsPluginInstaller.performPluginChanges(null, getLatestPluginVersions("common"), installable, null);
GrailsTest.assertStatusOK(status);
assertPluginsInstalled(GrailsTest.join(GrailsTest.defaultPlugins(), "common"));
status = GrailsPluginInstaller.performPluginChanges(getLatestPluginVersions("common"), null, installable, null);
GrailsTest.assertStatusOK(status);
assertPluginsInstalled(GrailsTest.defaultPlugins());
}
public void testMultiInstallPlugin() throws Exception {
assertPluginsInstalled(GrailsTest.defaultPlugins());
IStatus status = GrailsPluginInstaller.performPluginChanges(null, getLatestPluginVersions("common", "feeds"), installable, null);
GrailsTest.assertStatusOK(status);
assertPluginsInstalled(GrailsTest.join(GrailsTest.defaultPlugins(), "common", "feeds"));
status = GrailsPluginInstaller.performPluginChanges(getLatestPluginVersions("common", "feeds"), null, installable, null);
GrailsTest.assertStatusOK(status);
assertPluginsInstalled(GrailsTest.defaultPlugins());
}
private Collection<PluginVersion> getLatestPluginVersions(String... names) {
return getLatestPluginVersions(manager, names);
}
// Test removed, the multi-tenant-core plugin hasn't actually worked for a long time now.
// public void testInstallPluginwithDependentPlugin() throws Exception {
// //TODO: This test fails in Grails 2.0 because multi-tenant core plugin isn't compatible (yet?) with 2.0.
// // See http://jira.grails.org/browse/GRAILS-8198
// if (GrailsVersion.MOST_RECENT.equals(GrailsVersion.V_2_2_1)) {
// return;
// }
//
// assertPluginsInstalled(GrailsTest.defaultPlugins());
// IStatus status = GrailsPluginInstaller.performPluginChanges(null, getLatestPluginVersions("multi-tenant-core"), installable, null);
// GrailsTest.assertStatusOK(status);
// assertPluginsInstalled(GrailsTest.join(GrailsTest.defaultPlugins(), "multi-tenant-core", "falcone-util"));
// status = GrailsPluginInstaller.performPluginChanges(getLatestPluginVersions("multi-tenant-core", "falcone-util"), null, installable, null);
// GrailsTest.assertStatusOK(status);
// assertPluginsInstalled(GrailsTest.defaultPlugins());
// }
public void testInstallInPlaceWithProblem() throws Exception {
assertPluginsInstalled(GrailsTest.defaultPlugins());
// add a mangled version of a dependency to common in the BuildConfig.groovy
GrailsPluginUtil.addPluginDependency(installable, common, true);
GrailsCommandUtils.refreshDependencies(
JavaCore.create(installable), true);
assertPluginsInstalled(GrailsTest.join(GrailsTest.defaultPlugins(),"common"));
// should not be able to install common any more
IStatus status = GrailsPluginInstaller.performPluginChanges(null, getLatestPluginVersions("common", "feeds"), installable, null);
// no warning since the effect is to another line in the BuildConfig.groovy file
GrailsTest.assertStatusOK(status);
// common should already be installed
assertPluginsInstalled(GrailsTest.join(GrailsTest.defaultPlugins(), "common", "feeds"));
status = GrailsPluginInstaller.performPluginChanges(getLatestPluginVersions("common", "feeds"), null, installable, null);
// we think we uninstalled because we successfully removed the line in BuildConfig.groovy
GrailsTest.assertStatusOK(status);
// common should still be installed
assertPluginsInstalled(GrailsTest.join(GrailsTest.defaultPlugins(),"common"));
// try again, but this time get a warning
// Note: unless using 'FastGrailsPluginInstaller' the feeds plugin will have been uninstalled already.
status = GrailsPluginInstaller.performPluginChanges(getLatestPluginVersions("common" /*, "feeds"*/), null, installable, null);
// we think we uninstalled because we successfully removed the line in BuildConfig.groovy
assertStatusWarning(status);
// common should still be installed
assertPluginsInstalled(GrailsTest.join(GrailsTest.defaultPlugins(),"common"));
// now, remove the mangled dependency
GrailsPluginUtil.removePluginDependency(installable, common, true);
GrailsCommandUtils.refreshDependencies(
JavaCore.create(installable), true);
assertPluginsInstalled(GrailsTest.defaultPlugins());
}
/**
* Regression test for STS-1530, a bug that happens when one installs the 'export' plugin into Grails 1.3.6.
* THe export plugin somehow causes our dependency extractor to fail... presumably because the
* plugin modifies the classpath causing us to have problems using the JAXP libraries inside of Grails.
*/
public void testSTS_1530() throws Exception {
//Note this test is failing but that appears to be not our problem... it also fails when I do the
//same steps as outlined in this test on the commandline.
//See http://jira.codehaus.org/browse/GRAILSPLUGINS-2944
assertPluginsInstalled(GrailsTest.defaultPlugins());
//Install the 'export' plugin
Collection<PluginVersion> latestPluginVersions = getLatestPluginVersions("export");
IStatus status = GrailsPluginInstaller.performPluginChanges(null, latestPluginVersions, installable, null);
GrailsTest.assertStatusOK(status);
assertPluginsInstalled(GrailsTest.join(GrailsTest.defaultPlugins(), "export"));
//Uninstall the 'export' plugin
status = GrailsPluginInstaller.performPluginChanges(latestPluginVersions, null, installable, null);
GrailsTest.assertStatusOK(status);
assertPluginsInstalled(GrailsTest.defaultPlugins());
}
private void assertPluginsInstalled(String[] plugins) {
assertPluginsInstalled(manager, plugins);
}
public void testInstallExternalWithProblem() throws Exception {
// not implemented yet
}
private boolean isPluginInstalled(String name) {
Collection<GrailsPlugin> installed = manager.getDependenciesAsPluginModels();
return containsPlugin(installed, name);
}
private void assertStatusWarning(IStatus status) {
if (status.getSeverity() != IStatus.WARNING) {
fail("Expecting Warning Status, but was:\n" + status);
}
}
private PluginVersion getPluginVersion(String name, String version) {
for (GrailsPlugin gp : plugins) {
if (gp.getName().equals(name)) {
return gp.getVersion(version);
}
}
fail("Could not find plugin " + name + " " + version);
// won't get here
return null;
}
/**
* Regression test for.
* https://issuetracker.springsource.com/browse/STS-1502
*/
public void testSTS1502PluginWithJarDependency() throws Exception {
assertPluginsInstalled(GrailsTest.defaultPlugins());
IStatus status = GrailsPluginInstaller.performPluginChanges(null, getLatestPluginVersions("spring-security-core"), installable, null);
GrailsTest.assertStatusOK(status);
new ACondition() {
@Override
public boolean test() throws Exception {
IClasspathEntry[] classpath = JavaCore.create(installable).getResolvedClasspath(true);
assertClassPathEntry(IClasspathEntry.CPE_LIBRARY,
Pattern.compile("spring-security-core|org.springframework.security.core"), classpath);
return true;
}
}.waitFor(500000);
boolean webxml = isPluginInstalled("webxml");
if (webxml) {
//in later versions, spring-security-core plugin pulls in the "webxml" plugin?
status = GrailsPluginInstaller.performPluginChanges(
getLatestPluginVersions("spring-security-core", "webxml"), null, installable, null);
} else {
status = GrailsPluginInstaller.performPluginChanges(
getLatestPluginVersions("spring-security-core"), null, installable, null);
}
GrailsTest.assertStatusOK(status);
assertPluginsInstalled(GrailsTest.defaultPlugins());
}
}