You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2006/03/15 12:47:39 UTC

svn commit: r386058 [48/49] - in /incubator/harmony/enhanced/classlib/trunk: make/ modules/archive/make/common/ modules/archive/src/test/java/tests/ modules/archive/src/test/java/tests/api/ modules/archive/src/test/java/tests/api/java/ modules/archive/...

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpServerSocket.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpServerSocket.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpServerSocket.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpServerSocket.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,76 @@
+/* Copyright 2002, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+/**
+ * This class implements the Support_ServerSocket interface using java.net
+ * Serversockets
+ */
+
+public class Support_HttpServerSocket implements Support_ServerSocket {
+	private ServerSocket instance = null;
+
+	private int port = -1;
+
+	private int timeout = 8000;
+
+	/**
+	 * Blocks until a connection is made, or the socket times out.
+	 * 
+	 * @see tests.support.Support_ServerSocket#accept()
+	 */
+	public Support_Socket accept() throws IOException {
+		if (port == -1)
+			return null;
+		if (instance == null)
+			return null;
+		instance.setSoTimeout(timeout);
+		Socket s = instance.accept();
+		return new Support_HttpSocket(s);
+	}
+
+	/**
+	 * @see tests.support.Support_ServerSocket#setTimeout(int) Sets the
+	 *      timeout for the server.
+	 */
+	public void setTimeout(int timeout) {
+		this.timeout = timeout;
+	}
+
+	/**
+	 * @see tests.support.Support_ServerSocket#setPort(int)
+	 */
+	public void setPort(int port) {
+		this.port = port;
+	}
+
+	public void open() throws IOException {
+		instance = new ServerSocket(port);
+	}
+
+	/**
+	 * @see tests.support.Support_ServerSocket#close()
+	 */
+	public void close() throws IOException {
+		if (instance != null)
+			instance.close();
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpSocket.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpSocket.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpSocket.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpSocket.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,51 @@
+/* Copyright 2002, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+
+/**
+ * This class implements the Support_Socket interface using java.net Sockets.
+ */
+public class Support_HttpSocket implements Support_Socket {
+
+	private Socket instance;
+
+	private boolean streamOpen = false;
+
+	Support_HttpSocket(Socket socket) {
+		instance = socket;
+	}
+
+	public InputStream getInputStream() throws IOException {
+		streamOpen = true;
+		return instance.getInputStream();
+	}
+
+	public OutputStream getOutputStream() throws IOException {
+		streamOpen = true;
+		return instance.getOutputStream();
+	}
+
+	public void close() throws IOException {
+		if (!streamOpen && instance != null)
+			instance.close();
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpTests.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpTests.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpTests.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_HttpTests.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,422 @@
+/* Copyright 2002, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Performs some basic testing of either HttpConnection or HttpURLConnection
+ * depending on the Support_ServerSocket and Support_HttpConnector passed to the
+ * constructor.
+ * 
+ */
+public class Support_HttpTests {
+
+	private Support_ServerSocket serversocket;
+
+	private Support_HttpConnector connector;
+
+	public Support_HttpTests(Support_ServerSocket serversocket,
+			Support_HttpConnector client) {
+		this.serversocket = serversocket;
+		this.connector = client;
+	}
+
+	public void runTests(junit.framework.TestCase test) {
+
+		// get a port to use for the test
+		int portNumber = Support_PortManager.getNextPort();
+
+		// url's for the various tests
+		final String chunkedTestUrl = "http://localhost:" + portNumber
+				+ Support_HttpServer.CHUNKEDTEST;
+		final String contentTestUrl = "http://localhost:" + portNumber
+				+ Support_HttpServer.CONTENTTEST;
+		final String redirectTestUrl = "http://localhost:" + portNumber
+				+ Support_HttpServer.REDIRECTTEST;
+		final String postTestUrl = "http://localhost:" + portNumber
+				+ Support_HttpServer.POSTTEST;
+		final String headersTestUrl = "http://localhost:" + portNumber
+				+ Support_HttpServer.HEADERSTEST;
+
+		// start the test server. It will timeout and shut down after
+		// 5 seconds of inactivity
+		Support_HttpServer server = new Support_HttpServer(serversocket, test);
+		server.startServer(portNumber);
+
+		ByteArrayOutputStream bout = new ByteArrayOutputStream();
+		InputStream is;
+		int c;
+
+		// Chunked HTTP Transfer Coding Test
+		try {
+			// access the url and open a stream
+			connector.open(chunkedTestUrl);
+			is = connector.getInputStream();
+
+			// receive the data, and then read again after EOF
+			c = is.read();
+			while (c > 0)
+				c = is.read();
+			c = is.read();
+			is.close();
+			connector.close();
+			test.assertTrue("Error receiving chunked transfer coded data",
+					c == -1);
+		} catch (Exception e) {
+			e.printStackTrace();
+			test.fail("Exception during test a: " + e);
+		}
+
+		// Content-Length Test
+		try {
+			connector.open(contentTestUrl);
+			is = connector.getInputStream();
+			bout.reset();
+			do {
+				c = is.read();
+				if (c != -1)
+					bout.write(c);
+			} while (c != -1);
+			is.close();
+			connector.close();
+			String result = new String(bout.toByteArray(), "ISO8859_1");
+			test.assertTrue("Error receiving content coded data: " + result,
+					"ABCDE".equals(result));
+		} catch (Exception e) {
+			e.printStackTrace();
+			test.fail("Exception during test b: " + e);
+		}
+
+		// Headers Test
+		try {
+			connector.open(headersTestUrl);
+			connector.setRequestProperty("header1", "value1");
+			connector.setRequestProperty("header1", "value2");
+			int i = 0, found = 0;
+			String[] expected = new String[] { "no-cache=\"set-cookie\"",
+					"private", "no-transform" };
+			while (true) {
+				String key = connector.getHeaderFieldKey(i);
+				if (key == null && i > 0)
+					break;
+				if ("Cache-Control".equals(key)) {
+					test.assertTrue("Too many headers at: " + i, found <= 2);
+					String value = connector.getHeaderField(i);
+					test.assertTrue("Invalid header value: " + found + ": "
+							+ value, expected[found].equals(value));
+					found++;
+				}
+				i++;
+			}
+			test.assertTrue("Invalid headers: " + found, found == 3);
+			connector.close();
+		} catch (Exception e) {
+			e.printStackTrace();
+			test.fail("Exception during test c: " + e);
+		}
+
+		// Post Test
+		// Same as "Basic post" test below, but uses read() instead
+		// of read(buf, offset, length) to read the results
+		try {
+			String toWrite = "abcdef";
+			connector.open(postTestUrl);
+			OutputStream out = connector.getOutputStream();
+			out.write(toWrite.getBytes("ISO8859_1"));
+			out.close();
+			is = connector.getInputStream();
+			bout.reset();
+			do {
+				c = is.read();
+				if (c != -1)
+					bout.write(c);
+			} while (c != -1);
+			is.close();
+			connector.close();
+			String result = new String(bout.toByteArray(), "ISO8859_1");
+			test.assertTrue("Error sending data 1: " + result, toWrite
+					.equals(result));
+		} catch (Exception e) {
+			e.printStackTrace();
+			test.fail("Exception during test d: " + e);
+		}
+
+		// Post Test chunked
+		try {
+			String toWrite = "zyxwvuts";
+			connector.open(postTestUrl);
+			connector.setRequestProperty("Transfer-encoding", "chunked");
+			OutputStream out = connector.getOutputStream();
+			out.write(toWrite.getBytes("ISO8859_1"));
+			out.close();
+			is = connector.getInputStream();
+			bout.reset();
+			do {
+				c = is.read();
+				if (c != -1)
+					bout.write(c);
+			} while (c != -1);
+			is.close();
+			connector.close();
+			String result = new String(bout.toByteArray(), "ISO8859_1");
+			test.assertTrue("Error sending data 2: " + result, ("C" + toWrite)
+					.equals(result));
+		} catch (Exception e) {
+			e.printStackTrace();
+			test.fail("Exception during test e: " + e);
+		}
+
+		OutputStream os = null;
+
+		byte[] data = new byte[1024];
+		int len = 0;
+
+		// Basic post
+		try {
+			String message = "test";
+			connector.open(postTestUrl);
+			os = connector.getOutputStream();
+			os.write(message.getBytes("ISO8859_1"));
+			os.close();
+			is = connector.getInputStream();
+			len = 0;
+			do {
+				int r = is.read(data, len, data.length - len);
+				if (r == -1)
+					break;
+				len += r;
+			} while (true);
+			is.close();
+			connector.close();
+			String result = new String(data, 0, len, "ISO8859_1");
+			test.assertTrue("Basic port error: " + result, message
+					.equals(result));
+		} catch (IOException e) {
+			e.printStackTrace();
+			test.fail("Exception during basic post test: " + e);
+		}
+
+		String chunkChar = connector.isChunkedOnFlush() ? "C" : "";
+
+		// Flushing with post
+		try {
+			String message1 = "test2", message2 = "test3";
+			connector.open(postTestUrl);
+			os = connector.getOutputStream();
+			os.write(message1.getBytes("ISO8859_1"));
+			os.flush();
+			os.write(message2.getBytes("ISO8859_1"));
+			os.close();
+			is = connector.getInputStream();
+			len = 0;
+			do {
+				int r = is.read(data, len, data.length - len);
+				if (r == -1)
+					break;
+				len += r;
+			} while (true);
+			is.close();
+			connector.close();
+			String result = new String(data, 0, len, "ISO8859_1");
+			test.assertTrue("Flushing with post: " + result, (chunkChar
+					+ message1 + chunkChar + message2).equals(result));
+		} catch (IOException e) {
+			e.printStackTrace();
+			test.fail("Exception during flushing post test: " + e);
+		}
+
+		// Flushing with post and setting content-length
+		try {
+			String message1 = "test4", message2 = "test5";
+			connector.open(postTestUrl);
+			connector.setRequestProperty("Content-Length", "10");
+			os = connector.getOutputStream();
+			os.write(message1.getBytes());
+			os.flush();
+			os.write(message2.getBytes());
+			os.close();
+			is = connector.getInputStream();
+			len = 0;
+			do {
+				int r = is.read(data, len, data.length - len);
+				if (r == -1)
+					break;
+				len += r;
+			} while (true);
+			is.close();
+			connector.close();
+			String result = new String(data, 0, len, "ISO8859_1");
+			test.assertTrue("Flushing with post and setting content-length: "
+					+ result, (chunkChar + message1 + chunkChar + message2)
+					.equals(result));
+		} catch (IOException e) {
+			e.printStackTrace();
+			test
+					.fail("Exception during flushing with content-length post test: "
+							+ e);
+		}
+
+		// Flushing followed immediately by a close()
+		try {
+			String message = "test6";
+			connector.open(postTestUrl);
+			os = connector.getOutputStream();
+			os.write(message.getBytes("ISO8859_1"));
+			os.flush();
+			os.close();
+			is = connector.getInputStream();
+			len = 0;
+			do {
+				int r = is.read(data, len, data.length - len);
+				if (r == -1)
+					break;
+				len += r;
+			} while (true);
+			is.close();
+			connector.close();
+			String result = new String(data, 0, len, "ISO8859_1");
+			test.assertTrue("Flushing followed immediately by a close(): "
+					+ result, (chunkChar + message).equals(result));
+		} catch (IOException e) {
+			e.printStackTrace();
+			test.fail("Exception during flush followed by close post test: "
+					+ e);
+		}
+
+		// Redirection Tests
+		final int[] testCodes = { Support_HttpServer.MULT_CHOICE,
+				Support_HttpServer.MOVED_PERM, Support_HttpServer.FOUND,
+				Support_HttpServer.SEE_OTHER, Support_HttpServer.NOT_MODIFIED,
+				Support_HttpServer.UNUSED, Support_HttpServer.TEMP_REDIRECT, };
+
+		final int[] results = { 'A', 'A', 'A', 'A', 'P', 'P', 'P' };
+		// see Support_HTTPServer for the source of this data
+
+		final String fullLocalLocation = contentTestUrl;
+		final String partLocalLocation = Support_HttpServer.CONTENTTEST;
+
+		for (int i = 0; i < testCodes.length; i++) {
+
+			// test each of the redirection response codes
+			try {
+				// append the response code for the server to return
+				// and the location to redirect to
+				connector.open(redirectTestUrl + "/" + testCodes[i] + "-"
+						+ fullLocalLocation);
+				is = connector.getInputStream();
+				connector.close();
+
+				c = is.read();
+
+				if (testCodes[i] == Support_HttpServer.NOT_MODIFIED) {
+					// accept either the message-body or nothing, since the spec
+					// says there MUST NOT be a message body on 304 responses.
+					// But Java returns the message-body
+					if (!(c == results[i] || c == -1)) {
+						test
+								.fail("Incorrect data returned on test of HTTP response "
+										+ testCodes[i]);
+					}
+				} else if (c != results[i]) {
+					test
+							.fail("Incorrect data returned on test of HTTP response "
+									+ testCodes[i]);
+				}
+				while (c > 0)
+					c = is.read();
+				c = is.read();
+				is.close();
+			} catch (Exception e) {
+				e.printStackTrace();
+				test.fail("Error during redirection test " + i + ": " + e);
+			}
+		}
+
+		// Test redirecting to a location on a different port
+		Class serversocketclass = serversocket.getClass();
+		try {
+			Support_ServerSocket serversocket2 = (Support_ServerSocket) serversocketclass
+					.newInstance();
+
+			Support_HttpServer server2 = new Support_HttpServer(serversocket2,
+					test);
+			int newport = Support_PortManager.getNextPort();
+			server2.startServer(newport);
+			server2.setPortRedirectTestEnable(true);
+
+			// Test if redirection to a different port works
+			final String otherPortLocation = "http://localhost:" + newport
+					+ Support_HttpServer.PORTREDIRTEST;
+
+			try {
+				// append the response code for the server to return
+				// and the location to redirect to
+
+				connector.open(redirectTestUrl + "/"
+						+ Support_HttpServer.MOVED_PERM + "-"
+						+ otherPortLocation);
+				is = connector.getInputStream();
+				connector.close();
+
+				c = is.read();
+				test
+						.assertTrue(
+								"Incorrect data returned on redirection to a different port.",
+								c == 'A');
+				while (c > 0)
+					c = is.read();
+				c = is.read();
+				is.close();
+			} catch (Exception e) {
+				e.printStackTrace();
+				test.fail("Exception during test f: " + e);
+			}
+			server2.stopServer();
+		} catch (IllegalAccessException e) {
+			test.fail("Exception during redirection to a different port:" + e);
+		} catch (InstantiationException e) {
+			test.fail("Exception during redirection to a different port:" + e);
+		}
+
+		// test redirecting to a relative URL on the same host
+		try {
+			// append the response code for the server to return
+			connector.open(redirectTestUrl + "/"
+					+ Support_HttpServer.MOVED_PERM + "-" + partLocalLocation);
+			is = connector.getInputStream();
+			connector.close();
+
+			c = is.read();
+			test.assertTrue(
+					"Incorrect data returned on redirect to relative URI.",
+					c == 'A');
+			while (c > 0)
+				c = is.read();
+			c = is.read();
+			is.close();
+		} catch (Exception e) {
+			e.printStackTrace();
+			test.fail("Exception during redirection test to a relative URL: "
+					+ e);
+		}
+		server.stopServer();
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ListTest.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ListTest.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ListTest.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ListTest.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,214 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+
+public class Support_ListTest extends junit.framework.TestCase {
+
+	List list; // must contain the Integers 0 to 99 in order
+
+	public Support_ListTest(String p1) {
+		super(p1);
+	}
+
+	public Support_ListTest(String p1, List l) {
+		super(p1);
+		list = l;
+	}
+
+	public void runTest() {
+		int hashCode = 1;
+		for (int counter = 0; counter < 100; counter++) {
+			Object elem;
+			elem = list.get(counter);
+			hashCode = 31 * hashCode + elem.hashCode();
+			assertTrue("ListTest - get failed", elem
+					.equals(new Integer(counter)));
+		}
+		assertTrue("ListTest - hashCode failed", hashCode == list.hashCode());
+
+		list.add(50, new Integer(1000));
+		assertTrue("ListTest - a) add with index failed--did not insert", list
+				.get(50).equals(new Integer(1000)));
+		assertTrue(
+				"ListTest - b) add with index failed--did not move following elements",
+				list.get(51).equals(new Integer(50)));
+		assertTrue(
+				"ListTest - c) add with index failed--affected previous elements",
+				list.get(49).equals(new Integer(49)));
+
+		list.set(50, new Integer(2000));
+		assertTrue("ListTest - a) set failed--did not set", list.get(50)
+				.equals(new Integer(2000)));
+		assertTrue("ListTest - b) set failed--affected following elements",
+				list.get(51).equals(new Integer(50)));
+		assertTrue("ListTest - c) set failed--affected previous elements", list
+				.get(49).equals(new Integer(49)));
+
+		list.remove(50);
+		assertTrue("ListTest - a) remove with index failed--did not remove",
+				list.get(50).equals(new Integer(50)));
+		assertTrue(
+				"ListTest - b) remove with index failed--did not move following elements",
+				list.get(51).equals(new Integer(51)));
+		assertTrue(
+				"ListTest - c) remove with index failed--affected previous elements",
+				list.get(49).equals(new Integer(49)));
+
+		List myList = new LinkedList();
+		myList.add(new Integer(500));
+		myList.add(new Integer(501));
+		myList.add(new Integer(502));
+
+		list.addAll(50, myList);
+		assertTrue("ListTest - a) addAll with index failed--did not insert",
+				list.get(50).equals(new Integer(500)));
+		assertTrue("ListTest - b) addAll with index failed--did not insert",
+				list.get(51).equals(new Integer(501)));
+		assertTrue("ListTest - c) addAll with index failed--did not insert",
+				list.get(52).equals(new Integer(502)));
+		assertTrue(
+				"ListTest - d) addAll with index failed--did not move following elements",
+				list.get(53).equals(new Integer(50)));
+		assertTrue(
+				"ListTest - e) addAll with index failed--affected previous elements",
+				list.get(49).equals(new Integer(49)));
+
+		List mySubList = list.subList(50, 53);
+		assertTrue(mySubList.size() == 3);
+		assertTrue(
+				"ListTest - a) sublist Failed--does not contain correct elements",
+				mySubList.get(0).equals(new Integer(500)));
+		assertTrue(
+				"ListTest - b) sublist Failed--does not contain correct elements",
+				mySubList.get(1).equals(new Integer(501)));
+		assertTrue(
+				"ListTest - c) sublist Failed--does not contain correct elements",
+				mySubList.get(2).equals(new Integer(502)));
+
+		t_listIterator(mySubList);
+
+		mySubList.clear();
+		assertTrue(
+				"ListTest - Clearing the sublist did not remove the appropriate elements from the original list",
+				list.size() == 100);
+
+		t_listIterator(list);
+		ListIterator li = list.listIterator();
+		for (int counter = 0; li.hasNext(); counter++) {
+			Object elem;
+			elem = li.next();
+			assertTrue("ListTest - listIterator failed", elem
+					.equals(new Integer(counter)));
+		}
+
+		new Support_CollectionTest("", list).runTest();
+
+	}
+
+	public void t_listIterator(List list) {
+		ListIterator li = list.listIterator(1);
+		assertTrue("listIterator(1)", li.next() == list.get(1));
+
+		int orgSize = list.size();
+		li = list.listIterator();
+		for (int i = 0; i <= orgSize; i++) {
+			if (i == 0)
+				assertTrue("list iterator hasPrevious(): " + i, !li
+						.hasPrevious());
+			else
+				assertTrue("list iterator hasPrevious(): " + i, li
+						.hasPrevious());
+			if (i == list.size())
+				assertTrue("list iterator hasNext(): " + i, !li.hasNext());
+			else
+				assertTrue("list iterator hasNext(): " + i, li.hasNext());
+			assertTrue("list iterator nextIndex(): " + i, li.nextIndex() == i);
+			assertTrue("list iterator previousIndex(): " + i, li
+					.previousIndex() == i - 1);
+			boolean exception = false;
+			try {
+				assertTrue("list iterator next(): " + i, li.next() == list
+						.get(i));
+			} catch (NoSuchElementException e) {
+				exception = true;
+			}
+			if (i == list.size())
+				assertTrue("list iterator next() exception: " + i, exception);
+			else
+				assertTrue("list iterator next() exception: " + i, !exception);
+		}
+
+		for (int i = orgSize - 1; i >= 0; i--) {
+			assertTrue("list iterator previous(): " + i, li.previous() == list
+					.get(i));
+			assertTrue("list iterator nextIndex()2: " + i, li.nextIndex() == i);
+			assertTrue("list iterator previousIndex()2: " + i, li
+					.previousIndex() == i - 1);
+			if (i == 0)
+				assertTrue("list iterator hasPrevious()2: " + i, !li
+						.hasPrevious());
+			else
+				assertTrue("list iterator hasPrevious()2: " + i, li
+						.hasPrevious());
+			assertTrue("list iterator hasNext()2: " + i, li.hasNext());
+		}
+		boolean exception = false;
+		try {
+			li.previous();
+		} catch (NoSuchElementException e) {
+			exception = true;
+		}
+		assertTrue("list iterator previous() exception", exception);
+
+		Integer add1 = new Integer(600);
+		Integer add2 = new Integer(601);
+		li.add(add1);
+		assertTrue("list iterator add(), size()", list.size() == (orgSize + 1));
+		assertTrue("list iterator add(), nextIndex()", li.nextIndex() == 1);
+		assertTrue("list iterator add(), previousIndex()",
+				li.previousIndex() == 0);
+		Object next = li.next();
+		assertTrue("list iterator add(), next(): " + next, next == list.get(1));
+		li.add(add2);
+		Object previous = li.previous();
+		assertTrue("list iterator add(), previous(): " + previous,
+				previous == add2);
+		assertTrue("list iterator add(), nextIndex()2", li.nextIndex() == 2);
+		assertTrue("list iterator add(), previousIndex()2",
+				li.previousIndex() == 1);
+
+		li.remove();
+		assertTrue("list iterator remove(), size()",
+				list.size() == (orgSize + 1));
+		assertTrue("list iterator remove(), nextIndex()", li.nextIndex() == 2);
+		assertTrue("list iterator remove(), previousIndex()", li
+				.previousIndex() == 1);
+		assertTrue("list iterator previous()2", li.previous() == list.get(1));
+		assertTrue("list iterator previous()3", li.previous() == list.get(0));
+		assertTrue("list iterator next()2", li.next() == list.get(0));
+		li.remove();
+		assertTrue("list iterator hasPrevious()3", !li.hasPrevious());
+		assertTrue("list iterator hasNext()3", li.hasNext());
+		assertTrue("list iterator size()", list.size() == orgSize);
+		assertTrue("list iterator nextIndex()3", li.nextIndex() == 0);
+		assertTrue("list iterator previousIndex()3", li.previousIndex() == -1);
+	}
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_MapTest2.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_MapTest2.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_MapTest2.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_MapTest2.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,62 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.util.Map;
+
+public class Support_MapTest2 extends junit.framework.TestCase {
+
+	Map map;
+
+	public Support_MapTest2(Map m) {
+		super();
+		map = m;
+		if (!map.isEmpty()) {
+			fail("Map must be empty");
+		}
+	}
+
+	public void runTest() {
+		try {
+			map.put("one", "1");
+			assertTrue("size should be one", map.size() == 1);
+			map.clear();
+			assertTrue("size should be zero", map.size() == 0);
+			assertTrue("Should not have entries", !map.entrySet().iterator()
+					.hasNext());
+			assertTrue("Should not have keys", !map.keySet().iterator()
+					.hasNext());
+			assertTrue("Should not have values", !map.values().iterator()
+					.hasNext());
+		} catch (UnsupportedOperationException e) {
+		}
+
+		try {
+			map.put("one", "1");
+			assertTrue("size should be one", map.size() == 1);
+			map.remove("one");
+			assertTrue("size should be zero", map.size() == 0);
+			assertTrue("Should not have entries", !map.entrySet().iterator()
+					.hasNext());
+			assertTrue("Should not have keys", !map.keySet().iterator()
+					.hasNext());
+			assertTrue("Should not have values", !map.values().iterator()
+					.hasNext());
+		} catch (UnsupportedOperationException e) {
+		}
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_MessageFormat.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_MessageFormat.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_MessageFormat.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_MessageFormat.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,116 @@
+/* Copyright 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.text.DateFormat;
+import java.text.MessageFormat;
+import java.text.NumberFormat;
+import java.text.MessageFormat.Field;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.Locale;
+import java.util.Vector;
+
+public class Support_MessageFormat extends Support_Format {
+
+	public Support_MessageFormat(String p1) {
+		super(p1);
+	}
+
+	public void runTest() {
+		t_formatToCharacterIterator();
+		t_format_with_FieldPosition();
+	}
+
+	public static void main(String[] args) {
+		new Support_MessageFormat("").runTest();
+	}
+
+	public void t_format_with_FieldPosition() {
+
+		String pattern = "On {4,date} at {3,time}, he ate {2,number, integer} hamburger{2,choice,1#|1<s} and drank {1, number} litres of coke. That was {0,choice,1#just enough|1<more than enough} food!";
+		MessageFormat format = new MessageFormat(pattern, Locale.US);
+
+		Date date = new GregorianCalendar(2005, 1, 28, 14, 20, 16).getTime();
+		Integer hamburgers = new Integer(8);
+		Object[] objects = new Object[] { hamburgers, new Double(3.5),
+				hamburgers, date, date };
+
+		super.text = "On Feb 28, 2005 at 2:20:16 PM, he ate 8 hamburgers and drank 3.5 litres of coke. That was more than enough food!";
+
+		// test with MessageFormat.Field.ARGUMENT
+		t_FormatWithField(1, format, objects, null, Field.ARGUMENT, 3, 15);
+
+		// test other format fields that are included in the formatted text
+		t_FormatWithField(2, format, objects, null, DateFormat.Field.AM_PM, 0,
+				0);
+		t_FormatWithField(3, format, objects, null,
+				NumberFormat.Field.FRACTION, 0, 0);
+
+		// test fields that are not included in the formatted text
+		t_FormatWithField(4, format, objects, null, DateFormat.Field.ERA, 0, 0);
+		t_FormatWithField(5, format, objects, null,
+				NumberFormat.Field.EXPONENT_SIGN, 0, 0);
+	}
+
+	public void t_formatToCharacterIterator() {
+
+		String pattern = "On {4,date} at {3,time}, he ate {2,number, integer} hamburger{2,choice,1#|1<s} and drank {1, number} litres of coke. That was {0,choice,1#just enough|1<more than enough} food!";
+		MessageFormat format = new MessageFormat(pattern, Locale.US);
+
+		Date date = new GregorianCalendar(2005, 1, 28, 14, 20, 16).getTime();
+		Integer hamburgers = new Integer(8);
+		Object[] objects = new Object[] { hamburgers, new Double(3.5),
+				hamburgers, date, date };
+
+		t_Format(1, objects, format, getMessageVector1());
+	}
+
+	private Vector getMessageVector1() {
+		Vector v = new Vector();
+		v.add(new FieldContainer(3, 6, Field.ARGUMENT, 4));
+		v.add(new FieldContainer(3, 6, DateFormat.Field.MONTH));
+		v.add(new FieldContainer(6, 7, Field.ARGUMENT, 4));
+		v.add(new FieldContainer(7, 9, Field.ARGUMENT, 4));
+		v.add(new FieldContainer(7, 9, DateFormat.Field.DAY_OF_MONTH));
+		v.add(new FieldContainer(9, 11, Field.ARGUMENT, 4));
+		v.add(new FieldContainer(11, 15, Field.ARGUMENT, 4));
+		v.add(new FieldContainer(11, 15, DateFormat.Field.YEAR));
+		v.add(new FieldContainer(19, 20, Field.ARGUMENT, 3));
+		v.add(new FieldContainer(19, 20, DateFormat.Field.HOUR1));
+		v.add(new FieldContainer(20, 21, Field.ARGUMENT, 3));
+		v.add(new FieldContainer(21, 23, Field.ARGUMENT, 3));
+		v.add(new FieldContainer(21, 23, DateFormat.Field.MINUTE));
+		v.add(new FieldContainer(23, 24, Field.ARGUMENT, 3));
+		v.add(new FieldContainer(24, 26, Field.ARGUMENT, 3));
+		v.add(new FieldContainer(24, 26, DateFormat.Field.SECOND));
+		v.add(new FieldContainer(26, 27, Field.ARGUMENT, 3));
+		v.add(new FieldContainer(27, 29, Field.ARGUMENT, 3));
+		v.add(new FieldContainer(27, 29, DateFormat.Field.AM_PM));
+		v.add(new FieldContainer(38, 39, Field.ARGUMENT, 2));
+		v.add(new FieldContainer(38, 39, NumberFormat.Field.INTEGER));
+		v.add(new FieldContainer(49, 50, Field.ARGUMENT, 2));
+		v.add(new FieldContainer(61, 62, Field.ARGUMENT, 1));
+		v.add(new FieldContainer(61, 62, NumberFormat.Field.INTEGER));
+		v.add(new FieldContainer(62, 63, Field.ARGUMENT, 1));
+		v.add(new FieldContainer(62, 63, NumberFormat.Field.DECIMAL_SEPARATOR));
+		v.add(new FieldContainer(63, 64, Field.ARGUMENT, 1));
+		v.add(new FieldContainer(63, 64, NumberFormat.Field.FRACTION));
+		v.add(new FieldContainer(90, 106, Field.ARGUMENT, 0));
+		return v;
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_NetworkInterface.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_NetworkInterface.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_NetworkInterface.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_NetworkInterface.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,45 @@
+/* Copyright 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package tests.support;
+
+
+import java.net.NetworkInterface;
+
+public class Support_NetworkInterface {
+
+	/**
+	 * On windows platforms with IPV6 enabled there are a number of pseudo
+	 * interfaces which don't work with our tests. This function is called to
+	 * make sure we only use the non-pseudo interfaces
+	 */
+	public static boolean useInterface(NetworkInterface theInterface) {
+		boolean result = true;
+		String platform = System.getProperty("os.name");
+		// only use these on windows platforms
+		if (platform.startsWith("Windows")) {
+			if ((theInterface.getDisplayName()
+					.equals("Teredo Tunneling Pseudo-Interface"))
+					|| (theInterface.getDisplayName()
+							.equals("6to4 Tunneling Pseudo-Interface"))
+					|| (theInterface.getDisplayName()
+							.equals("Automatic Tunneling Pseudo-Interface"))
+					|| (theInterface.getDisplayName()
+							.equals("Loopback Pseudo-Interface"))) {
+				result = false;
+			}
+		}
+		return result;
+	}
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_PlatformFile.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_PlatformFile.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_PlatformFile.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_PlatformFile.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,34 @@
+/* Copyright 2002, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public class Support_PlatformFile {
+
+	private static String platformId = null;
+
+	public static String getNewPlatformFile(String pre, String post) {
+		if (platformId == null) {
+			String property = System.getProperty("com.ibm.oti.configuration");
+			if (property == null) {
+				property = "JDK";
+			}
+			platformId = property
+					+ System.getProperty("java.vm.version").replace('.', '-');
+		}
+		return pre + platformId + post;
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_PortManager.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_PortManager.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_PortManager.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_PortManager.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,41 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.util.Date;
+
+public class Support_PortManager extends java.lang.Object {
+
+	private static int lastAssignedPort = somewhatRandomPort();
+
+	public static synchronized int getNextPort() {
+		if (++lastAssignedPort > 65534)
+			lastAssignedPort = 6000;
+		return lastAssignedPort;
+	}
+
+	/*
+	 * Returns a different port number every 6 seconds or so. The port number
+	 * should be about += 100 at each 6 second interval
+	 */
+	private static int somewhatRandomPort() {
+		Date date = new Date();
+		int minutes = date.getMinutes();
+		int seconds = date.getSeconds();
+		return 6000 + (1000 * minutes) + ((seconds / 6) * 100);
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ProcessReadWriteTest.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ProcessReadWriteTest.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ProcessReadWriteTest.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ProcessReadWriteTest.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,46 @@
+/* Copyright 2002, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class Support_ProcessReadWriteTest {
+
+	public static void main(String[] args) {
+		try {
+			FileInputStream input = new FileInputStream(FileDescriptor.in);
+			FileOutputStream output = new FileOutputStream(FileDescriptor.out);
+
+			// read just three lines since EOF isn't working properly. It would
+			// be better to read to the end and echo it all
+			for (int i = 0; i < 3; i++) {
+				int c = input.read();
+				while (c != '\n') {
+					output.write(c);
+					c = input.read();
+				}
+				output.write(c);
+			}
+			input.close();
+			output.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_I1.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_I1.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_I1.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_I1.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,26 @@
+/* Copyright 2001, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public interface Support_Proxy_I1 {
+	boolean equals(Object o);
+
+	int[] array(long[] f);
+
+	void foo(int i, boolean b);
+
+	String string(String s) throws Support_Proxy_ParentException, LinkageError;
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_I2.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_I2.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_I2.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_I2.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,25 @@
+/* Copyright 2001, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public interface Support_Proxy_I2 {
+
+	int[] array(long[] f);
+
+	void foo(boolean b, int i);
+
+	String string(String s) throws Support_Proxy_SubException, Error;
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_ParentException.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_ParentException.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_ParentException.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_ParentException.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,20 @@
+/* Copyright 2001, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public class Support_Proxy_ParentException extends Exception {
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_SubException.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_SubException.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_SubException.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Proxy_SubException.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,20 @@
+/* Copyright 2001, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public class Support_Proxy_SubException extends Support_Proxy_ParentException {
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ServerSocket.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ServerSocket.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ServerSocket.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_ServerSocket.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,35 @@
+/* Copyright 2002, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.io.IOException;
+
+/**
+ * The interface for a generic server socket.
+ * 
+ */
+public interface Support_ServerSocket {
+
+	public Support_Socket accept() throws IOException;
+
+	public void setTimeout(int timeout);
+
+	public void setPort(int port);
+
+	public void open() throws IOException;
+
+	public void close() throws IOException;
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_SetTest.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_SetTest.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_SetTest.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_SetTest.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,45 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.util.Set;
+
+public class Support_SetTest extends junit.framework.TestCase {
+
+	Set set; // must contain only the Integers 0 to 99
+
+	public Support_SetTest(String p1) {
+		super(p1);
+	}
+
+	public Support_SetTest(String p1, Set s) {
+		super(p1);
+		set = s;
+	}
+
+	public void runTest() {
+		// add
+		assertTrue("Set Test - Adding a duplicate element changed the set",
+				!set.add(new Integer(50)));
+		assertTrue("Set Test - Removing an element did not change the set", set
+				.remove(new Integer(50)));
+		assertTrue(
+				"Set Test - Adding and removing a duplicate element failed to remove it",
+				!set.contains(new Integer(50)));
+		set.add(new Integer(50));
+		new Support_CollectionTest("", set).runTest();
+	}
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_SimpleDateFormat.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_SimpleDateFormat.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_SimpleDateFormat.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_SimpleDateFormat.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,259 @@
+/* Copyright 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.text.DateFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.text.DateFormat.Field;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+import java.util.Vector;
+
+public class Support_SimpleDateFormat extends Support_Format {
+
+	public Support_SimpleDateFormat(String p1) {
+		super(p1);
+	}
+
+	public void runTest() {
+		t_formatToCharacterIterator();
+		t_format_with_FieldPosition();
+	}
+
+	public static void main(String[] args) {
+		new Support_SimpleDateFormat("").runTest();
+	}
+
+	public void t_format_with_FieldPosition() {
+		TimeZone tz = TimeZone.getTimeZone("EST");
+		Calendar cal = new GregorianCalendar(tz);
+		cal.set(1999, Calendar.SEPTEMBER, 13, 17, 19, 01);
+		cal.set(Calendar.MILLISECOND, 0);
+		Date date = cal.getTime();
+		SimpleDateFormat format = (SimpleDateFormat) DateFormat
+				.getDateInstance();
+		format.setTimeZone(tz);
+
+		// test with all pattern chars, and multiple occurances
+		format
+				.applyPattern("G GGGG y yy yyyy M MM MMM MMMM d dd ddd k kk kkk H HH HHH h hh hhh m mmm s ss sss S SS SSS EE EEEE D DD DDD F FF w www W WWW a  aaa  K KKK z zzzz Z ZZZZ");
+
+		StringBuffer textbuffer = new StringBuffer(
+				"AD AD 99 99 1999 9 09 Sep September 13 13 013 17 17 017 17 17 017 5 05");
+		textbuffer
+				.append(" 005 19 019 1 01 001 0 00 000 Mon Monday 256 256 256 2 02 38 038 3 003 PM");
+		textbuffer.append("  PM  5 005 EDT Eastern Daylight Time -0400 -0400");
+
+		// to avoid passing the huge Stringbuffer each time.
+		super.text = textbuffer.toString();
+
+		// test if field positions are set correctly for these fields occuring
+		// multiple times.
+		t_FormatWithField(0, format, date, null, Field.ERA, 0, 2);
+		t_FormatWithField(1, format, date, null, Field.YEAR, 6, 8);
+		t_FormatWithField(2, format, date, null, Field.MONTH, 17, 18);
+		t_FormatWithField(3, format, date, null, Field.DAY_OF_MONTH, 36, 38);
+		t_FormatWithField(4, format, date, null, Field.HOUR_OF_DAY1, 46, 48);
+		t_FormatWithField(5, format, date, null, Field.HOUR_OF_DAY0, 56, 58);
+		t_FormatWithField(6, format, date, null, Field.HOUR1, 66, 67);
+		t_FormatWithField(7, format, date, null, Field.MINUTE, 75, 77);
+		t_FormatWithField(8, format, date, null, Field.SECOND, 82, 83);
+		t_FormatWithField(9, format, date, null, Field.MILLISECOND, 91, 92);
+		t_FormatWithField(10, format, date, null, Field.DAY_OF_WEEK, 100, 103);
+		t_FormatWithField(11, format, date, null, Field.DAY_OF_YEAR, 111, 114);
+		t_FormatWithField(12, format, date, null, Field.DAY_OF_WEEK_IN_MONTH,
+				123, 124);
+		t_FormatWithField(13, format, date, null, Field.WEEK_OF_YEAR, 128, 130);
+		t_FormatWithField(14, format, date, null, Field.WEEK_OF_MONTH, 135, 136);
+		t_FormatWithField(15, format, date, null, Field.AM_PM, 141, 143);
+		t_FormatWithField(16, format, date, null, Field.HOUR0, 149, 150);
+		t_FormatWithField(17, format, date, null, Field.TIME_ZONE, 155, 158);
+
+		// test fields that are not included in the formatted text
+		t_FormatWithField(18, format, date, null,
+				NumberFormat.Field.EXPONENT_SIGN, 0, 0);
+
+		// test with simple example
+		format.applyPattern("h:m z");
+
+		super.text = "5:19 EDT";
+		t_FormatWithField(21, format, date, null, Field.HOUR1, 0, 1);
+		t_FormatWithField(22, format, date, null, Field.MINUTE, 2, 4);
+		t_FormatWithField(23, format, date, null, Field.TIME_ZONE, 5, 8);
+
+		// test fields that are not included in the formatted text
+
+		t_FormatWithField(24, format, date, null, Field.ERA, 0, 0);
+		t_FormatWithField(25, format, date, null, Field.YEAR, 0, 0);
+		t_FormatWithField(26, format, date, null, Field.MONTH, 0, 0);
+		t_FormatWithField(27, format, date, null, Field.DAY_OF_MONTH, 0, 0);
+		t_FormatWithField(28, format, date, null, Field.HOUR_OF_DAY1, 0, 0);
+		t_FormatWithField(29, format, date, null, Field.HOUR_OF_DAY0, 0, 0);
+		t_FormatWithField(30, format, date, null, Field.SECOND, 0, 0);
+		t_FormatWithField(31, format, date, null, Field.MILLISECOND, 0, 0);
+		t_FormatWithField(32, format, date, null, Field.DAY_OF_WEEK, 0, 0);
+		t_FormatWithField(33, format, date, null, Field.DAY_OF_YEAR, 0, 0);
+		t_FormatWithField(34, format, date, null, Field.DAY_OF_WEEK_IN_MONTH,
+				0, 0);
+		t_FormatWithField(35, format, date, null, Field.WEEK_OF_YEAR, 0, 0);
+		t_FormatWithField(36, format, date, null, Field.WEEK_OF_MONTH, 0, 0);
+		t_FormatWithField(37, format, date, null, Field.AM_PM, 0, 0);
+		t_FormatWithField(38, format, date, null, Field.HOUR0, 0, 0);
+
+		t_FormatWithField(39, format, date, null, NumberFormat.Field.EXPONENT,
+				0, 0);
+
+		// test with simple example with pattern char Z
+		format.applyPattern("h:m Z z");
+		super.text = "5:19 -0400 EDT";
+		t_FormatWithField(40, format, date, null, Field.HOUR1, 0, 1);
+		t_FormatWithField(41, format, date, null, Field.MINUTE, 2, 4);
+		t_FormatWithField(42, format, date, null, Field.TIME_ZONE, 5, 10);
+	}
+
+	public void t_formatToCharacterIterator() {
+		TimeZone tz = TimeZone.getTimeZone("EST");
+		Calendar cal = new GregorianCalendar(tz);
+		cal.set(1999, Calendar.SEPTEMBER, 13, 17, 19, 01);
+		cal.set(Calendar.MILLISECOND, 0);
+		Date date = cal.getTime();
+		SimpleDateFormat format = (SimpleDateFormat) DateFormat
+				.getDateInstance();
+		format.setTimeZone(tz);
+
+		format.applyPattern("yyyyMMddHHmmss");
+		t_Format(1, date, format, getDateVector1());
+
+		format.applyPattern("w W dd MMMM yyyy EEEE");
+		t_Format(2, date, format, getDateVector2());
+
+		format.applyPattern("h:m z");
+		t_Format(3, date, format, getDateVector3());
+
+		format.applyPattern("h:m Z");
+		t_Format(5, date, format, getDateVector5());
+
+		// with all pattern chars, and multiple occurances
+		format
+				.applyPattern("G GGGG y yy yyyy M MM MMM MMMM d dd ddd k kk kkk H HH HHH h hh hhh m mmm s ss sss S SS SSS EE EEEE D DD DDD F FF w www W WWW a  aaa  K KKK z zzzz Z ZZZZ");
+		t_Format(4, date, format, getDateVector4());
+	}
+
+	private Vector getDateVector1() {
+		// "19990913171901"
+		Vector v = new Vector();
+		v.add(new FieldContainer(0, 4, Field.YEAR));
+		v.add(new FieldContainer(4, 6, Field.MONTH));
+		v.add(new FieldContainer(6, 8, Field.DAY_OF_MONTH));
+		v.add(new FieldContainer(8, 10, Field.HOUR_OF_DAY0));
+		v.add(new FieldContainer(10, 12, Field.MINUTE));
+		v.add(new FieldContainer(12, 14, Field.SECOND));
+		return v;
+	}
+
+	private Vector getDateVector2() {
+		// "12 3 5 March 2002 Monday"
+		Vector v = new Vector();
+		v.add(new FieldContainer(0, 2, Field.WEEK_OF_YEAR));
+		v.add(new FieldContainer(3, 4, Field.WEEK_OF_MONTH));
+		v.add(new FieldContainer(5, 7, Field.DAY_OF_MONTH));
+		v.add(new FieldContainer(8, 17, Field.MONTH));
+		v.add(new FieldContainer(18, 22, Field.YEAR));
+		v.add(new FieldContainer(23, 29, Field.DAY_OF_WEEK));
+		return v;
+	}
+
+	private Vector getDateVector3() {
+		// "5:19 EDT"
+		Vector v = new Vector();
+		v.add(new FieldContainer(0, 1, Field.HOUR1));
+		v.add(new FieldContainer(2, 4, Field.MINUTE));
+		v.add(new FieldContainer(5, 8, Field.TIME_ZONE));
+		return v;
+	}
+
+	private Vector getDateVector5() {
+		// "5:19 -0400"
+		Vector v = new Vector();
+		v.add(new FieldContainer(0, 1, Field.HOUR1));
+		v.add(new FieldContainer(2, 4, Field.MINUTE));
+		v.add(new FieldContainer(5, 10, Field.TIME_ZONE));
+		return v;
+	}
+
+	private Vector getDateVector4() {
+		Vector v = new Vector();
+
+		// "AD AD 99 99 1999 9 09 Sep September 13 13 013 17 17 017 17 17 017 5
+		// 05
+		// 005 19 019 1 01 001 0 00 000 Mon Monday 256 256 256 2 02 38 038 3 003
+		// PM
+		// PM 5 005 EDT Eastern Daylight Time -0400 -0400"
+		v.add(new FieldContainer(0, 2, Field.ERA));
+		v.add(new FieldContainer(3, 5, Field.ERA));
+		v.add(new FieldContainer(6, 8, Field.YEAR));
+		v.add(new FieldContainer(9, 11, Field.YEAR));
+		v.add(new FieldContainer(12, 16, Field.YEAR));
+		v.add(new FieldContainer(17, 18, Field.MONTH));
+		v.add(new FieldContainer(19, 21, Field.MONTH));
+		v.add(new FieldContainer(22, 25, Field.MONTH));
+		v.add(new FieldContainer(26, 35, Field.MONTH));
+		v.add(new FieldContainer(36, 38, Field.DAY_OF_MONTH));
+		v.add(new FieldContainer(39, 41, Field.DAY_OF_MONTH));
+		v.add(new FieldContainer(42, 45, Field.DAY_OF_MONTH));
+		v.add(new FieldContainer(46, 48, Field.HOUR_OF_DAY1));
+		v.add(new FieldContainer(49, 51, Field.HOUR_OF_DAY1));
+		v.add(new FieldContainer(52, 55, Field.HOUR_OF_DAY1));
+		v.add(new FieldContainer(56, 58, Field.HOUR_OF_DAY0));
+		v.add(new FieldContainer(59, 61, Field.HOUR_OF_DAY0));
+		v.add(new FieldContainer(62, 65, Field.HOUR_OF_DAY0));
+		v.add(new FieldContainer(66, 67, Field.HOUR1));
+		v.add(new FieldContainer(68, 70, Field.HOUR1));
+		v.add(new FieldContainer(71, 74, Field.HOUR1));
+		v.add(new FieldContainer(75, 77, Field.MINUTE));
+		v.add(new FieldContainer(78, 81, Field.MINUTE));
+		v.add(new FieldContainer(82, 83, Field.SECOND));
+		v.add(new FieldContainer(84, 86, Field.SECOND));
+		v.add(new FieldContainer(87, 90, Field.SECOND));
+		v.add(new FieldContainer(91, 92, Field.MILLISECOND));
+		v.add(new FieldContainer(93, 95, Field.MILLISECOND));
+		v.add(new FieldContainer(96, 99, Field.MILLISECOND));
+		v.add(new FieldContainer(100, 103, Field.DAY_OF_WEEK));
+		v.add(new FieldContainer(104, 110, Field.DAY_OF_WEEK));
+		v.add(new FieldContainer(111, 114, Field.DAY_OF_YEAR));
+		v.add(new FieldContainer(115, 118, Field.DAY_OF_YEAR));
+		v.add(new FieldContainer(119, 122, Field.DAY_OF_YEAR));
+		v.add(new FieldContainer(123, 124, Field.DAY_OF_WEEK_IN_MONTH));
+		v.add(new FieldContainer(125, 127, Field.DAY_OF_WEEK_IN_MONTH));
+		v.add(new FieldContainer(128, 130, Field.WEEK_OF_YEAR));
+		v.add(new FieldContainer(131, 134, Field.WEEK_OF_YEAR));
+		v.add(new FieldContainer(135, 136, Field.WEEK_OF_MONTH));
+		v.add(new FieldContainer(137, 140, Field.WEEK_OF_MONTH));
+		v.add(new FieldContainer(141, 143, Field.AM_PM));
+		v.add(new FieldContainer(145, 147, Field.AM_PM));
+		v.add(new FieldContainer(149, 150, Field.HOUR0));
+		v.add(new FieldContainer(151, 154, Field.HOUR0));
+		v.add(new FieldContainer(155, 158, Field.TIME_ZONE));
+		v.add(new FieldContainer(159, 180, Field.TIME_ZONE));
+		v.add(new FieldContainer(181, 186, Field.TIME_ZONE));
+		v.add(new FieldContainer(187, 192, Field.TIME_ZONE));
+		return v;
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Socket.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Socket.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Socket.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_Socket.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,32 @@
+/* Copyright 2002, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * This interface provides an extremely basic set of socket operations.
+ */
+public interface Support_Socket {
+
+	public InputStream getInputStream() throws IOException;
+
+	public OutputStream getOutputStream() throws IOException;
+
+	public void close() throws IOException;
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_StringReader.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_StringReader.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_StringReader.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_StringReader.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,229 @@
+/* Copyright 2001, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.io.IOException;
+import java.io.Reader;
+
+public class Support_StringReader extends Reader {
+	private String str;
+
+	private int markpos = -1;
+
+	private int pos = 0;
+
+	private int count;
+
+	/**
+	 * Construct a StringReader on the String <code>str</code>. The size of
+	 * the reader is set to the <code>length()</code> of the String and the
+	 * Object to synchronize access through is set to <code>str</code>.
+	 * 
+	 * @param str
+	 *            the String to filter reads on.
+	 */
+	public Support_StringReader(String str) {
+		super(str);
+		this.str = str;
+		this.count = str.length();
+	}
+
+	/**
+	 * This method closes this StringReader. Once it is closed, you can no
+	 * longer read from it. Only the first invocation of this method has any
+	 * effect.
+	 * 
+	 */
+	public void close() {
+		synchronized (lock) {
+			if (isOpen())
+				str = null;
+		}
+	}
+
+	/**
+	 * Answer a boolean indicating whether or not this StringReader is open.
+	 */
+	private boolean isOpen() {
+		return str != null;
+	}
+
+	/**
+	 * Set a Mark position in this Reader. The parameter <code>readLimit</code>
+	 * is ignored for StringReaders. Sending reset() will reposition the reader
+	 * back to the marked position provided the mark has not been invalidated.
+	 * 
+	 * @param readlimit
+	 *            ignored for StringReaders.
+	 * 
+	 * @exception java.io.IOException
+	 *                If an error occurs attempting mark this StringReader.
+	 */
+	public void mark(int readLimit) throws IOException {
+		if (readLimit >= 0) {
+			synchronized (lock) {
+				if (isOpen())
+					markpos = pos;
+				else
+					throw new IOException("StringReader is closed");
+			}
+		} else
+			throw new IllegalArgumentException();
+	}
+
+	/**
+	 * Answers a boolean indicating whether or not this StringReader supports
+	 * mark() and reset(). This method always returns true.
+	 * 
+	 * @return <code>true</code> if mark() and reset() are supported,
+	 *         <code>false</code> otherwise. This implementation always
+	 *         returns <code>true</code>.
+	 */
+	public boolean markSupported() {
+		return true;
+	}
+
+	/**
+	 * Reads a single character from this StringReader and returns the result as
+	 * an int. The 2 higher-order bytes are set to 0. If the end of reader was
+	 * encountered then return -1.
+	 * 
+	 * @return the character read or -1 if end of reader.
+	 * 
+	 * @exception java.io.IOException
+	 *                If the StringReader is already closed.
+	 */
+	public int read() throws IOException {
+		synchronized (lock) {
+			if (isOpen()) {
+				if (pos != count)
+					return str.charAt(pos++);
+				return -1;
+			} else
+				throw new IOException("StringReader is closed");
+		}
+	}
+
+	/**
+	 * Reads at most <code>count</code> characters from this StringReader and
+	 * stores them at <code>offset</code> in the character array
+	 * <code>buf</code>. Returns the number of characters actually read or -1
+	 * if the end of reader was encountered.
+	 * 
+	 * @param buf
+	 *            character array to store the read characters
+	 * @param offset
+	 *            offset in buf to store the read characters
+	 * @param count
+	 *            maximum number of characters to read
+	 * @return the number of characters read or -1 if end of reader.
+	 * 
+	 * @exception java.io.IOException
+	 *                If the StringReader is closed.
+	 */
+	public int read(char buf[], int offset, int count) throws IOException {
+		// avoid int overflow
+		if (0 <= offset && offset <= buf.length && 0 <= count
+				&& count <= buf.length - offset) {
+			synchronized (lock) {
+				if (isOpen()) {
+					if (pos == this.count)
+						return -1;
+					int end = pos + count > this.count ? this.count : pos
+							+ count;
+					str.getChars(pos, end, buf, offset);
+					int read = end - pos;
+					pos = end;
+					return read;
+				} else
+					throw new IOException("StringReader is closed");
+			}
+		} else
+			throw new ArrayIndexOutOfBoundsException();
+	}
+
+	/**
+	 * Answers a <code>boolean</code> indicating whether or not this
+	 * StringReader is ready to be read without blocking. If the result is
+	 * <code>true</code>, the next <code>read()</code> will not block. If
+	 * the result is <code>false</code> this Reader may or may not block when
+	 * <code>read()</code> is sent. The implementation in StringReader always
+	 * returns <code>true</code> even when it has been closed.
+	 * 
+	 * @return <code>true</code> if the receiver will not block when
+	 *         <code>read()</code> is called, <code>false</code> if unknown
+	 *         or blocking will occur.
+	 * 
+	 * @exception java.io.IOException
+	 *                If an IO error occurs.
+	 */
+	public boolean ready() throws IOException {
+		synchronized (lock) {
+			if (isOpen())
+				return true;
+			throw new IOException("StringReader is closed");
+		}
+	}
+
+	/**
+	 * Reset this StringReader's position to the last <code>mark()</code>
+	 * location. Invocations of <code>read()/skip()</code> will occur from
+	 * this new location. If this Reader was not marked, the StringReader is
+	 * reset to the beginning of the String.
+	 * 
+	 * @exception java.io.IOException
+	 *                If this StringReader has already been closed.
+	 */
+	public void reset() throws IOException {
+		synchronized (lock) {
+			if (isOpen())
+				pos = markpos != -1 ? markpos : 0;
+			else
+				throw new IOException("StringReader is closed");
+		}
+	}
+
+	/**
+	 * Skips <code>count</code> number of characters in this StringReader.
+	 * Subsequent <code>read()</code>'s will not return these characters
+	 * unless <code>reset()</code> is used.
+	 * 
+	 * @param count
+	 *            The number of characters to skip.
+	 * @return the number of characters actually skipped.
+	 * 
+	 * @exception java.io.IOException
+	 *                If this StringReader has already been closed.
+	 */
+	public long skip(long count) throws IOException {
+		synchronized (lock) {
+			if (isOpen()) {
+				if (count <= 0)
+					return 0;
+				long skipped = 0;
+				if (count < this.count - pos) {
+					pos = pos + (int) count;
+					skipped = count;
+				} else {
+					skipped = this.count - pos;
+					pos = this.count;
+				}
+				return skipped;
+			} else
+				throw new IOException("StringReader is closed");
+		}
+	}
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_StringWriter.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_StringWriter.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_StringWriter.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_StringWriter.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,167 @@
+/* Copyright 2001, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+import java.io.IOException;
+import java.io.Writer;
+
+public class Support_StringWriter extends Writer {
+	private StringBuffer buf;
+
+	/**
+	 * Constructs a new StringWriter which has a StringBuffer allocated with the
+	 * default size of 16 characters. The StringBuffer is also the
+	 * <code>lock</code> used to synchronize access to this Writer.
+	 */
+	public Support_StringWriter() {
+		super();
+		buf = new StringBuffer(16);
+		lock = buf;
+	}
+
+	/**
+	 * Constructs a new StringWriter which has a StringBuffer allocated with the
+	 * size of <code>initialSize</code> characters. The StringBuffer is also
+	 * the <code>lock</code> used to synchronize access to this Writer.
+	 */
+	public Support_StringWriter(int initialSize) {
+		if (initialSize >= 0) {
+			buf = new StringBuffer(initialSize);
+			lock = buf;
+		} else
+			throw new IllegalArgumentException();
+	}
+
+	/**
+	 * Close this Writer. This is the concrete implementation required. This
+	 * particular implementation does nothing.
+	 * 
+	 * @exception java.io.IOException
+	 *                If an IO error occurs closing this StringWriter.
+	 */
+	public void close() throws IOException {
+	}
+
+	/**
+	 * Flush this Writer. This is the concrete implementation required. This
+	 * particular implementation does nothing.
+	 * 
+	 */
+	public void flush() {
+	}
+
+	/**
+	 * Answer the contents of this StringWriter as a StringBuffer. Any changes
+	 * made to the StringBuffer by the receiver or the caller are reflected in
+	 * this StringWriter.
+	 * 
+	 * @return this StringWriters local StringBuffer.
+	 */
+	public StringBuffer getBuffer() {
+		synchronized (lock) {
+			return buf;
+		}
+	}
+
+	/**
+	 * Answer the contents of this StringWriter as a String. Any changes made to
+	 * the StringBuffer by the receiver after returning will not be reflected in
+	 * the String returned to the caller.
+	 * 
+	 * @return this StringWriters current contents as a String.
+	 */
+	public String toString() {
+		synchronized (lock) {
+			return buf.toString();
+		}
+	}
+
+	/**
+	 * Writes <code>count</code> characters starting at <code>offset</code>
+	 * in <code>buf</code> to this StringWriter.
+	 * 
+	 * @param buf
+	 *            the non-null array containing characters to write.
+	 * @param offset
+	 *            offset in buf to retrieve characters
+	 * @param count
+	 *            maximum number of characters to write
+	 * 
+	 * @exception java.lang.ArrayIndexOutOfBoundsException
+	 *                If offset or count are outside of bounds.
+	 */
+	public void write(char[] buf, int offset, int count) {
+		// avoid int overflow
+		if (0 <= offset && offset <= buf.length && 0 <= count
+				&& count <= buf.length - offset) {
+			synchronized (lock) {
+				this.buf.append(buf, offset, count);
+			}
+		} else
+			throw new ArrayIndexOutOfBoundsException();
+	}
+
+	/**
+	 * Writes the specified character <code>oneChar</code> to this
+	 * StringWriter. This implementation writes the low order two bytes to the
+	 * Stream.
+	 * 
+	 * @param oneChar
+	 *            The character to write
+	 * 
+	 */
+	public void write(int oneChar) {
+		synchronized (lock) {
+			buf.append((char) oneChar);
+		}
+	}
+
+	/**
+	 * Writes the characters from the String <code>str</code> to this
+	 * StringWriter.
+	 * 
+	 * @param str
+	 *            the non-null String containing the characters to write.
+	 * 
+	 */
+	public void write(String str) {
+		synchronized (lock) {
+			buf.append(str);
+		}
+	}
+
+	/**
+	 * Writes <code>count</code> number of characters starting at
+	 * <code>offset</code> from the String <code>str</code> to this
+	 * StringWriter.
+	 * 
+	 * @param str
+	 *            the non-null String containing the characters to write.
+	 * @param offset
+	 *            the starting point to retrieve characters.
+	 * @param count
+	 *            the number of characters to retrieve and write.
+	 * 
+	 * @exception java.lang.ArrayIndexOutOfBoundsException
+	 *                If offset or count are outside of bounds.
+	 */
+	public void write(String str, int offset, int count) {
+		String sub = str.substring(offset, offset + count);
+		synchronized (lock) {
+			buf.append(sub);
+		}
+	}
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,27 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public class Support_TestResource extends java.util.ListResourceBundle {
+
+	protected Object[][] getContents() {
+		Object[][] contents = { { "parent1", "parentValue1" },
+				{ "parent2", "parentValue2" }, { "parent3", "parentValue3" },
+				{ "parent4", "parentValue4" }, };
+		return contents;
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_en.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_en.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_en.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_en.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,27 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public class Support_TestResource_en extends java.util.ListResourceBundle {
+
+	protected Object[][] getContents() {
+		Object[][] contents = { { "parent2", "enValue2" },
+				{ "parent3", "enValue3" }, { "parent4", "enValue4" },
+				{ "child1", "enChildValue1" }, };
+		return contents;
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_en_US.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_en_US.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_en_US.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_en_US.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,27 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public class Support_TestResource_en_US extends java.util.ListResourceBundle {
+
+	protected Object[][] getContents() {
+		Object[][] contents = { { "parent3", "enUSValue3" },
+				{ "parent4", "enUSValue4" }, { "child1", "enUSChildValue1" },
+				{ "child2", "enUSChildValue2" }, };
+		return contents;
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_fr.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_fr.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_fr.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_fr.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,27 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public class Support_TestResource_fr extends java.util.ListResourceBundle {
+
+	protected Object[][] getContents() {
+		Object[][] contents = { { "parent2", "frValue2" },
+				{ "parent3", "frValue3" }, { "parent4", "frValue4" },
+				{ "child1", "frChildValue1" }, };
+		return contents;
+	}
+
+}

Added: incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_fr_FR.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_fr_FR.java?rev=386058&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_fr_FR.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/support/src/test/java/tests/support/Support_TestResource_fr_FR.java Wed Mar 15 03:46:17 2006
@@ -0,0 +1,27 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tests.support;
+
+public class Support_TestResource_fr_FR extends java.util.ListResourceBundle {
+
+	protected Object[][] getContents() {
+		Object[][] contents = { { "parent3", "frFRValue3" },
+				{ "parent4", "frFRValue4" }, { "child1", "frFRChildValue1" },
+				{ "child2", "frFRChildValue2" }, };
+		return contents;
+	}
+
+}