package grails.plugins;
import grails.core.DefaultGrailsApplication;
import grails.core.GrailsApplication;
import groovy.lang.GroovyClassLoader;
import junit.framework.TestCase;
import org.grails.plugins.IncludingPluginFilter;
import org.springframework.context.support.GenericApplicationContext;
import java.util.ArrayList;
import java.util.List;
public class DefaultGrailsPluginManagerTests extends TestCase {
private Class<?> first;
private Class<?> second;
private Class<?> third;
private Class<?> fourth;
@SuppressWarnings("rawtypes")
public void testLoadPlugins() {
GroovyClassLoader gcl = new GroovyClassLoader();
first = gcl.parseClass("class FirstGrailsPlugin {\n" +
"def version = 1.0\n" +
"}");
second = gcl.parseClass("class SecondGrailsPlugin {\n" +
"def version = 1.0\n" +
"def dependsOn = [first:version]\n" +
"}");
third = gcl.parseClass("import grails.util.GrailsUtil\n" +
"class ThirdGrailsPlugin {\n" +
"def version = GrailsUtil.getGrailsVersion()\n" +
"def dependsOn = [i18n:version]\n" +
"}");
fourth = gcl.parseClass("class FourthGrailsPlugin {\n" +
"def version = 1.0\n" +
"def dependsOn = [second:version, third:version]\n" +
"}");
GrailsApplication app = new DefaultGrailsApplication(new Class[]{}, gcl);
GenericApplicationContext parent = new GenericApplicationContext();
parent.getDefaultListableBeanFactory().registerSingleton(GrailsApplication.APPLICATION_ID, app);
DefaultGrailsPluginManager manager = new DefaultGrailsPluginManager(new Class[]{first, second, third, fourth}, app);
manager.setParentApplicationContext(parent);
manager.setPluginFilter(new IncludingPluginFilter(new String[]{"dataSource", "first", "third"}));
manager.loadPlugins();
List pluginList = manager.getPluginList();
assertNotNull(manager.getGrailsPlugin("dataSource"));
assertNotNull(manager.getGrailsPlugin("first"));
assertNotNull(manager.getGrailsPlugin("third"));
//dataSource depends on core
assertNotNull(manager.getGrailsPlugin("core"));
//third depends on i18n
assertNotNull(manager.getGrailsPlugin("third"));
assertEquals("Expected plugins not loaded. Expected " + 5 + " but got " + pluginList, 5, pluginList.size());
}
/**
* Test the known 1.0.2 failure where:
*
* mail 0.3 = has no deps
* quartz 0.3-SNAPSHOT: loadAfter = ['core', 'hibernate']
* emailconfirmation 0.4: dependsOn = [quartz:'0.3 > *', mail: '0.2 > *']
*
* ...and emailconfirmation is NOT loaded first.
*/
@SuppressWarnings("rawtypes")
public void testDependenciesWithDelayedLoadingWithVersionRangeStrings() {
GroovyClassLoader gcl = new GroovyClassLoader();
// These are defined in a specific order so that the one with the range dependencies
// is the first in the list, and its dependencies load after
first = gcl.parseClass("class FirstGrailsPlugin {\n" +
"def version = \"0.4\"\n" +
"def dependsOn = [second:'0.3 > *', third:'0.2 > *']\n" +
"}");
second = gcl.parseClass("class SecondGrailsPlugin {\n" +
"def version = \"0.3\"\n" +
"def dependsOn = [:]\n" +
"}");
third = gcl.parseClass("class ThirdGrailsPlugin {\n" +
"def version = \"0.3-SNAPSHOT\"\n" +
"def loadAfter = ['core', 'hibernate']\n" +
"}");
GrailsApplication app = new DefaultGrailsApplication(new Class[]{}, gcl);
GenericApplicationContext parent = new GenericApplicationContext();
parent.getDefaultListableBeanFactory().registerSingleton(GrailsApplication.APPLICATION_ID, app);
DefaultGrailsPluginManager manager = new DefaultGrailsPluginManager(new Class[]{first, second, third}, app);
manager.setParentApplicationContext(parent);
manager.setPluginFilter(new IncludingPluginFilter(new String[]{"dataSource", "first", "second", "third"}));
manager.loadPlugins();
List pluginList = manager.getPluginList();
assertNotNull(manager.getGrailsPlugin("first"));
assertNotNull(manager.getGrailsPlugin("second"));
//dataSource depends on core
assertNotNull(manager.getGrailsPlugin("core"));
//third depends on i18n
assertNotNull(manager.getGrailsPlugin("third"));
assertEquals("Expected plugins not loaded. Expected " + 5 + " but got " + pluginList, 5, pluginList.size());
}
public void testLoadingOrderGRAILS9426() {
// GRAILS-9426
DefaultGrailsPluginManager manager = loadPlugins("class FirstGrailsPlugin {\n" +
"def version = '1.0'\n" +
"}", "class SecondGrailsPlugin {\n" +
"def version = '1.0'\n" +
"}", "import grails.util.GrailsUtil\n" +
"class ThirdGrailsPlugin {\n" +
"def version = '1.0'\n" +
"}", "class FourthGrailsPlugin {\n" +
"def version = '1.0'\n" +
"def loadBefore = ['first', 'second']\n" +
"}");
List<GrailsPlugin> pluginList = manager.getPluginList();
assertNotNull(manager.getGrailsPlugin("first"));
assertNotNull(manager.getGrailsPlugin("second"));
assertNotNull(manager.getGrailsPlugin("third"));
assertNotNull(manager.getGrailsPlugin("fourth"));
List<GrailsPlugin> expectedOrder = new ArrayList<GrailsPlugin>();
expectedOrder.add(manager.getGrailsPlugin("fourth"));
expectedOrder.add(manager.getGrailsPlugin("first"));
expectedOrder.add(manager.getGrailsPlugin("second"));
expectedOrder.add(manager.getGrailsPlugin("third"));
assertEquals("Expected plugin order", expectedOrder, pluginList);
assertEquals("Expected plugins not loaded. Expected " + 4 + " but got " + pluginList, 4, pluginList.size());
}
DefaultGrailsPluginManager loadPlugins(String firstClassString, String secondClassString, String thirdClassString, String fourthClassString) {
GroovyClassLoader gcl = new GroovyClassLoader();
first = gcl.parseClass(firstClassString);
second = gcl.parseClass(secondClassString);
third = gcl.parseClass(thirdClassString);
fourth = gcl.parseClass(fourthClassString);
GrailsApplication app = new DefaultGrailsApplication(new Class[]{}, gcl);
GenericApplicationContext parent = new GenericApplicationContext();
parent.getDefaultListableBeanFactory().registerSingleton(GrailsApplication.APPLICATION_ID, app);
DefaultGrailsPluginManager manager = new DefaultGrailsPluginManager(new Class[]{first, second, third, fourth}, app);
manager.setParentApplicationContext(parent);
manager.setPluginFilter(new IncludingPluginFilter(new String[]{"first", "second", "third", "fourth"}));
manager.loadPlugins();
return manager;
}
public void testLoadingOrderLoadBeforeAndLoadAfter() {
DefaultGrailsPluginManager manager = loadPlugins("class FirstGrailsPlugin {\n" +
"def version = '1.0'\n" +
"def loadAfter = ['second', 'third']\n" +
"}", "class SecondGrailsPlugin {\n" +
"def version = '1.0'\n" +
"}", "import grails.util.GrailsUtil\n" +
"class ThirdGrailsPlugin {\n" +
"def version = '1.0'\n" +
"def loadBefore = ['fourth']\n" +
"}", "class FourthGrailsPlugin {\n" +
"def version = '1.0'\n" +
"def loadBefore = ['first', 'second']\n" +
"}");
List<GrailsPlugin> pluginList = manager.getPluginList();
List<GrailsPlugin> expectedOrder = new ArrayList<GrailsPlugin>();
expectedOrder.add(manager.getGrailsPlugin("third"));
expectedOrder.add(manager.getGrailsPlugin("fourth"));
expectedOrder.add(manager.getGrailsPlugin("second"));
expectedOrder.add(manager.getGrailsPlugin("first"));
assertEquals("Expected plugin order", expectedOrder, pluginList);
}
}