/* * Copyright (C) 2006, 2007 XStream Committers. * All rights reserved. * * The software in this package is published under the terms of the BSD * style license a copy of which has been included with this distribution in * the LICENSE.txt file. * * Created on 22. March 2006 by Joerg Schaible */ package com.thoughtworks.acceptance; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import com.thoughtworks.acceptance.objects.Software; import com.thoughtworks.acceptance.someobjects.WithNamedList; /** * @author Jörg Schaible */ public class ConcurrencyTest extends AbstractAcceptanceTest { public void testConcurrentXStreaming() throws InterruptedException { xstream.alias("thing", WithNamedList.class); xstream.addImplicitCollection(WithNamedList.class, "things"); final List reference = Arrays.asList(new String[]{"A", "B", "C", "D"}); final WithNamedList[] namedLists = new WithNamedList[5]; for (int i = 0; i < namedLists.length; ++i) { namedLists[i] = new WithNamedList("Name " + (i + 1)); namedLists[i].things.add(new Software("walnes", "XStream 1." + i)); namedLists[i].things.add(reference); namedLists[i].things.add(new RuntimeException("JUnit " + i)); // a Serializable } final Map exceptions = new HashMap(); final ThreadGroup tg = new ThreadGroup(getName()) { public void uncaughtException(Thread t, Throwable e) { exceptions.put(e, t.getName()); super.uncaughtException(t, e); } }; final Object object = Arrays.asList(namedLists); final String xml = xstream.toXML(object); final int[] counter = new int[1]; counter[0] = 0; final Thread[] threads = new Thread[5]; for (int i = 0; i < threads.length; ++i) { threads[i] = new Thread(tg, "JUnit Thread " + i) { public void run() { int i = 0; try { synchronized (this) { notifyAll(); wait(); } while (!interrupted()) { assertBothWays(object, xml); ++i; } } catch (InterruptedException e) { fail("Unexpected InterruptedException"); } synchronized (counter) { counter[0] += i; } } }; } for (int i = 0; i < threads.length; ++i) { synchronized (threads[i]) { threads[i].start(); threads[i].wait(); } } for (int i = 0; i < threads.length; ++i) { synchronized (threads[i]) { threads[i].notifyAll(); } } Thread.sleep(1000); for (int i = 0; i < threads.length; ++i) { threads[i].interrupt(); } for (int i = 0; i < threads.length; ++i) { synchronized (threads[i]) { threads[i].join(); } } assertEquals("Exceptions has been thrown: " + exceptions, 0, exceptions.size()); assertTrue("Each thread should have made at least 1 conversion", counter[0] >= threads.length); } }