blob: d16801ba5ed1750381401b95d689a3e8667f7dd3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you 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 org.apache.jmeter.protocol.http.modifier;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import org.apache.jmeter.junit.JMeterTestCase;
import org.apache.jmeter.protocol.http.sampler.HTTPNullSampler;
import org.apache.jmeter.protocol.http.sampler.HTTPSampleResult;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
import org.apache.jmeter.protocol.http.util.HTTPConstants;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.threads.JMeterContext;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jorphan.io.TextFile;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class TestAnchorModifier extends JMeterTestCase {
private AnchorModifier parser = new AnchorModifier();
private JMeterContext jmctx = null;
@BeforeEach
public void setUp() {
jmctx = JMeterContextService.getContext();
parser.setThreadContext(jmctx);
}
private void testProcessingHTMLFile(String HTMLFileName) throws Exception {
File file = findTestFile("testfiles/load_bug_list.jmx");
HTTPSamplerBase config = (HTTPSamplerBase) SaveService.loadTree(file).getArray()[0];
config.setRunningVersion(true);
HTTPSampleResult result = new HTTPSampleResult();
file = findTestFile("testfiles/Load_JMeter_Page.jmx");
HTTPSamplerBase context = (HTTPSamplerBase) SaveService.loadTree(file).getArray()[0];
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
result.setResponseData(new TextFile(findTestFile(HTMLFileName)).getText(), null);
result.setSampleLabel(context.toString());
result.setSamplerData(context.toString());
result.setURL(new URL("http://bz.apache.org/fakepage.html"));
jmctx.setPreviousResult(result);
AnchorModifier modifier = new AnchorModifier();
modifier.setThreadContext(jmctx);
modifier.process();
assertEquals("http://bz.apache.org/bugzilla/buglist.cgi?"
+ "bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED"
+ "&email1=&emailtype1=substring&emailassigned_to1=1"
+ "&email2=&emailtype2=substring&emailreporter2=1" + "&bugidtype=include&bug_id=&changedin=&votes="
+ "&chfieldfrom=&chfieldto=Now&chfieldvalue="
+ "&product=JMeter&short_desc=&short_desc_type=substring"
+ "&long_desc=&long_desc_type=substring&bug_file_loc=" + "&bug_file_loc_type=substring&keywords="
+ "&keywords_type=anywords" + "&field0-0-0=noop&type0-0-0=noop&value0-0-0="
+ "&cmdtype=doit&order=Reuse+same+sort+as+last+time", config.toString());
config.recoverRunningVersion();
assertEquals("http://bz.apache.org/bugzilla/buglist.cgi?"
+ "bug_status=.*&bug_status=.*&bug_status=.*&email1="
+ "&emailtype1=substring&emailassigned_to1=1&email2=" + "&emailtype2=substring&emailreporter2=1"
+ "&bugidtype=include&bug_id=&changedin=&votes=" + "&chfieldfrom=&chfieldto=Now&chfieldvalue="
+ "&product=JMeter&short_desc=&short_desc_type=substring"
+ "&long_desc=&long_desc_type=substring&bug_file_loc=" + "&bug_file_loc_type=substring&keywords="
+ "&keywords_type=anywords&field0-0-0=noop" + "&type0-0-0=noop&value0-0-0=&cmdtype=doit"
+ "&order=Reuse+same+sort+as+last+time", config.toString());
}
@Test
public void testModifySampler() throws Exception {
testProcessingHTMLFile("testfiles/jmeter_home_page.html");
}
@Test
public void testModifySamplerWithRelativeLink() throws Exception {
testProcessingHTMLFile("testfiles/jmeter_home_page_with_relative_links.html");
}
@Test
public void testModifySamplerWithBaseHRef() throws Exception {
testProcessingHTMLFile("testfiles/jmeter_home_page_with_base_href.html");
}
@Test
public void testNullSampler() {
jmctx.setCurrentSampler(null);
jmctx.setPreviousResult(new HTTPSampleResult());
parser.process(); // should do nothing
}
@Test
public void testNullResult() throws Exception {
jmctx.setCurrentSampler(makeContext("http://www.apache.org/subdir/previous.html"));
jmctx.setPreviousResult(null);
parser.process(); // should do nothing
}
@Test
public void testWrongResultClass() throws Exception {
jmctx.setCurrentSampler(makeContext("http://www.apache.org/subdir/previous.html"));
jmctx.setPreviousResult(new SampleResult());
parser.process(); // should do nothing
}
@Test
public void testSimpleParse() throws Exception {
HTTPSamplerBase config = makeUrlConfig(".*/index\\.html");
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<a href=\"index.html\">Goto index page</a></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setSamplerData(context.toString());
result.setURL(context.getUrl());
jmctx.setPreviousResult(result);
parser.process();
assertEquals("http://www.apache.org/subdir/index.html", config.getUrl().toString());
}
// Test https works too
@Test
public void testSimpleParse1() throws Exception {
HTTPSamplerBase config = makeUrlConfig(".*/index\\.html");
config.setProtocol(HTTPConstants.PROTOCOL_HTTPS);
config.setPort(HTTPConstants.DEFAULT_HTTPS_PORT);
HTTPSamplerBase context = makeContext("https://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<a href=\"index.html\">Goto index page</a></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setSamplerData(context.toString());
result.setURL(context.getUrl());
jmctx.setPreviousResult(result);
parser.process();
assertEquals("https://www.apache.org/subdir/index.html", config.getUrl().toString());
}
@Test
public void testSimpleParse2() throws Exception {
HTTPSamplerBase config = makeUrlConfig("/index\\.html");
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<a href=\"/index.html\">Goto index page</a>" + "hfdfjiudfjdfjkjfkdjf"
+ "<b>bold text</b><a href=lowerdir/index.html>lower</a>" + "</body></html>";
HTTPSampleResult result = new HTTPSampleResult();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
jmctx.setPreviousResult(result);
parser.process();
String newUrl = config.getUrl().toString();
Assertions.assertTrue("http://www.apache.org/index.html".equals(newUrl)
|| "http://www.apache.org/subdir/lowerdir/index.html".equals(newUrl));
}
@Test
public void testSimpleParse3() throws Exception {
HTTPSamplerBase config = makeUrlConfig(".*index.*");
config.getArguments().addArgument("param1", "value1");
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<a href=\"/home/index.html?param1=value1\">" + "Goto index page</a></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
jmctx.setPreviousResult(result);
parser.process();
String newUrl = config.getUrl().toString();
assertEquals("http://www.apache.org/home/index.html?param1=value1", newUrl);
}
@Test
public void testSimpleParse4() throws Exception {
HTTPSamplerBase config = makeUrlConfig("/subdir/index\\..*");
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<A HREF=\"index.html\">Goto index page</A></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
jmctx.setPreviousResult(result);
parser.process();
String newUrl = config.getUrl().toString();
assertEquals("http://www.apache.org/subdir/index.html", newUrl);
}
@Test
public void testSimpleParse5() throws Exception {
HTTPSamplerBase config = makeUrlConfig("/subdir/index\\.h.*");
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/one/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<a href=\"../index.html\">Goto index page</a></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
jmctx.setPreviousResult(result);
parser.process();
String newUrl = config.getUrl().toString();
assertEquals("http://www.apache.org/subdir/index.html", newUrl);
}
@Test
public void testFailSimpleParse1() throws Exception {
HTTPSamplerBase config = makeUrlConfig(".*index.*?param2=.+1");
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<a href=\"/home/index.html?param1=value1\">" + "Goto index page</a></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
String newUrl = config.getUrl().toString();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
jmctx.setPreviousResult(result);
parser.process();
assertEquals(newUrl, config.getUrl().toString());
}
@Test
public void testFailSimpleParse3() throws Exception {
HTTPSamplerBase config = makeUrlConfig("/home/index.html");
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<a href=\"/home/index.html?param1=value1\">" + "Goto index page</a></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
String newUrl = config.getUrl().toString();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
jmctx.setPreviousResult(result);
parser.process();
assertEquals(newUrl + "?param1=value1", config.getUrl().toString());
}
@Test
public void testFailSimpleParse2() throws Exception {
HTTPSamplerBase config = makeUrlConfig(".*login\\.html");
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<a href=\"/home/index.html?param1=value1\">" + "Goto index page</a></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setPreviousResult(result);
parser.process();
String newUrl = config.getUrl().toString();
Assertions.assertNotEquals("http://www.apache.org/home/index.html?param1=value1", newUrl);
assertEquals(config.getUrl().toString(), newUrl);
}
@Test
public void testSimpleFormParse() throws Exception {
HTTPSamplerBase config = makeUrlConfig(".*index.html");
config.addArgument("test", "g.*");
config.setMethod(HTTPConstants.POST);
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<form action=\"index.html\" method=\"POST\">" + "<input type=\"checkbox\" name=\"test\""
+ " value=\"goto\">Goto index page</form></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
jmctx.setPreviousResult(result);
parser.process();
assertEquals("http://www.apache.org/subdir/index.html", config.getUrl().toString());
assertEquals("test=goto", config.getQueryString());
}
@Test
public void testBadCharParse() throws Exception {
HTTPSamplerBase config = makeUrlConfig(".*index.html");
config.addArgument("te$st", "g.*");
config.setMethod(HTTPConstants.POST);
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<form action=\"index.html\" method=\"POST\">" + "<input type=\"checkbox\" name=\"te$st\""
+ " value=\"goto\">Goto index page</form></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
jmctx.setPreviousResult(result);
parser.process();
assertEquals("http://www.apache.org/subdir/index.html", config.getUrl().toString());
assertEquals("te%24st=goto", config.getQueryString());
}
@Test
public void testSpecialCharParse() throws Exception {
String specialChars = "-_.!~*'()%25";// These are some of the special characters
String htmlEncodedFixture = URLEncoder.encode(specialChars, StandardCharsets.UTF_8.name());
HTTPSamplerBase config = makeUrlConfig(".*index.html");
config.addArgument("test", ".*");
config.setMethod(HTTPConstants.POST);
HTTPSamplerBase context = makeContext("http://www.apache.org/subdir/previous.html");
String responseText = "<html><head><title>Test page</title></head><body>"
+ "<form action=\"index.html\" method=\"POST\">" + "<input type=\"hidden\" name=\"test\""
+ " value=\"" + htmlEncodedFixture + "\">Goto index page</form></body></html>";
HTTPSampleResult result = new HTTPSampleResult();
result.setResponseData(responseText, null);
result.setSampleLabel(context.toString());
result.setURL(context.getUrl());
jmctx.setCurrentSampler(context);
jmctx.setCurrentSampler(config);
jmctx.setPreviousResult(result);
parser.process();
assertEquals("http://www.apache.org/subdir/index.html", config.getUrl().toString());
assertEquals("test=" + htmlEncodedFixture, config.getQueryString());
}
private HTTPSamplerBase makeContext(String url) throws MalformedURLException {
URL u = new URL(url);
HTTPSamplerBase context = new HTTPNullSampler();
context.setDomain(u.getHost());
context.setPath(u.getPath());
context.setPort(u.getPort());
context.setProtocol(u.getProtocol());
context.parseArguments(u.getQuery());
return context;
}
private HTTPSamplerBase makeUrlConfig(String path) {
HTTPSamplerBase config = new HTTPNullSampler();
config.setDomain("www.apache.org");
config.setMethod(HTTPConstants.GET);
config.setPath(path);
config.setPort(HTTPConstants.DEFAULT_HTTP_PORT);
config.setProtocol(HTTPConstants.PROTOCOL_HTTP);
return config;
}
}