    1   /*
    2    * Copyright 1999-2004 The Apache Software Foundation
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *     http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  package org.apache.commons.jxpath.ri;
    17
    18  import junit.framework.TestCase;
    19
    20  import org.apache.commons.jxpath.JXPathContext;
    21
    22  /***
    23   * Test thread safety.
    24   *
    25   * @author Dmitri Plotnikov
    26   * @version $Revision: 1.3 $ $Date: 2004/02/29 14:17:44 $
    27   */
    28
    29  public class StressTest extends TestCase {
    30
    31      private static final int THREAD_COUNT = 50;
    32      private static final int THREAD_DURATION = 1000;
    33      private static JXPathContext context;
    34      private static int count;
    35      private static Throwable exception;
    36
    37      /***
    38       * Construct a new instance of this test case.
    39       *
    40       * @param name Name of the test case
    41       */
    42      public StressTest(String name) {
    43          super(name);
    44      }
    45
    46      public void testThreads() throws Throwable {
    47          context = JXPathContext.newContext(null, new Double(100));
    48          Thread[] threadArray = new Thread[THREAD_COUNT];
    49          for (int i = 0; i < THREAD_COUNT; i++) {
    50              threadArray[i] = new Thread(new StressRunnable());
    51          }
    52
    53          for (int i = 0; i < threadArray.length; i++) {
    54              threadArray[i].start();
    55          }
    56
    57          for (int i = 0; i < threadArray.length; i++) {
    58              try {
    59                  threadArray[i].join();
    60              }
    61              catch (InterruptedException e) {
    62                  assertTrue("Interrupted", false);
    63              }
    64          }
    65
    66          if (exception != null) {
    67              throw exception;
    68          }
    69          assertEquals("Test count", THREAD_COUNT * THREAD_DURATION, count);
    70      }
    71
    72      private final class StressRunnable implements Runnable {
    73          public void run() {
    74              for (int j = 0; j < THREAD_DURATION && exception == null; j++) {
    75                  try {
    76                      double random = 1 + Math.random();
    77                      double sum =
    78                          ((Double) context.getValue("/ + " + random))
    79                              .doubleValue();
    80                      assertEquals(100 + random, sum, 0.0001);
    81                      synchronized (context) {
    82                          count++;
    83                      }
    84                  }
    85                  catch (Throwable t) {
    86                      exception = t;
    87                  }
    88              }
    89          }
    90      }
    91  }