Example #1
0
/**
 * @author mstover
 *     <p>To change this generated comment edit the template variable "typecomment":
 *     Window>Preferences>Java>Templates.
 */
public class RegexFunction extends AbstractFunction implements Serializable {
  private static transient Logger log =
      Hierarchy.getDefaultHierarchy().getLoggerFor("jmeter.elements");
  public static final String ALL = "ALL";
  public static final String RAND = "RAND";
  public static final String KEY = "__regexFunction";

  Object[] values;
  private static Random rand = new Random();
  private static List desc = new LinkedList();
  Pattern searchPattern;
  Object[] template;
  String valueIndex, defaultValue, between;
  transient PatternCompiler compiler = new Perl5Compiler();
  Pattern templatePattern;
  private String name;
  private static ThreadLocal localMatcher =
      new ThreadLocal() {
        protected Object initialValue() {
          return new Perl5Matcher();
        }
      };

  static {
    desc.add(JMeterUtils.getResString("regexfunc_param_1"));
    desc.add(JMeterUtils.getResString("regexfunc_param_2"));
    desc.add(JMeterUtils.getResString("regexfunc_param_3"));
    desc.add(JMeterUtils.getResString("regexfunc_param_4"));
    desc.add(JMeterUtils.getResString("regexfunc_param_5"));
    desc.add(JMeterUtils.getResString("function_name_param"));
  }

  public RegexFunction() {
    valueIndex = between = name = "";
    try {
      templatePattern = compiler.compile("\\$(\\d+)\\$");
    } catch (MalformedPatternException e) {
      log.error("", e);
    }
  }

  public String execute(SampleResult previousResult, Sampler currentSampler)
      throws InvalidVariableException {
    try {
      searchPattern = compiler.compile(((CompoundVariable) values[0]).execute());
      generateTemplate(((CompoundVariable) values[1]).execute());

      if (values.length > 2) {
        valueIndex = ((CompoundVariable) values[2]).execute();
      }
      if (valueIndex.equals("")) {
        valueIndex = "1";
      }

      if (values.length > 3) {
        between = ((CompoundVariable) values[3]).execute();
      }

      if (values.length > 4) {
        String dv = ((CompoundVariable) values[4]).execute();
        if (!dv.equals("")) {
          defaultValue = dv;
        }
      }

      if (values.length > 5) {
        name = ((CompoundVariable) values[values.length - 1]).execute();
      }
    } catch (MalformedPatternException e) {
      log.error("", e);
      throw new InvalidVariableException("Bad regex pattern");
    } catch (Exception e) {
      throw new InvalidVariableException(e.getMessage());
    }

    getVariables().put(name, defaultValue);
    if (previousResult == null || previousResult.getResponseData() == null) {
      return defaultValue;
    }

    List collectAllMatches = new ArrayList();
    try {
      PatternMatcher matcher = (PatternMatcher) localMatcher.get();
      String responseText = new String(previousResult.getResponseData());
      PatternMatcherInput input = new PatternMatcherInput(responseText);
      while (matcher.contains(input, searchPattern)) {
        MatchResult match = matcher.getMatch();
        collectAllMatches.add(match);
      }
    } catch (NumberFormatException e) {
      log.error("", e);
      return defaultValue;
    } catch (Exception e) {
      return defaultValue;
    }

    if (collectAllMatches.size() == 0) {
      return defaultValue;
    }

    if (valueIndex.equals(ALL)) {
      StringBuffer value = new StringBuffer();
      Iterator it = collectAllMatches.iterator();
      boolean first = true;
      while (it.hasNext()) {
        if (!first) {
          value.append(between);
        } else {
          first = false;
        }
        value.append(generateResult((MatchResult) it.next()));
      }
      return value.toString();
    } else if (valueIndex.equals(RAND)) {
      MatchResult result =
          (MatchResult) collectAllMatches.get(rand.nextInt(collectAllMatches.size()));
      return generateResult(result);
    } else {
      try {
        int index = Integer.parseInt(valueIndex) - 1;
        MatchResult result = (MatchResult) collectAllMatches.get(index);
        return generateResult(result);
      } catch (NumberFormatException e) {
        float ratio = Float.parseFloat(valueIndex);
        MatchResult result =
            (MatchResult) collectAllMatches.get((int) (collectAllMatches.size() * ratio + .5) - 1);
        return generateResult(result);
      } catch (IndexOutOfBoundsException e) {
        return defaultValue;
      }
    }
  }

