/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* 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 com.datastax.driver.core;
import com.datastax.driver.core.utils.CassandraVersion;
import com.datastax.driver.core.utils.DseVersion;
import org.testng.*;
import org.testng.internal.ConstructorOrMethod;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;
public class TestListener extends TestListenerAdapter implements IInvokedMethodListener {
private long start_time = System.nanoTime();
private int test_index = 0;
@Override
public void onTestFailure(ITestResult tr) {
long elapsedTime = TimeUnit.NANOSECONDS.toSeconds((System.nanoTime() - start_time));
long testTime = tr.getEndMillis() - tr.getStartMillis();
tr.getThrowable().printStackTrace();
System.out.println("FAILED : " + tr.getName());
System.out.println("Test : " + formatIntoHHMMSS(testTime / 1000));
System.out.println("Elapsed: " + formatIntoHHMMSS(elapsedTime));
System.out.println();
}
@Override
public void onTestSkipped(ITestResult tr) {
long elapsedTime = TimeUnit.NANOSECONDS.toSeconds((System.nanoTime() - start_time));
long testTime = tr.getEndMillis() - tr.getStartMillis();
System.out.println("SKIPPED: " + tr.getName());
System.out.println("Test : " + formatIntoHHMMSS(testTime / 1000));
System.out.println("Elapsed: " + formatIntoHHMMSS(elapsedTime));
System.out.println();
}
@Override
public void onTestSuccess(ITestResult tr) {
long elapsedTime = TimeUnit.NANOSECONDS.toSeconds((System.nanoTime() - start_time));
long testTime = tr.getEndMillis() - tr.getStartMillis();
System.out.println("SUCCESS: " + tr.getName());
System.out.println("Test : " + formatIntoHHMMSS(testTime / 1000));
System.out.println("Elapsed: " + formatIntoHHMMSS(elapsedTime));
System.out.println();
}
@Override
public void onTestStart(ITestResult tr) {
System.out.println();
System.out.println("-----------------------------------------------");
System.out.println("Starting " + tr.getTestClass().getName() + '.' + tr.getName() + " [Test #" + ++test_index + "]...");
}
static String formatIntoHHMMSS(long secondsTotal) {
long hours = secondsTotal / 3600,
remainder = secondsTotal % 3600,
minutes = remainder / 60,
seconds = remainder % 60;
return ((hours < 10 ? "0" : "") + hours
+ ':' + (minutes < 10 ? "0" : "") + minutes
+ ':' + (seconds < 10 ? "0" : "") + seconds);
}
@Override
public void beforeInvocation(IInvokedMethod testMethod, ITestResult testResult) {
// Check to see if the class or method is annotated with 'CassandraVersion', if so ensure the
// version we are testing with meets the requirement, if not a SkipException is thrown
// and this test is skipped.
ITestNGMethod testNgMethod = testResult.getMethod();
ConstructorOrMethod constructorOrMethod = testNgMethod.getConstructorOrMethod();
Class<?> clazz = testNgMethod.getInstance().getClass();
if (clazz != null) {
do {
if (scanAnnotatedElement(clazz))
break;
} while (!(clazz = clazz.getSuperclass()).equals(Object.class));
}
Method method = constructorOrMethod.getMethod();
if (method != null) {
scanAnnotatedElement(method);
}
}
private boolean scanAnnotatedElement(AnnotatedElement element) {
if (element.isAnnotationPresent(CassandraVersion.class)) {
CassandraVersion cassandraVersion = element.getAnnotation(CassandraVersion.class);
cassandraVersionCheck(cassandraVersion);
return true;
}
if (element.isAnnotationPresent(DseVersion.class)) {
DseVersion dseVersion = element.getAnnotation(DseVersion.class);
dseVersionCheck(dseVersion);
return true;
}
return false;
}
@Override
public void afterInvocation(IInvokedMethod testMethod, ITestResult testResult) {
// Do nothing
}
private static void cassandraVersionCheck(CassandraVersion version) {
versionCheck(CCMBridge.getGlobalCassandraVersion(), VersionNumber.parse(version.value()), version.description());
}
private static void dseVersionCheck(DseVersion version) {
VersionNumber dseVersion = CCMBridge.getGlobalDSEVersion();
if (dseVersion != null) {
versionCheck(CCMBridge.getGlobalDSEVersion(), VersionNumber.parse(version.value()), version.description());
} else {
throw new SkipException("Skipping test because not configured for DataStax Enterprise cluster.");
}
}
private static void versionCheck(VersionNumber current, VersionNumber required, String skipString) {
if (current == null) {
throw new SkipException("Skipping test because provided version is null");
} else {
if (current.compareTo(required) < 0) {
throw new SkipException(
String.format("Version >= %s required, but found %s. Justification: %s",
required, current, skipString));
}
}
}
}