/**
* Copyright 2015 Nabarun Mondal
* 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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.noga.njexl.testing.api;
import com.noga.njexl.lang.extension.TypeUtility;
import com.noga.njexl.testing.dataprovider.DataSourceTable;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.regex.Pattern;
@XStreamAlias("R")
public class CallContainer implements Serializable, Cloneable {
public static final String TEST_ID = "TEST_ID" ;
public static final String TEST_DESCRIPTION = "TEST_DESCRIPTION" ;
public static final String PERCENTILE = "%PERCENTILE%" ;
public static final double DEFAULT_PERCENTILE_VALUE = 10000.0 ;
public static final String EXPECTED_EXCEPTION = "EXPECTED_EXCEPTION" ;
public static final String TEST_DISABLED = "TEST_DISABLED" ;
@XStreamOmitField
public String globals ;
@XStreamOmitField
public String pre = "" ;
@XStreamOmitField
public String post = "" ;
@XStreamOmitField
public Object service;
@XStreamOmitField
public DataSourceTable dataTable;
@XStreamAlias("i")
public int rowId;
@XStreamOmitField
public Method method;
@XStreamImplicit(itemFieldName = "p")
public Object[] parameters;
@XStreamAlias("r")
public Object result;
@XStreamAlias("t")
public long timing;
@XStreamOmitField
public Throwable error;
@XStreamAlias("th")
public String exceptionMessage;
@XStreamAlias("s")
public boolean validationResult;
public String column(String columnName){
return dataTable.columnValue(columnName,rowId);
}
public String[] values(){
return dataTable.row(rowId);
}
@XStreamAlias("ee")
public Pattern exceptionPattern = Pattern.compile("");
public boolean disabled(){
try {
String val = column(TEST_DISABLED);
if (val == null) {
return false;
}
return Boolean.valueOf(val);
}catch (Exception e){
return false;
}
}
public void setExceptionPattern(String ee){
if ( ee == null ) {
ee = column(EXPECTED_EXCEPTION);
}
if ( ee == null ){
return;
}
exceptionPattern = Pattern.compile(ee);
}
public void setExceptionMessage() {
if (error != null) {
exceptionMessage = "" ;
exceptionMessage = String.format("%s ; Cause : ",error.getMessage());
if(error.getCause() != null)
{
exceptionMessage += String.format("%s",error.getCause().getMessage());
}
}
}
public boolean isExceptionValid(){
if ( exceptionPattern.pattern().isEmpty()){
if ( error == null ){
return true;
}
return false;
}
if ( error == null ){
return false ;
}
String className = error.getClass().getName();
if ( exceptionPattern.matcher(className).matches()){
return true;
}
String message = error.getMessage();
if ( message != null ){
if ( exceptionPattern.matcher(message).matches()){
return true;
}
}
return false;
}
public String testId(){
if ( dataTable == null ){
return Integer.toString(rowId) ;
}
String t = dataTable.columnValue( TEST_ID, rowId);
return (t!=null) ? t : Integer.toString(rowId) ;
}
public Double percentile(){
if ( dataTable == null ){
return null ;
}
String t = dataTable.columnValue( PERCENTILE, rowId);
if ( t == null ) return null;
return TypeUtility.castDouble(t, DEFAULT_PERCENTILE_VALUE );
}
public String uniqueId(){
return uniqueId( Thread.currentThread().getId()) ;
}
public String uniqueId(long l){
return testId() + "_" + Long.toString( l ) ;
}
public String description(){
String t = dataTable.columnValue( TEST_DESCRIPTION, rowId);
return (t!=null) ? t : Integer.toString(rowId) ;
}
@Override
public String toString(){
return String.format("%s@%s : %s", uniqueId(), dataTable != null ? dataTable.name() : "(null)", validationResult );
}
public String toXml(){
XStream xStream = new XStream();
xStream.alias("R", CallContainer.class);
xStream.autodetectAnnotations(true);
return xStream.toXML(this);
}
/**
* <pre>
* Creates a cloned copy of one object.
* Needed in case of multi threaded environment
* </pre>
* @param inputObject the object whose copy is required.
* @return clone copy
*/
public static synchronized CallContainer clone(CallContainer inputObject) {
try {
CallContainer clonedObject = (CallContainer) inputObject.clone();
return clonedObject;
}catch (Exception e){
}
return inputObject ;
}
public synchronized void call(){
try{
validationResult = false ;
timing = System.nanoTime();
result = method.invoke(service,parameters);
timing = System.nanoTime() - timing ;
}catch (Throwable t){
timing = -1;
error = t.getCause() ;
if ( error == null ){
error = t;
}
// set it up
setExceptionPattern(null);
setExceptionMessage();
if ( isExceptionValid() ){
validationResult = true ;
}
result = null;
}
}
}