  private void saveGroups(MatchResult result) {
    if (result != null) {
      JMeterVariables vars = getVariables();
      for (int x = 0; x < result.groups(); x++) {
        vars.put(name + "_g" + x, result.group(x));
      }
    }
  }

  public List getArgumentDesc() {
    return desc;
  }

  private String generateResult(MatchResult match) {
    saveGroups(match);
    StringBuffer result = new StringBuffer();
    for (int a = 0; a < template.length; a++) {
      if (template[a] instanceof String) {
        result.append(template[a]);
      } else {
        result.append(match.group(((Integer) template[a]).intValue()));
      }
    }
    JMeterVariables vars = getVariables();
    vars.put(name, result.toString());
    return result.toString();
  }

  public String getReferenceKey() {
    return KEY;
  }

  public void setParameters(Collection parameters) throws InvalidVariableException {
    values = parameters.toArray();
    if (values.length < 2) {
      throw new InvalidVariableException();
    }

    //		defaultValue = URLDecoder.decode(parameters);
    defaultValue = "";
  }

  private void generateTemplate(String rawTemplate) {
    List pieces = new ArrayList();
    List combined = new LinkedList();
    PatternMatcher matcher = new Perl5Matcher();
    Util.split(pieces, new Perl5Matcher(), templatePattern, rawTemplate);
    PatternMatcherInput input = new PatternMatcherInput(rawTemplate);
    int count = 0;
    Iterator iter = pieces.iterator();
    boolean startsWith = isFirstElementGroup(rawTemplate);
    while (iter.hasNext()) {
      boolean matchExists = matcher.contains(input, templatePattern);
      if (startsWith) {
        if (matchExists) {
          combined.add(new Integer(matcher.getMatch().group(1)));
        }
        combined.add(iter.next());
      } else {
        combined.add(iter.next());
        if (matchExists) {
          combined.add(new Integer(matcher.getMatch().group(1)));
        }
      }
    }
    if (matcher.contains(input, templatePattern)) {
      combined.add(new Integer(matcher.getMatch().group(1)));
    }
    template = combined.toArray();
  }

  private boolean isFirstElementGroup(String rawData) {
    try {
      Pattern pattern = compiler.compile("^\\$\\d+\\$");
      return new Perl5Matcher().contains(rawData, pattern);
    } catch (MalformedPatternException e) {
      log.error("", e);
      return false;
    }
  }

