package com.netflix.xstream.converters; import com.thoughtworks.xstream.converters.SingleValueConverter; import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; import junit.framework.TestCase; public class DurationConverterTest extends TestCase { public void testConversion() throws Exception { testConversion(new DurationConverter()); } public void testThreadSafe() throws Exception { final SingleValueConverter converter = new DurationConverter(); final long startTime = System.currentTimeMillis() + 500; final Callable test = new Callable() { public Object call() throws Exception { Thread.sleep(startTime - System.currentTimeMillis()); for (int rep = 0; rep < 5; ++rep) { testConversion(converter); } return null; } }; final FutureTask[] results = new FutureTask[10]; // Start threads: for (int r = 0; r < results.length; ++r) { (new Thread(results[r] = new FutureTask(test))).start(); } // Wait for threads to complete: for (Future result : results) { assertNull(result.get()); } } private static void testConversion(SingleValueConverter converter) throws Exception { DatatypeFactory factory = DatatypeFactory.newInstance(); for (String s : STRINGS) { Duration o = factory.newDuration(s); assertEquals(s, converter.toString(o)); assertEquals(o, converter.fromString(s)); } } private static final String[] STRINGS = { "-P1Y2M3DT4H5M6.7S", "P1Y", "PT1H2M" }; }