package org.hyperic.hq.tests.web;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.client.Client;
import org.apache.cxf.jaxrs.client.ClientConfiguration;
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
import org.apache.cxf.service.model.EndpointInfo;
import org.apache.cxf.transport.Conduit;
import org.apache.cxf.transport.ConduitInitiator;
import org.apache.cxf.transport.ConduitInitiatorManager;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transport.http.HTTPTransportFactory;
import org.apache.cxf.ws.addressing.EndpointReferenceType;
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.hyperic.hq.api.rest.cxf.TestHttpConduit;
import org.hyperic.hq.test.BaseInfrastructureTest;
import org.hyperic.hq.tests.context.WebContainerContextLoader;
import org.hyperic.hq.tests.context.WebContextConfiguration;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.meterware.servletunit.ServletRunner;
@DirtiesContext
@ContextConfiguration(locations = { "classpath:META-INF/hqapi-context.xml" , "classpath*:WEB-INF/security-web-context-spring.xml" }, loader=WebContainerContextLoader.class)
@WebContextConfiguration(contextRoot=WebTestCaseBase.CONTEXT, contextUrl=WebTestCaseBase.CONTEXT_URL, webXml=WebTestCaseBase.WEB_XML)
@Transactional(propagation=Propagation.NESTED)
public abstract class WebTestCaseBase extends BaseInfrastructureTest{
protected static final String WEB_XML = "/WEB-INF/web-spring.xml" ;
protected static final String CONTEXT = "/tests" ;
public static final String CONTEXT_URL = "http://localhost" + CONTEXT ;
protected static abstract class IterationInterceptor<T extends Annotation> implements TestRule {
//cache at a class level as a new instance is initialized for each test method
public static Map<Class<?>, Object> clsLevelMetadata = new HashMap<Class<?>, Object>() ;
private Class<T> annotationType ;
public IterationInterceptor(final Class<T> annotationType) {
this.annotationType = annotationType ;
}//EOM
// @Override
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public final void evaluate() throws Throwable {
T metadata = description.getAnnotation(annotationType) ;
if(metadata == null) {
final Object metadataTemp = clsLevelMetadata.get(annotationType) ;
if(metadataTemp == null) {
metadata = AnnotationUtils.findAnnotation(description.getTestClass(), annotationType) ;
clsLevelMetadata.put(annotationType, (metadata == null ? Boolean.FALSE : metadata)) ;
}//EO if not yet initialized
else if(!(metadataTemp instanceof Boolean)) metadata = (T) metadataTemp ;
}//EO if cls level metadata was not already cached
if(metadata == null || shouldSkip(metadata)) base.evaluate() ;
else {
try{
final int iIterationLength = getIterationLength(metadata) ;
for(int i=0; i<iIterationLength; i++) {
doBeforeEvaluation(i, metadata) ;
base.evaluate() ;
doAfterEvaluation(i, metadata) ;
}//EO while there are more platforms
}finally{
}//EO catch block
}//EO if the getresource annotation exists
}//EOM
};
}//EOM
protected boolean shouldSkip(final T metadata) { return false ; }//EOM
protected abstract int getIterationLength(final T metadata) ;
protected abstract void doBeforeEvaluation(final int iIterationIndex, final T metadata) ;
protected void doAfterEvaluation(final int iIterationIndex, final T metadata) {}//EOM
}//EO inner calss IterationInterceptor
}//EOC