Jonathan,

I have tried your changes here (only in non-GUI mode) and found no problems.
In fact, your changes seem to resolve a problem where I was getting a large
number of exceptions such as the following in jmeter.log:

12/28/2002 11:19:41 PM ERROR - jmeter.engine:
java.lang.ArrayIndexOutOfBoundsException: 17
        at 
org.apache.oro.text.regex.Perl5Compiler.__emitNode(Perl5Compiler.java:338)
        at 
org.apache.oro.text.regex.Perl5Compiler.__parseExpression(Perl5Compiler.java
:1375)
        at 
org.apache.oro.text.regex.Perl5Compiler.compile(Perl5Compiler.java:1460)
        at 
org.apache.oro.text.regex.Perl5Compiler.compile(Perl5Compiler.java:1731)
        at 
org.apache.jmeter.assertions.ResponseAssertion.evaluateResponse(ResponseAsse
rtion.java:294)
        at 
org.apache.jmeter.assertions.ResponseAssertion.getResult(ResponseAssertion.j
ava:197)
        at 
org.apache.jmeter.threads.JMeterThread.checkAssertions(JMeterThread.java:179
)
        at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:144)
        at java.lang.Thread.run(Thread.java:536)

Needless to say, my test script runs much better without these ;-).

I will prepare a new patch based on your code and attach it to the existing
bugzilla issue.

Thanks,

Scott
-- 
Scott Eade
Backstage Technologies Pty. Ltd.
http://www.backstagetech.com.au
.Mac Chat/AIM: seade at mac dot com


On 27/12/2002 4:03 AM, "Jonathan Carlson" <[EMAIL PROTECTED]> wrote:

> Here is a much cleaner (IMHO) fix for the Assertion Results threading problem.
> Could someone else try this out and see how it works for them?  It works fine
> for me in both GUI and non-GUI mode.
> 
> This fix also avoids the problem that Scott found with the previous fix when
> running in non-GUI mode.  I'm sorry I didn't catch that before you all did,
> but I didn't even know that there was a non-GUI mode until recently.
> 
> The below fix assumes a "clean" (without my previous fixes) 1.8 version of
> ResponseAssertion.java.
> 
> 1) The compilerMatcher static field replaces the current compiler and matcher
> static fields.
> 2) The #evaluateResponse method is a replacement for the existing one.
> 3) The CompilerMatcher static member class is new.
> 
> One note about this:  The benefit of the caching of the compiled patterns here
> is not proven, only assumed.  Some people, including myself, don't like to add
> complexity without demonstrating a need for it.  In this case, I really need
> to move onto other work that will provide benefit to my company and the added
> complexity was quite minimal given the perceived benefit.
> 
> If someone else feels it is important to demonstrate that looking up a cached
> compiled pattern truly is cheaper than recompiling the pattern each time, I
> would be happy if they would do that.  Otherwise, I don't think the added
> complexity is enough to warrant it at this point.
> 
> Cheers, Jonathan 
> 
> P.S. I'll be on vacation until Friday 2002-01-03.  I'll be interested to hear
> about other people's success or unsuccess with this patch at that time.  (I'm
> expecting only success :-)
> 
> 
>   private transient static ThreadLocal compilerMatcher =
>       new ThreadLocal()
>       {
>           protected Object initialValue()
>           {
>               return new CompilerMatcher();
>           }
>       };
> 
> 
>   /**
>    * Make sure the response satisfies the specified assertion requirements.
>    * @param response an instance of SampleResult
>    * @return an instance of AssertionResult
>    */
>   private AssertionResult evaluateResponse(SampleResult response)
>   {
>       boolean pass = true;
>       boolean not = (NOT & getTestType()) > 0;
>       AssertionResult result = new AssertionResult();
>       try
>       {
>           String responseString = new String(response.getResponseData());
>           // Get the CompilerMatcher for this thread
>           CompilerMatcher localCompilerMatcher =
>                   (CompilerMatcher) this.compilerMatcher.get();
>           Iterator iter = getTestStrings().iterator();
>           while (iter.hasNext())
>           {
>               String stringPattern = (String) iter.next();
>               boolean found;
>               if ((CONTAINS & getTestType()) > 0)
>               {
>                   found = localCompilerMatcher
>                           .contains(responseString, stringPattern);
>               }
>               else
>               {
>                   found = localCompilerMatcher
>                           .matches(responseString, stringPattern);
>               }
>               pass = not ? !found : found;
> 
>               if (!pass)
>               {
>                   result.setFailure(true);
>                   result.setFailureMessage(
>                       "Test Failed, expected " + notMessage + failMessage +
> stringPattern);
>                   break;
>               }
>           }
>           if(pass)
>           {
>               result.setFailure(false);
>           }
>           result.setError(false);
>       }
>       catch(MalformedPatternException e)
>       {
>           result.setError(true);
>           result.setFailure(false);
>           result.setFailureMessage("Bad test configuration"+e);
>       }
>       return result;
>   }
> 
>   /**
>    * Performs regular expression matching and compiled regular expression
>    * pattern caching.
>    *
>    * This static member class is *not* thread-safe so it must be
>    * accessed from a java.lang.ThreadLocal instance for multi-thread usage.
>    * ThreadLocal causes slightly extra memory usage, but allows for faster
>    * thread-safe processing than synchronization would afford.
>    */
>   public static class CompilerMatcher
>   {
>       private Perl5Compiler compiler = new Perl5Compiler();
>       private Perl5Matcher  matcher = new Perl5Matcher();
>       private Map           compiledPatterns = new HashMap();
> 
>       /**
>        * Returns true if the compiled version of the patternString regular
>        * expression argument matches the aString argument.
>        */
>       public boolean matches(String aString, String patternString)
>           throws MalformedPatternException
>       {
>           return this.matcher.matches(aString,
> this.getTestPattern(patternString));
>       }
> 
>       /**
>        * Returns true if the compiled version of the patternString regular
>        * expression argument is contained in the aString argument.
>        */
>       public boolean contains(String aString, String patternString)
>           throws MalformedPatternException
>       {
>           return this.matcher.contains(aString,
> this.getTestPattern(patternString));
>       }
> 
>       /**
>        * Compiles and caches a regexp pattern for the given string pattern.
>        * This would be of no benefit (and may bloat memory usage) if the
>        * string pattern arg is never the same.  But for this usage that
>        * won't be the case.
>        */
>       private Pattern getTestPattern(String stringPattern)
>           throws MalformedPatternException
>       {
>           Pattern pattern = (Pattern) compiledPatterns.get(stringPattern);
>           if (pattern == null)
>           {
>               pattern = compiler.compile(stringPattern);
>               compiledPatterns.put(stringPattern, pattern);
>               log.debug("Compiled and cached a pattern: '" + stringPattern +
> "' - " + Thread.currentThread());
>           }
>           return pattern;
>       }
>   }
> 
> 
> **********************************************************************
> This email and any files transmitted with it are confidential and
> intended solely for the use of the individual or entity to whom they
> are addressed. If you have received this email in error please notify
> the system manager.
> **********************************************************************
> 
> --
> To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
> 


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to