/*
* Copyright 2006-2012 The Scriptella Project Team.
*
* 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 scriptella.execution;
import scriptella.DBTestCase;
import scriptella.configuration.QueryEl;
import scriptella.configuration.ScriptEl;
import java.text.DecimalFormat;
import java.util.Collection;
import java.util.Map;
/**
* Tests for {@link ExecutionStatistics} and {@link ExecutionStatisticsBuilder}.
*
* @author Fyodor Kupolov
* @version 1.0
*/
public class ExecutionStatisticsTest extends DBTestCase {
public void test() throws EtlExecutorException {
final EtlExecutor se = newEtlExecutor();
final ExecutionStatistics s = se.execute();
Map<String, Integer> cats = s.getCategoriesStatistics();
assertEquals(2, cats.size());
assertEquals(3, cats.get(ScriptEl.TAG_NAME).intValue());
assertEquals(2, cats.get(QueryEl.TAG_NAME).intValue());
assertEquals(12, s.getExecutedStatementsCount()); //4+2+2+1+3
final Collection<ExecutionStatistics.ElementInfo> elements = s.getElements();
for (ExecutionStatistics.ElementInfo info : elements) {
assertTrue("Negative working time: " + info.getWorkingTime(), info.getWorkingTime() >= 0);
if ("/etl/script[1]".equals(info.getId())) {
assertEquals(1, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
assertEquals(4, info.getStatementsCount());
} else if ("/etl/query[1]/query[1]/script[1]".equals(
info.getId())) {
assertEquals(2, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
assertEquals(2, info.getStatementsCount()); //1 statement executed 2 times
} else if ("/etl/query[1]/query[1]".equals(info.getId())) {
assertEquals(2, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
assertEquals(2, info.getStatementsCount());
} else if ("/etl/query[1]".equals(info.getId())) {
assertEquals(1, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
assertEquals(1, info.getStatementsCount());
} else if ("/etl/script[2]".equals(info.getId())) {
assertEquals(1, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
assertEquals(3, info.getStatementsCount());
} else {
fail("Unrecognized statistic element " + info.getId());
}
}
}
public void test2() throws EtlExecutorException {
final EtlExecutor se = newEtlExecutor(
"ExecutionStatisticsTest2.xml");
final ExecutionStatistics s = se.execute();
Map<String, Integer> cats = s.getCategoriesStatistics();
assertEquals(2, cats.size());
assertEquals(4, cats.get("script").intValue());
assertEquals(1, cats.get("query").intValue());
final Collection<ExecutionStatistics.ElementInfo> elements = s.getElements();
for (ExecutionStatistics.ElementInfo info : elements) {
if ("/etl/script[1]".equals(info.getId())) {
assertEquals(1, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
} else if ("/etl/query[1]/script[1]".equals(info.getId())) {
assertEquals(0, info.getSuccessfulExecutionCount());
assertEquals(2, info.getFailedExecutionCount());
} else if ("/etl/query[1]/script[2]".equals(info.getId())) {
assertEquals(2, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
} else if ("/etl/query[1]".equals(info.getId())) {
assertEquals(1, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
} else if ("/etl/script[2]".equals(info.getId())) {
assertEquals(1, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
} else {
fail("Unrecognized statistic element " + info.getId());
}
}
}
public void test3() throws EtlExecutorException {
final EtlExecutor se = newEtlExecutor(
"ExecutionStatisticsTest3.xml");
final ExecutionStatistics s = se.execute();
Map<String, Integer> cats = s.getCategoriesStatistics();
assertEquals(2, cats.size());
assertEquals(2, cats.get("script").intValue());
assertEquals(2, cats.get("query").intValue());
assertEquals(9, s.getExecutedStatementsCount()); //4+2+2+1
final Collection<ExecutionStatistics.ElementInfo> elements = s.getElements();
for (ExecutionStatistics.ElementInfo info : elements) {
if ("/etl/script[1]".equals(info.getId())) {
assertEquals(1, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
assertEquals(4, info.getStatementsCount());
} else if ("/etl/query[1]/query[1]/script[1]".equals(
info.getId())) {
assertEquals(2, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
assertEquals(2, info.getStatementsCount()); //1 statement executed 2 times
} else if ("/etl/query[1]/query[1]".equals(info.getId())) {
assertEquals(2, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
assertEquals(2, info.getStatementsCount());
} else if ("/etl/query[1]".equals(info.getId())) {
assertEquals(1, info.getSuccessfulExecutionCount());
assertEquals(0, info.getFailedExecutionCount());
assertEquals(1, info.getStatementsCount());
} else {
fail("Unrecognized statistic element " + info.getId());
}
}
}
/**
* Tests if total time is correctly printed.
*/
public void testTotalTime() throws EtlExecutorException {
DecimalFormat f = new DecimalFormat(ExecutionStatistics.DOUBLE_FORMAT_PTR);
char sep = f.getDecimalFormatSymbols().getDecimalSeparator();
long time = 288727350; //3d 8h 12m 7s 350ms
StringBuilder sb = new StringBuilder();
ExecutionStatistics.appendTotalTimeDuration(time, sb, f);
assertEquals(" 3 days 8 hours 12 minutes 7" + sep + "35 seconds", sb.toString());
time = 3605001; //1h 5s 1ms
sb = new StringBuilder();
ExecutionStatistics.appendTotalTimeDuration(time, sb, f);
assertEquals(" 1 hour 5 seconds", sb.toString());
time = 800; //800ms
sb = new StringBuilder();
ExecutionStatistics.appendTotalTimeDuration(time, sb, f);
assertEquals(" 0" + sep + "8 second", sb.toString());
time = 1000; //1000ms
sb = new StringBuilder();
ExecutionStatistics.appendTotalTimeDuration(time, sb, f);
assertEquals(" 1 second", sb.toString());
}
}