/* * 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 static org.apache.jmeter.functions.FunctionTestHelper.makeParams; import java.io.FileNotFoundException; import java.util.Collection; import java.util.LinkedList; import org.apache.jmeter.engine.util.CompoundVariable; import org.apache.jmeter.junit.JMeterTestCaseJUnit; import org.apache.jmeter.threads.JMeterContext; import org.apache.jmeter.threads.JMeterContextService; import org.apache.jmeter.threads.JMeterVariables; import org.apache.jmeter.util.BeanShellInterpreter; import org.apache.jmeter.util.JMeterUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import junit.extensions.ActiveTestSuite; import junit.framework.Test; import junit.framework.TestSuite; /** * Test cases for Functions */ public class PackageTest extends JMeterTestCaseJUnit { private static final Logger log = LoggerFactory.getLogger(PackageTest.class); public PackageTest(String arg0) { super(arg0); } // Create the CSVRead function and set its parameters. private static CSVRead setCSVReadParams(String p1, String p2) throws Exception { CSVRead cr = new CSVRead(); Collection<CompoundVariable> parms = new LinkedList<>(); if (p1 != null) { parms.add(new CompoundVariable(p1)); } if (p2 != null) { parms.add(new CompoundVariable(p2)); } cr.setParameters(parms); return cr; } // Create the BeanShell function and set its parameters. private static BeanShell BSHFParams(String p1, String p2, String p3) throws Exception { BeanShell bsh = new BeanShell(); bsh.setParameters(makeParams(p1, p2, p3)); return bsh; } public static Test suite() throws Exception { TestSuite allsuites = new TestSuite("Function PackageTest"); if (!BeanShellInterpreter.isInterpreterPresent()) { final String msg = "BeanShell jar not present, tests ignored"; log.warn(msg); } else { TestSuite bsh = new TestSuite("BeanShell"); bsh.addTest(new PackageTest("BSH1")); allsuites.addTest(bsh); } // Reset files allsuites.addTest(new PackageTest("CSVSetup")); TestSuite par = new ActiveTestSuite("Parallel"); par.addTest(new PackageTest("CSVThread1")); par.addTest(new PackageTest("CSVThread2")); allsuites.addTest(par); TestSuite xpath = new TestSuite("XPath"); xpath.addTest(new PackageTest("XPathtestColumns")); xpath.addTest(new PackageTest("XPathtestDefault")); xpath.addTest(new PackageTest("XPathtestNull")); xpath.addTest(new PackageTest("XPathtestrowNum")); xpath.addTest(new PackageTest("XPathEmpty")); xpath.addTest(new PackageTest("XPathFile1")); xpath.addTest(new PackageTest("XPathFile2")); xpath.addTest(new PackageTest("XPathNoFile")); allsuites.addTest(xpath); allsuites.addTest(new PackageTest("XPathSetup1")); TestSuite par2 = new ActiveTestSuite("ParallelXPath1"); par2.addTest(new PackageTest("XPathThread1")); par2.addTest(new PackageTest("XPathThread2")); allsuites.addTest(par2); allsuites.addTest(new PackageTest("XPathSetup2")); TestSuite par3 = new ActiveTestSuite("ParallelXPath2"); par3.addTest(new PackageTest("XPathThread1")); par3.addTest(new PackageTest("XPathThread2")); allsuites.addTest(par3); return allsuites; } private JMeterContext jmctx = null; private JMeterVariables vars = null; @Override public void setUp() { jmctx = JMeterContextService.getContext(); jmctx.setVariables(new JMeterVariables()); vars = jmctx.getVariables(); } public void BSH1() throws Exception { String fn = "testfiles/BeanShellTest.bsh"; try { BSHFParams(null, null, null); fail("Expected InvalidVariableException"); } catch (InvalidVariableException e) { } try { BSHFParams("", "", ""); fail("Expected InvalidVariableException"); } catch (InvalidVariableException e) { } BeanShell bsh; try { bsh = BSHFParams("", "", null); assertEquals("", bsh.execute()); } catch (InvalidVariableException e) { fail("BeanShell not present"); } bsh = BSHFParams("1", null, null); assertEquals("1", bsh.execute()); bsh = BSHFParams("1+1", "VAR", null); assertEquals("2", bsh.execute()); assertEquals("2", vars.get("VAR")); // Check some initial variables bsh = BSHFParams("return threadName", null, null); assertEquals(Thread.currentThread().getName(), bsh.execute()); bsh = BSHFParams("return log.getClass().getName()", null, null); assertEquals(log.getClass().getName(), bsh.execute()); // Check source works bsh = BSHFParams("source (\"testfiles/BeanShellTest.bsh\")", null, null); assertEquals("9876", bsh.execute()); // Check persistence bsh = BSHFParams("${SCR1}", null, null); vars.put("SCR1", "var1=11"); assertEquals("11", bsh.execute()); vars.put("SCR1", "var2=22"); assertEquals("22", bsh.execute()); vars.put("SCR1", "x=var1"); assertEquals("11", bsh.execute()); vars.put("SCR1", "++x"); assertEquals("12", bsh.execute()); vars.put("VAR1", "test"); vars.put("SCR1", "vars.get(\"VAR1\")"); assertEquals("test", bsh.execute()); // Check init file functioning JMeterUtils.getJMeterProperties().setProperty(BeanShell.INIT_FILE, fn); bsh = BSHFParams("${SCR2}", null, null); vars.put("SCR2", "getprop(\"" + BeanShell.INIT_FILE + "\")"); assertEquals(fn, bsh.execute());// Check that bsh has read the file vars.put("SCR2", "getprop(\"avavaav\",\"default\")"); assertEquals("default", bsh.execute()); vars.put("SCR2", "++i"); assertEquals("1", bsh.execute()); vars.put("SCR2", "++i"); assertEquals("2", bsh.execute()); } // Function objects to be tested private static CSVRead cr1, cr4; // Helper class used to implement co-routine between two threads private static class Baton { void pass() { done(); try { wait(1000); } catch (InterruptedException e) { System.out.println(e); } } void done() { notifyAll(); } } private static final Baton BATON = new Baton(); public void CSVThread1() throws Exception { Thread.currentThread().setName("One"); synchronized (BATON) { assertEquals("b1", cr1.execute(null, null)); assertEquals("", cr4.execute(null, null)); assertEquals("b2", cr1.execute(null, null)); BATON.pass(); assertEquals("", cr4.execute(null, null)); assertEquals("b4", cr1.execute(null, null)); assertEquals("", cr4.execute(null, null)); BATON.pass(); assertEquals("b3", cr1.execute(null, null)); assertEquals("", cr4.execute(null, null)); BATON.done(); } } public void CSVThread2() throws Exception { Thread.currentThread().setName("Two"); Thread.sleep(500);// Allow other thread to start synchronized (BATON) { assertEquals("b3", cr1.execute(null, null)); assertEquals("", cr4.execute(null, null)); BATON.pass(); assertEquals("b1", cr1.execute(null, null)); assertEquals("", cr4.execute(null, null)); assertEquals("b2", cr1.execute(null, null)); BATON.pass(); assertEquals("", cr4.execute(null, null)); assertEquals("b4", cr1.execute(null, null)); BATON.done(); } } public void CSVSetup() throws Exception { cr1 = setCSVReadParams("testfiles/test.csv", "1"); cr4 = setCSVReadParams("testfiles/test.csv", "next"); } // XPathFileContainer tests public void XPathtestNull() throws Exception { try { new XPathFileContainer("nosuch.xml", "/"); fail("Should not find the file"); } catch (FileNotFoundException e) { } } public void XPathtestrowNum() throws Exception { XPathFileContainer f = new XPathFileContainer("../build.xml", "/project/target/@name"); assertNotNull(f); int myRow = f.nextRow(); assertEquals(0, myRow); assertEquals(1, f.getNextRow()); myRow = f.nextRow(); assertEquals(1, myRow); assertEquals(2, f.getNextRow()); myRow = f.nextRow(); assertEquals(2, myRow); assertEquals(3, f.getNextRow()); } public void XPathtestColumns() throws Exception { XPathFileContainer f = new XPathFileContainer("../build.xml", "/project/target/@name"); assertNotNull(f); assertTrue("Not empty", f.size() > 0); int last = 0; for (int i = 0; i < f.size(); i++) { last = f.nextRow(); log.debug("found [" + i + "]" + f.getXPathString(last)); } assertEquals(last + 1, f.size()); } public void XPathtestDefault() throws Exception { XPathFileContainer f = new XPathFileContainer("../build.xml", "/project/@default"); assertNotNull(f); assertTrue("Not empty", f.size() > 0); assertEquals("install", f.getXPathString(0)); } public void XPathEmpty() throws Exception{ XPath xp = setupXPath("",""); String val=xp.execute(); assertEquals("",val); val=xp.execute(); assertEquals("",val); val=xp.execute(); assertEquals("",val); } public void XPathNoFile() throws Exception{ XPath xp = setupXPath("no-such-file",""); String val=xp.execute(); assertEquals("",val); // TODO - should check that error has been logged... } public void XPathFile1() throws Exception{ XPath xp = setupXPath("testfiles/XPathTest.xml","//user/@username"); assertEquals("u1",xp.execute()); assertEquals("u2",xp.execute()); assertEquals("u3",xp.execute()); assertEquals("u4",xp.execute()); assertEquals("u5",xp.execute()); assertEquals("u1",xp.execute()); } public void XPathFile2() throws Exception{ XPath xp1 = setupXPath("testfiles/XPathTest.xml","//user/@username"); XPath xp1a = setupXPath("testfiles/XPathTest.xml","//user/@username"); XPath xp2 = setupXPath("testfiles/XPathTest.xml","//user/@password"); XPath xp2a = setupXPath("testfiles/XPathTest.xml","//user/@password"); assertEquals("u1",xp1.execute()); assertEquals("p1",xp2.execute()); assertEquals("p2",xp2.execute()); assertEquals("u2",xp1a.execute()); assertEquals("u3",xp1.execute()); assertEquals("u4",xp1.execute()); assertEquals("p3",xp2a.execute()); } private static XPath sxp1,sxp2; // Use same XPath for both threads public void XPathSetup1() throws Exception{ sxp1 = setupXPath("testfiles/XPathTest.xml","//user/@username"); sxp2=sxp1; } // Use different XPath for both threads public void XPathSetup2() throws Exception{ sxp1 = setupXPath("testfiles/XPathTest.xml","//user/@username"); sxp2 = setupXPath("testfiles/XPathTest.xml","//user/@username"); } public void XPathThread1() throws Exception { Thread.currentThread().setName("XPathOne"); synchronized (BATON) { assertEquals("u1",sxp1.execute()); assertEquals("u2",sxp1.execute()); BATON.pass(); assertEquals("u5",sxp1.execute()); BATON.pass(); assertEquals("u2",sxp1.execute()); BATON.done(); } } public void XPathThread2() throws Exception { Thread.currentThread().setName("XPathTwo"); Thread.sleep(500); synchronized (BATON) { assertEquals("u3",sxp2.execute()); assertEquals("u4",sxp2.execute()); BATON.pass(); assertEquals("u1",sxp2.execute()); BATON.pass(); assertEquals("u3",sxp2.execute()); BATON.done(); } } private XPath setupXPath(String file, String expr) throws Exception{ Collection<CompoundVariable> parms = new LinkedList<>(); parms.add(new CompoundVariable(file)); parms.add(new CompoundVariable(expr)); XPath xp = new XPath(); xp.setParameters(parms); return xp; } }