package com.googlecode.jmeter.plugins.webdriver.sampler;
import com.googlecode.jmeter.plugins.webdriver.config.WebDriverConfig;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.log.Logger;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.openqa.selenium.WebDriver;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.*;
public class WebDriverSamplerTest {
private WebDriverSampler sampler;
private JMeterVariables variables;
private WebDriver browser;
@Before
public void createSampler() {
browser = Mockito.mock(WebDriver.class);
when(browser.getPageSource()).thenReturn("page source");
when(browser.getCurrentUrl()).thenReturn("http://google.com.au");
variables = new JMeterVariables();
variables.putObject(WebDriverConfig.BROWSER, browser);
JMeterContextService.getContext().setVariables(variables);
sampler = new WebDriverSampler();
}
@Test
public void shouldBeAbleToSerialiseAndDeserialise() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ObjectOutputStream output = new ObjectOutputStream(bytes);
output.writeObject(sampler);
output.flush();
output.close();
ObjectInputStream input = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()));
final WebDriverSampler deserializedSampler = (WebDriverSampler) input.readObject();
assertThat(deserializedSampler, is(sampler));
}
@Test
public void shouldBeAbleToSetParameters() {
sampler.setParameters("parameters");
assertThat(sampler.getParameters(), is("parameters"));
}
@Test
public void shouldBeAbleToSetScript() {
sampler.setScript("script");
assertThat(sampler.getScript(), is("script"));
}
@Test
public void shouldHaveExpectedInstanceVariablesOnScriptContext() {
sampler.setName("name");
sampler.setParameters("p1 p2 p3");
final SampleResult sampleResult = new SampleResult();
final ScriptEngine scriptEngine = sampler.createScriptEngineWith(sampleResult);
final ScriptContext scriptContext = scriptEngine.getContext();
final WebDriverScriptable scriptable = (WebDriverScriptable) scriptContext.getAttribute("WDS");
assertThat(scriptable.getLog(), is(instanceOf(Logger.class)));
assertThat(scriptable.getName(), is(sampler.getName()));
assertThat(scriptable.getParameters(), is(sampler.getParameters()));
assertThat(scriptable.getArgs(), is(new String[]{"p1", "p2", "p3"}));
assertThat(scriptable.getBrowser(), is(instanceOf(WebDriver.class)));
assertThat(scriptable.getSampleResult(), is(sampleResult));
}
@Test
public void shouldReturnSuccessfulSampleResultWhenEvalScriptCompletes() throws MalformedURLException {
sampler.setName("name");
sampler.setScript("var x = 'hello';");
final SampleResult sampleResult = sampler.sample(null);
assertThat(sampleResult.isResponseCodeOK(), is(true));
assertThat(sampleResult.getResponseMessage(), is("OK"));
assertThat(sampleResult.isSuccessful(), is(true));
assertThat(sampleResult.getContentType(), is("text/plain"));
assertThat(sampleResult.getDataType(), is(SampleResult.TEXT));
assertThat(sampleResult.getSampleLabel(), is("name"));
assertThat(sampleResult.getResponseDataAsString(), is("page source"));
assertThat(sampleResult.getURL(), is(new URL("http://google.com.au")));
verify(browser, times(1)).getPageSource();
verify(browser, times(1)).getCurrentUrl();
}
@Test
public void shouldReturnSuccessfulSampleResultWhenScriptSetsSampleResultToSuccess() throws MalformedURLException {
sampler.setScript("WDS.sampleResult.setSuccessful(true);");
final SampleResult sampleResult = sampler.sample(null);
assertThat(sampleResult.isSuccessful(), is(true));
assertThat(sampleResult.getResponseCode(), is("200"));
assertThat(sampleResult.getResponseMessage(), is("OK"));
assertThat(sampleResult.getResponseDataAsString(), is("page source"));
assertThat(sampleResult.getURL(), is(new URL("http://google.com.au")));
verify(browser, times(1)).getPageSource();
verify(browser, times(1)).getCurrentUrl();
}
@Test
public void shouldReturnFailureSampleResultWhenScriptSetsSampleResultToFailure() throws MalformedURLException {
sampler.setScript("WDS.sampleResult.setSuccessful(false);");
final SampleResult sampleResult = sampler.sample(null);
assertThat(sampleResult.isSuccessful(), is(false));
assertThat(sampleResult.getResponseCode(), is("500"));
assertThat(sampleResult.getResponseMessage(), not("OK"));
assertThat(sampleResult.getResponseDataAsString(), is("page source"));
assertThat(sampleResult.getURL(), is(new URL("http://google.com.au")));
verify(browser, times(1)).getPageSource();
verify(browser, times(1)).getCurrentUrl();
}
@Test
public void shouldReturnFailureSampleResultWhenEvalScriptIsInvalid() {
sampler.setScript("x.methodThatDoesNotExist();");
final SampleResult sampleResult = sampler.sample(null);
assertThat(sampleResult.isResponseCodeOK(), is(false));
assertThat(sampleResult.getResponseMessage(), containsString("ReferenceError"));
assertThat(sampleResult.isSuccessful(), is(false));
verify(browser, never()).getPageSource();
verify(browser, never()).getCurrentUrl();
}
@Test
public void shouldReturnFailureSampleResultWhenBrowserURLIsInvalid() {
when(browser.getCurrentUrl()).thenReturn("unknown://uri");
sampler.setScript("var x = 'hello';");
final SampleResult sampleResult = sampler.sample(null);
assertThat(sampleResult.isResponseCodeOK(), is(false));
assertThat(sampleResult.getResponseMessage(), containsString("unknown"));
assertThat(sampleResult.isSuccessful(), is(false));
verify(browser, times(1)).getCurrentUrl();
}
@Test(expected = IllegalArgumentException.class)
public void shouldThrowExceptionWhenBrowserNotConfigured() {
variables.remove(WebDriverConfig.BROWSER);
sampler.setScript("var x=1;");
sampler.sample(null);
fail("Did not throw expected exception"); // should throw exception if Browser is null
}
}