package com.rits.tests.cloning; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Random; import java.util.TreeMap; import junit.extensions.ActiveTestSuite; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import com.rits.cloning.Cloner; /** * test thread safety of cloner * * @author kostantinos.kougios * * 18 Jan 2009 */ public class TestClonerThreadSafety extends TestCase { private static final Cloner cloner = new Cloner(); // use 1 cloner for all tests (all threads) public void testCloner() { final Random r = new Random(); for (int i = 0; i < 10000; i++) { final Calendar cal = Calendar.getInstance(); final Calendar clone = cloner.deepClone(cal); assertNotSame(cal, clone); assertNotSame(cal.getTime(), clone.getTime()); assertTrue(cal.equals(clone)); if (r.nextBoolean()) { Thread.yield(); } final List<Calendar> l = new ArrayList<Calendar>(); l.add(cal); l.add(Calendar.getInstance()); final List<Calendar> lClone = cloner.deepClone(l); assertNotSame(l, lClone); assertEquals(l.size(), lClone.size()); assertEquals(l.get(0), lClone.get(0)); assertEquals(l.get(1), lClone.get(1)); if (r.nextBoolean()) { Thread.yield(); } try { final URL url = new URL("http://localhost"); assertEquals(url, cloner.deepClone(url)); } catch (final MalformedURLException e) { throw new RuntimeException(e); } final TreeMap<String, Object> m = new TreeMap<String, Object>(); m.put("cal", cal); m.put("clone", clone); final TreeMap<String, Object> dm = cloner.deepClone(m); assertEquals(m.size(), dm.size()); assertNotSame(m.get("cal"), dm.get("cal")); assertEquals(m.get("cal"), dm.get("cal")); assertNotSame(m.get("clone"), dm.get("clone")); assertEquals(m.get("clone"), dm.get("clone")); if (r.nextBoolean()) { Thread.yield(); } } } public static Test suite() { final TestSuite testSuite = new TestSuite(); for (int i = 0; i < 80; i++) { testSuite.addTest(new ActiveTestSuite(TestClonerThreadSafety.class)); } return testSuite; } }