    1   /*
    2    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
    3    *
    4    * This software is open source.
    5    * See the bottom of this file for the licence.
    6    */
    7
    8   package org.dom4j.util;
    9
    10  import junit.framework.Test;
    11  import junit.framework.TestSuite;
    12  import junit.framework.TestCase;
    13  import junit.extensions.RepeatedTest;
    14
    15  import java.util.HashMap;
    16  import java.util.Map;
    17
    18  import com.clarkware.junitperf.LoadTest;
    19  import com.clarkware.junitperf.TimedTest;
    20
    21  /***
    22   * PerThreadSingleton Tester.
    23   *
    24   * @author ddlucas
    25   * @since
    26   *
    27   * <pre>
    28   * 01 / 05 / 2005
    29   * </pre>
    30   *
    31   * @version 1.0
    32   */
    33  public class PerThreadSingletonTest extends TestCase {
    34      public PerThreadSingletonTest(String name) {
    35          super(name);
    36      }
    37
    38      private static SingletonStrategy singleton;
    39
    40      private static ThreadLocal reference = new ThreadLocal();
    41
    42      public void setUp() throws Exception {
    43          super.setUp();
    44          synchronized (PerThreadSingletonTest.class) {
    45              if (singleton == null) {
    46                  singleton = new PerThreadSingleton();
    47                  singleton.setSingletonClassName(HashMap.class.getName());
    48              }
    49          }
    50      }
    51
    52      public void tearDown() throws Exception {
    53          super.tearDown();
    54      }
    55
    56      public void testInstance() throws Exception {
    57          String tid = Thread.currentThread().getName();
    58          Map map = (Map) singleton.instance();
    59
    60          String expected = "new value";
    61          if (!map.containsKey(tid) && reference.get() != null) {
    62              System.out.println("tid=" + tid + " map=" + map);
    63              System.out.println("reference=" + reference);
    64              System.out.println("singleton=" + singleton);
    65              fail("created singleton more than once");
    66          } else {
    67              map.put(tid, expected);
    68              reference.set(map);
    69          }
    70
    71          String actual = (String) map.get(tid);
    72          // System.out.println("tid="+tid+ " map="+map);
    73          assertEquals("testInstance", expected, actual);
    74
    75          map = (Map) singleton.instance();
    76          expected = "new value";
    77          actual = (String) map.get(tid);
    78          // System.out.println("tid="+tid+ " map="+map);
    79          // System.out.println("reference="+reference);
    80          // System.out.println("singleton="+singleton);
    81          assertEquals("testInstance", expected, actual);
    82          assertEquals("testInstance reference", reference.get(), map);
    83
    84      }
    85
    86      /***
    87       * Assembles and returns a test suite.
    88       *
    89       * @return The suite
    90       */
    91      public static Test suite() {
    92          TestSuite suite = new TestSuite();
    93          suite.addTest(makeRepeatedLoadTest(5, 100, "testInstance"));
    94          return suite;
    95      }
    96
    97      /***
    98       * JUnit method to exercise test via threads and loops
    99       *
    100      * @param users
    101      *            Number of users to simulate (i.e. Threads).
    102      * @param iterations
    103      *            Number of iterations per user ( repeat the test x times).
    104      * @param testMethod
    105      *            method to execute (testXXX).
    106      *
    107      * @return A Junit test
    108      */
    109     protected static Test makeRepeatedLoadTest(int users, int iterations,
    110             String testMethod) {
    111         long maxElapsedTime = 1200 + (1000 * users * iterations);
    112
    113         Test testCase = new PerThreadSingletonTest(testMethod);
    114
    115         Test repeatedTest = new RepeatedTest(testCase, iterations);
    116         Test loadTest = new LoadTest(repeatedTest, users);
    117         Test timedTest = new TimedTest(loadTest, maxElapsedTime);
    118
    119         return timedTest;
    120     }
    121 }
    122
    123 /*
    124  * Redistribution and use of this software and associated documentation
    125  * ("Software"), with or without modification, are permitted provided that the
    126  * following conditions are met:
    127  *
    128  * 1. Redistributions of source code must retain copyright statements and
    129  * notices. Redistributions must also contain a copy of this document.
    130  *
    131  * 2. Redistributions in binary form must reproduce the above copyright notice,
    132  * this list of conditions and the following disclaimer in the documentation
    133  * and/or other materials provided with the distribution.
    134  *
    135  * 3. The name "DOM4J" must not be used to endorse or promote products derived
    136  * from this Software without prior written permission of MetaStuff, Ltd. For
    137  * written permission, please contact dom4j-info@metastuff.com.
    138  *
    139  * 4. Products derived from this Software may not be called "DOM4J" nor may
    140  * "DOM4J" appear in their names without prior written permission of MetaStuff,
    141  * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
    142  *
    143  * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
    144  *
    145  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
    146  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    147  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    148  * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
    149  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    150  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    151  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    152  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    153  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    154  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    155  * POSSIBILITY OF SUCH DAMAGE.
    156  *
    157  * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
    158  */
    159