  /*	public static class Test extends TestCase
  {
  	RegexFunction variable;
  	SampleResult result;
  	Collection params;

  	public Test(String name)
  	{
  		super(name);
  	}

  	public void setUp()
  	{
  		variable = new RegexFunction();
  		result = new SampleResult();
  		String data = "<company-xmlext-query-ret><row><value field=\"RetCode\">LIS_OK</value><value"+
  		" field=\"RetCodeExtension\"></value><value field=\"alias\"></value><value"+
  		" field=\"positioncount\"></value><value field=\"invalidpincount\">0</value><value"+
  		" field=\"pinposition1\">1</value><value"+
  		" field=\"pinpositionvalue1\"></value><value"+
  		" field=\"pinposition2\">5</value><value"+
  		" field=\"pinpositionvalue2\"></value><value"+
  		" field=\"pinposition3\">6</value><value"+
  		" field=\"pinpositionvalue3\"></value></row></company-xmlext-query-ret>";
  		result.setResponseData(data.getBytes());
  	}

  	public void testVariableExtraction() throws Exception
  	{
  		params = new LinkedList();
  		params.add(ArgumentEncoder.encode("<value field=\"(pinposition\\d+)\">(\\d+)</value>"));
  		params.add("$2$");
  		params.add("2");
  		variable.setParameters(params);
  		variable.setJMeterVariables(new JMeterVariables());
  		String match = variable.execute(result,null);
  		assertEquals("5",match);
  	}

  	public void testVariableExtraction2() throws Exception
  	{
  		params = new LinkedList();
  		params.add(ArgumentEncoder.encode("<value field=\"(pinposition\\d+)\">(\\d+)</value>"));
  		params.add("$1$");
  		params.add("3");
  		variable.setParameters(params);
  		variable.setJMeterVariables(new JMeterVariables());
  		String match = variable.execute(result,null);
  		assertEquals("pinposition3",match);
  	}

  	public void testVariableExtraction5() throws Exception
  	{
  		params = new LinkedList();
  		params.add(ArgumentEncoder.encode("<value field=\"(pinposition\\d+)\">(\\d+)</value>"));
  		params.add("$1$");
  		params.add("All");
  		params.add("_");
  		variable.setParameters(params);
  		variable.setJMeterVariables(new JMeterVariables());
  		String match = variable.execute(result,null);
  		assertEquals("pinposition1_pinposition2_pinposition3",match);
  	}

  	public void testVariableExtraction6() throws Exception
  	{
  		params = new LinkedList();
  		params.add(	ArgumentEncoder.encode("<value field=\"(pinposition\\d+)\">(\\d+)</value>"));
  		params.add("$2$");
  		params.add("4");
  		params.add("");
  		params.add("default");
  		variable.setParameters(params);
  		variable.setJMeterVariables(new JMeterVariables());
  		String match = variable.execute(result,null);
  		assertEquals("default",match);
  	}

  	public void testComma() throws Exception
  	{
  		params = new LinkedList();
  		params.add(ArgumentEncoder.encode("<value,? field=\"(pinposition\\d+)\">(\\d+)</value>"));
  		params.add("$1$");
  		params.add("3");
  		variable.setParameters(params);
  		variable.setJMeterVariables(new JMeterVariables());
  		String match = variable.execute(result,null);
  		assertEquals("pinposition3",match);
  	}

  	public void testVariableExtraction3() throws Exception
  	{
  		params = new LinkedList();
  		params.add(ArgumentEncoder.encode("<value field=\"(pinposition\\d+)\">(\\d+)</value>"));
  		params.add("_$1$");
  		params.add("5");
  		variable.setParameters(params);
  		variable.setJMeterVariables(new JMeterVariables());
  		String match = variable.execute(result,null);
  		assertEquals("_pinposition2",match);
  	}

  	public void testVariableExtraction4() throws Exception
  	{
  		params = new LinkedList();
  		params.add(ArgumentEncoder.encode("<value field=\"(pinposition\\d+)\">(\\d+)</value>"));
  		params.add(ArgumentEncoder.encode("$2$, "));
  		params.add(".333");
  		variable.setParameters(params);
  		variable.setJMeterVariables(new JMeterVariables());

  		String match = variable.execute(result,null);
  		assertEquals("1, ",match);
  	}

  	public void testDefaultValue() throws Exception
  	{
  		params = new LinkedList();
  		params.add(ArgumentEncoder.encode("<value,, field=\"(pinposition\\d+)\">(\\d+)</value>"));
  		params.add(ArgumentEncoder.encode("$2$, "));
  		params.add(".333");
  		params.add("");
  		params.add("No Value Found");
  		variable.setParameters(params);
  		variable.setJMeterVariables(new JMeterVariables());

  		String match = variable.execute(result,null);
  		assertEquals("No Value Found",match);
  	}
  }*/

}
/**
 * @author mstover
 *     <p>To change this generated comment edit the template variable "typecomment":
 *     Window>Preferences>Java>Templates.
 */
