/* * Copyright 2006-2010 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.admin.web.server; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; import org.springframework.batch.admin.ServerRunning; import org.springframework.batch.admin.web.JsonWrapper; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.poller.DirectPoller; import org.springframework.batch.poller.Poller; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; import org.springframework.web.client.RestTemplate; /** * @author Dave Syer * */ public class JsonIntegrationTests { @Rule public ServerRunning serverRunning = ServerRunning .isRunning("${SERVER_URL:http://localhost:8080/spring-batch-admin-sample}"); @Test public void testHomePage() throws Exception { RestTemplate template = new RestTemplate(); ResponseEntity<String> result = template.exchange(serverRunning.getUrl() + "/home.json", HttpMethod.GET, null, String.class); JsonWrapper wrapper = new JsonWrapper(result.getBody()); assertNotNull(wrapper.get("feed.resources")); assertNotNull(wrapper.get("feed.resources['/files'].uri")); } @Test public void testJobsPage() throws Exception { RestTemplate template = new RestTemplate(); ResponseEntity<String> result = template.exchange(serverRunning.getUrl() + "/jobs.json", HttpMethod.GET, null, String.class); JsonWrapper wrapper = new JsonWrapper(result.getBody()); // System.err.println(wrapper); assertNotNull(wrapper.get("jobs.resource")); assertNotNull(wrapper.get("jobs.registrations.infinite.name")); } @Test public void testJobConfigurationUpload() throws Exception { RestTemplate template = new RestTemplate(); HttpEntity<String> request = new HttpEntity<String>(FileUtils.readFileToString(new File( "src/test/resources/test-job-context.xml"))); ResponseEntity<String> result = template.exchange(serverRunning.getUrl() + "/job-configuration.json", HttpMethod.POST, request, String.class); JsonWrapper wrapper = new JsonWrapper(result.getBody()); // System.err.println(wrapper); assertNotNull(wrapper.get("jobs.resource")); assertNotNull(wrapper.get("jobs.registrations['test-job'].name")); } @Test public void testJobLaunch() throws Exception { RestTemplate template = new RestTemplate(); ResponseEntity<String> result = template.exchange(serverRunning.getUrl() + "/jobs/job2.json?jobParameters=fail=true", HttpMethod.POST, null, String.class); JsonWrapper wrapper = new JsonWrapper(result.getBody()); // System.err.println(wrapper); assertNotNull(wrapper.get("jobExecution.resource")); assertNotNull(wrapper.get("jobExecution.status")); assertNotNull(wrapper.get("jobExecution.id")); // Poll for the completed job execution final String resource = wrapper.get("jobExecution.resource", String.class); Poller<JsonWrapper> poller = new DirectPoller<JsonWrapper>(100L); Future<JsonWrapper> poll = poller.poll(new Callable<JsonWrapper>() { public JsonWrapper call() throws Exception { RestTemplate template = new RestTemplate(); ResponseEntity<String> result = template.exchange(resource, HttpMethod.GET, null, String.class); JsonWrapper wrapper = new JsonWrapper(result.getBody()); // System.err.println(wrapper); Map<?, ?> map = wrapper.get("jobExecution.stepExecutions", Map.class); return map.isEmpty() || wrapper.get("jobExecution.stepExecutions['job2.step1']['resource']") == null ? null : wrapper; } }); JsonWrapper jobExecution = poll.get(500L, TimeUnit.MILLISECONDS); assertNotNull(jobExecution); // System.err.println(jobExecution); // Verify that there is a step execution in the result result = template.exchange( jobExecution.get("jobExecution.stepExecutions['job2.step1'].resource", String.class), HttpMethod.GET, null, String.class); wrapper = new JsonWrapper(result.getBody()); // System.err.println(wrapper); assertNotNull(wrapper.get("stepExecution.id")); assertNotNull(wrapper.get("stepExecution.status")); assertNotNull(wrapper.get("jobExecution.resource")); assertNotNull(wrapper.get("jobExecution.status")); assertNotNull(wrapper.get("jobExecution.id")); } @Test public void testJobStop() throws Exception { RestTemplate template = new RestTemplate(); ResponseEntity<String> result = template.exchange(serverRunning.getUrl() + "/jobs/infinite.json?jobParameters=timestamp=" + System.currentTimeMillis(), HttpMethod.POST, null, String.class); JsonWrapper wrapper = new JsonWrapper(result.getBody()); // System.err.println(wrapper); assertNotNull(wrapper.get("jobExecution.resource")); assertNotNull(wrapper.get("jobExecution.status")); assertNotNull(wrapper.get("jobExecution.id")); template.exchange(wrapper.get("jobExecution.resource", String.class), HttpMethod.DELETE, null, String.class); // Poll for the completed job execution final String resource = wrapper.get("jobExecution.resource", String.class); Poller<JsonWrapper> poller = new DirectPoller<JsonWrapper>(100L); Future<JsonWrapper> poll = poller.poll(new Callable<JsonWrapper>() { public JsonWrapper call() throws Exception { RestTemplate template = new RestTemplate(); ResponseEntity<String> result = template.exchange(resource, HttpMethod.GET, null, String.class); JsonWrapper wrapper = new JsonWrapper(result.getBody()); // System.err.println(wrapper); BatchStatus status = wrapper.get("jobExecution.status", BatchStatus.class); return status.isGreaterThan(BatchStatus.STOPPING) ? wrapper : null; } }); JsonWrapper jobExecution = poll.get(500L, TimeUnit.MILLISECONDS); assertNotNull(jobExecution); BatchStatus status = jobExecution.get("jobExecution.status", BatchStatus.class); assertEquals(BatchStatus.STOPPED, status); } @Test public void testListedResourcesWithGet() throws Exception { Map<String,String> params = new HashMap<String, String>(); params.put("jobName", "job2"); // These should be there if the previous test cases worked params.put("jobInstanceId", "0"); params.put("jobExecutionId", "0"); params.put("stepExecutionId", "0"); RestTemplate template = new RestTemplate(); PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); propertiesFactoryBean.setLocation(new ClassPathResource("/org/springframework/batch/admin/web/manager/json-resources.properties")); propertiesFactoryBean.afterPropertiesSet(); Properties properties = propertiesFactoryBean.getObject(); for (String path : properties.stringPropertyNames()) { if (!StringUtils.hasText(path) || !path.startsWith("GET")) { continue; } path = path.substring(path.indexOf("/")); ResponseEntity<String> result = template.exchange(serverRunning.getUrl() + path, HttpMethod.GET, null, String.class, params); JsonWrapper wrapper = new JsonWrapper(result.getBody()); // System.err.println(wrapper); assertNotNull(wrapper); } } }