blob: c992e94edff54875a9c2dc9732e6e95d910634d4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.batchee.servlet;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.TextPage;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomNode;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import org.apache.batchee.servlet.util.CreateSomeJobs;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;
import org.jboss.shrinkwrap.descriptor.api.webapp30.WebAppDescriptor;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.batch.runtime.BatchStatus;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@RunWith(Arquillian.class)
public class ServletTest {
@ArquillianResource
private URL base;
@Deployment(testable = false)
public static Archive<?> war() {
final WebArchive webArchive = ShrinkWrap.create(WebArchive.class, "batchee-gui.war")
.addAsWebInfResource(new StringAsset(
Descriptors.create(WebAppDescriptor.class)
.metadataComplete(true)
.createListener()
.listenerClass(CreateSomeJobs.class.getName())
.up()
.createFilter()
.filterName("JBatch Private Filter")
.filterClass(JBatchServletInitializer.PrivateFilter.class.getName())
.up()
.createServlet()
.servletName("JBatch")
.servletClass(JBatchController.class.getName())
.loadOnStartup(1)
.up()
.createFilterMapping()
.filterName("JBatch Private Filter")
.urlPattern("/*")
.up()
.createServletMapping()
.servletName("JBatch")
.urlPattern("/jbatch/*")
.up()
.exportAsString()), "web.xml")
// GUI
.addPackages(true, JBatchController.class.getPackage())
// test data to create some job things to do this test
.addPackage(CreateSomeJobs.class.getPackage())
.addAsWebInfResource("META-INF/batch-jobs/init.xml", "classes/META-INF/batch-jobs/init.xml");
for (final String resource : Arrays.asList("layout.jsp", "jobs.jsp", "job-instances.jsp", "step-executions.jsp",
"css/bootstrap.min.3.0.0.css", "js/bootstrap.min.3.0.0.js")) {
webArchive.addAsWebResource("META-INF/resources/internal/batchee/" + resource, "internal/batchee/" + resource);
}
return webArchive;
}
@Test
public void home() throws IOException {
assertEquals("init", extractContent("", "/ul/li/a[1]/text()"));
}
@Test
public void instances() throws IOException {
assertEquals(BatchStatus.COMPLETED.name(), extractContent("executions/init", "/table/tbody/tr/td[2]"));
}
@Test
public void steps() throws IOException {
assertEquals("step1", extractContent("step-executions/0", "/table/tbody/tr/td[2]"));
}
@Test(expected = FailingHttpStatusCodeException.class)
public void privateUrl() throws IOException {
final WebClient client = newWebClient();
client.getPage(base.toExternalForm() + "jbatch/internal/batchee/jobs.jsp");
}
@Test
public void testSimpleRest() throws IOException, InterruptedException {
String textContent = executeSimpleRest("start/init?value=OK&sleep=2");
Long executionId = extractExecutionId(textContent);
Thread.sleep(100L);
textContent = executeSimpleRest("status/" + executionId);
String[] parms = textContent.split("\n");
assertTrue(parms.length == 3);
assertEquals(BatchStatus.STARTED.toString(), parms[2]);
boolean stopped = false;
for (int i = 0; i < 11; i++) {
textContent = executeSimpleRest("status/" + executionId);
parms = textContent.split("\n");
assertTrue(parms.length == 3);
if (BatchStatus.COMPLETED.toString().equals(parms[2])) {
stopped = true;
break;
}
Thread.sleep(200L);
}
if (!stopped) {
fail("failed to properly stop the batch. Last status = " + parms[2]);
}
}
private String executeSimpleRest(String command) throws IOException {
final String startUrl = base.toExternalForm() + "jbatch/rest/" + command;
final WebClient webClient = newWebClient();
final TextPage page = webClient.getPage(startUrl);
String textContent = page.getContent();
assertNotNull(textContent);
assertTrue(textContent.contains("\nOK\n"));
extractExecutionId(textContent);
return textContent;
}
private Long extractExecutionId(String textContent) {
String[] parms = textContent.split("\n");
assertTrue(parms.length >= 2);
Long executionId = Long.valueOf(parms[0]);
assertTrue(-1L != executionId);
return executionId;
}
private String extractContent(final String endUrl, final String xpath) throws IOException {
final String url = base.toExternalForm() + "jbatch/" + endUrl;
final WebClient webClient = newWebClient();
final HtmlPage page = webClient.getPage(url);
final List<?> byXPath = page.getByXPath("//div[@id=\"content\"]" + xpath);
assertTrue(byXPath.size() >= 1);
final Object next = byXPath.iterator().next();
if (!DomNode.class.isInstance(next)) {
throw new IllegalArgumentException("Can't find text for " + next);
}
return DomNode.class.cast(next).asText();
}
private WebClient newWebClient() {
final WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setAppletEnabled(false);
return webClient;
}
}