/*
* Copyright 2010-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.batch.core.configuration.support;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.Job;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.Ordered;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
/**
*
* @author Dave Syer
* @author Lucas Ward
*
*/
public class AutomaticJobRegistrarTests {
private AutomaticJobRegistrar registrar = new AutomaticJobRegistrar();
private MapJobRegistry registry = new MapJobRegistry();
@Before
public void setUp() {
DefaultJobLoader jobLoader = new DefaultJobLoader();
jobLoader.setJobRegistry(registry);
registrar.setJobLoader(jobLoader);
}
@SuppressWarnings("cast")
@Test
public void testOrderedImplemented() throws Exception {
assertTrue(registrar instanceof Ordered);
assertEquals(Ordered.LOWEST_PRECEDENCE, registrar.getOrder());
registrar.setOrder(1);
assertEquals(1, registrar.getOrder());
}
@Test
public void testLocateJob() throws Exception {
Resource[] jobPaths = new Resource[] {
new ClassPathResource("org/springframework/batch/core/launch/support/job.xml"),
new ClassPathResource("org/springframework/batch/core/launch/support/job2.xml") };
@SuppressWarnings("resource")
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.refresh();
setUpApplicationContextFactories(jobPaths, applicationContext);
registrar.setApplicationContext(applicationContext);
registrar.start();
Collection<String> names = registry.getJobNames();
assertEquals(2, names.size());
assertTrue(names.contains("test-job"));
assertTrue(names.contains("test-job2"));
Job job = registry.getJob("test-job");
assertEquals("test-job", job.getName());
job = registry.getJob("test-job2");
assertEquals("test-job2", job.getName());
}
@Test
public void testNoJobFound() throws Exception {
Resource[] jobPaths = new Resource[] { new ClassPathResource(
"org/springframework/batch/core/launch/support/test-environment.xml") };
@SuppressWarnings("resource")
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.refresh();
setUpApplicationContextFactories(jobPaths, applicationContext);
registrar.setApplicationContext(applicationContext);
registrar.start();
}
@Test
public void testDuplicateJobsInFile() throws Exception {
Resource[] jobPaths = new Resource[] { new ClassPathResource(
"org/springframework/batch/core/launch/support/2jobs.xml") };
@SuppressWarnings("resource")
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.refresh();
setUpApplicationContextFactories(jobPaths, applicationContext);
registrar.setApplicationContext(applicationContext);
registrar.start();
assertEquals(2, registry.getJobNames().size());
}
@Test
public void testChildContextOverridesBeanPostProcessor() throws Exception {
Resource[] jobPaths = new Resource[] { new ClassPathResource(
"org/springframework/batch/core/launch/support/2jobs.xml") };
@SuppressWarnings("resource")
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"/org/springframework/batch/core/launch/support/test-environment-with-registry-and-auto-register.xml");
registrar.setApplicationContext(applicationContext);
setUpApplicationContextFactories(jobPaths, applicationContext);
registrar.start();
assertEquals(2, registry.getJobNames().size());
}
@Test
public void testErrorInContext() throws Exception {
Resource[] jobPaths = new Resource[] {
new ClassPathResource("org/springframework/batch/core/launch/support/2jobs.xml"),
new ClassPathResource("org/springframework/batch/core/launch/support/error.xml") };
setUpApplicationContextFactories(jobPaths, null);
try {
registrar.start();
fail("Expected BeanCreationException");
}
catch (BeanCreationException e) {
}
}
@Test
public void testClear() throws Exception {
Resource[] jobPaths = new Resource[] { new ClassPathResource(
"org/springframework/batch/core/launch/support/2jobs.xml") };
setUpApplicationContextFactories(jobPaths, null);
registrar.start();
assertEquals(2, registry.getJobNames().size());
registrar.stop();
assertEquals(0, registry.getJobNames().size());
}
@Test
public void testStartStopRunning() throws Exception {
Resource[] jobPaths = new Resource[] { new ClassPathResource(
"org/springframework/batch/core/launch/support/2jobs.xml") };
setUpApplicationContextFactories(jobPaths, null);
registrar.start();
assertTrue(registrar.isRunning());
registrar.start();
assertEquals(2, registry.getJobNames().size());
registrar.stop();
assertFalse(registrar.isRunning());
}
@SuppressWarnings("resource")
@Test
public void testInitCalledOnContextRefreshed() throws Exception {
Resource[] jobPaths = new Resource[] { new ClassPathResource(
"org/springframework/batch/core/launch/support/2jobs.xml") };
registrar.setApplicationContext(new ClassPathXmlApplicationContext(
"/org/springframework/batch/core/launch/support/test-environment-with-registry-and-auto-register.xml"));
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.refresh();
setUpApplicationContextFactories(jobPaths, applicationContext);
registrar.setApplicationContext(applicationContext);
registrar.onApplicationEvent(new ContextRefreshedEvent(applicationContext));
assertEquals(2, registry.getJobNames().size());
}
@Test
public void testClearCalledOnContextClosed() throws Exception {
Resource[] jobPaths = new Resource[] { new ClassPathResource(
"org/springframework/batch/core/launch/support/2jobs.xml") };
@SuppressWarnings("resource")
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.refresh();
setUpApplicationContextFactories(jobPaths, applicationContext);
registrar.setApplicationContext(applicationContext);
registrar.start();
assertEquals(2, registry.getJobNames().size());
registrar.onApplicationEvent(new ContextClosedEvent(applicationContext));
assertEquals(0, registry.getJobNames().size());
}
private void setUpApplicationContextFactories(Resource[] jobPaths, ApplicationContext parent) {
Collection<ApplicationContextFactory> applicationContextFactories = new ArrayList<ApplicationContextFactory>();
for (Resource resource : jobPaths) {
GenericApplicationContextFactory factory = new GenericApplicationContextFactory(resource);
factory.setApplicationContext(parent);
applicationContextFactories.add(factory);
}
registrar.setApplicationContextFactories(applicationContextFactories
.toArray(new ApplicationContextFactory[jobPaths.length]));
}
}