public class URLRewritingModifier extends AbstractTestElement
    implements Serializable, PreProcessor {
  private static transient Logger log =
      Hierarchy.getDefaultHierarchy().getLoggerFor("jmeter.protocol.http");
  private Pattern case1, case2, case3, case4;
  transient Perl5Compiler compiler = new Perl5Compiler();
  private static final String ARGUMENT_NAME = "argument_name";
  private static final String PATH_EXTENSION = "path_extension";
  private static final String PATH_EXTENSION_NO_EQUALS = "path_extension_no_equals";

  public void process() {
    Sampler sampler = JMeterContextService.getContext().getCurrentSampler();
    SampleResult responseText = JMeterContextService.getContext().getPreviousResult();
    if (responseText == null) {
      return;
    }
    initRegex(getArgumentName());
    String text = new String(responseText.getResponseData());
    Perl5Matcher matcher = JMeterUtils.getMatcher();
    String value = "";
    if (matcher.contains(text, case1)) {
      MatchResult result = matcher.getMatch();
      value = result.group(1);
    } else if (matcher.contains(text, case2)) {
      MatchResult result = matcher.getMatch();
      value = result.group(1);
    } else if (matcher.contains(text, case3)) {
      MatchResult result = matcher.getMatch();
      value = result.group(1);
    } else if (matcher.contains(text, case4)) {
      MatchResult result = matcher.getMatch();
      value = result.group(1);
    }

    modify((HTTPSampler) sampler, value);
  }

  private void modify(HTTPSampler sampler, String value) {
    if (isPathExtension()) {
      if (isPathExtensionNoEquals()) {
        sampler.setPath(sampler.getPath() + ";" + getArgumentName() + value);
      } else {
        sampler.setPath(sampler.getPath() + ";" + getArgumentName() + "=" + value);
      }
    } else {
      sampler.getArguments().removeArgument(getArgumentName());
      sampler.getArguments().addArgument(new HTTPArgument(getArgumentName(), value, true));
    }
  }

  public void setArgumentName(String argName) {
    setProperty(ARGUMENT_NAME, argName);
  }

  private void initRegex(String argName) {
    case1 =
        JMeterUtils.getPatternCache()
            .getPattern(
                argName + "=([^\"'>& \n\r;]*)[& \\n\\r\"'>;]?$?", Perl5Compiler.MULTILINE_MASK);
    case2 =
        JMeterUtils.getPatternCache()
            .getPattern(
                "[Nn][Aa][Mm][Ee]=\"" + argName + "\"[^>]+[vV][Aa][Ll][Uu][Ee]=\"([^\"]*)\"",
                Perl5Compiler.MULTILINE_MASK);
    case3 =
        JMeterUtils.getPatternCache()
            .getPattern(
                "[vV][Aa][Ll][Uu][Ee]=\"([^\"]*)\"[^>]+[Nn][Aa][Mm][Ee]=\"" + argName + "\"",
                Perl5Compiler.MULTILINE_MASK);
    // case1 could be re-written "=?([^..."  instead of creating a new pattern?
    case4 =
        JMeterUtils.getPatternCache()
            .getPattern(
                argName + "([^\"'>& \n\r]*)[& \\n\\r\"'>]?$?", Perl5Compiler.MULTILINE_MASK);
  }

  public String getArgumentName() {
    return getPropertyAsString(ARGUMENT_NAME);
  }

  public void setPathExtension(boolean pathExt) {
    setProperty(new BooleanProperty(PATH_EXTENSION, pathExt));
  }

  public void setPathExtensionNoEquals(boolean pathExtNoEquals) {
    setProperty(new BooleanProperty(PATH_EXTENSION_NO_EQUALS, pathExtNoEquals));
  }

  public boolean isPathExtension() {
    return getPropertyAsBoolean(PATH_EXTENSION);
  }

  public boolean isPathExtensionNoEquals() {
    return getPropertyAsBoolean(PATH_EXTENSION_NO_EQUALS);
  }

  public static class Test extends TestCase {
    SampleResult response;
    JMeterContext context;

    public Test(String name) {
      super(name);
    }

    public void setUp() {
      context = JMeterContextService.getContext();
    }

    public void testGrabSessionId() throws Exception {
      String html =
          "location: http://server.com/index.html?session_id=jfdkjdkf%20jddkfdfjkdjfdf%22;";
      response = new SampleResult();
      response.setResponseData(html.getBytes());
      URLRewritingModifier mod = new URLRewritingModifier();
      mod.setArgumentName("session_id");
      HTTPSampler sampler = createSampler();
      sampler.addArgument("session_id", "adfasdfdsafasdfasd");
      context.setCurrentSampler(sampler);
      context.setPreviousResult(response);
      mod.process();
      Arguments args = sampler.getArguments();
      assertEquals(
          "jfdkjdkf jddkfdfjkdjfdf\"",
          ((Argument) args.getArguments().get(0).getObjectValue()).getValue());
      assertEquals(
          "http://server.com/index.html?session_id=jfdkjdkf+jddkfdfjkdjfdf%22", sampler.toString());
    }

    public void testGrabSessionId2() throws Exception {
      String html = "<a href=\"http://server.com/index.html?session_id=jfdkjdkfjddkfdfjkdjfdf\">";
      response = new SampleResult();
      response.setResponseData(html.getBytes());
      URLRewritingModifier mod = new URLRewritingModifier();
      mod.setArgumentName("session_id");
      HTTPSampler sampler = createSampler();
      context.setCurrentSampler(sampler);
      context.setPreviousResult(response);
      mod.process();
      Arguments args = sampler.getArguments();
      assertEquals(
          "jfdkjdkfjddkfdfjkdjfdf",
          ((Argument) args.getArguments().get(0).getObjectValue()).getValue());
    }

    private HTTPSampler createSampler() {
      HTTPSampler sampler = new HTTPSampler();
      sampler.setDomain("server.com");
      sampler.setPath("index.html");
      sampler.setMethod(HTTPSampler.GET);
      sampler.setProtocol("http");
      return sampler;
    }

    public void testGrabSessionId3() throws Exception {
      String html = "href='index.html?session_id=jfdkjdkfjddkfdfjkdjfdf'";
      response = new SampleResult();
      response.setResponseData(html.getBytes());
      URLRewritingModifier mod = new URLRewritingModifier();
      mod.setArgumentName("session_id");
      HTTPSampler sampler = createSampler();
      context.setCurrentSampler(sampler);
      context.setPreviousResult(response);
      mod.process();
      Arguments args = sampler.getArguments();
      assertEquals(
          "jfdkjdkfjddkfdfjkdjfdf",
          ((Argument) args.getArguments().get(0).getObjectValue()).getValue());
    }

    public void testGrabSessionId4() throws Exception {
      String html = "href='index.html;%24sid%24KQNq3AAADQZoEQAxlkX8uQV5bjqVBPbT'";
      response = new SampleResult();
      response.setResponseData(html.getBytes());
      URLRewritingModifier mod = new URLRewritingModifier();
      mod.setArgumentName("%24sid%24");
      mod.setPathExtension(true);
      mod.setPathExtensionNoEquals(true);
      HTTPSampler sampler = createSampler();
      context.setCurrentSampler(sampler);
      context.setPreviousResult(response);
      mod.process();
      Arguments args = sampler.getArguments();
      assertEquals("index.html;%24sid%24KQNq3AAADQZoEQAxlkX8uQV5bjqVBPbT", sampler.getPath());
    }
  }
}
Example #3
0
/**
 * The <code>JavaConfig</code> class contains the configuration data necessary for the Java
 * protocol. This data is used to configure a {@link
 * org.apache.jmeter.protocol.java.sampler.JavaSamplerClient} instance to perform performance test
 * samples.
 *
 * @author Brad Kiewel
 * @author <a href="mailto:[email protected]">Jeremy Arnold</a>
 * @version $Revision: 1.1 $
 */
