package test.com.xceptance.xlt.common.util.action.execution;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.util.NameValuePair;
import com.xceptance.xlt.api.data.GeneralDataProvider;
import com.xceptance.xlt.api.util.XltProperties;
import com.xceptance.xlt.common.util.action.data.URLActionData;
import com.xceptance.xlt.common.util.action.execution.URLActionDataRequestBuilder;
import com.xceptance.xlt.common.util.bsh.ParameterInterpreter;
import test.com.xceptance.xlt.common.util.MockObjects;
public class URLActionDataRequestBuilderTest
{
@SuppressWarnings("unused")
private MockObjects mockObjects;
private URLActionDataRequestBuilder builder;
private ParameterInterpreter interpreter;
private XltProperties properties;
private GeneralDataProvider dataProvider;
private final String name = "Name";
private final String urlStringEmpty = "https://www.xceptance.com/?x=%45s#q=xeceptance+%2B";
@SuppressWarnings("unused")
private String urlStringWithEncodedParameters;
private String urlStringWithDecodedParameters;
private final String methodPost = "POST";
@SuppressWarnings("unused")
private final String methodGet = "GET";
private final String bodyDecoded = "Body?=%$";
private final String bodyEncoded = "Body%3F%3D%25%24";
private final List<NameValuePair> headers = new ArrayList<NameValuePair>();
private final NameValuePair header2 = new NameValuePair("HeaderName2", "HeaderValue2");
private final NameValuePair header1 = new NameValuePair("HeaderName1", "HeaderValue1");
private final List<NameValuePair> parametersEmpty = new ArrayList<NameValuePair>();
private final List<NameValuePair> parametersDecoded = new ArrayList<NameValuePair>();
private final List<NameValuePair> parametersEncoded = new ArrayList<NameValuePair>();
private final NameValuePair p1Empty = new NameValuePair("parameter1", "parameterValue1");
private final NameValuePair p2Empty = new NameValuePair("parameter1", "parameterValue1");
private final NameValuePair p1Encoded = new NameValuePair("Parameter%26%25%24Name1", "Parameter%C2%A7%24%25%26%2BValue1");
private final NameValuePair p2Encoded = new NameValuePair("Parameter%26%25%24Name2", "Parameter%C2%A7%24%25%26%2BValue2");
private final NameValuePair p1Decoded = new NameValuePair("Parameter&%$Name1", "Parameter§$%&+Value1");
private final NameValuePair p2Decoded = new NameValuePair("Parameter&%$Name2", "Parameter§$%&+Value2");
@Before
public void setup() throws UnsupportedEncodingException
{
properties = XltProperties.getInstance();
dataProvider = GeneralDataProvider.getInstance();
interpreter = new ParameterInterpreter(properties, dataProvider);
mockObjects = new MockObjects();
builder = new URLActionDataRequestBuilder();
headers.add(header1);
headers.add(header2);
parametersEmpty.add(p1Empty);
parametersEmpty.add(p2Empty);
parametersEncoded.add(p1Encoded);
parametersEncoded.add(p2Encoded);
parametersDecoded.add(p1Decoded);
parametersDecoded.add(p2Decoded);
urlStringWithEncodedParameters = "https://www.xceptance.com/?x=%45s&" + parametersEncoded.get(0).getName() + "=" +
parametersEncoded.get(0).getValue() + "&" + parametersEncoded.get(1).getName() + "=" +
parametersEncoded.get(1).getValue() + "#q=xeceptance+%2B";
urlStringWithDecodedParameters = "https://www.xceptance.com/?x=%45s&" + parametersDecoded.get(0).getName() + "=" +
parametersDecoded.get(0).getValue() + "&" + parametersDecoded.get(1).getName() + "=" +
parametersDecoded.get(1).getValue() + "#q=xeceptance+%2B";
}
@Test
public void test_Get_NoParam__NoBody_()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringEmpty, request.getUrl().toString());
Assert.assertNull(request.getRequestBody());
}
@Test
public void test_POST_NoParam__NoBody_()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setMethod(methodPost);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringEmpty, request.getUrl().toString());
Assert.assertNull(request.getRequestBody());
}
@Test
public void test_Get_Param_EncodeParam_NoBody_()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setEncodeParameters(false);
action.setParameters(parametersEncoded);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringWithDecodedParameters, request.getUrl().toString());
Assert.assertNull(request.getRequestBody());
}
@Test
public void test_POST_Param_EncodeParam_NoBody_()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setMethod(methodPost);
action.setEncodeParameters(true);
action.setParameters(parametersDecoded);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringEmpty, request.getUrl().toString());
Assert.assertNull(request.getRequestBody());
final List<NameValuePair> requestParameters = request.getRequestParameters();
for (int i = 0; i < requestParameters.size(); i++)
{
Assert.assertEquals(parametersDecoded.get(i).getName(), requestParameters.get(i).getName());
Assert.assertEquals(parametersDecoded.get(i).getValue(), requestParameters.get(i).getValue());
}
}
@Test
public void test_Get_Param_NoEncodeParam_NoBody_()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setEncodeParameters(true);
action.setParameters(parametersDecoded);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringWithDecodedParameters, request.getUrl().toString());
Assert.assertNull(request.getRequestBody());
}
@Test
public void test_POST_Param_NoEncodeParam_NoBody_()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setMethod(methodPost);
action.setEncodeParameters(true);
action.setParameters(parametersDecoded);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringEmpty, request.getUrl().toString());
Assert.assertNull(request.getRequestBody());
final List<NameValuePair> requestParameters = request.getRequestParameters();
for (int i = 0; i < requestParameters.size(); i++)
{
Assert.assertEquals(parametersDecoded.get(i).getName(), requestParameters.get(i).getName());
Assert.assertEquals(parametersDecoded.get(i).getValue(), requestParameters.get(i).getValue());
}
}
@Test
public void test_Get_NoParam_Body()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setBody(bodyEncoded);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringEmpty, request.getUrl().toString());
Assert.assertNull(request.getRequestBody());
}
@Test
public void test_POST_NoParam_Body_NoEncodedBody()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setBody(bodyEncoded);
action.setEncodeBody(false);
action.setMethod(methodPost);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringEmpty, request.getUrl().toString());
Assert.assertEquals(bodyDecoded, request.getRequestBody());
}
@Test
public void test_POST_NoParam_Body_EncodedBody()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setBody(bodyDecoded);
action.setEncodeBody(true);
action.setMethod(methodPost);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringEmpty, request.getUrl().toString());
Assert.assertEquals(bodyDecoded, request.getRequestBody());
}
@Test
public void test_POST_Param_EncodeParam_Body_NoEncodedBody()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setMethod(methodPost);
action.setEncodeParameters(true);
action.setParameters(parametersDecoded);
action.setBody(bodyEncoded);
action.setEncodeBody(false);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringWithDecodedParameters, request.getUrl().toString());
Assert.assertEquals(bodyDecoded, request.getRequestBody());
}
@Test
public void test_POST_Param_EncodeParam_Body_EncodedBody()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setMethod(methodPost);
action.setEncodeParameters(true);
action.setParameters(parametersDecoded);
action.setBody(bodyDecoded);
action.setEncodeBody(true);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringWithDecodedParameters, request.getUrl().toString());
Assert.assertEquals(bodyDecoded, request.getRequestBody());
}
@Test
public void test_POST_Param_NoEncodeParam_Body_NoEncodeBody()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setMethod(methodPost);
action.setEncodeParameters(true);
action.setParameters(parametersDecoded);
action.setBody(bodyEncoded);
action.setEncodeBody(false);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringWithDecodedParameters, request.getUrl().toString());
Assert.assertEquals(bodyDecoded, request.getRequestBody());
}
@Test
public void test_POST_Param_NoEncodeParam_Body_EncodeBody()
{
final URLActionData action = new URLActionData(name, urlStringEmpty, interpreter);
action.setMethod(methodPost);
action.setEncodeParameters(false);
action.setParameters(parametersEncoded);
action.setBody(bodyDecoded);
action.setEncodeBody(true);
final WebRequest request = builder.buildRequest(action);
Assert.assertEquals(action.getMethod(), request.getHttpMethod());
Assert.assertEquals(urlStringWithDecodedParameters, request.getUrl().toString());
Assert.assertEquals(bodyDecoded, request.getRequestBody());
}
}