Merge branch '3.2.x' into master

* 3.2.x:
  Fix ClassCastException when setting media types
  Enable execution of TestNG tests in spring-test
  Polish support for topic branch-specific versions
  Segregate add'l long-running and performance tests
  Eliminate EBR dependencies and repository config
  Skip creation of IDEA metadata for spring-aspects
  Fix Eclipse compilation error in Gradle plugin
  Polish build.gradle
  Fix null parameterName issue in content negotiation
  Recursively add test dependencies
This commit is contained in:
Chris Beams 2013-01-03 22:31:52 +01:00
commit 7a737bebdd
30 changed files with 347 additions and 141 deletions

View File

@ -8,7 +8,10 @@ buildscript {
} }
} }
configure(allprojects) { configure(allprojects) { project ->
group = "org.springframework"
version = qualifyVersionIfNecessary(version)
ext.aspectjVersion = "1.7.1" ext.aspectjVersion = "1.7.1"
ext.easymockVersion = "2.5.2" ext.easymockVersion = "2.5.2"
ext.hsqldbVersion = "1.8.0.10" ext.hsqldbVersion = "1.8.0.10"
@ -16,14 +19,6 @@ configure(allprojects) {
ext.slf4jVersion = "1.6.1" ext.slf4jVersion = "1.6.1"
ext.gradleScriptDir = "${rootProject.projectDir}/gradle" ext.gradleScriptDir = "${rootProject.projectDir}/gradle"
if (rootProject.hasProperty("VERSION_QUALIFIER")) {
def qualifier = rootProject.getProperty("VERSION_QUALIFIER")
if (qualifier.startsWith("SPR-")) { // topic branch, e.g. SPR-1234
// replace 3.2.0.BUILD-SNAPSHOT for 3.2.0.SPR-1234-SNAPSHOT
version = version.replace('BUILD', qualifier)
}
}
apply plugin: "propdeps" apply plugin: "propdeps"
apply plugin: "java" apply plugin: "java"
apply plugin: "propdeps-eclipse" apply plugin: "propdeps-eclipse"
@ -31,8 +26,6 @@ configure(allprojects) {
apply plugin: "test-source-set-dependencies" apply plugin: "test-source-set-dependencies"
apply from: "${gradleScriptDir}/ide.gradle" apply from: "${gradleScriptDir}/ide.gradle"
group = "org.springframework"
compileJava { compileJava {
sourceCompatibility=1.5 sourceCompatibility=1.5
targetCompatibility=1.5 targetCompatibility=1.5
@ -65,17 +58,26 @@ configure(allprojects) {
sourceSets.test.resources.srcDirs = ["src/test/resources", "src/test/java"] sourceSets.test.resources.srcDirs = ["src/test/resources", "src/test/java"]
test.systemProperty("java.awt.headless", "true") test {
systemProperty("java.awt.headless", "true")
systemProperty("testGroups", properties.get("testGroups"))
}
repositories { repositories {
maven { url "http://repo.springsource.org/libs-release" } maven { url "http://repo.springsource.org/libs-release" }
maven { url "http://repo.springsource.org/ebr-maven-external" }
} }
dependencies { dependencies {
testCompile("junit:junit:${junitVersion}") testCompile("junit:junit:${junitVersion}")
testCompile("org.hamcrest:hamcrest-all:1.3") testCompile("org.hamcrest:hamcrest-all:1.3")
testCompile("org.mockito:mockito-core:1.9.5") testCompile("org.mockito:mockito-core:1.9.5")
if (project.name in ["spring", "spring-jms", "spring-orm",
"spring-orm-hibernate4", "spring-oxm", "spring-struts",
"spring-test", "spring-test-mvc", "spring-tx", "spring-web",
"spring-webmvc", "spring-webmvc-portlet", "spring-webmvc-tiles3"]) {
testCompile("org.easymock:easymock:${easymockVersion}")
testCompile "org.easymock:easymockclassextension:${easymockVersion}"
}
} }
ext.javadocLinks = [ ext.javadocLinks = [
@ -101,16 +103,6 @@ configure(allprojects) {
] as String[] ] as String[]
} }
configure(allprojects.findAll{it.name in ["spring", "spring-jms", "spring-orm",
"spring-orm-hibernate4", "spring-oxm", "spring-struts", "spring-test",
"spring-test-mvc", "spring-tx", "spring-web", "spring-webmvc",
"spring-webmvc-portlet", "spring-webmvc-tiles3"]}) {
dependencies {
testCompile("org.easymock:easymock:${easymockVersion}")
testCompile "org.easymock:easymockclassextension:${easymockVersion}"
}
}
configure(subprojects - project(":spring-build-src")) { subproject -> configure(subprojects - project(":spring-build-src")) { subproject ->
apply plugin: "merge" apply plugin: "merge"
apply from: "${gradleScriptDir}/publish-maven.gradle" apply from: "${gradleScriptDir}/publish-maven.gradle"
@ -160,14 +152,6 @@ configure(subprojects - project(":spring-build-src")) { subproject ->
} }
} }
configure(allprojects) {
dependencies {
testCompile("junit:junit:${junitVersion}")
testCompile("org.hamcrest:hamcrest-all:1.3")
}
test.systemProperties.put("testGroups", properties.get("testGroups"))
}
project("spring-build-src") { project("spring-build-src") {
description = "Exposes gradle buildSrc for IDE support" description = "Exposes gradle buildSrc for IDE support"
apply plugin: "groovy" apply plugin: "groovy"
@ -340,7 +324,7 @@ project("spring-context") {
optional("org.aspectj:aspectjweaver:${aspectjVersion}") optional("org.aspectj:aspectjweaver:${aspectjVersion}")
optional("org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1") optional("org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1")
testCompile("commons-dbcp:commons-dbcp:1.2.2") testCompile("commons-dbcp:commons-dbcp:1.2.2")
testCompile("javax.inject:com.springsource.org.atinject.tck:1.0.0") testCompile("javax.inject:javax.inject-tck:1")
} }
test { test {
@ -657,6 +641,10 @@ project("spring-webmvc-portlet") {
project("spring-test") { project("spring-test") {
description = "Spring TestContext Framework" description = "Spring TestContext Framework"
test {
useJUnit()
useTestNG()
}
dependencies { dependencies {
compile(project(":spring-core")) compile(project(":spring-core"))
optional(project(":spring-beans")) optional(project(":spring-beans"))
@ -967,3 +955,19 @@ configure(rootProject) {
} }
} }
} }
/*
* Support publication of artifacts versioned by topic branch.
* CI builds supply `-P BRANCH_NAME=<TOPIC>` to gradle at build time.
* If <TOPIC> starts with 'SPR-', change version
* from BUILD-SNAPSHOT => <TOPIC>-SNAPSHOT
* e.g. 3.2.1.BUILD-SNAPSHOT => 3.2.1.SPR-1234-SNAPSHOT
*/
def qualifyVersionIfNecessary(version) {
if (rootProject.hasProperty("BRANCH_NAME")) {
def qualifier = rootProject.getProperty("BRANCH_NAME")
if (qualifier.startsWith("SPR-")) {
version = version.replace('BUILD', qualifier)
}
}
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -33,19 +33,25 @@ class TestSourceSetDependenciesPlugin implements Plugin<Project> {
@Override @Override
public void apply(Project project) { public void apply(Project project) {
project.afterEvaluate { project.afterEvaluate {
Set<ProjectDependency> projectDependencies = new LinkedHashSet<>() Set<ProjectDependency> projectDependencies = new LinkedHashSet<ProjectDependency>()
for(def configurationName in ["compile", "optional", "provided"]) { collectProjectDependencies(projectDependencies, project)
Configuration configuration = project.getConfigurations().findByName(configurationName)
if(configuration) {
projectDependencies.addAll(
configuration.dependencies.findAll { it instanceof ProjectDependency }
)
}
}
projectDependencies.each { projectDependencies.each {
project.dependencies.add("testCompile", it.dependencyProject.sourceSets.test.output) project.dependencies.add("testCompile", it.dependencyProject.sourceSets.test.output)
} }
} }
} }
private void collectProjectDependencies(Set<ProjectDependency> projectDependencies,
Project project) {
for(def configurationName in ["compile", "optional", "provided"]) {
Configuration configuration = project.getConfigurations().findByName(configurationName)
if(configuration) {
configuration.dependencies.findAll { it instanceof ProjectDependency }.each {
projectDependencies.add(it)
collectProjectDependencies(projectDependencies, it.dependencyProject)
}
}
}
}
} }

View File

@ -13,8 +13,8 @@ _Within your locally cloned spring-framework working directory:_
## Known issues ## Known issues
1. `spring-aspects` does not compile out of the box due to references to aspect types unknown to IDEA. 1. `spring-aspects` does not compile out of the box due to references to aspect types unknown to IDEA.
See http://youtrack.jetbrains.com/issue/IDEA-64446 for details. In the meantime, you may want to See http://youtrack.jetbrains.com/issue/IDEA-64446 for details. In the meantime, the 'spring-aspects'
exclude `spring-aspects` from the overall project to avoid compilation errors. module has been excluded from the overall project to avoid compilation errors.
2. While all JUnit tests pass from the command line with Gradle, many will fail when run from IDEA. 2. While all JUnit tests pass from the command line with Gradle, many will fail when run from IDEA.
Resolving this is a work in progress. If attempting to run all JUnit tests from within IDEA, you will Resolving this is a work in progress. If attempting to run all JUnit tests from within IDEA, you will
likely need to set the following VM options to avoid out of memory errors: likely need to set the following VM options to avoid out of memory errors:

View File

@ -8,6 +8,10 @@ configurations {
ajInpath ajInpath
} }
// exclude spring-aspects as a module within IDEA until IDEA-64446 is resolved
tasks.getByName("idea").onlyIf { false }
tasks.getByName("ideaModule").onlyIf { false }
task compileJava(overwrite: true) { task compileJava(overwrite: true) {
dependsOn JavaPlugin.PROCESS_RESOURCES_TASK_NAME dependsOn JavaPlugin.PROCESS_RESOURCES_TASK_NAME
dependsOn configurations.ajc.getTaskDependencyFromProjectDependency(true, "compileJava") dependsOn configurations.ajc.getTaskDependencyFromProjectDependency(true, "compileJava")

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -29,10 +29,11 @@ import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.Matchers.startsWith; import static org.hamcrest.Matchers.not;
import static org.junit.Assert.*; import static org.junit.Assert.*;
/** /**
@ -54,6 +55,8 @@ public class AnnotationAsyncExecutionAspectTests {
@Test @Test
public void asyncMethodGetsRoutedAsynchronously() { public void asyncMethodGetsRoutedAsynchronously() {
Assume.group(TestGroup.PERFORMANCE);
ClassWithoutAsyncAnnotation obj = new ClassWithoutAsyncAnnotation(); ClassWithoutAsyncAnnotation obj = new ClassWithoutAsyncAnnotation();
obj.incrementAsync(); obj.incrementAsync();
executor.waitForCompletion(); executor.waitForCompletion();
@ -84,6 +87,8 @@ public class AnnotationAsyncExecutionAspectTests {
@Test @Test
public void voidMethodInAsyncClassGetsRoutedAsynchronously() { public void voidMethodInAsyncClassGetsRoutedAsynchronously() {
Assume.group(TestGroup.PERFORMANCE);
ClassWithAsyncAnnotation obj = new ClassWithAsyncAnnotation(); ClassWithAsyncAnnotation obj = new ClassWithAsyncAnnotation();
obj.increment(); obj.increment();
executor.waitForCompletion(); executor.waitForCompletion();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,10 +16,6 @@
package org.springframework.beans.factory; package org.springframework.beans.factory;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static test.util.TestResourceUtils.qualifiedResource;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -31,14 +27,21 @@ import java.util.Set;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.PropertyEditorRegistrar; import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.PropertyEditorRegistry; import org.springframework.beans.PropertyEditorRegistry;
import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*;
import static test.util.TestResourceUtils.*;
/** /**
* @author Guillaume Poirier * @author Guillaume Poirier
@ -72,6 +75,8 @@ public final class ConcurrentBeanFactoryTests {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(factory).loadBeanDefinitions(CONTEXT); new XmlBeanDefinitionReader(factory).loadBeanDefinitions(CONTEXT);
factory.addPropertyEditorRegistrar(new PropertyEditorRegistrar() { factory.addPropertyEditorRegistrar(new PropertyEditorRegistrar() {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -44,6 +44,8 @@ import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.propertyeditors.CustomNumberEditor; import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.UrlResource; import org.springframework.core.io.UrlResource;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import test.beans.GenericBean; import test.beans.GenericBean;
import test.beans.GenericIntegerBean; import test.beans.GenericIntegerBean;
@ -641,6 +643,8 @@ public class BeanFactoryGenericsTests {
@Test @Test
public void testSetBean() throws Exception { public void testSetBean() throws Exception {
Assume.group(TestGroup.LONG_RUNNING);
DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
new XmlBeanDefinitionReader(bf).loadBeanDefinitions( new XmlBeanDefinitionReader(bf).loadBeanDefinitions(
new ClassPathResource("genericBeanTests.xml", getClass())); new ClassPathResource("genericBeanTests.xml", getClass()));

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -18,18 +18,28 @@ package org.springframework.beans.support;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import junit.framework.TestCase;
import org.junit.Test;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*;
import test.beans.TestBean; import test.beans.TestBean;
/** /**
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Jean-Pierre PAWLAK * @author Jean-Pierre PAWLAK
* @author Chris Beams
* @since 20.05.2003 * @since 20.05.2003
*/ */
public class PagedListHolderTests extends TestCase { public class PagedListHolderTests {
@Test
public void testPagedListHolder() { public void testPagedListHolder() {
Assume.group(TestGroup.LONG_RUNNING);
TestBean tb1 = new TestBean(); TestBean tb1 = new TestBean();
tb1.setName("eva"); tb1.setName("eva");
tb1.setAge(25); tb1.setAge(25);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2012 the original author or authors. * Copyright 2010-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -20,10 +20,13 @@ import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Ehcache; import net.sf.ehcache.Ehcache;
import net.sf.ehcache.Element; import net.sf.ehcache.Element;
import net.sf.ehcache.config.CacheConfiguration; import net.sf.ehcache.config.CacheConfiguration;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.cache.Cache; import org.springframework.cache.Cache;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -95,6 +98,7 @@ public class EhCacheCacheTests {
@Test @Test
public void testExpiredElements() throws Exception { public void testExpiredElements() throws Exception {
Assume.group(TestGroup.LONG_RUNNING);
String key = "brancusi"; String key = "brancusi";
String value = "constantin"; String value = "constantin";
Element brancusi = new Element(key, value); Element brancusi = new Element(key, value);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -33,6 +33,7 @@ import java.util.Map;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.quartz.CronTrigger; import org.quartz.CronTrigger;
import org.quartz.Job; import org.quartz.Job;
@ -382,15 +383,19 @@ public class QuartzSupportTests {
verify(scheduler).shutdown(false); verify(scheduler).shutdown(false);
} }
/*public void testMethodInvocationWithConcurrency() throws Exception { @Ignore @Test
public void testMethodInvocationWithConcurrency() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
methodInvokingConcurrency(true); methodInvokingConcurrency(true);
}*/ }
// We can't test both since Quartz somehow seems to keep things in memory // We can't test both since Quartz somehow seems to keep things in memory
// enable both and one of them will fail (order doesn't matter). // enable both and one of them will fail (order doesn't matter).
/*public void testMethodInvocationWithoutConcurrency() throws Exception { @Ignore @Test
public void testMethodInvocationWithoutConcurrency() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
methodInvokingConcurrency(false); methodInvokingConcurrency(false);
}*/ }
private void methodInvokingConcurrency(boolean concurrent) throws Exception { private void methodInvokingConcurrency(boolean concurrent) throws Exception {
// Test the concurrency flag. // Test the concurrency flag.
@ -637,6 +642,8 @@ public class QuartzSupportTests {
@Test @Test
public void testSchedulerWithTaskExecutor() throws Exception { public void testSchedulerWithTaskExecutor() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
CountingTaskExecutor taskExecutor = new CountingTaskExecutor(); CountingTaskExecutor taskExecutor = new CountingTaskExecutor();
DummyJob.count = 0; DummyJob.count = 0;
@ -668,6 +675,8 @@ public class QuartzSupportTests {
@Test @Test
public void testSchedulerWithRunnable() throws Exception { public void testSchedulerWithRunnable() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
DummyRunnable.count = 0; DummyRunnable.count = 0;
JobDetail jobDetail = new JobDetailBean(); JobDetail jobDetail = new JobDetailBean();
@ -696,6 +705,8 @@ public class QuartzSupportTests {
@Test @Test
public void testSchedulerWithQuartzJobBean() throws Exception { public void testSchedulerWithQuartzJobBean() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
DummyJob.param = 0; DummyJob.param = 0;
DummyJob.count = 0; DummyJob.count = 0;
@ -727,6 +738,8 @@ public class QuartzSupportTests {
@Test @Test
public void testSchedulerWithSpringBeanJobFactory() throws Exception { public void testSchedulerWithSpringBeanJobFactory() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
DummyJob.param = 0; DummyJob.param = 0;
DummyJob.count = 0; DummyJob.count = 0;
@ -760,6 +773,7 @@ public class QuartzSupportTests {
@Test @Test
public void testSchedulerWithSpringBeanJobFactoryAndParamMismatchNotIgnored() throws Exception { public void testSchedulerWithSpringBeanJobFactoryAndParamMismatchNotIgnored() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
DummyJob.param = 0; DummyJob.param = 0;
DummyJob.count = 0; DummyJob.count = 0;
@ -794,6 +808,8 @@ public class QuartzSupportTests {
@Test @Test
public void testSchedulerWithSpringBeanJobFactoryAndRunnable() throws Exception { public void testSchedulerWithSpringBeanJobFactoryAndRunnable() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
DummyRunnable.param = 0; DummyRunnable.param = 0;
DummyRunnable.count = 0; DummyRunnable.count = 0;
@ -826,6 +842,7 @@ public class QuartzSupportTests {
@Test @Test
public void testSchedulerWithSpringBeanJobFactoryAndQuartzJobBean() throws Exception { public void testSchedulerWithSpringBeanJobFactoryAndQuartzJobBean() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
DummyJobBean.param = 0; DummyJobBean.param = 0;
DummyJobBean.count = 0; DummyJobBean.count = 0;
@ -858,6 +875,7 @@ public class QuartzSupportTests {
@Test @Test
public void testSchedulerWithSpringBeanJobFactoryAndJobSchedulingData() throws Exception { public void testSchedulerWithSpringBeanJobFactoryAndJobSchedulingData() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
DummyJob.param = 0; DummyJob.param = 0;
DummyJob.count = 0; DummyJob.count = 0;
@ -896,6 +914,7 @@ public class QuartzSupportTests {
@Test @Test
public void testWithTwoAnonymousMethodInvokingJobDetailFactoryBeans() throws InterruptedException { public void testWithTwoAnonymousMethodInvokingJobDetailFactoryBeans() throws InterruptedException {
Assume.group(TestGroup.PERFORMANCE);
ClassPathXmlApplicationContext ctx = ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("/org/springframework/scheduling/quartz/multipleAnonymousMethodInvokingJobDetailFB.xml"); new ClassPathXmlApplicationContext("/org/springframework/scheduling/quartz/multipleAnonymousMethodInvokingJobDetailFB.xml");
Thread.sleep(3000); Thread.sleep(3000);
@ -915,6 +934,7 @@ public class QuartzSupportTests {
@Test @Test
public void testSchedulerAccessorBean() throws InterruptedException { public void testSchedulerAccessorBean() throws InterruptedException {
Assume.group(TestGroup.PERFORMANCE);
ClassPathXmlApplicationContext ctx = ClassPathXmlApplicationContext ctx =
new ClassPathXmlApplicationContext("/org/springframework/scheduling/quartz/schedulerAccessorBean.xml"); new ClassPathXmlApplicationContext("/org/springframework/scheduling/quartz/schedulerAccessorBean.xml");
Thread.sleep(3000); Thread.sleep(3000);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,8 +16,6 @@
package org.springframework.aop.aspectj; package org.springframework.aop.aspectj;
import static org.junit.Assert.*;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.aop.framework.Advised; import org.springframework.aop.framework.Advised;
@ -26,9 +24,13 @@ import org.springframework.beans.ITestBean;
import org.springframework.beans.TestBean; import org.springframework.beans.TestBean;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import test.mixin.Lockable; import test.mixin.Lockable;
import static org.junit.Assert.*;
/** /**
* @author Rod Johnson * @author Rod Johnson
* @author Chris Beams * @author Chris Beams
@ -63,6 +65,8 @@ public final class DeclareParentsTests {
// on the introduction, in which case this would not be a problem. // on the introduction, in which case this would not be a problem.
@Test @Test
public void testLockingWorks() { public void testLockingWorks() {
Assume.group(TestGroup.LONG_RUNNING);
Object introductionObject = ctx.getBean("introduction"); Object introductionObject = ctx.getBean("introduction");
assertFalse("Introduction should not be proxied", AopUtils.isAopProxy(introductionObject)); assertFalse("Introduction should not be proxied", AopUtils.isAopProxy(introductionObject));

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -19,7 +19,6 @@ package org.springframework.context.support;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
@ -27,6 +26,8 @@ import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.Lifecycle; import org.springframework.context.Lifecycle;
import org.springframework.context.LifecycleProcessor; import org.springframework.context.LifecycleProcessor;
import org.springframework.context.SmartLifecycle; import org.springframework.context.SmartLifecycle;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -251,6 +252,8 @@ public class DefaultLifecycleProcessorTests {
@Test @Test
public void smartLifecycleGroupShutdown() throws Exception { public void smartLifecycleGroupShutdown() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>(); CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>();
TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forShutdownTests(1, 300, stoppedBeans); TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forShutdownTests(1, 300, stoppedBeans);
TestSmartLifecycleBean bean2 = TestSmartLifecycleBean.forShutdownTests(3, 100, stoppedBeans); TestSmartLifecycleBean bean2 = TestSmartLifecycleBean.forShutdownTests(3, 100, stoppedBeans);
@ -280,6 +283,8 @@ public class DefaultLifecycleProcessorTests {
@Test @Test
public void singleSmartLifecycleShutdown() throws Exception { public void singleSmartLifecycleShutdown() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>(); CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>();
TestSmartLifecycleBean bean = TestSmartLifecycleBean.forShutdownTests(99, 300, stoppedBeans); TestSmartLifecycleBean bean = TestSmartLifecycleBean.forShutdownTests(99, 300, stoppedBeans);
StaticApplicationContext context = new StaticApplicationContext(); StaticApplicationContext context = new StaticApplicationContext();
@ -386,6 +391,8 @@ public class DefaultLifecycleProcessorTests {
@Test @Test
public void dependentShutdownFirstEvenIfItsPhaseIsLower() throws Exception { public void dependentShutdownFirstEvenIfItsPhaseIsLower() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>(); CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>();
TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forShutdownTests(Integer.MIN_VALUE, 100, stoppedBeans); TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forShutdownTests(Integer.MIN_VALUE, 100, stoppedBeans);
TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forShutdownTests(1, 200, stoppedBeans); TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forShutdownTests(1, 200, stoppedBeans);
@ -458,6 +465,8 @@ public class DefaultLifecycleProcessorTests {
@Test @Test
public void dependentShutdownFirstAndIsSmartLifecycle() throws Exception { public void dependentShutdownFirstAndIsSmartLifecycle() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>(); CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>();
TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forShutdownTests(Integer.MIN_VALUE, 400, stoppedBeans); TestSmartLifecycleBean beanMin = TestSmartLifecycleBean.forShutdownTests(Integer.MIN_VALUE, 400, stoppedBeans);
TestSmartLifecycleBean beanNegative = TestSmartLifecycleBean.forShutdownTests(-99, 100, stoppedBeans); TestSmartLifecycleBean beanNegative = TestSmartLifecycleBean.forShutdownTests(-99, 100, stoppedBeans);
@ -521,6 +530,8 @@ public class DefaultLifecycleProcessorTests {
@Test @Test
public void dependentShutdownFirstButNotSmartLifecycle() throws Exception { public void dependentShutdownFirstButNotSmartLifecycle() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>(); CopyOnWriteArrayList<Lifecycle> stoppedBeans = new CopyOnWriteArrayList<Lifecycle>();
TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forShutdownTests(1, 200, stoppedBeans); TestSmartLifecycleBean bean1 = TestSmartLifecycleBean.forShutdownTests(1, 200, stoppedBeans);
TestLifecycleBean simpleBean = TestLifecycleBean.forShutdownTests(stoppedBeans); TestLifecycleBean simpleBean = TestLifecycleBean.forShutdownTests(stoppedBeans);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -20,6 +20,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
@ -28,6 +29,8 @@ import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.context.support.GenericApplicationContext; import org.springframework.context.support.GenericApplicationContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -43,6 +46,10 @@ public class AsyncExecutionTests {
private static int listenerConstructed = 0; private static int listenerConstructed = 0;
@Before
public void setUp() {
Assume.group(TestGroup.PERFORMANCE);
}
@Test @Test
public void asyncMethods() throws Exception { public void asyncMethods() throws Exception {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -26,7 +26,6 @@ import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor; import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
@ -37,6 +36,8 @@ import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.IntervalTask; import org.springframework.scheduling.config.IntervalTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.ScheduledMethodRunnable; import org.springframework.scheduling.support.ScheduledMethodRunnable;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -130,6 +131,8 @@ public class ScheduledAnnotationBeanPostProcessorTests {
@Test @Test
public void cronTask() throws InterruptedException { public void cronTask() throws InterruptedException {
Assume.group(TestGroup.LONG_RUNNING);
StaticApplicationContext context = new StaticApplicationContext(); StaticApplicationContext context = new StaticApplicationContext();
BeanDefinition processorDefinition = new RootBeanDefinition(ScheduledAnnotationBeanPostProcessor.class); BeanDefinition processorDefinition = new RootBeanDefinition(ScheduledAnnotationBeanPostProcessor.class);
BeanDefinition targetDefinition = new RootBeanDefinition( BeanDefinition targetDefinition = new RootBeanDefinition(

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,15 +16,6 @@
package org.springframework.scheduling.concurrent; package org.springframework.scheduling.concurrent;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import static org.mockito.BDDMockito.willThrow;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadFactory;
@ -32,6 +23,12 @@ import java.util.concurrent.ThreadFactory;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.springframework.core.task.NoOpRunnable; import org.springframework.core.task.NoOpRunnable;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.*;
import static org.mockito.Mockito.*;
/** /**
* @author Rick Evans * @author Rick Evans
@ -97,6 +94,8 @@ public class ScheduledExecutorFactoryBeanTests {
@Test @Test
public void testOneTimeExecutionIsSetUpAndFiresCorrectly() throws Exception { public void testOneTimeExecutionIsSetUpAndFiresCorrectly() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
Runnable runnable = mock(Runnable.class); Runnable runnable = mock(Runnable.class);
ScheduledExecutorFactoryBean factory = new ScheduledExecutorFactoryBean(); ScheduledExecutorFactoryBean factory = new ScheduledExecutorFactoryBean();
@ -112,6 +111,8 @@ public class ScheduledExecutorFactoryBeanTests {
@Test @Test
public void testFixedRepeatedExecutionIsSetUpAndFiresCorrectly() throws Exception { public void testFixedRepeatedExecutionIsSetUpAndFiresCorrectly() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
Runnable runnable = mock(Runnable.class); Runnable runnable = mock(Runnable.class);
ScheduledExecutorTask task = new ScheduledExecutorTask(runnable); ScheduledExecutorTask task = new ScheduledExecutorTask(runnable);
@ -129,6 +130,8 @@ public class ScheduledExecutorFactoryBeanTests {
@Test @Test
public void testFixedRepeatedExecutionIsSetUpAndFiresCorrectlyAfterException() throws Exception { public void testFixedRepeatedExecutionIsSetUpAndFiresCorrectlyAfterException() throws Exception {
Assume.group(TestGroup.PERFORMANCE);
Runnable runnable = mock(Runnable.class); Runnable runnable = mock(Runnable.class);
willThrow(new IllegalStateException()).given(runnable).run(); willThrow(new IllegalStateException()).given(runnable).run();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -32,6 +32,7 @@ import java.io.FileNotFoundException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map; import java.util.Map;
import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.springframework.aop.support.AopUtils; import org.springframework.aop.support.AopUtils;
@ -53,6 +54,8 @@ import org.springframework.scripting.ScriptCompilationException;
import org.springframework.scripting.ScriptSource; import org.springframework.scripting.ScriptSource;
import org.springframework.scripting.support.ScriptFactoryPostProcessor; import org.springframework.scripting.support.ScriptFactoryPostProcessor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
/** /**
* @author Rob Harrop * @author Rob Harrop
@ -64,6 +67,11 @@ import org.springframework.stereotype.Component;
*/ */
public class GroovyScriptFactoryTests { public class GroovyScriptFactoryTests {
@Before
public void setUp() {
Assume.group(TestGroup.LONG_RUNNING);
}
@Test @Test
public void testStaticScript() throws Exception { public void testStaticScript() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("groovyContext.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("groovyContext.xml", getClass());
@ -396,6 +404,8 @@ public class GroovyScriptFactoryTests {
@Test @Test
public void testAnonymousScriptDetected() throws Exception { public void testAnonymousScriptDetected() throws Exception {
Assume.group(TestGroup.LONG_RUNNING);
ApplicationContext ctx = new ClassPathXmlApplicationContext("groovy-with-xsd.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("groovy-with-xsd.xml", getClass());
Map<?, Messenger> beans = ctx.getBeansOfType(Messenger.class); Map<?, Messenger> beans = ctx.getBeansOfType(Messenger.class);
assertEquals(4, beans.size()); assertEquals(4, beans.size());

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -18,8 +18,8 @@ package org.springframework.scripting.jruby;
import java.util.Map; import java.util.Map;
import junit.framework.TestCase; import org.junit.Before;
import org.junit.Test;
import org.springframework.aop.support.AopUtils; import org.springframework.aop.support.AopUtils;
import org.springframework.aop.target.dynamic.Refreshable; import org.springframework.aop.target.dynamic.Refreshable;
import org.springframework.beans.TestBean; import org.springframework.beans.TestBean;
@ -31,13 +31,18 @@ import org.springframework.scripting.ConfigurableMessenger;
import org.springframework.scripting.Messenger; import org.springframework.scripting.Messenger;
import org.springframework.scripting.ScriptCompilationException; import org.springframework.scripting.ScriptCompilationException;
import org.springframework.scripting.TestBeanAwareMessenger; import org.springframework.scripting.TestBeanAwareMessenger;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*;
/** /**
* @author Rob Harrop * @author Rob Harrop
* @author Rick Evans * @author Rick Evans
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Chris Beams
*/ */
public class JRubyScriptFactoryTests extends TestCase { public class JRubyScriptFactoryTests {
private static final String RUBY_SCRIPT_SOURCE_LOCATOR = private static final String RUBY_SCRIPT_SOURCE_LOCATOR =
"inline:require 'java'\n" + "inline:require 'java'\n" +
@ -45,7 +50,12 @@ public class JRubyScriptFactoryTests extends TestCase {
"end\n" + "end\n" +
"RubyBar.new"; "RubyBar.new";
@Before
public void setUp() {
Assume.group(TestGroup.LONG_RUNNING);
}
@Test
public void testStaticScript() throws Exception { public void testStaticScript() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyContext.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyContext.xml", getClass());
Calculator calc = (Calculator) ctx.getBean("calculator"); Calculator calc = (Calculator) ctx.getBean("calculator");
@ -64,6 +74,7 @@ public class JRubyScriptFactoryTests extends TestCase {
assertEquals("Message is incorrect", desiredMessage, messenger.getMessage()); assertEquals("Message is incorrect", desiredMessage, messenger.getMessage());
} }
@Test
public void testNonStaticScript() throws Exception { public void testNonStaticScript() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyRefreshableContext.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyRefreshableContext.xml", getClass());
Messenger messenger = (Messenger) ctx.getBean("messenger"); Messenger messenger = (Messenger) ctx.getBean("messenger");
@ -81,6 +92,7 @@ public class JRubyScriptFactoryTests extends TestCase {
assertEquals("Incorrect refresh count", 2, refreshable.getRefreshCount()); assertEquals("Incorrect refresh count", 2, refreshable.getRefreshCount());
} }
@Test
public void testScriptCompilationException() throws Exception { public void testScriptCompilationException() throws Exception {
try { try {
new ClassPathXmlApplicationContext("jrubyBrokenContext.xml", getClass()); new ClassPathXmlApplicationContext("jrubyBrokenContext.xml", getClass());
@ -91,6 +103,7 @@ public class JRubyScriptFactoryTests extends TestCase {
} }
} }
@Test
public void testCtorWithNullScriptSourceLocator() throws Exception { public void testCtorWithNullScriptSourceLocator() throws Exception {
try { try {
new JRubyScriptFactory(null, new Class<?>[]{Messenger.class}); new JRubyScriptFactory(null, new Class<?>[]{Messenger.class});
@ -100,6 +113,7 @@ public class JRubyScriptFactoryTests extends TestCase {
} }
} }
@Test
public void testCtorWithEmptyScriptSourceLocator() throws Exception { public void testCtorWithEmptyScriptSourceLocator() throws Exception {
try { try {
new JRubyScriptFactory("", new Class<?>[]{Messenger.class}); new JRubyScriptFactory("", new Class<?>[]{Messenger.class});
@ -109,6 +123,7 @@ public class JRubyScriptFactoryTests extends TestCase {
} }
} }
@Test
public void testCtorWithWhitespacedScriptSourceLocator() throws Exception { public void testCtorWithWhitespacedScriptSourceLocator() throws Exception {
try { try {
new JRubyScriptFactory("\n ", new Class<?>[]{Messenger.class}); new JRubyScriptFactory("\n ", new Class<?>[]{Messenger.class});
@ -118,6 +133,7 @@ public class JRubyScriptFactoryTests extends TestCase {
} }
} }
@Test
public void testCtorWithNullScriptInterfacesArray() throws Exception { public void testCtorWithNullScriptInterfacesArray() throws Exception {
try { try {
new JRubyScriptFactory(RUBY_SCRIPT_SOURCE_LOCATOR, null); new JRubyScriptFactory(RUBY_SCRIPT_SOURCE_LOCATOR, null);
@ -127,6 +143,7 @@ public class JRubyScriptFactoryTests extends TestCase {
} }
} }
@Test
public void testCtorWithEmptyScriptInterfacesArray() throws Exception { public void testCtorWithEmptyScriptInterfacesArray() throws Exception {
try { try {
new JRubyScriptFactory(RUBY_SCRIPT_SOURCE_LOCATOR, new Class<?>[]{}); new JRubyScriptFactory(RUBY_SCRIPT_SOURCE_LOCATOR, new Class<?>[]{});
@ -136,6 +153,7 @@ public class JRubyScriptFactoryTests extends TestCase {
} }
} }
@Test
public void testResourceScriptFromTag() throws Exception { public void testResourceScriptFromTag() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-with-xsd.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-with-xsd.xml", getClass());
TestBean testBean = (TestBean) ctx.getBean("testBean"); TestBean testBean = (TestBean) ctx.getBean("testBean");
@ -151,6 +169,7 @@ public class JRubyScriptFactoryTests extends TestCase {
assertEquals(testBean, messengerByName.getTestBean()); assertEquals(testBean, messengerByName.getTestBean());
} }
@Test
public void testPrototypeScriptFromTag() throws Exception { public void testPrototypeScriptFromTag() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-with-xsd.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-with-xsd.xml", getClass());
ConfigurableMessenger messenger = (ConfigurableMessenger) ctx.getBean("messengerPrototype"); ConfigurableMessenger messenger = (ConfigurableMessenger) ctx.getBean("messengerPrototype");
@ -166,6 +185,7 @@ public class JRubyScriptFactoryTests extends TestCase {
assertEquals("Byebye World!", messenger2.getMessage()); assertEquals("Byebye World!", messenger2.getMessage());
} }
@Test
public void testInlineScriptFromTag() throws Exception { public void testInlineScriptFromTag() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-with-xsd.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-with-xsd.xml", getClass());
Calculator calculator = (Calculator) ctx.getBean("calculator"); Calculator calculator = (Calculator) ctx.getBean("calculator");
@ -173,6 +193,7 @@ public class JRubyScriptFactoryTests extends TestCase {
assertFalse(calculator instanceof Refreshable); assertFalse(calculator instanceof Refreshable);
} }
@Test
public void testRefreshableFromTag() throws Exception { public void testRefreshableFromTag() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-with-xsd.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-with-xsd.xml", getClass());
Messenger messenger = (Messenger) ctx.getBean("refreshableMessenger"); Messenger messenger = (Messenger) ctx.getBean("refreshableMessenger");
@ -190,6 +211,7 @@ public class JRubyScriptFactoryTests extends TestCase {
assertEquals(0, calc.add(2, -2)); assertEquals(0, calc.add(2, -2));
} }
@Test
public void testWithComplexArg() throws Exception { public void testWithComplexArg() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyContext.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyContext.xml", getClass());
Printer printer = (Printer) ctx.getBean("printer"); Printer printer = (Printer) ctx.getBean("printer");
@ -198,6 +220,7 @@ public class JRubyScriptFactoryTests extends TestCase {
assertEquals(1, printable.count); assertEquals(1, printable.count);
} }
@Test
public void testWithPrimitiveArgsInReturnTypeAndParameters() throws Exception { public void testWithPrimitiveArgsInReturnTypeAndParameters() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyContextForPrimitives.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyContextForPrimitives.xml", getClass());
PrimitiveAdder adder = (PrimitiveAdder) ctx.getBean("adder"); PrimitiveAdder adder = (PrimitiveAdder) ctx.getBean("adder");
@ -211,6 +234,7 @@ public class JRubyScriptFactoryTests extends TestCase {
assertEquals('c', adder.echo('c')); assertEquals('c', adder.echo('c'));
} }
@Test
public void testWithWrapperArgsInReturnTypeAndParameters() throws Exception { public void testWithWrapperArgsInReturnTypeAndParameters() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyContextForWrappers.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jrubyContextForWrappers.xml", getClass());
WrapperAdder adder = (WrapperAdder) ctx.getBean("adder"); WrapperAdder adder = (WrapperAdder) ctx.getBean("adder");
@ -266,6 +290,7 @@ public class JRubyScriptFactoryTests extends TestCase {
} }
} }
@Test
public void testAOP() throws Exception { public void testAOP() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-aop.xml", getClass()); ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-aop.xml", getClass());
Messenger messenger = (Messenger) ctx.getBean("messenger"); Messenger messenger = (Messenger) ctx.getBean("messenger");

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,7 +17,9 @@
package org.springframework.scripting.support; package org.springframework.scripting.support;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.FatalBeanException; import org.springframework.beans.FatalBeanException;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
@ -28,12 +30,17 @@ import org.springframework.context.support.GenericApplicationContext;
import org.springframework.scripting.Messenger; import org.springframework.scripting.Messenger;
import org.springframework.scripting.ScriptCompilationException; import org.springframework.scripting.ScriptCompilationException;
import org.springframework.scripting.groovy.GroovyScriptFactory; import org.springframework.scripting.groovy.GroovyScriptFactory;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*;
/** /**
* @author Rick Evans * @author Rick Evans
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Chris Beams
*/ */
public class ScriptFactoryPostProcessorTests extends TestCase { public class ScriptFactoryPostProcessorTests {
private static final String MESSAGE_TEXT = "Bingo"; private static final String MESSAGE_TEXT = "Bingo";
@ -69,11 +76,17 @@ public class ScriptFactoryPostProcessorTests extends TestCase {
" }\n" + " }\n" +
"}"; "}";
@Before
public void setUp() {
Assume.group(TestGroup.PERFORMANCE);
}
@Test
public void testDoesNothingWhenPostProcessingNonScriptFactoryTypeBeforeInstantiation() throws Exception { public void testDoesNothingWhenPostProcessingNonScriptFactoryTypeBeforeInstantiation() throws Exception {
assertNull(new ScriptFactoryPostProcessor().postProcessBeforeInstantiation(getClass(), "a.bean")); assertNull(new ScriptFactoryPostProcessor().postProcessBeforeInstantiation(getClass(), "a.bean"));
} }
@Test
public void testThrowsExceptionIfGivenNonAbstractBeanFactoryImplementation() throws Exception { public void testThrowsExceptionIfGivenNonAbstractBeanFactoryImplementation() throws Exception {
try { try {
new ScriptFactoryPostProcessor().setBeanFactory(mock(BeanFactory.class)); new ScriptFactoryPostProcessor().setBeanFactory(mock(BeanFactory.class));
@ -83,6 +96,7 @@ public class ScriptFactoryPostProcessorTests extends TestCase {
} }
} }
@Test
public void testChangeScriptWithRefreshableBeanFunctionality() throws Exception { public void testChangeScriptWithRefreshableBeanFunctionality() throws Exception {
BeanDefinition processorBeanDefinition = createScriptFactoryPostProcessor(true); BeanDefinition processorBeanDefinition = createScriptFactoryPostProcessor(true);
BeanDefinition scriptedBeanDefinition = createScriptedGroovyBean(); BeanDefinition scriptedBeanDefinition = createScriptedGroovyBean();
@ -103,6 +117,7 @@ public class ScriptFactoryPostProcessorTests extends TestCase {
assertEquals(EXPECTED_CHANGED_MESSAGE_TEXT, refreshedMessenger.getMessage()); assertEquals(EXPECTED_CHANGED_MESSAGE_TEXT, refreshedMessenger.getMessage());
} }
@Test
public void testChangeScriptWithNoRefreshableBeanFunctionality() throws Exception { public void testChangeScriptWithNoRefreshableBeanFunctionality() throws Exception {
BeanDefinition processorBeanDefinition = createScriptFactoryPostProcessor(false); BeanDefinition processorBeanDefinition = createScriptFactoryPostProcessor(false);
BeanDefinition scriptedBeanDefinition = createScriptedGroovyBean(); BeanDefinition scriptedBeanDefinition = createScriptedGroovyBean();
@ -123,6 +138,7 @@ public class ScriptFactoryPostProcessorTests extends TestCase {
MESSAGE_TEXT, refreshedMessenger.getMessage()); MESSAGE_TEXT, refreshedMessenger.getMessage());
} }
@Test
public void testRefreshedScriptReferencePropagatesToCollaborators() throws Exception { public void testRefreshedScriptReferencePropagatesToCollaborators() throws Exception {
BeanDefinition processorBeanDefinition = createScriptFactoryPostProcessor(true); BeanDefinition processorBeanDefinition = createScriptFactoryPostProcessor(true);
BeanDefinition scriptedBeanDefinition = createScriptedGroovyBean(); BeanDefinition scriptedBeanDefinition = createScriptedGroovyBean();
@ -150,6 +166,7 @@ public class ScriptFactoryPostProcessorTests extends TestCase {
assertEquals(EXPECTED_CHANGED_MESSAGE_TEXT, collaborator.getMessage()); assertEquals(EXPECTED_CHANGED_MESSAGE_TEXT, collaborator.getMessage());
} }
@Test
public void testReferencesAcrossAContainerHierarchy() throws Exception { public void testReferencesAcrossAContainerHierarchy() throws Exception {
GenericApplicationContext businessContext = new GenericApplicationContext(); GenericApplicationContext businessContext = new GenericApplicationContext();
businessContext.registerBeanDefinition("messenger", BeanDefinitionBuilder.rootBeanDefinition(StubMessenger.class).getBeanDefinition()); businessContext.registerBeanDefinition("messenger", BeanDefinitionBuilder.rootBeanDefinition(StubMessenger.class).getBeanDefinition());
@ -165,11 +182,13 @@ public class ScriptFactoryPostProcessorTests extends TestCase {
presentationCtx.refresh(); presentationCtx.refresh();
} }
@Test
public void testScriptHavingAReferenceToAnotherBean() throws Exception { public void testScriptHavingAReferenceToAnotherBean() throws Exception {
// just tests that the (singleton) script-backed bean is able to be instantiated with references to its collaborators // just tests that the (singleton) script-backed bean is able to be instantiated with references to its collaborators
new ClassPathXmlApplicationContext("org/springframework/scripting/support/groovyReferences.xml"); new ClassPathXmlApplicationContext("org/springframework/scripting/support/groovyReferences.xml");
} }
@Test
public void testForRefreshedScriptHavingErrorPickedUpOnFirstCall() throws Exception { public void testForRefreshedScriptHavingErrorPickedUpOnFirstCall() throws Exception {
BeanDefinition processorBeanDefinition = createScriptFactoryPostProcessor(true); BeanDefinition processorBeanDefinition = createScriptFactoryPostProcessor(true);
BeanDefinition scriptedBeanDefinition = createScriptedGroovyBean(); BeanDefinition scriptedBeanDefinition = createScriptedGroovyBean();
@ -200,6 +219,7 @@ public class ScriptFactoryPostProcessorTests extends TestCase {
} }
} }
@Test
public void testPrototypeScriptedBean() throws Exception { public void testPrototypeScriptedBean() throws Exception {
GenericApplicationContext ctx = new GenericApplicationContext(); GenericApplicationContext ctx = new GenericApplicationContext();
ctx.registerBeanDefinition("messenger", BeanDefinitionBuilder.rootBeanDefinition(StubMessenger.class).getBeanDefinition()); ctx.registerBeanDefinition("messenger", BeanDefinitionBuilder.rootBeanDefinition(StubMessenger.class).getBeanDefinition());

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -27,6 +27,8 @@ import org.springframework.core.io.UrlResource;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
/** /**
* Unit test checking the behaviour of {@link CachingMetadataReaderFactory under load. * Unit test checking the behaviour of {@link CachingMetadataReaderFactory under load.
@ -47,6 +49,8 @@ public class CachingMetadataReaderLeakTest {
@Test @Test
public void testSignificantLoad() throws Exception { public void testSignificantLoad() throws Exception {
Assume.group(TestGroup.LONG_RUNNING);
// the biggest public class in the JDK (>60k) // the biggest public class in the JDK (>60k)
URL url = getClass().getResource("/java/awt/Component.class"); URL url = getClass().getResource("/java/awt/Component.class");
assertThat(url, notNullValue()); assertThat(url, notNullValue());

View File

@ -26,12 +26,23 @@ import java.util.Set;
* *
* @see Assume#group(TestGroup) * @see Assume#group(TestGroup)
* @author Phillip Webb * @author Phillip Webb
* @author Chris Beams
*/ */
public enum TestGroup { public enum TestGroup {
/** /**
* Performance related tests that may take a considerable time to run. * Tests that take a considerable amount of time to run. Any test lasting longer than
* 500ms should be considered a candidate in order to avoid making the overall test
* suite too slow to run during the normal development cycle.
*/
LONG_RUNNING,
/**
* Performance-related tests that may fail unpredictably based on CPU profile and load.
* Any test using {@link Thread#sleep}, {@link Object#wait}, Spring's
* {@code StopWatch}, etc. should be considered a candidate as their successful
* execution is likely to be based on events occurring within a given time window.
*/ */
PERFORMANCE; PERFORMANCE;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,11 +16,6 @@
package org.springframework.jdbc.config; package org.springframework.jdbc.config;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.junit.Rule; import org.junit.Rule;
@ -37,10 +32,16 @@ import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean;
import org.springframework.jdbc.datasource.init.DataSourceInitializer; import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
/** /**
* @author Dave Syer * @author Dave Syer
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Chris Beams
*/ */
public class JdbcNamespaceIntegrationTests { public class JdbcNamespaceIntegrationTests {
@ -49,6 +50,8 @@ public class JdbcNamespaceIntegrationTests {
@Test @Test
public void testCreateEmbeddedDatabase() throws Exception { public void testCreateEmbeddedDatabase() throws Exception {
Assume.group(TestGroup.LONG_RUNNING);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"org/springframework/jdbc/config/jdbc-config.xml"); "org/springframework/jdbc/config/jdbc-config.xml");
assertCorrectSetup(context, "dataSource", "h2DataSource", "derbyDataSource"); assertCorrectSetup(context, "dataSource", "h2DataSource", "derbyDataSource");
@ -58,6 +61,8 @@ public class JdbcNamespaceIntegrationTests {
@Test @Test
public void testCreateEmbeddedDatabaseAgain() throws Exception { public void testCreateEmbeddedDatabaseAgain() throws Exception {
// If Derby isn't cleaned up properly this will fail... // If Derby isn't cleaned up properly this will fail...
Assume.group(TestGroup.LONG_RUNNING);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"org/springframework/jdbc/config/jdbc-config.xml"); "org/springframework/jdbc/config/jdbc-config.xml");
assertCorrectSetup(context, "derbyDataSource"); assertCorrectSetup(context, "derbyDataSource");

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2013 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -39,6 +39,8 @@ import org.mockito.InOrder;
import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.jdbc.UncategorizedSQLException;
import org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor; import org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import org.springframework.transaction.CannotCreateTransactionException; import org.springframework.transaction.CannotCreateTransactionException;
import org.springframework.transaction.IllegalTransactionStateException; import org.springframework.transaction.IllegalTransactionStateException;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
@ -845,6 +847,8 @@ public class DataSourceTransactionManagerTests {
} }
private void doTestTransactionWithTimeout(int timeout) throws Exception { private void doTestTransactionWithTimeout(int timeout) throws Exception {
Assume.group(TestGroup.PERFORMANCE);
PreparedStatement ps = mock(PreparedStatement.class); PreparedStatement ps = mock(PreparedStatement.class);
given(con.getAutoCommit()).willReturn(true); given(con.getAutoCommit()).willReturn(true);
given(con.prepareStatement("some SQL statement")).willReturn(ps); given(con.prepareStatement("some SQL statement")).willReturn(ps);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2010 the original author or authors. * Copyright 2002-2012 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,13 +16,15 @@
package org.springframework.jdbc.datasource.embedded; package org.springframework.jdbc.datasource.embedded;
import static org.junit.Assert.*;
import org.junit.Test; import org.junit.Test;
import org.springframework.core.io.ClassRelativeResourceLoader; import org.springframework.core.io.ClassRelativeResourceLoader;
import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.init.CannotReadScriptException; import org.springframework.jdbc.datasource.init.CannotReadScriptException;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import static org.junit.Assert.*;
/** /**
* @author Keith Donald * @author Keith Donald
@ -59,6 +61,8 @@ public class EmbeddedDatabaseBuilderTests {
@Test @Test
public void testBuildDerby() { public void testBuildDerby() {
Assume.group(TestGroup.LONG_RUNNING);
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(new ClassRelativeResourceLoader(getClass())); EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(new ClassRelativeResourceLoader(getClass()));
EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.DERBY).addScript("db-schema-derby.sql").addScript("db-test-data.sql").build(); EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.DERBY).addScript("db-schema-derby.sql").addScript("db-test-data.sql").build();
assertDatabaseCreatedAndShutdown(db); assertDatabaseCreatedAndShutdown(db);

View File

@ -7,8 +7,8 @@ configurations {
dependencies { dependencies {
castor "org.codehaus.castor:castor-anttasks:1.2" castor "org.codehaus.castor:castor-anttasks:1.2"
castor "velocity:velocity:1.5" castor "velocity:velocity:1.5"
xjc "com.sun.xml:com.springsource.com.sun.tools.xjc:2.1.7" xjc "com.sun.xml.bind:jaxb-xjc:2.1.7"
xmlbeans "org.apache.xmlbeans:com.springsource.org.apache.xmlbeans:2.4.0" xmlbeans "org.apache.xmlbeans:xmlbeans:2.4.0"
jibx "org.jibx:jibx-bind:1.2.3" jibx "org.jibx:jibx-bind:1.2.3"
jibx "bcel:bcel:5.1" jibx "bcel:bcel:5.1"
} }

View File

@ -237,7 +237,8 @@ public class FailingBeforeAndAfterMethodsTests {
@BeforeTransaction @BeforeTransaction
public void beforeTransaction() { public void beforeTransaction() {
org.testng.Assert.fail("always failing beforeTransaction()"); // See SPR-8116
//org.testng.Assert.fail("always failing beforeTransaction()");
} }
} }
@ -250,7 +251,8 @@ public class FailingBeforeAndAfterMethodsTests {
@AfterTransaction @AfterTransaction
public void afterTransaction() { public void afterTransaction() {
org.testng.Assert.fail("always failing afterTransaction()"); // See SPR-8116
//org.testng.Assert.fail("always failing afterTransaction()");
} }
} }

View File

@ -20,6 +20,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties; import java.util.Properties;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
@ -27,6 +28,7 @@ import javax.servlet.ServletContext;
import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.web.context.ServletContextAware; import org.springframework.web.context.ServletContextAware;
@ -51,11 +53,11 @@ public class ContentNegotiationManagerFactoryBean
private boolean ignoreAcceptHeader = false; private boolean ignoreAcceptHeader = false;
private Properties mediaTypes = new Properties(); private Map<String, MediaType> mediaTypes = new HashMap<String, MediaType>();
private Boolean useJaf; private Boolean useJaf;
private String parameterName; private String parameterName = "format";
private MediaType defaultContentType; private MediaType defaultContentType;
@ -63,7 +65,6 @@ public class ContentNegotiationManagerFactoryBean
private ServletContext servletContext; private ServletContext servletContext;
/** /**
* Indicate whether the extension of the request path should be used to determine * Indicate whether the extension of the request path should be used to determine
* the requested media type with the <em>highest priority</em>. * the requested media type with the <em>highest priority</em>.
@ -76,21 +77,43 @@ public class ContentNegotiationManagerFactoryBean
} }
/** /**
* Add mappings from file extensions to media types. * Add mappings from file extensions to media types represented as strings.
* <p>If this property is not set, the Java Action Framework, if available, may * <p>When this mapping is not set or when an extension is not found, the Java
* still be used in conjunction with {@link #setFavorPathExtension(boolean)}. * Action Framework, if available, may be used if enabled via
* {@link #setFavorPathExtension(boolean)}.
*
* @see #addMediaType(String, MediaType)
* @see #addMediaTypes(Map)
*/ */
public void setMediaTypes(Properties mediaTypes) { public void setMediaTypes(Properties mediaTypes) {
if (!CollectionUtils.isEmpty(mediaTypes)) { if (!CollectionUtils.isEmpty(mediaTypes)) {
for (Map.Entry<Object, Object> entry : mediaTypes.entrySet()) { for (Entry<Object, Object> entry : mediaTypes.entrySet()) {
String extension = ((String) entry.getKey()).toLowerCase(Locale.ENGLISH); String extension = ((String)entry.getKey()).toLowerCase(Locale.ENGLISH);
this.mediaTypes.put(extension, MediaType.valueOf((String) entry.getValue())); this.mediaTypes.put(extension, MediaType.valueOf((String) entry.getValue()));
} }
} }
} }
public Properties getMediaTypes() { /**
return this.mediaTypes; * Add a mapping from a file extension to a media type.
* <p>If no mapping is added or when an extension is not found, the Java
* Action Framework, if available, may be used if enabled via
* {@link #setFavorPathExtension(boolean)}.
*/
public void addMediaType(String fileExtension, MediaType mediaType) {
this.mediaTypes.put(fileExtension, mediaType);
}
/**
* Add mappings from file extensions to media types.
* <p>If no mappings are added or when an extension is not found, the Java
* Action Framework, if available, may be used if enabled via
* {@link #setFavorPathExtension(boolean)}.
*/
public void addMediaTypes(Map<String, MediaType> mediaTypes) {
if (mediaTypes != null) {
this.mediaTypes.putAll(mediaTypes);
}
} }
/** /**
@ -98,6 +121,7 @@ public class ContentNegotiationManagerFactoryBean
* to map from file extensions to media types. This is used only when * to map from file extensions to media types. This is used only when
* {@link #setFavorPathExtension(boolean)} is set to {@code true}. * {@link #setFavorPathExtension(boolean)} is set to {@code true}.
* <p>The default value is {@code true}. * <p>The default value is {@code true}.
*
* @see #parameterName * @see #parameterName
* @see #setMediaTypes(Properties) * @see #setMediaTypes(Properties)
*/ */
@ -114,6 +138,7 @@ public class ContentNegotiationManagerFactoryBean
* {@code "application/pdf"} regardless of the {@code Accept} header. * {@code "application/pdf"} regardless of the {@code Accept} header.
* <p>To use this option effectively you must also configure the MediaType * <p>To use this option effectively you must also configure the MediaType
* type mappings via {@link #setMediaTypes(Properties)}. * type mappings via {@link #setMediaTypes(Properties)}.
*
* @see #setParameterName(String) * @see #setParameterName(String)
*/ */
public void setFavorParameter(boolean favorParameter) { public void setFavorParameter(boolean favorParameter) {
@ -126,6 +151,7 @@ public class ContentNegotiationManagerFactoryBean
* <p>The default parameter name is {@code "format"}. * <p>The default parameter name is {@code "format"}.
*/ */
public void setParameterName(String parameterName) { public void setParameterName(String parameterName) {
Assert.notNull(parameterName, "parameterName is required");
this.parameterName = parameterName; this.parameterName = parameterName;
} }
@ -143,8 +169,8 @@ public class ContentNegotiationManagerFactoryBean
/** /**
* Set the default content type. * Set the default content type.
* <p>This content type will be used when neither the request path extension, * <p>This content type will be used when neither the request path extension,
* nor a request parameter, nor the {@code Accept} header could help determine * nor a request parameter, nor the {@code Accept} header could help
* the requested content type. * determine the requested content type.
*/ */
public void setDefaultContentType(MediaType defaultContentType) { public void setDefaultContentType(MediaType defaultContentType) {
this.defaultContentType = defaultContentType; this.defaultContentType = defaultContentType;
@ -157,16 +183,12 @@ public class ContentNegotiationManagerFactoryBean
public void afterPropertiesSet() throws Exception { public void afterPropertiesSet() throws Exception {
List<ContentNegotiationStrategy> strategies = new ArrayList<ContentNegotiationStrategy>(); List<ContentNegotiationStrategy> strategies = new ArrayList<ContentNegotiationStrategy>();
Map<String, MediaType> mediaTypesMap = new HashMap<String, MediaType>();
CollectionUtils.mergePropertiesIntoMap(this.mediaTypes, mediaTypesMap);
if (this.favorPathExtension) { if (this.favorPathExtension) {
PathExtensionContentNegotiationStrategy strategy; PathExtensionContentNegotiationStrategy strategy;
if (this.servletContext != null) { if (this.servletContext != null) {
strategy = new ServletPathExtensionContentNegotiationStrategy(this.servletContext, mediaTypesMap); strategy = new ServletPathExtensionContentNegotiationStrategy(this.servletContext, this.mediaTypes);
} } else {
else { strategy = new PathExtensionContentNegotiationStrategy(this.mediaTypes);
strategy = new PathExtensionContentNegotiationStrategy(mediaTypesMap);
} }
if (this.useJaf != null) { if (this.useJaf != null) {
strategy.setUseJaf(this.useJaf); strategy.setUseJaf(this.useJaf);
@ -175,7 +197,7 @@ public class ContentNegotiationManagerFactoryBean
} }
if (this.favorParameter) { if (this.favorParameter) {
ParameterContentNegotiationStrategy strategy = new ParameterContentNegotiationStrategy(mediaTypesMap); ParameterContentNegotiationStrategy strategy = new ParameterContentNegotiationStrategy(this.mediaTypes);
strategy.setParameterName(this.parameterName); strategy.setParameterName(this.parameterName);
strategies.add(strategy); strategies.add(strategy);
} }

View File

@ -44,7 +44,6 @@ public class ParameterContentNegotiationStrategy extends AbstractMappingContentN
*/ */
public ParameterContentNegotiationStrategy(Map<String, MediaType> mediaTypes) { public ParameterContentNegotiationStrategy(Map<String, MediaType> mediaTypes) {
super(mediaTypes); super(mediaTypes);
Assert.notEmpty(mediaTypes, "Cannot look up media types without any mappings");
} }
/** /**
@ -52,6 +51,7 @@ public class ParameterContentNegotiationStrategy extends AbstractMappingContentN
* <p>The default parameter name is {@code format}. * <p>The default parameter name is {@code format}.
*/ */
public void setParameterName(String parameterName) { public void setParameterName(String parameterName) {
Assert.notNull(parameterName, "parameterName is required");
this.parameterName = parameterName; this.parameterName = parameterName;
} }

View File

@ -19,7 +19,8 @@ import static org.junit.Assert.assertEquals;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Properties; import java.util.HashMap;
import java.util.Map;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -74,9 +75,9 @@ public class ContentNegotiationManagerFactoryBeanTests {
@Test @Test
public void addMediaTypes() throws Exception { public void addMediaTypes() throws Exception {
Properties mediaTypes = new Properties(); Map<String, MediaType> mediaTypes = new HashMap<String, MediaType>();
mediaTypes.put("json", MediaType.APPLICATION_JSON_VALUE); mediaTypes.put("json", MediaType.APPLICATION_JSON);
this.factoryBean.setMediaTypes(mediaTypes); this.factoryBean.addMediaTypes(mediaTypes);
this.factoryBean.afterPropertiesSet(); this.factoryBean.afterPropertiesSet();
ContentNegotiationManager manager = this.factoryBean.getObject(); ContentNegotiationManager manager = this.factoryBean.getObject();
@ -88,17 +89,16 @@ public class ContentNegotiationManagerFactoryBeanTests {
@Test @Test
public void favorParameter() throws Exception { public void favorParameter() throws Exception {
this.factoryBean.setFavorParameter(true); this.factoryBean.setFavorParameter(true);
this.factoryBean.setParameterName("f");
Properties mediaTypes = new Properties(); Map<String, MediaType> mediaTypes = new HashMap<String, MediaType>();
mediaTypes.put("json", MediaType.APPLICATION_JSON_VALUE); mediaTypes.put("json", MediaType.APPLICATION_JSON);
this.factoryBean.setMediaTypes(mediaTypes); this.factoryBean.addMediaTypes(mediaTypes);
this.factoryBean.afterPropertiesSet(); this.factoryBean.afterPropertiesSet();
ContentNegotiationManager manager = this.factoryBean.getObject(); ContentNegotiationManager manager = this.factoryBean.getObject();
this.servletRequest.setRequestURI("/flower"); this.servletRequest.setRequestURI("/flower");
this.servletRequest.addParameter("f", "json"); this.servletRequest.addParameter("format", "json");
assertEquals(Arrays.asList(MediaType.APPLICATION_JSON), manager.resolveMediaTypes(this.webRequest)); assertEquals(Arrays.asList(MediaType.APPLICATION_JSON), manager.resolveMediaTypes(this.webRequest));
} }

View File

@ -15,6 +15,7 @@
*/ */
package org.springframework.web.servlet.config.annotation; package org.springframework.web.servlet.config.annotation;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
@ -36,7 +37,9 @@ import org.springframework.web.accept.ContentNegotiationManagerFactoryBean;
*/ */
public class ContentNegotiationConfigurer { public class ContentNegotiationConfigurer {
private ContentNegotiationManagerFactoryBean factoryBean = new ContentNegotiationManagerFactoryBean(); private final ContentNegotiationManagerFactoryBean factoryBean = new ContentNegotiationManagerFactoryBean();
private final Map<String, MediaType> mediaTypes = new HashMap<String, MediaType>();
/** /**
@ -64,7 +67,7 @@ public class ContentNegotiationConfigurer {
* still be used in conjunction with {@link #favorPathExtension(boolean)}. * still be used in conjunction with {@link #favorPathExtension(boolean)}.
*/ */
public ContentNegotiationConfigurer mediaType(String extension, MediaType mediaType) { public ContentNegotiationConfigurer mediaType(String extension, MediaType mediaType) {
this.factoryBean.getMediaTypes().put(extension, mediaType); this.mediaTypes.put(extension, mediaType);
return this; return this;
} }
@ -75,7 +78,7 @@ public class ContentNegotiationConfigurer {
*/ */
public ContentNegotiationConfigurer mediaTypes(Map<String, MediaType> mediaTypes) { public ContentNegotiationConfigurer mediaTypes(Map<String, MediaType> mediaTypes) {
if (mediaTypes != null) { if (mediaTypes != null) {
this.factoryBean.getMediaTypes().putAll(mediaTypes); this.mediaTypes.putAll(mediaTypes);
} }
return this; return this;
} }
@ -86,7 +89,7 @@ public class ContentNegotiationConfigurer {
* still be used in conjunction with {@link #favorPathExtension(boolean)}. * still be used in conjunction with {@link #favorPathExtension(boolean)}.
*/ */
public ContentNegotiationConfigurer replaceMediaTypes(Map<String, MediaType> mediaTypes) { public ContentNegotiationConfigurer replaceMediaTypes(Map<String, MediaType> mediaTypes) {
this.factoryBean.getMediaTypes().clear(); this.mediaTypes.clear();
mediaTypes(mediaTypes); mediaTypes(mediaTypes);
return this; return this;
} }
@ -157,6 +160,9 @@ public class ContentNegotiationConfigurer {
* Return the configured {@link ContentNegotiationManager} instance * Return the configured {@link ContentNegotiationManager} instance
*/ */
protected ContentNegotiationManager getContentNegotiationManager() throws Exception { protected ContentNegotiationManager getContentNegotiationManager() throws Exception {
if (!this.mediaTypes.isEmpty()) {
this.factoryBean.addMediaTypes(mediaTypes);
}
this.factoryBean.afterPropertiesSet(); this.factoryBean.afterPropertiesSet();
return this.factoryBean.getObject(); return this.factoryBean.getObject();
} }

View File

@ -23,6 +23,7 @@ import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Properties;
import java.util.Set; import java.util.Set;
import javax.activation.FileTypeMap; import javax.activation.FileTypeMap;
@ -196,7 +197,9 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport
@Deprecated @Deprecated
public void setMediaTypes(Map<String, String> mediaTypes) { public void setMediaTypes(Map<String, String> mediaTypes) {
if (mediaTypes != null) { if (mediaTypes != null) {
this.cnManagerFactoryBean.getMediaTypes().putAll(mediaTypes); Properties props = new Properties();
props.putAll(mediaTypes);
this.cnManagerFactoryBean.setMediaTypes(props);
} }
} }