/* * 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.parser; import static org.junit.Assert.assertThat; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import org.hamcrest.CoreMatchers; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class TestBug60842HtmlParser { private List<String> links; private String html; private HTMLParser parser; public TestBug60842HtmlParser(HTMLParser parser, String html, String links) { this.parser = parser; this.html = html; if (links.isEmpty()) { this.links = Collections.emptyList(); } else { this.links = Arrays.asList(links.split(",")); } } @Parameters() public static Collection<Object[]> params() { List<Object[]> result = new ArrayList<>(); for (HTMLParser parserToTest : Arrays.asList( new LagartoBasedHtmlParser(), new JsoupBasedHtmlParser())) { for (Object[] data : Arrays.asList( new Object[] { parserToTest, "<body background='abc.png'/>", "http://example.org/abc.png" }, new Object[] { parserToTest, "<link href='abc.css' rel='stylesheet'/>", "http://example.org/abc.css" }, new Object[] { parserToTest, "<img src='abc.png'/>", "http://example.org/abc.png" }, new Object[] { parserToTest, "<base href='http://another.org'/><img src='one.png'/>", "http://another.org/one.png" }, new Object[] { parserToTest, "<applet code='abc.jar'/>", "http://example.org/abc.jar" }, new Object[] { parserToTest, "<object codebase='abc.jar' data='something'/>", "http://example.org/abc.jar,http://example.org/something" }, new Object[] { parserToTest, "<object data='something'/>", "http://example.org/something" }, new Object[] { parserToTest, "<object codebase='abc.jar'/>", "http://example.org/abc.jar" }, new Object[] { parserToTest, "<input type='image' src='foo'/>", "http://example.org/foo" }, new Object[] { parserToTest, "<input type='text' src='foo'/>", "" }, new Object[] { parserToTest, "<frameset><frame src='foo'/></frameset>", "http://example.org/foo" }, new Object[] { parserToTest, "<iframe src='foo'/>", "http://example.org/foo" }, new Object[] { parserToTest, "<embed src='foo'/>", "http://example.org/foo" }, new Object[] { parserToTest, "<bgsound src='foo'/>", "http://example.org/foo" }, new Object[] { parserToTest, "<anytag background='foo'/>", "http://example.org/foo" }, new Object[] { parserToTest, "<anytag style='foo: url(\"bar\")'/>", "http://example.org/bar" }, new Object[] { parserToTest, "<anytag style=\"foo: url('bar')'\"/>", "http://example.org/bar" }, // new Object[] {p,"<anytag style=\"foo: url(bar)'\"/>", // "http://example.org/bar"}, // new Object[] {p,"<anytag style=\"foo: url(bar)'; other: // url(something);\"/>", // "http://example.org/bar,http://example.org/something"}, new Object[] { parserToTest, "<link href=' abc\n.css ' rel='stylesheet'/>", "http://example.org/abc.css" }, new Object[] { parserToTest, "<link href=' with spaces\n.css ' rel='stylesheet'/>", "http://example.org/with spaces.css" }, new Object[] { parserToTest, "<embed src=''/>", "" }, new Object[] { parserToTest, "<embed src=' '/>", "" })) { result.add(data); } } return result; } @Test public void testGetEmbeddedResourceURLsStringByteArrayURLURLCollectionString() throws Exception { final ArrayList<URLString> c = new ArrayList<>(); parser.getEmbeddedResourceURLs("Mozilla", html.getBytes(StandardCharsets.UTF_8), new URL("http://example.org"), new URLCollection(c), StandardCharsets.UTF_8.name()); List<String> urlNames = c.stream().map(u -> u.toString()) .collect(Collectors.toList()); assertThat( String.format("Parse with %s the page %s to get %s", parser.getClass().getSimpleName(), html, links), urlNames, CoreMatchers.is(CoreMatchers.equalTo(links))); } }