blob: e89a89ccd7186f85c3b5b183f29c4e17dc606e3c [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.cli;
import org.apache.batchee.cli.lifecycle.Lifecycle;
import org.apache.batchee.util.Batches;
import org.junit.FixMethodOrder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.StandardErrorStreamLog;
import org.junit.contrib.java.lang.system.StandardOutputStreamLog;
import org.junit.runners.MethodSorters;
import javax.batch.operations.JobOperator;
import javax.batch.runtime.BatchRuntime;
import static java.lang.Thread.sleep;
import static org.apache.batchee.cli.BatchEECLI.main;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MainTest {
@Rule
public final StandardOutputStreamLog stdout = new StandardOutputStreamLog();
@Rule
public final StandardErrorStreamLog stderr = new StandardErrorStreamLog();
@Test
public void argHelp() {
main(null);
assertEquals(
"Available commands:\n\n" +
"abandon: abandon a batch from its id\n" +
"evict: remove old data, uses embedded configuration (no JAXRS support yet)\n" +
"executions: list executions\n" +
"instances: list instances\n" +
"names: list known batches\n" +
"restart: restart a batch\n" +
"running: list running batches\n" +
"start: start a batch\n" +
"status: list last batches statuses\n" +
"stepExecutions: list step executions for a particular execution\n" +
"stop: stop a batch from its id\n" +
"user1\n" +
"user2\n", stderr.getLog().replace(System.getProperty("line.separator"), "\n"));
}
@Test
public void helpCommand() {
main(new String[] { "help", "evict" }); // using a simple command to avoid a big block for nothing
assertEquals(
"usage: evict -until <arg>\n" +
"\n" +
"remove old data, uses embedded configuration (no JAXRS support yet)\n" +
"\n" +
" -until <arg> date until when the eviction will occur (excluded),\n" +
" YYYYMMDD format\n", stdout.getLog().replace(System.getProperty("line.separator"), "\n"));
}
@Test
public void start() {
main(new String[]{ "start", "-name", "sample" });
assertThat(stdout.getLog(), containsString("Batch 'sample' started with id #"));
assertThat(stdout.getLog(), containsString("Batch status: COMPLETED"));
}
@Test
public void startAndFail() {
main(new String[]{ "start", "-name", "sample", "status=fail" });
assertThat(stdout.getLog(), containsString("Batch 'sample' started with id #"));
assertThat(stdout.getLog(), containsString("Batch status: FAILED"));
}
@Test
public void restart() {
main(new String[]{ "start", "-name", "sample", "status=fail" });
final String str = "Batch 'sample' started with id #";
assertThat(stdout.getLog(), containsString(str));
final int idx = stdout.getLog().indexOf(str);
final int end = stdout.getLog().indexOf(System.getProperty("line.separator"), idx);
final String id = stdout.getLog().substring(idx + str.length(), end);
main(new String[]{ "restart", "-id", id, "status=ok" });
assertThat(stdout.getLog(), containsString(str));
assertThat(stdout.getLog(), containsString("Batch status: COMPLETED"));
}
@Test
public void emptyRunning() {
main(new String[]{ "running" });
assertThat(stdout.getLog(), containsString("No job started"));
}
@Test
public void running() {
final JobOperator jobOperator = BatchRuntime.getJobOperator();
final long id = jobOperator.start("long-sample", null);
try {
sleep(100); // ensure it is started
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
}
main(new String[]{"running"});
assertThat(stdout.getLog(), containsString("long-sample -> ["));
Batches.waitForEnd(jobOperator, id);
}
@Test
public void stop() { // abandon is the same
final Thread start = new Thread() {
@Override
public void run() {
main(new String[]{ "start", "-name", "long-sample", "-socket", "1236", "-wait", "false" });
}
};
start.run();
final String str = "Batch 'long-sample' started with id #";
final String out = stdout.getLog();
int idx;
do {
idx = out.indexOf(str);
} while (idx < 0);
final int end = out.lastIndexOf(System.getProperty("line.separator"));
final long id = Long.parseLong(out.substring(idx + str.length(), end));
main(new String[]{"stop", "-id", Long.toString(id), "-socket", "1236"});
assertThat(stdout.getLog(), containsString("Stopped"));
Batches.waitForEnd(id);
}
@Test
public void status() {
// ensure we have at least one thing to print
final JobOperator jobOperator = BatchRuntime.getJobOperator();
final long id = jobOperator.start("sample", null);
main(new String[]{"status"});
// output looks like
// Name | execution id | batch status | exit status | start time | end time
// sample | 1 | COMPLETED | COMPLETED | sam. janv. 04 17:22:51 CET 2014 | sam. janv. 04 17:22:51 CET 2014
assertThat(stdout.getLog(), containsString("sample\t|"));
assertThat(stdout.getLog(), containsString("COMPLETED"));
Batches.waitForEnd(jobOperator, id);
}
@Test
public void instances() {
// ensure we have at least one thing to print
final JobOperator jobOperator = BatchRuntime.getJobOperator();
final long id = jobOperator.start("sample", null);
main(new String[]{"instances", "-name", "sample"});
// output looks like:
// sample has 3 job instances
//
// instance id
// -----------
// 0
// 1
assertThat(stdout.getLog(), containsString("sample has"));
assertThat(stdout.getLog(), containsString("instance id"));
Batches.waitForEnd(jobOperator, id);
}
@Test
public void executions() {
// ensure we have at least one thing to print
final JobOperator jobOperator = BatchRuntime.getJobOperator();
final long id = jobOperator.start("sample", null);
// output looks like:
// Executions of sample for instance 5
// execution id | batch status | exit status | start time | end time
// 5 | COMPLETED | COMPLETED | sam. janv. 04 17:20:24 CET 2014 | sam. janv. 04 17:20:24 CET 2014
Batches.waitForEnd(jobOperator, id);
main(new String[]{"executions", "-id", Long.toString(id)});
assertThat(stdout.getLog(), containsString("Executions of sample for instance " + id));
assertThat(stdout.getLog(), containsString("COMPLETED"));
}
@Test
public void stepExecutions() {
// ensure we have at least one thing to print
final JobOperator jobOperator = BatchRuntime.getJobOperator();
final long id = jobOperator.start("sample", null);
Batches.waitForEnd(jobOperator, id);
main(new String[]{"stepExecutions", "-id", Long.toString(id)});
assertThat(stdout.getLog(), containsString(
"step id\t|\t step name\t|\t start time \t|\t end time \t|\t" +
"exit status\t|\tbatch status\t|\t" +
"READ_COUNT\t|\tWRITE_COUNT\t|\tCOMMIT_COUNT\t|\tROLLBACK_COUNT\t|\tREAD_SKIP_COUNT\t|\t" +
"PROCESS_SKIP_COUNT\t|\tFILTER_COUNT\t|\tWRITE_SKIP_COUNT"));
assertThat(stdout.getLog(), containsString("OK"));
assertThat(stdout.getLog(), containsString("sample-step"));
assertThat(stdout.getLog(), containsString("COMPLETED"));
}
@Test
public void lifecycle() {
// whatever child of JobOperatorCommand so using running which is simple
main(new String[]{ "running", "-lifecycle", MyLifecycle.class.getName() });
assertEquals("start stop", MyLifecycle.result);
}
@Test
public void user() {
for (int i = 1; i < 3; i++) {
main(new String[]{"user" + i});
assertThat(stdout.getLog(), containsString("User " + i + " called"));
}
}
public static class MyLifecycle implements Lifecycle<String> {
private static String result;
@Override
public String start() {
return "start";
}
@Override
public void stop(final String state) {
result = state + " stop";
}
}
}