public class JavaConfig extends ConfigTestElement implements Serializable {
  /** Logging */
  private static transient Logger log =
      Hierarchy.getDefaultHierarchy().getLoggerFor("jmeter.protocol.java");

  /** Constructor for the JavaConfig object */
  public JavaConfig() {
    setArguments(new Arguments());
  }

  /**
   * Sets the class name attribute of the JavaConfig object. This is the class name of the {@link
   * org.apache.jmeter.protocol.java.sampler.JavaSamplerClient} implementation which will be used to
   * execute the test.
   *
   * @param classname the new classname value
   */
  public void setClassname(String classname) {
    setProperty(JavaSampler.CLASSNAME, classname);
  }

  /**
   * Gets the class name attribute of the JavaConfig object. This is the class name of the {@link
   * org.apache.jmeter.protocol.java.sampler.JavaSamplerClient} implementation which will be used to
   * execute the test.
   *
   * @return the classname value
   */
  public String getClassname() {
    return getPropertyAsString(JavaSampler.CLASSNAME);
  }

  /**
   * Adds an argument to the list of arguments for this JavaConfig object. The {@link
   * org.apache.jmeter.protocol.java.sampler.JavaSamplerClient} implementation can access these
   * arguments through the {@link org.apache.jmeter.protocol.java.sampler.JavaSamplerContext}.
   *
   * @param name the name of the argument to be added
   * @param value the value of the argument to be added
   */
  public void addArgument(String name, String value) {
    Arguments args = this.getArguments();
    args.addArgument(name, value);
  }

  /** Removes all of the arguments associated with this JavaConfig object. */
  public void removeArguments() {
    setProperty(new TestElementProperty(JavaSampler.ARGUMENTS, new Arguments()));
  }

  /**
   * Set all of the arguments for this JavaConfig object. This will replace any previously added
   * arguments. The {@link org.apache.jmeter.protocol.java.sampler.JavaSamplerClient} implementation
   * can access these arguments through the {@link
   * org.apache.jmeter.protocol.java.sampler.JavaSamplerContext}.
   *
   * @param args the new arguments
   */
  public void setArguments(Arguments args) {
    setProperty(new TestElementProperty(JavaSampler.ARGUMENTS, args));
  }

  /**
   * Gets the arguments for this JavaConfig object. The {@link
   * org.apache.jmeter.protocol.java.sampler.JavaSamplerClient} implementation can access these
   * arguments through the {@link org.apache.jmeter.protocol.java.sampler.JavaSamplerContext}.
   *
   * @return the arguments
   */
  public Arguments getArguments() {
    return (Arguments) getProperty(JavaSampler.ARGUMENTS).getObjectValue();
  }
}