/* * Copyright (C) 2006 Joe Walnes. * Copyright (C) 2006, 2007, 2008 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 25. June 2006 by Guilherme Silveira */ package com.thoughtworks.acceptance; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Properties; //import javax.xml.stream.XMLInputFactory; import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; //import com.bea.xml.stream.MXParserFactory; import com.thoughtworks.acceptance.objects.StandardObject; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.HierarchicalStreamDriver; //import com.thoughtworks.xstream.io.xml.Dom4JDriver; import com.thoughtworks.xstream.io.xml.DomDriver; //import com.thoughtworks.xstream.io.xml.JDomDriver; //import com.thoughtworks.xstream.io.xml.StaxDriver; //import com.thoughtworks.xstream.io.xml.XomDriver; import com.thoughtworks.xstream.io.xml.XppDomDriver; import com.thoughtworks.xstream.io.xml.XppDriver; /** * @author Sanjiv Jivan * @author Guilherme Silveira * @author Jörg Schaible */ public class EncodingTestSuite extends TestSuite { public static class TestObject extends StandardObject { private String data; } public EncodingTestSuite() { super(EncodingTestSuite.class.getName()); // addDriverTest(new Dom4JDriver()); addDriverTest(new DomDriver()); // addDriverTest(new JDomDriver()); // addDriverTest(new StaxDriver()); addDriverTest(new XppDomDriver()); addDriverTest(new XppDriver()); // addDriverTest(new XomDriver()); } private void test(HierarchicalStreamDriver driver, String encoding) throws IOException { String headerLine = encoding != null ? ("<?xml version=\"1.0\" encoding=\"" + encoding + "\"?>\n") : ""; String xmlData = headerLine // force code format + "<test>\n" + " <data>J\u00f6rg</data>\n" + "</test>"; XStream xstream = new XStream(driver); xstream.alias("test", TestObject.class); TestObject obj = new TestObject(); obj.data = "J\u00f6rg"; ByteArrayOutputStream bos = new ByteArrayOutputStream(); OutputStreamWriter writer = encoding != null ? new OutputStreamWriter(bos, encoding) : new OutputStreamWriter(bos); xstream.toXML(obj, writer); writer.close(); String generated = encoding != null ? bos.toString(encoding) : bos.toString(); Assert.assertTrue("'" + obj.data + "' was not found", generated.indexOf(obj.data) > 0); Object restored = xstream.fromXML(new ByteArrayInputStream(encoding != null ? xmlData .getBytes(encoding) : xmlData.getBytes())); Assert.assertEquals(obj, restored); } private void addDriverTest(final HierarchicalStreamDriver driver) { String testName = getShortName(driver); final String allEncodingTests = System.getProperty("xstream.test.encoding.all"); if ("true".equals(allEncodingTests)) { // Native encoding normally fails on most systems!! addTest(new TestCase(testName + "Native") { protected void runTest() throws Throwable { test(driver, null); } }); // System encoding fails on US-ASCII systems, like Codehaus Bamboo final String systemEncoding = System.getProperty("file.encoding"); addTest(new TestCase(testName + "With" + systemEncoding + "SystemEncoding") { protected void runTest() throws Throwable { final Properties systemProperties = new Properties(); systemProperties.putAll(System.getProperties()); try { // Use BEA reference implementation for StAX // (Woodstox will fail on Windows because of unknown system encoding) // System.setProperty( // XMLInputFactory.class.getName(), MXParserFactory.class.getName()); test(driver, systemEncoding); } finally { System.setProperties(systemProperties); } } }); } addTest(new TestCase(testName + "WithUTF_8Encoding") { protected void runTest() throws Throwable { test(driver, "UTF-8"); } }); addTest(new TestCase(testName + "WithIS0_8859_1Encoding") { protected void runTest() throws Throwable { test(driver, "ISO-8859-1"); } }); } private String getShortName(HierarchicalStreamDriver driver) { String result = driver.getClass().getName(); result = result.substring(result.lastIndexOf('.') + 1); return result; } public static Test suite() { return new EncodingTestSuite(); } }