blob: 01944c2d5112726dac026a9f0127620b33ec5c88 [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.functions;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.commons.lang3.StringUtils;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.junit.JMeterTest;
import org.apache.jmeter.junit.JMeterTestCaseJUnit3;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class ComponentReferenceFunctionTest extends JMeterTestCaseJUnit3 {
private static final Logger LOG = LoggingManager.getLoggerForClass();
private static Map<String, Boolean> funcTitles;
// Constructor for Function tests
private Function funcItem;
public ComponentReferenceFunctionTest(String name) {
super(name);
}
public ComponentReferenceFunctionTest(String testName, Function fi) {
super(testName);// Save the method name
funcItem = fi;
}
/*
* Test Functions - create the suite of tests
*/
private static Test suiteFunctions() throws Exception {
TestSuite suite = new TestSuite("Functions");
for (Object item : JMeterTest.getObjects(Function.class)) {
if (item.getClass().equals(CompoundVariable.class)) {
continue;
}
TestSuite ts = new TestSuite(item.getClass().getName());
ts.addTest(new ComponentReferenceFunctionTest("runFunction", (Function) item));
ts.addTest(new ComponentReferenceFunctionTest("runFunction2", (Function) item));
suite.addTest(ts);
}
return suite;
}
private Element getBodyFromXMLDocument(InputStream stream)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setIgnoringElementContentWhitespace(true);
dbf.setIgnoringComments(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new InputSource(stream));
org.w3c.dom.Element root = doc.getDocumentElement();
org.w3c.dom.Element body = (org.w3c.dom.Element) root.getElementsByTagName("body").item(0);
return body;
}
/*
* Extract titles from functions.xml
*/
public void createFunctionSet() throws Exception {
funcTitles = new HashMap<>(20);
String compref = "../xdocs/usermanual/functions.xml";
try (InputStream stream = new FileInputStream(compref)) {
Element body = getBodyFromXMLDocument(stream);
Element section = (Element) body.getElementsByTagName("section").item(0);
NodeList subSections = section.getElementsByTagName("subsection");
for (int i = 0; i < subSections.getLength(); i++) {
NodeList components = ((Element)subSections.item(i)).getElementsByTagName("component");
for (int j = 0; j < components.getLength(); j++) {
org.w3c.dom.Element comp = (org.w3c.dom.Element)
components.item(j);
funcTitles.put(comp.getAttribute("name"), Boolean.FALSE);
String tag = comp.getAttribute("tag");
if (!StringUtils.isEmpty(tag)){
funcTitles.put(tag, Boolean.FALSE);
}
}
}
}
}
public void checkFunctionSet() throws Exception {
assertEquals("Should not have any names left over", 0, JMeterTest.scanprintMap(funcTitles, "Function"));
}
/*
* run the function test
*/
public void runFunction() throws Exception {
if (funcTitles.size() > 0) {
String title = funcItem.getReferenceKey();
boolean ct = funcTitles.containsKey(title);
if (ct) {
funcTitles.put(title, Boolean.TRUE);// For detecting extra entries
}
// Is this a work in progress ?
if (!title.contains("(ALPHA") && !title.contains("(EXPERIMENTAL")) {
// No, not a work in progress ...
String s = "function.xml needs '" + title + "' entry for " + funcItem.getClass().getName();
if (!ct) {
LOG.warn(s); // Record in log as well
}
assertTrue(s, ct);
}
}
}
/*
* Check that function descriptions are OK
*/
public void runFunction2() throws Exception {
for (Object o : funcItem.getArgumentDesc()) {
assertTrue("Description must be a String", o instanceof String);
assertFalse("Description must not start with [refkey", ((String) o).startsWith("[refkey"));
}
}
/*
* Use a suite to allow the tests to be generated at run-time
*/
public static Test suite() throws Exception {
TestSuite suite = new TestSuite("ComponentReferenceFunctionTest");
suite.addTest(new ComponentReferenceFunctionTest("createFunctionSet"));
suite.addTest(suiteFunctions());
suite.addTest(new ComponentReferenceFunctionTest("checkFunctionSet"));
return suite;
}
}