A new hygenic way for tests to clean up before or after execution.

This replaces PrefsTester and is more general purpose.
diff --git a/libcore/archive/src/test/java/org/apache/harmony/archive/tests/java/util/zip/ZipFileTest.java b/libcore/archive/src/test/java/org/apache/harmony/archive/tests/java/util/zip/ZipFileTest.java
index 146c679..fb326a6 100644
--- a/libcore/archive/src/test/java/org/apache/harmony/archive/tests/java/util/zip/ZipFileTest.java
+++ b/libcore/archive/src/test/java/org/apache/harmony/archive/tests/java/util/zip/ZipFileTest.java
@@ -23,6 +23,7 @@
 import dalvik.annotation.TestTargetNew;
 import tests.support.Support_PlatformFile;
 import tests.support.resource.Support_Resources;
+import tests.util.TestEnvironment;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -142,7 +143,6 @@
         args = {java.lang.String.class}
     )
     public void test_ConstructorLjava_lang_String() throws IOException {
-        String oldUserDir = System.getProperty("user.dir");
         System.setProperty("user.dir", System.getProperty("java.io.tmpdir"));
 
         zfile.close(); // about to reopen the same temp file
@@ -167,7 +167,6 @@
             // expected
         } finally {
             System.setSecurityManager(oldSm);
-            System.setProperty("user.dir", oldUserDir);
         }
     }
 
@@ -583,6 +582,7 @@
      */
     @Override
     protected void tearDown() {
+        TestEnvironment.reset();
         try {
             if (zfile != null) {
                 // Note zfile is a user-defined zip file used by other tests and
diff --git a/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/CipherTest.java b/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/CipherTest.java
index 1245eb3..c7c1a5d 100644
--- a/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/CipherTest.java
+++ b/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/CipherTest.java
@@ -25,6 +25,7 @@
 import org.apache.harmony.crypto.tests.support.MyCipher;
 
 import tests.support.resource.Support_Resources;
+import tests.util.TestEnvironment;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -86,7 +87,12 @@
             fail("No key " + e);
         }
     }
-    
+
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+    }
+
     /**
      * @tests javax.crypto.Cipher#getInstance(java.lang.String)
      */
diff --git a/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/EncryptedPrivateKeyInfoTest.java b/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/EncryptedPrivateKeyInfoTest.java
index d3d0857..63ed789 100644
--- a/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/EncryptedPrivateKeyInfoTest.java
+++ b/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/EncryptedPrivateKeyInfoTest.java
@@ -57,6 +57,7 @@
 import org.apache.harmony.crypto.tests.support.EncryptedPrivateKeyInfoData;
 
 import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(EncryptedPrivateKeyInfo.class)
 /**
@@ -195,7 +196,12 @@
     //            {"RSA",null}, // 1.2.840.113549.1.1.1
     //            {"1.2.840.113549.1.1.1", null},
     };
-    
+
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+    }
+
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         notes = "",
diff --git a/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/func/CipherAesWrapTest.java b/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/func/CipherAesWrapTest.java
index d196edc..a5d8d90 100644
--- a/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/func/CipherAesWrapTest.java
+++ b/libcore/crypto/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/func/CipherAesWrapTest.java
@@ -22,10 +22,17 @@
 import junit.framework.TestCase;
 
 import targets.Cipher;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(Cipher.AESWrap.class)
 public class CipherAesWrapTest extends TestCase {
-// 3 cases checked
+
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+    }
+
+    // 3 cases checked
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         notes = "",
diff --git a/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/FileHandlerTest.java b/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/FileHandlerTest.java
index 3ff1fc9..e4ef413 100644
--- a/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/FileHandlerTest.java
+++ b/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/FileHandlerTest.java
@@ -50,6 +50,7 @@
 
 import org.apache.harmony.logging.tests.java.util.logging.HandlerTest.NullOutputStream;
 import org.apache.harmony.logging.tests.java.util.logging.util.EnvironmentHelper;
+import tests.util.TestEnvironment;
 
 /**
  */
@@ -62,18 +63,11 @@
 
     final static String className = FileHandlerTest.class.getName();
 
-    final static StringWriter writer = new StringWriter();
-
-    final static SecurityManager securityManager = new MockLogSecurityManager();
-
     final static String SEP = File.separator;
 
-    private String oldHomePath = System.getProperty("user.home");
-    
-    // The HOMEPATH can't be used in android.
-    final static String HOMEPATH = System.getProperty("java.io.tmpdir") + SEP + "home";
+    String HOMEPATH;
 
-    final static String TEMPPATH = System.getProperty("java.io.tmpdir");
+    String TEMPPATH;
 
     private final PrintStream err = System.err;
 
@@ -88,6 +82,7 @@
      */
     protected void setUp() throws Exception {
         super.setUp();
+        TestEnvironment.reset();
         manager.reset();
         
         //initProp
@@ -106,19 +101,10 @@
         props.put("java.util.logging.FileHandler.append", "true");
         props.put("java.util.logging.FileHandler.pattern",
                         "%t/log/java%u.test");
-        
-        File home = new File(HOMEPATH);
-        if (!home.exists()) {
-            home.mkdirs();
-        } else if (!home.isDirectory()) {
-            home.delete();
-            home.mkdirs();
-        }
-        if(!home.isDirectory()) {
-            fail("unable to create temp path");
-        }
-        System.setProperty("user.home", HOMEPATH);
-        
+
+        HOMEPATH = System.getProperty("user.home");
+        TEMPPATH = System.getProperty("java.io.tmpdir");
+
         File file = new File(TEMPPATH + SEP + "log");
         file.mkdir();
         manager.readConfiguration(EnvironmentHelper
@@ -140,8 +126,7 @@
         }
         reset(TEMPPATH + SEP + "log", "");
         System.setErr(err);
-        System.setProperty("user.home", oldHomePath);
-        new File(HOMEPATH).delete();
+        TestEnvironment.reset();
         super.tearDown();
     }
 
@@ -634,8 +619,6 @@
         assertFileContent(TEMPPATH, "testLimitCount0.0",
                 new LogRecord[] { rs[9] }, handler.getFormatter());
 
-        String oldUserDir = System.getProperty("user.dir");
-        System.setProperty("user.dir", System.getProperty("java.io.tmpdir"));
         FileHandler h1 = null;
         FileHandler h2 = null;
         try {
@@ -656,7 +639,6 @@
             } catch (Exception e) {
             }
             reset("log", "");
-            System.setProperty("user.dir", oldUserDir);
         }
     }
     @TestTargets({
@@ -1000,14 +982,6 @@
             fail("should throw IllegalArgumentException");
         } catch (IllegalArgumentException e) {
         }
-        
-        // always parse special pattern
-        System.setProperty("user.home", "home");
-        try {
-            h1 = new FileHandler("%t/%h.txt");
-        } catch (Exception e) {
-            fail("Unexpected exception " + e.toString());
-        }
     }
 
     /*
diff --git a/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogManagerTest.java b/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogManagerTest.java
index cf608bc..44389be 100644
--- a/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogManagerTest.java
+++ b/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogManagerTest.java
@@ -45,6 +45,7 @@
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
+import tests.util.TestEnvironment;
 
 /**
  * 
@@ -107,6 +108,7 @@
      */
     @Override
     protected void tearDown() throws Exception {
+        TestEnvironment.reset();
         super.tearDown();
         handler = null;
     }
@@ -1194,24 +1196,17 @@
         args = {}
     )
     public void testValidConfigClass() throws Exception {
-        String oldProperty = System.getProperty("java.util.logging.config.class");
-        try {
-            //            System.setProperty("java.util.logging.config.class", "org.apache.harmony.logging.tests.java.util.logging.LogManagerTest$ConfigClass");
-            System.setProperty("java.util.logging.config.class", this.getClass().getName()
-                    + "$ConfigClass");
-            assertNull(manager.getLogger("testConfigClass.foo"));
+        //            System.setProperty("java.util.logging.config.class", "org.apache.harmony.logging.tests.java.util.logging.LogManagerTest$ConfigClass");
+        System.setProperty("java.util.logging.config.class", this.getClass().getName()
+                + "$ConfigClass");
+        assertNull(manager.getLogger("testConfigClass.foo"));
 
-            manager.readConfiguration();
-            assertNull(manager.getLogger("testConfigClass.foo"));
-            Logger l = Logger.getLogger("testConfigClass.foo.child");
-            assertSame(Level.FINEST, manager.getLogger("").getLevel());
-            assertEquals(0, manager.getLogger("").getHandlers().length);
-            assertEquals("testConfigClass.foo", l.getParent().getName());
-        } finally {
-            if (oldProperty != null) {
-                System.setProperty("java.util.logging.config.class", oldProperty);
-            }
-        }
+        manager.readConfiguration();
+        assertNull(manager.getLogger("testConfigClass.foo"));
+        Logger l = Logger.getLogger("testConfigClass.foo.child");
+        assertSame(Level.FINEST, manager.getLogger("").getLevel());
+        assertEquals(0, manager.getLogger("").getHandlers().length);
+        assertEquals("testConfigClass.foo", l.getParent().getName());
     }
 
     /*
diff --git a/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogRecordTest.java b/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogRecordTest.java
index 5b21099..6d4f784 100644
--- a/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogRecordTest.java
+++ b/libcore/logging/src/test/java/org/apache/harmony/logging/tests/java/util/logging/LogRecordTest.java
@@ -295,7 +295,7 @@
         assertNull(lr.getSourceClassName());
 
         // find class and method who called logger
-        Logger logger = Logger.global;
+        Logger logger = Logger.getLogger("testGetSourceDefaultValue");
         MockHandler handler = new MockHandler();
         logger.addHandler(handler);
         logger.log(Level.SEVERE, MSG);
diff --git a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/internal/net/www/protocol/https/HttpsURLConnectionTest.java b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/internal/net/www/protocol/https/HttpsURLConnectionTest.java
index 275ea9d..e26cf74 100644
--- a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/internal/net/www/protocol/https/HttpsURLConnectionTest.java
+++ b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/internal/net/www/protocol/https/HttpsURLConnectionTest.java
@@ -25,6 +25,7 @@
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
 import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
@@ -99,19 +100,6 @@
     // Proxy authentication required response code
     private static final int AUTHENTICATION_REQUIRED_CODE = 407;
 
-    // fields keeping the system values of corresponding properties
-    private static String systemKeyStoreType;
-
-    private static String systemKeyStore;
-
-    private static String systemKeyStorePassword;
-
-    private static String systemTrustStoreType;
-
-    private static String systemTrustStore;
-
-    private static String systemTrustStorePassword;
-    
     private static File store;
     
     static {
@@ -136,19 +124,14 @@
         // set up the properties defining the default values needed by SSL stuff
         setUpStoreProperties();
 
-        try {
-            SSLSocketFactory defaultSSLSF = HttpsURLConnection
-                    .getDefaultSSLSocketFactory();
-            ServerSocket ss = new ServerSocket(0);
-            Socket s = defaultSSLSF
-                    .createSocket("localhost", ss.getLocalPort());
-            ss.accept();
-            s.close();
-            ss.close();
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
-        }
+        SSLSocketFactory defaultSSLSF = HttpsURLConnection
+                .getDefaultSSLSocketFactory();
+        ServerSocket ss = new ServerSocket(0);
+        Socket s = defaultSSLSF
+                .createSocket("localhost", ss.getLocalPort());
+        ss.accept();
+        s.close();
+        ss.close();
     }
 
     /**
@@ -171,33 +154,28 @@
         // set up the properties defining the default values needed by SSL stuff
         setUpStoreProperties();
 
-        try {
-            // create the SSL server socket acting as a server
-            SSLContext ctx = getContext();
-            ServerSocket ss = ctx.getServerSocketFactory()
-                    .createServerSocket(0);
+        // create the SSL server socket acting as a server
+        SSLContext ctx = getContext();
+        ServerSocket ss = ctx.getServerSocketFactory()
+                .createServerSocket(0);
 
-            // create the HostnameVerifier to check hostname verification
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+        // create the HostnameVerifier to check hostname verification
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
 
-            // create url connection to be tested
-            URL url = new URL("https://localhost:" + ss.getLocalPort());
-            HttpsURLConnection connection = (HttpsURLConnection) url
-                    .openConnection();
+        // create url connection to be tested
+        URL url = new URL("https://localhost:" + ss.getLocalPort());
+        HttpsURLConnection connection = (HttpsURLConnection) url
+                .openConnection();
 
-            // perform the interaction between the peers
-            SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
+        // perform the interaction between the peers
+        SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
 
-            // check the connection state
-            checkConnectionStateParameters(connection, peerSocket);
+        // check the connection state
+        checkConnectionStateParameters(connection, peerSocket);
 
-            // should silently exit
-            connection.connect();
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
-        }
+        // should silently exit
+        connection.connect();
     }
 
     /**
@@ -231,37 +209,32 @@
         // set up the properties defining the default values needed by SSL stuff
         setUpStoreProperties();
 
+        // create the SSL server socket acting as a server
+        SSLContext ctx = getContext();
+        ServerSocket ss = ctx.getServerSocketFactory()
+                .createServerSocket(0);
+
+        // create the HostnameVerifier to check hostname verification
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+
+        // create url connection to be tested
+        URL url = new URL("https://localhost:" + ss.getLocalPort());
+        HttpsURLConnection connection = (HttpsURLConnection) url
+                .openConnection();
+
         try {
-            // create the SSL server socket acting as a server
-            SSLContext ctx = getContext();
-            ServerSocket ss = ctx.getServerSocketFactory()
-                    .createServerSocket(0);
-
-            // create the HostnameVerifier to check hostname verification
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
-
-            // create url connection to be tested
-            URL url = new URL("https://localhost:" + ss.getLocalPort());
-            HttpsURLConnection connection = (HttpsURLConnection) url
-                    .openConnection();
-
-            try {
-                doInteraction(connection, ss, NOT_FOUND_CODE);
-                fail("Expected exception was not thrown.");
-            } catch (FileNotFoundException e) {
-                if (DO_LOG) {
-                    System.out.println("Expected exception was thrown: "
-                            + e.getMessage());
-                }
+            doInteraction(connection, ss, NOT_FOUND_CODE);
+            fail("Expected exception was not thrown.");
+        } catch (FileNotFoundException e) {
+            if (DO_LOG) {
+                System.out.println("Expected exception was thrown: "
+                        + e.getMessage());
             }
-
-            // should silently exit
-            connection.connect();
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
         }
+
+        // should silently exit
+        connection.connect();
     }
 
     /**
@@ -458,39 +431,34 @@
         // setting up the properties pointing to the key/trust stores
         setUpStoreProperties();
 
-        try {
-            // create the SSLServerSocket which will be used by server side
-            SSLServerSocket ss = (SSLServerSocket) getContext()
-                    .getServerSocketFactory().createServerSocket(0);
+        // create the SSLServerSocket which will be used by server side
+        SSLServerSocket ss = (SSLServerSocket) getContext()
+                .getServerSocketFactory().createServerSocket(0);
 
-            // create the HostnameVerifier to check that Hostname verification
-            // is done
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+        // create the HostnameVerifier to check that Hostname verification
+        // is done
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
 
-            // create HttpsURLConnection to be tested
-            URL url = new URL("https://localhost:" + ss.getLocalPort());
-            HttpsURLConnection connection = (HttpsURLConnection) url
-                    .openConnection();
+        // create HttpsURLConnection to be tested
+        URL url = new URL("https://localhost:" + ss.getLocalPort());
+        HttpsURLConnection connection = (HttpsURLConnection) url
+                .openConnection();
 
-            TestHostnameVerifier hnv_late = new TestHostnameVerifier();
-            // replace default verifier
-            connection.setHostnameVerifier(hnv_late);
+        TestHostnameVerifier hnv_late = new TestHostnameVerifier();
+        // replace default verifier
+        connection.setHostnameVerifier(hnv_late);
 
-            // perform the interaction between the peers and check the results
-            SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
-            assertTrue("Hostname verification was not done", hnv_late.verified);
-            assertFalse(
-                    "Hostname verification should not be done by this verifier",
-                    hnv.verified);
-            checkConnectionStateParameters(connection, peerSocket);
+        // perform the interaction between the peers and check the results
+        SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
+        assertTrue("Hostname verification was not done", hnv_late.verified);
+        assertFalse(
+                "Hostname verification should not be done by this verifier",
+                hnv.verified);
+        checkConnectionStateParameters(connection, peerSocket);
 
-            // should silently exit
-            connection.connect();
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
-        }
+        // should silently exit
+        connection.connect();
     }
 
     /**
@@ -509,32 +477,27 @@
         // setting up the properties pointing to the key/trust stores
         setUpStoreProperties();
 
-        try {
-            // create the SSLServerSocket which will be used by server side
-            SSLServerSocket ss = (SSLServerSocket) getContext()
-                    .getServerSocketFactory().createServerSocket(0);
+        // create the SSLServerSocket which will be used by server side
+        SSLServerSocket ss = (SSLServerSocket) getContext()
+                .getServerSocketFactory().createServerSocket(0);
 
-            // create the HostnameVerifier to check that Hostname verification
-            // is done
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+        // create the HostnameVerifier to check that Hostname verification
+        // is done
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
 
-            // create HttpsURLConnection to be tested
-            URL url = new URL("https://localhost:" + ss.getLocalPort());
-            HttpsURLConnection connection = (HttpsURLConnection) url
-                    .openConnection();
-            connection.setDoOutput(true);
+        // create HttpsURLConnection to be tested
+        URL url = new URL("https://localhost:" + ss.getLocalPort());
+        HttpsURLConnection connection = (HttpsURLConnection) url
+                .openConnection();
+        connection.setDoOutput(true);
 
-            // perform the interaction between the peers and check the results
-            SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
-            checkConnectionStateParameters(connection, peerSocket);
+        // perform the interaction between the peers and check the results
+        SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
+        checkConnectionStateParameters(connection, peerSocket);
 
-            // should silently exit
-            connection.connect();
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
-        }
+        // should silently exit
+        connection.connect();
     }
 
     /**
@@ -566,32 +529,27 @@
         // setting up the properties pointing to the key/trust stores
         setUpStoreProperties();
 
-        try {
-            // create the SSLServerSocket which will be used by server side
-            ServerSocket ss = new ServerSocket(0);
+        // create the SSLServerSocket which will be used by server side
+        ServerSocket ss = new ServerSocket(0);
 
-            // create the HostnameVerifier to check that Hostname verification
-            // is done
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+        // create the HostnameVerifier to check that Hostname verification
+        // is done
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
 
-            // create HttpsURLConnection to be tested
-            URL url = new URL("https://requested.host:55556/requested.data");
-            HttpsURLConnection connection = (HttpsURLConnection) url
-                    .openConnection(new Proxy(Proxy.Type.HTTP,
-                            new InetSocketAddress("localhost", ss
-                                    .getLocalPort())));
+        // create HttpsURLConnection to be tested
+        URL url = new URL("https://requested.host:55556/requested.data");
+        HttpsURLConnection connection = (HttpsURLConnection) url
+                .openConnection(new Proxy(Proxy.Type.HTTP,
+                        new InetSocketAddress("localhost", ss
+                                .getLocalPort())));
 
-            // perform the interaction between the peers and check the results
-            SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
-            checkConnectionStateParameters(connection, peerSocket);
+        // perform the interaction between the peers and check the results
+        SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
+        checkConnectionStateParameters(connection, peerSocket);
 
-            // should silently exit
-            connection.connect();
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
-        }
+        // should silently exit
+        connection.connect();
     }
 
     /**
@@ -624,40 +582,35 @@
         // setting up the properties pointing to the key/trust stores
         setUpStoreProperties();
 
-        try {
-            // create the SSLServerSocket which will be used by server side
-            ServerSocket ss = new ServerSocket(0);
+        // create the SSLServerSocket which will be used by server side
+        ServerSocket ss = new ServerSocket(0);
 
-            // create the HostnameVerifier to check that Hostname verification
-            // is done
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+        // create the HostnameVerifier to check that Hostname verification
+        // is done
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
 
-            Authenticator.setDefault(new Authenticator() {
+        Authenticator.setDefault(new Authenticator() {
 
-                protected PasswordAuthentication getPasswordAuthentication() {
-                    return new PasswordAuthentication("user", "password"
-                            .toCharArray());
-                }
-            });
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication("user", "password"
+                        .toCharArray());
+            }
+        });
 
-            // create HttpsURLConnection to be tested
-            URL url = new URL("https://requested.host:55555/requested.data");
-            HttpsURLConnection connection = (HttpsURLConnection) url
-                    .openConnection(new Proxy(Proxy.Type.HTTP,
-                            new InetSocketAddress("localhost", ss
-                                    .getLocalPort())));
+        // create HttpsURLConnection to be tested
+        URL url = new URL("https://requested.host:55555/requested.data");
+        HttpsURLConnection connection = (HttpsURLConnection) url
+                .openConnection(new Proxy(Proxy.Type.HTTP,
+                        new InetSocketAddress("localhost", ss
+                                .getLocalPort())));
 
-            // perform the interaction between the peers and check the results
-            SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
-            checkConnectionStateParameters(connection, peerSocket);
+        // perform the interaction between the peers and check the results
+        SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
+        checkConnectionStateParameters(connection, peerSocket);
 
-            // should silently exit
-            connection.connect();
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
-        }
+        // should silently exit
+        connection.connect();
     }
 
     /**
@@ -692,40 +645,35 @@
         // setting up the properties pointing to the key/trust stores
         setUpStoreProperties();
 
-        try {
-            // create the SSLServerSocket which will be used by server side
-            ServerSocket ss = new ServerSocket(0);
+        // create the SSLServerSocket which will be used by server side
+        ServerSocket ss = new ServerSocket(0);
 
-            // create the HostnameVerifier to check that Hostname verification
-            // is done
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+        // create the HostnameVerifier to check that Hostname verification
+        // is done
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
 
-            // create HttpsURLConnection to be tested
-            URL url = new URL("https://requested.host:55555/requested.data");
-            HttpsURLConnection connection = (HttpsURLConnection) url
-                    .openConnection(new Proxy(Proxy.Type.HTTP,
-                            new InetSocketAddress("localhost", ss
-                                    .getLocalPort())));
+        // create HttpsURLConnection to be tested
+        URL url = new URL("https://requested.host:55555/requested.data");
+        HttpsURLConnection connection = (HttpsURLConnection) url
+                .openConnection(new Proxy(Proxy.Type.HTTP,
+                        new InetSocketAddress("localhost", ss
+                                .getLocalPort())));
 
-            // perform the interaction between the peers and check the results
-            SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
-            checkConnectionStateParameters(connection, peerSocket);
+        // perform the interaction between the peers and check the results
+        SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss);
+        checkConnectionStateParameters(connection, peerSocket);
 
-            // create another SSLServerSocket which will be used by server side
-            ss = new ServerSocket(0);
+        // create another SSLServerSocket which will be used by server side
+        ss = new ServerSocket(0);
 
-            connection = (HttpsURLConnection) url.openConnection(new Proxy(
-                    Proxy.Type.HTTP, new InetSocketAddress("localhost", ss
-                            .getLocalPort())));
+        connection = (HttpsURLConnection) url.openConnection(new Proxy(
+                Proxy.Type.HTTP, new InetSocketAddress("localhost", ss
+                        .getLocalPort())));
 
-            // perform the interaction between the peers and check the results
-            peerSocket = (SSLSocket) doInteraction(connection, ss);
-            checkConnectionStateParameters(connection, peerSocket);
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
-        }
+        // perform the interaction between the peers and check the results
+        peerSocket = (SSLSocket) doInteraction(connection, ss);
+        checkConnectionStateParameters(connection, peerSocket);
     }
 
     /**
@@ -765,39 +713,34 @@
         // setting up the properties pointing to the key/trust stores
         setUpStoreProperties();
 
-        try {
-            // create the SSLServerSocket which will be used by server side
-            ServerSocket ss = new ServerSocket(0);
+        // create the SSLServerSocket which will be used by server side
+        ServerSocket ss = new ServerSocket(0);
 
-            // create the HostnameVerifier to check that Hostname verification
-            // is done
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+        // create the HostnameVerifier to check that Hostname verification
+        // is done
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
 
-            Authenticator.setDefault(new Authenticator() {
+        Authenticator.setDefault(new Authenticator() {
 
-                protected PasswordAuthentication getPasswordAuthentication() {
-                    return new PasswordAuthentication("user", "password"
-                            .toCharArray());
-                }
-            });
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication("user", "password"
+                        .toCharArray());
+            }
+        });
 
-            // create HttpsURLConnection to be tested
-            URL url = new URL("https://requested.host:55554/requested.data");
-            HttpsURLConnection connection = (HttpsURLConnection) url
-                    .openConnection(new Proxy(Proxy.Type.HTTP,
-                            new InetSocketAddress("localhost", ss
-                                    .getLocalPort())));
-            connection.setDoOutput(true);
+        // create HttpsURLConnection to be tested
+        URL url = new URL("https://requested.host:55554/requested.data");
+        HttpsURLConnection connection = (HttpsURLConnection) url
+                .openConnection(new Proxy(Proxy.Type.HTTP,
+                        new InetSocketAddress("localhost", ss
+                                .getLocalPort())));
+        connection.setDoOutput(true);
 
-            // perform the interaction between the peers and check the results
-            SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss,
-                    OK_CODE, true);
-            checkConnectionStateParameters(connection, peerSocket);
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
-        }
+        // perform the interaction between the peers and check the results
+        SSLSocket peerSocket = (SSLSocket) doInteraction(connection, ss,
+                OK_CODE, true);
+        checkConnectionStateParameters(connection, peerSocket);
     }
 
     /**
@@ -830,36 +773,31 @@
         // setting up the properties pointing to the key/trust stores
         setUpStoreProperties();
 
+        // create the SSLServerSocket which will be used by server side
+        ServerSocket ss = new ServerSocket(0);
+
+        // create the HostnameVerifier to check that Hostname verification
+        // is done
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+
+        // create HttpsURLConnection to be tested
+        URL url = new URL("https://requested.host:55555/requested.data");
+        HttpURLConnection connection = (HttpURLConnection) url
+                .openConnection(new Proxy(Proxy.Type.HTTP,
+                        new InetSocketAddress("localhost", ss
+                                .getLocalPort())));
+
+        // perform the interaction between the peers and check the results
         try {
-            // create the SSLServerSocket which will be used by server side
-            ServerSocket ss = new ServerSocket(0);
-
-            // create the HostnameVerifier to check that Hostname verification
-            // is done
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
-
-            // create HttpsURLConnection to be tested
-            URL url = new URL("https://requested.host:55555/requested.data");
-            HttpURLConnection connection = (HttpURLConnection) url
-                    .openConnection(new Proxy(Proxy.Type.HTTP,
-                            new InetSocketAddress("localhost", ss
-                                    .getLocalPort())));
-
-            // perform the interaction between the peers and check the results
-            try {
-                doInteraction(connection, ss, AUTHENTICATION_REQUIRED_CODE,
-                        true);
-            } catch (IOException e) {
-                // SSL Tunnelling failed
-                if (DO_LOG) {
-                    System.out.println("Got expected IOException: "
-                            + e.getMessage());
-                }
+            doInteraction(connection, ss, AUTHENTICATION_REQUIRED_CODE,
+                    true);
+        } catch (IOException e) {
+            // SSL Tunnelling failed
+            if (DO_LOG) {
+                System.out.println("Got expected IOException: "
+                        + e.getMessage());
             }
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
         }
     }
 
@@ -893,34 +831,29 @@
         // setting up the properties pointing to the key/trust stores
         setUpStoreProperties();
 
+        // create the SSLServerSocket which will be used by server side
+        ServerSocket ss = new ServerSocket(0);
+
+        // create the HostnameVerifier to check that Hostname verification
+        // is done
+        TestHostnameVerifier hnv = new TestHostnameVerifier();
+        HttpsURLConnection.setDefaultHostnameVerifier(hnv);
+
+        // create HttpsURLConnection to be tested
+        URL url = new URL("https://localhost:" + ss.getLocalPort());
+        HttpURLConnection connection = (HttpURLConnection) url
+                .openConnection(new Proxy(Proxy.Type.HTTP,
+                        new InetSocketAddress("localhost", ss
+                                .getLocalPort())));
+
         try {
-            // create the SSLServerSocket which will be used by server side
-            ServerSocket ss = new ServerSocket(0);
-
-            // create the HostnameVerifier to check that Hostname verification
-            // is done
-            TestHostnameVerifier hnv = new TestHostnameVerifier();
-            HttpsURLConnection.setDefaultHostnameVerifier(hnv);
-
-            // create HttpsURLConnection to be tested
-            URL url = new URL("https://localhost:" + ss.getLocalPort());
-            HttpURLConnection connection = (HttpURLConnection) url
-                    .openConnection(new Proxy(Proxy.Type.HTTP,
-                            new InetSocketAddress("localhost", ss
-                                    .getLocalPort())));
-
-            try {
-                doInteraction(connection, ss, NOT_FOUND_CODE); // NOT FOUND
-                fail("Expected exception was not thrown.");
-            } catch (FileNotFoundException e) {
-                if (DO_LOG) {
-                    System.out.println("Expected exception was thrown: "
-                            + e.getMessage());
-                }
+            doInteraction(connection, ss, NOT_FOUND_CODE); // NOT FOUND
+            fail("Expected exception was not thrown.");
+        } catch (FileNotFoundException e) {
+            if (DO_LOG) {
+                System.out.println("Expected exception was thrown: "
+                        + e.getMessage());
             }
-        } finally {
-            // roll the properties back to system values
-            tearDownStoreProperties();
         }
     }
 
@@ -932,6 +865,9 @@
      * Log the name of the test case to be executed.
      */
     public void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+
         if (DO_LOG) {
             System.out.println();
             System.out.println("------------------------");
@@ -959,6 +895,7 @@
     }
 
     public void tearDown() {
+        TestEnvironment.reset();
         if (store != null) {
             store.delete();
         }
@@ -1042,17 +979,6 @@
     private static void setUpStoreProperties() throws Exception {
         String type = KeyStore.getDefaultType();
 
-        systemKeyStoreType = System.getProperty("javax.net.ssl.keyStoreType");
-        systemKeyStore = System.getProperty("javax.net.ssl.keyStore");
-        systemKeyStorePassword = System
-                .getProperty("javax.net.ssl.keyStorePassword");
-
-        systemTrustStoreType = System
-                .getProperty("javax.net.ssl.trustStoreType");
-        systemTrustStore = System.getProperty("javax.net.ssl.trustStore");
-        systemTrustStorePassword = System
-                .getProperty("javax.net.ssl.trustStorePassword");
-
         System.setProperty("javax.net.ssl.keyStoreType", type);
         System.setProperty("javax.net.ssl.keyStore", getKeyStoreFileName());
         System.setProperty("javax.net.ssl.keyStorePassword", KS_PASSWORD);
@@ -1063,48 +989,6 @@
     }
 
     /**
-     * Rolls back the values of system properties.
-     */
-    private static void tearDownStoreProperties() {
-        if (systemKeyStoreType == null) {
-            System.clearProperty("javax.net.ssl.keyStoreType");
-        } else {
-            System
-                    .setProperty("javax.net.ssl.keyStoreType",
-                            systemKeyStoreType);
-        }
-        if (systemKeyStore == null) {
-            System.clearProperty("javax.net.ssl.keyStore");
-        } else {
-            System.setProperty("javax.net.ssl.keyStore", systemKeyStore);
-        }
-        if (systemKeyStorePassword == null) {
-            System.clearProperty("javax.net.ssl.keyStorePassword");
-        } else {
-            System.setProperty("javax.net.ssl.keyStorePassword",
-                    systemKeyStorePassword);
-        }
-
-        if (systemTrustStoreType == null) {
-            System.clearProperty("javax.net.ssl.trustStoreType");
-        } else {
-            System.setProperty("javax.net.ssl.trustStoreType",
-                    systemTrustStoreType);
-        }
-        if (systemTrustStore == null) {
-            System.clearProperty("javax.net.ssl.trustStore");
-        } else {
-            System.setProperty("javax.net.ssl.trustStore", systemTrustStore);
-        }
-        if (systemTrustStorePassword == null) {
-            System.clearProperty("javax.net.ssl.trustStorePassword");
-        } else {
-            System.setProperty("javax.net.ssl.trustStorePassword",
-                    systemTrustStorePassword);
-        }
-    }
-
-    /**
      * Performs interaction between client's HttpURLConnection and
      * servers side (ServerSocket).
      */
diff --git a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileTest.java b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileTest.java
index 84cddf2..53ce506 100644
--- a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileTest.java
+++ b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileTest.java
@@ -25,10 +25,21 @@
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(File.class)
 public class FileTest extends TestCase {
 
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+    }
+
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     /**
      * @tests java.io.File#File(java.io.File, java.lang.String)
      */
diff --git a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/lang/RuntimeTest.java b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/lang/RuntimeTest.java
index b1de669..1b61d6f 100644
--- a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/lang/RuntimeTest.java
+++ b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/lang/RuntimeTest.java
@@ -33,6 +33,7 @@
 import java.util.Vector;
 
 import tests.support.resource.Support_Resources;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(Runtime.class) 
 public class RuntimeTest extends junit.framework.TestCase {
@@ -72,6 +73,11 @@
         return new RuntimeTest("FT");
     }
 
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     /**
      * @tests java.lang.Runtime#exec(java.lang.String)
      */
@@ -864,7 +870,6 @@
         byte[] expected = {72, 0, 101, 0, 97, 0, 114, 0, 116, 0, 32, 0, 60, 47};
         byte[] returned = new byte[expected.length];
 
-        String oldEncoding = System.getProperty("file.encoding");
         System.setProperty("file.encoding", "UTF-16LE");
 
         try {
@@ -883,8 +888,6 @@
                     Arrays.equals(expected, returned));
         } catch (UnsupportedEncodingException e) {
             fail("UnsupportedEncodingException was thrown.");
-        } finally {
-            System.setProperty("file.encoding", oldEncoding);
         }
     }
  
diff --git a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/lang/SystemTest.java b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/lang/SystemTest.java
index f17c3d8..08412d2 100644
--- a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/lang/SystemTest.java
+++ b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/lang/SystemTest.java
@@ -22,6 +22,7 @@
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargetClass;
+import tests.util.TestEnvironment;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -1207,10 +1208,16 @@
 
     @Override
     protected void setUp() {
+        TestEnvironment.reset();
         flag = false;
         ranFinalize = false;
     }
 
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     protected SystemTest createInstance() {
         return new SystemTest("FT");
     }
diff --git a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java
index 5635ecb..4053271 100644
--- a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java
+++ b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java
@@ -39,6 +39,7 @@
 import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;
 
 import tests.support.Support_Configuration;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(InetAddress.class) 
 public class InetAddressTest extends junit.framework.TestCase {
@@ -49,6 +50,16 @@
 
     protected static String threadedTestErrorString;
 
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+    }
+
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     /**
      * This class is used to test inet_ntoa, gethostbyaddr and gethostbyname
      * functions in the VM to make sure they're threadsafe. getByName will cause
@@ -391,60 +402,47 @@
         }
 
         // Make sure there is no caching
-        String originalPropertyValue = System
-                .getProperty("networkaddress.cache.ttl");
         System.setProperty("networkaddress.cache.ttl", "0");
 
         // Test for threadsafety
-        try {
-            InetAddress lookup1 = InetAddress
-                    .getByName(Support_Configuration.InetTestAddress);
-            assertTrue(lookup1 + " expected "
-                    + Support_Configuration.InetTestIP,
-                    Support_Configuration.InetTestIP.equals(lookup1
-                            .getHostAddress()));
-            InetAddress lookup2 = InetAddress
-                    .getByName(Support_Configuration.InetTestAddress2);
-            assertTrue(lookup2 + " expected "
-                    + Support_Configuration.InetTestIP2,
-                    Support_Configuration.InetTestIP2.equals(lookup2
-                            .getHostAddress()));
-            threadsafeTestThread thread1 = new threadsafeTestThread("1",
-                    lookup1.getHostName(), lookup1, 0);
-            threadsafeTestThread thread2 = new threadsafeTestThread("2",
-                    lookup2.getHostName(), lookup2, 0);
-            threadsafeTestThread thread3 = new threadsafeTestThread("3",
-                    lookup1.getHostAddress(), lookup1, 1);
-            threadsafeTestThread thread4 = new threadsafeTestThread("4",
-                    lookup2.getHostAddress(), lookup2, 1);
+        InetAddress lookup1 = InetAddress
+                .getByName(Support_Configuration.InetTestAddress);
+        assertTrue(lookup1 + " expected "
+                + Support_Configuration.InetTestIP,
+                Support_Configuration.InetTestIP.equals(lookup1
+                        .getHostAddress()));
+        InetAddress lookup2 = InetAddress
+                .getByName(Support_Configuration.InetTestAddress2);
+        assertTrue(lookup2 + " expected "
+                + Support_Configuration.InetTestIP2,
+                Support_Configuration.InetTestIP2.equals(lookup2
+                        .getHostAddress()));
+        threadsafeTestThread thread1 = new threadsafeTestThread("1",
+                lookup1.getHostName(), lookup1, 0);
+        threadsafeTestThread thread2 = new threadsafeTestThread("2",
+                lookup2.getHostName(), lookup2, 0);
+        threadsafeTestThread thread3 = new threadsafeTestThread("3",
+                lookup1.getHostAddress(), lookup1, 1);
+        threadsafeTestThread thread4 = new threadsafeTestThread("4",
+                lookup2.getHostAddress(), lookup2, 1);
 
-            // initialize the flags
-            threadedTestSucceeded = true;
-            synchronized (someoneDone) {
-                thread1.start();
-                thread2.start();
-                thread3.start();
-                thread4.start();
-            }
-            thread1.join();
-            thread2.join();
-            thread3.join();
-            thread4.join();
-            /* FIXME: comment the assertion below because it is platform/configuration dependent
-             * Please refer to HARMONY-1664 (https://issues.apache.org/jira/browse/HARMONY-1664)
-             * for details
-             */
-//            assertTrue(threadedTestErrorString, threadedTestSucceeded);
-        } finally {
-            // restore the old value of the property
-            if (originalPropertyValue == null)
-                // setting the property to -1 has the same effect as having the
-                // property be null
-                System.setProperty("networkaddress.cache.ttl", "-1");
-            else
-                System.setProperty("networkaddress.cache.ttl",
-                        originalPropertyValue);
+        // initialize the flags
+        threadedTestSucceeded = true;
+        synchronized (someoneDone) {
+            thread1.start();
+            thread2.start();
+            thread3.start();
+            thread4.start();
         }
+        thread1.join();
+        thread2.join();
+        thread3.join();
+        thread4.join();
+        /* FIXME: comment the assertion below because it is platform/configuration dependent
+        * Please refer to HARMONY-1664 (https://issues.apache.org/jira/browse/HARMONY-1664)
+        * for details
+        */
+//            assertTrue(threadedTestErrorString, threadedTestSucceeded);
     }
 
     /**
diff --git a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net/URLTest.java b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net/URLTest.java
index b4eb0ad..188d88d 100644
--- a/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net/URLTest.java
+++ b/libcore/luni/src/test/java/org/apache/harmony/luni/tests/java/net/URLTest.java
@@ -27,6 +27,7 @@
 import tests.support.Support_Configuration;
 import tests.support.Support_PortManager;
 import tests.support.resource.Support_Resources;
+import tests.util.TestEnvironment;
 
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
@@ -60,6 +61,17 @@
 public class URLTest extends TestCase {
    
     private static final String helloWorldString = "Hello World";
+
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+    }
+
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     /**
      * @tests java.net.URL#getHost()
      */
@@ -137,19 +149,12 @@
     public void test_java_protocol_handler_pkgs_prop() throws MalformedURLException {
         // Regression test for Harmony-3094
         final String HANDLER_PKGS = "java.protocol.handler.pkgs";
-        String pkgs = System.getProperty(HANDLER_PKGS);
         System.setProperty(HANDLER_PKGS, "fake|org.apache.harmony.luni.tests.java.net");
 
         try {
             new URL("test_protocol", "", "fake.jar");
         } catch (MalformedURLException e) {
             // expected
-        } finally {
-            if (pkgs == null) {
-                System.clearProperty(HANDLER_PKGS);
-            } else {
-                System.setProperty(HANDLER_PKGS, pkgs);
-            }
         }
     }
     
diff --git a/libcore/luni/src/test/java/tests/api/java/io/FilePermissionTest.java b/libcore/luni/src/test/java/tests/api/java/io/FilePermissionTest.java
index 27f416d..2fa0828 100644
--- a/libcore/luni/src/test/java/tests/api/java/io/FilePermissionTest.java
+++ b/libcore/luni/src/test/java/tests/api/java/io/FilePermissionTest.java
@@ -17,28 +17,34 @@
 
 package tests.api.java.io;
 
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import tests.util.TestEnvironment;
+
 import java.io.File;
 import java.io.FilePermission;
 import java.security.PermissionCollection;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-
 @TestTargetClass(FilePermission.class) 
 public class FilePermissionTest extends junit.framework.TestCase {
 
-    FilePermission readAllFiles = new FilePermission("<<ALL FILES>>", "read");
+    FilePermission readAllFiles;
+    FilePermission alsoReadAllFiles;
+    FilePermission allInCurrent;
+    FilePermission readInCurrent;
+    FilePermission readInFile;
 
-    FilePermission alsoReadAllFiles = new FilePermission("<<ALL FILES>>",
-            "read");
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
 
-    FilePermission allInCurrent = new FilePermission("*",
-            "read, write, execute,delete");
-
-    FilePermission readInCurrent = new FilePermission("*", "read");
-
-    FilePermission readInFile = new FilePermission("aFile.file", "read");
+        readAllFiles = new FilePermission("<<ALL FILES>>", "read");
+        alsoReadAllFiles = new FilePermission("<<ALL FILES>>", "read");
+        allInCurrent = new FilePermission("*", "read, write, execute,delete");
+        readInCurrent = new FilePermission("*", "read");
+        readInFile = new FilePermission("aFile.file", "read");
+    }
 
     /**
      * @tests java.io.FilePermission#FilePermission(java.lang.String,
@@ -58,9 +64,9 @@
                 "write");
         assertEquals("action given to the constructor did not correspond - constructor failed",
                 "write", constructFile.getActions());
-        assertTrue(
-                "name given to the construcotr did not correspond - construcotr failed",
-                constructFile.getName() == "test constructor");
+        assertEquals(
+                "name given to the constructor did not correspond - constructor failed",
+                "test constructor", constructFile.getName());
 
         // Regression test for HARMONY-1050
         try {
@@ -244,18 +250,4 @@
                 readInCurrent.hashCode() != allInCurrent.hashCode());
 
     }
-
-    /**
-     * Sets up the fixture, for example, open a network connection. This method
-     * is called before a test is executed.
-     */
-    protected void setUp() {
-    }
-
-    /**
-     * Tears down the fixture, for example, close a network connection. This
-     * method is called after a test is executed.
-     */
-    protected void tearDown() {
-    }
 }
diff --git a/libcore/luni/src/test/java/tests/api/java/io/FileTest.java b/libcore/luni/src/test/java/tests/api/java/io/FileTest.java
index 3063b89..adcaccd 100644
--- a/libcore/luni/src/test/java/tests/api/java/io/FileTest.java
+++ b/libcore/luni/src/test/java/tests/api/java/io/FileTest.java
@@ -39,6 +39,7 @@
 import dalvik.annotation.TestTargets;
 import static tests.support.Support_Exec.javaProcessBuilder;
 import static tests.support.Support_Exec.execAndGetOutput;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(File.class) 
 public class FileTest extends junit.framework.TestCase {
@@ -97,7 +98,6 @@
     public void test_ConstructorLjava_io_FileLjava_lang_String() throws Exception {
         String error;
         String dirName = System.getProperty("java.io.tmpdir");
-        String oldUserDir = System.getProperty("user.dir");
         System.setProperty("user.dir", dirName);
         
         File d = new File(dirName);
@@ -127,8 +127,6 @@
         d = new File(s, "/abc");
         assertEquals("Test 4: Incorrect file created;", 
                 f.getAbsolutePath(), d.getAbsolutePath());
-        
-        System.setProperty("user.dir", oldUserDir);
     }
 
     /**
@@ -173,7 +171,6 @@
         String fileName = "input.tst";
 
         String userDir = System.getProperty("java.io.tmpdir");
-        String oldUserDir = System.getProperty("user.dir");
         System.setProperty("user.dir", userDir);
         
         File f = new File(dirName, fileName);
@@ -206,8 +203,6 @@
                 .getAbsolutePath());
         assertEquals("Test3: Created Incorrect File", "/abc", f
                 .getAbsolutePath());
-
-        System.setProperty("user.dir", oldUserDir);
     }
 
     /**
@@ -931,7 +926,6 @@
         String expected;
         String error;
         String tmpDir = System.getProperty("java.io.tmpdir");
-        String oldUserDir = System.getProperty("user.dir");
         System.setProperty("user.dir", tmpDir);
         try {
             String base = new File(tmpDir).getCanonicalPath();
@@ -978,8 +972,6 @@
 
         } catch (IOException e) {
             fail("Unexpected IOException During Test : " + e.getMessage());
-        } finally {
-            System.setProperty("user.dir", oldUserDir);
         }
     }
 
@@ -1094,7 +1086,6 @@
         args = {}
     )    
     public void test_getPath() {
-        String oldUserDir = System.getProperty("java.io.tmpdir");
         System.setProperty("user.dir", System.getProperty("java.io.tmpdir"));
         String base = System.getProperty("user.dir");
         String fname;
@@ -1120,7 +1111,6 @@
         f2.delete();
         f3.delete();
         f4.delete();
-        System.setProperty("user.dir", oldUserDir);
     }
 
     /**
@@ -2503,6 +2493,9 @@
      * is called before a test is executed.
      */
     protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+
         // Make sure that system properties are set correctly
         String userDir = System.getProperty("java.io.tmpdir");
         if (userDir == null)
@@ -2534,6 +2527,8 @@
      * method is called after a test is executed.
      */
     protected void tearDown() {
+        TestEnvironment.reset();
+
         if (tempFile.exists() && !tempFile.delete())
             System.out
                     .println("FileTest.tearDown() failed, could not delete file!");
diff --git a/libcore/luni/src/test/java/tests/api/java/net/ExcludedProxyTest.java b/libcore/luni/src/test/java/tests/api/java/net/ExcludedProxyTest.java
index ae76723..eeb46db 100644
--- a/libcore/luni/src/test/java/tests/api/java/net/ExcludedProxyTest.java
+++ b/libcore/luni/src/test/java/tests/api/java/net/ExcludedProxyTest.java
@@ -36,6 +36,7 @@
 import tests.support.Support_Configuration;
 import tests.support.resource.Support_Resources;
 import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 /*
  * This test is designed for collecting all the testcases which needs a proxy
@@ -46,6 +47,12 @@
 
 @TestTargetClass(Proxy.class) 
 public class ExcludedProxyTest extends TestCase {
+
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+    }
+
     /**
      * @tests java.net.HttpURLConnection#usingProxy()
      */
diff --git a/libcore/luni/src/test/java/tests/api/java/net/ProxySelectorTest.java b/libcore/luni/src/test/java/tests/api/java/net/ProxySelectorTest.java
index f208954..ee8195b 100644
--- a/libcore/luni/src/test/java/tests/api/java/net/ProxySelectorTest.java
+++ b/libcore/luni/src/test/java/tests/api/java/net/ProxySelectorTest.java
@@ -34,6 +34,7 @@
 import java.util.Properties;
 
 import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(ProxySelector.class) 
 public class ProxySelectorTest extends TestCase {
@@ -77,11 +78,6 @@
         }
     }
 
-    /*
-     * Original system properties must be restored after running each test case.
-     */
-    private Properties orignalSystemProperties;
-
     /**
      * @tests java.net.ProxySelector#getDefault()
      */
@@ -722,16 +718,14 @@
      */
     protected void setUp() throws Exception {
         super.setUp();
-        // save original system properties
-        orignalSystemProperties = (Properties) System.getProperties().clone();
+        TestEnvironment.reset();
     }
 
     /*
      * @see junit.framework.TestCase#tearDown()
      */
     protected void tearDown() throws Exception {
-        // restore orignal system properties
-        System.setProperties(orignalSystemProperties);
+        TestEnvironment.reset();
         super.tearDown();
     }
 }
diff --git a/libcore/luni/src/test/java/tests/api/java/net/ServerSocketTest.java b/libcore/luni/src/test/java/tests/api/java/net/ServerSocketTest.java
index ecdfd01..a750536 100644
--- a/libcore/luni/src/test/java/tests/api/java/net/ServerSocketTest.java
+++ b/libcore/luni/src/test/java/tests/api/java/net/ServerSocketTest.java
@@ -45,6 +45,7 @@
 
 import tests.support.Support_Configuration;
 import tests.support.Support_PortManager;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(value = ServerSocket.class) 
 public class ServerSocketTest extends SocketTestCase {
@@ -1289,7 +1290,7 @@
      * method is called after a test is executed.
      */
     protected void tearDown() {
-
+        TestEnvironment.reset();
         try {
             if (s != null)
                 s.close();
diff --git a/libcore/luni/src/test/java/tests/api/java/util/FormatterTest.java b/libcore/luni/src/test/java/tests/api/java/util/FormatterTest.java
index 6f86818..5a29fdc 100644
--- a/libcore/luni/src/test/java/tests/api/java/util/FormatterTest.java
+++ b/libcore/luni/src/test/java/tests/api/java/util/FormatterTest.java
@@ -59,6 +59,7 @@
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(Formatter.class) 
 public class FormatterTest extends TestCase {
@@ -1268,8 +1269,6 @@
         } catch (IllegalFormatPrecisionException e) {
             // expected
         }
-        
-        System.setProperty("line.separator", oldSeparator);
     }
 
     /**
@@ -4725,6 +4724,7 @@
      * Setup resource files for testing
      */
     protected void setUp() throws IOException {
+        TestEnvironment.reset();
         notExist = File.createTempFile("notexist", null);
         notExist.delete();
 
@@ -4748,6 +4748,7 @@
      * Delete the resource files if they exist
      */
     protected void tearDown() {
+        TestEnvironment.reset();
         if (notExist.exists()) {
             notExist.delete();
         }
diff --git a/libcore/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java b/libcore/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java
index 6c36ec2..e7c5f5c 100644
--- a/libcore/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java
+++ b/libcore/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java
@@ -20,6 +20,7 @@
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 import java.nio.charset.Charset;
 import java.nio.charset.IllegalCharsetNameException;
@@ -40,6 +41,8 @@
      * JUnit set-up method
      */
     public void setUp() {
+        TestEnvironment.reset();
+
         // Populate the known charset vars
         Set names = Charset.availableCharsets().keySet();
         for (Iterator nameItr = names.iterator(); nameItr.hasNext();) {
diff --git a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/AbstractPreferencesTest.java b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/AbstractPreferencesTest.java
index 76ef4e7..b45a75a 100644
--- a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/AbstractPreferencesTest.java
+++ b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/AbstractPreferencesTest.java
@@ -16,12 +16,12 @@
 
 package org.apache.harmony.prefs.tests.java.util.prefs;
 
-import dalvik.annotation.TestTargets;
 import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargetClass;
-
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
 import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -35,13 +35,9 @@
 import java.util.prefs.PreferenceChangeListener;
 import java.util.prefs.Preferences;
 
-import tests.util.PrefsTester;
-
 @TestTargetClass(AbstractPreferences.class)
 public class AbstractPreferencesTest extends TestCase {
 
-    private final PrefsTester prefsTester = new PrefsTester();
-
     AbstractPreferences pref;
 
     static AbstractPreferences root;
@@ -55,7 +51,7 @@
     
     protected void setUp() throws Exception {
         super.setUp();
-        prefsTester.setUp();
+        TestEnvironment.reset();
 
         root = (AbstractPreferences) Preferences.userRoot();
         parent = (AbstractPreferences) Preferences.userNodeForPackage(this.getClass());
@@ -64,7 +60,6 @@
     }
 
     protected void tearDown() throws Exception {
-        prefsTester.tearDown();
         super.tearDown();
     }
 
diff --git a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/FilePreferencesImplTest.java b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/FilePreferencesImplTest.java
index 0cb1975..4535a59 100644
--- a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/FilePreferencesImplTest.java
+++ b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/FilePreferencesImplTest.java
@@ -17,33 +17,29 @@
 package org.apache.harmony.prefs.tests.java.util.prefs;
 
 import dalvik.annotation.AndroidOnly;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargets;
 import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 import java.io.FilePermission;
 import java.security.Permission;
 import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
 
-import junit.framework.TestCase;
-import tests.util.PrefsTester;
-
 @TestTargetClass(java.util.prefs.Preferences.class)
 public class FilePreferencesImplTest extends TestCase {
 
-    private final PrefsTester prefsTester = new PrefsTester();
-
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        prefsTester.setUp();
+        TestEnvironment.reset();
     }
 
     @Override
     protected void tearDown() throws Exception {
-        prefsTester.tearDown();
         super.tearDown();
     }
 
diff --git a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/NodeChangeEventTest.java b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/NodeChangeEventTest.java
index 1afd755..e24026c 100644
--- a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/NodeChangeEventTest.java
+++ b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/NodeChangeEventTest.java
@@ -16,10 +16,12 @@
 
 package org.apache.harmony.prefs.tests.java.util.prefs;
 
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargets;
 import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
+import junit.framework.TestCase;
+import org.apache.harmony.testframework.serialization.SerializationTest;
+import tests.util.TestEnvironment;
 
 import java.io.NotSerializableException;
 import java.util.prefs.AbstractPreferences;
@@ -27,28 +29,20 @@
 import java.util.prefs.NodeChangeEvent;
 import java.util.prefs.Preferences;
 
-import junit.framework.TestCase;
-
-import org.apache.harmony.testframework.serialization.SerializationTest;
-import tests.util.PrefsTester;
-
 /**
  * 
  */
 @TestTargetClass(NodeChangeEvent.class)
 public class NodeChangeEventTest extends TestCase {
 
-    private final PrefsTester prefsTester = new PrefsTester();
-
     NodeChangeEvent event;
 
     protected void setUp() throws Exception {
         super.setUp();
-        prefsTester.setUp();
+        TestEnvironment.reset();
     }
 
     protected void tearDown() throws Exception {
-        prefsTester.tearDown();
         super.tearDown();
     }
 
diff --git a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/NodeChangeListenerTest.java b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/NodeChangeListenerTest.java
index 3cdb4d9..8e01589 100644
--- a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/NodeChangeListenerTest.java
+++ b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/NodeChangeListenerTest.java
@@ -16,26 +16,22 @@
 
 package org.apache.harmony.prefs.tests.java.util.prefs;
 
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargets;
 import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
+import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 import java.util.prefs.NodeChangeEvent;
 import java.util.prefs.NodeChangeListener;
 import java.util.prefs.Preferences;
 
-import junit.framework.TestCase;
-import tests.util.PrefsTester;
-
 /**
  * 
  */
 @TestTargetClass(NodeChangeListener.class)
 public class NodeChangeListenerTest extends TestCase {
 
-    private final PrefsTester prefsTester = new PrefsTester();
-
     NodeChangeListener l;
 
     /*
@@ -44,7 +40,7 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        prefsTester.setUp();
+        TestEnvironment.reset();
         l = new NodeChangeListenerImpl();
     }
 
@@ -53,7 +49,6 @@
      */
     @Override
     protected void tearDown() throws Exception {
-        prefsTester.tearDown();
         super.tearDown();
     }
 
diff --git a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/PreferenceChangeEventTest.java b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/PreferenceChangeEventTest.java
index aa55457..47e621e 100644
--- a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/PreferenceChangeEventTest.java
+++ b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/PreferenceChangeEventTest.java
@@ -16,37 +16,32 @@
 
 package org.apache.harmony.prefs.tests.java.util.prefs;
 
-import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
+import junit.framework.TestCase;
+import org.apache.harmony.testframework.serialization.SerializationTest;
+import tests.util.TestEnvironment;
 
 import java.io.NotSerializableException;
 import java.util.prefs.AbstractPreferences;
 import java.util.prefs.PreferenceChangeEvent;
 import java.util.prefs.Preferences;
 
-import junit.framework.TestCase;
-
-import org.apache.harmony.testframework.serialization.SerializationTest;
-import tests.util.PrefsTester;
-
 /**
  * 
  */
 @TestTargetClass(PreferenceChangeEvent.class)
 public class PreferenceChangeEventTest extends TestCase {
 
-    private final PrefsTester prefsTester = new PrefsTester();
-
     PreferenceChangeEvent event;
 
     @Override protected void setUp() throws Exception {
         super.setUp();
-        prefsTester.setUp();
+        TestEnvironment.reset();
     }
 
     @Override protected void tearDown() throws Exception {
-        prefsTester.tearDown();
         super.tearDown();
     }
 
diff --git a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/PreferencesTest.java b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/PreferencesTest.java
index c9c74fd..122dacd 100644
--- a/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/PreferencesTest.java
+++ b/libcore/prefs/src/test/java/org/apache/harmony/prefs/tests/java/util/prefs/PreferencesTest.java
@@ -21,11 +21,10 @@
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
-
 import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 import java.io.ByteArrayInputStream;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -39,16 +38,12 @@
 import java.util.prefs.PreferenceChangeListener;
 import java.util.prefs.Preferences;
 
-import tests.util.PrefsTester;
-
 /**
  * 
  */
 @TestTargetClass(Preferences.class)
 public class PreferencesTest extends TestCase {
 
-    private final PrefsTester prefsTester = new PrefsTester();
-
     MockSecurityManager manager = new MockSecurityManager();
 
     MockInputStream stream = null;
@@ -82,7 +77,7 @@
                 "<!DOCTYPE preferences SYSTEM \"http://java.sun.com/dtd/preferences.dtd\"><preferences><root type=\"user\"><map></map></root></preferences>"
                         .getBytes("UTF-8"));
         stream = new MockInputStream(in);
-        prefsTester.setUp();
+        TestEnvironment.reset();
     }
 
     /*
@@ -91,7 +86,6 @@
     @Override
     protected void tearDown() throws Exception {
         stream.close();
-        prefsTester.tearDown();
         super.tearDown();
     }
 
diff --git a/libcore/security/src/test/java/org/apache/harmony/security/tests/java/security/PolicyTest.java b/libcore/security/src/test/java/org/apache/harmony/security/tests/java/security/PolicyTest.java
index cfa2af1..ce57328 100644
--- a/libcore/security/src/test/java/org/apache/harmony/security/tests/java/security/PolicyTest.java
+++ b/libcore/security/src/test/java/org/apache/harmony/security/tests/java/security/PolicyTest.java
@@ -31,6 +31,7 @@
 
 import org.apache.harmony.security.tests.support.SecurityChecker;
 import org.apache.harmony.security.tests.support.TestUtils;
+import tests.util.TestEnvironment;
 
 import java.io.File;
 import java.io.FilePermission;
@@ -60,6 +61,11 @@
         junit.textui.TestRunner.run(PolicyTest.class);
     }
 
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     /**
      * @tests constructor Policy()
      */
diff --git a/libcore/security/src/test/java/tests/security/permissions/JavaLangSystemTest.java b/libcore/security/src/test/java/tests/security/permissions/JavaLangSystemTest.java
index d1bf7c2..b9217a1 100644
--- a/libcore/security/src/test/java/tests/security/permissions/JavaLangSystemTest.java
+++ b/libcore/security/src/test/java/tests/security/permissions/JavaLangSystemTest.java
@@ -22,6 +22,7 @@
 import dalvik.annotation.TestTargetClass;
 
 import junit.framework.TestCase;
+import tests.util.TestEnvironment;
 
 import java.io.InputStream;
 import java.io.PrintStream;
@@ -46,6 +47,7 @@
 
     @Override
     protected void tearDown() throws Exception {
+        TestEnvironment.reset();
         System.setSecurityManager(old);
         super.tearDown();
     }
diff --git a/libcore/sql/src/test/java/org/apache/harmony/sql/tests/java/sql/DriverManagerTest.java b/libcore/sql/src/test/java/org/apache/harmony/sql/tests/java/sql/DriverManagerTest.java
index ebb055c..d53f078 100644
--- a/libcore/sql/src/test/java/org/apache/harmony/sql/tests/java/sql/DriverManagerTest.java
+++ b/libcore/sql/src/test/java/org/apache/harmony/sql/tests/java/sql/DriverManagerTest.java
@@ -39,6 +39,7 @@
 import junit.framework.TestCase;
 import static tests.support.Support_Exec.javaProcessBuilder;
 import static tests.support.Support_Exec.execAndGetOutput;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(DriverManager.class)
 /**
@@ -77,6 +78,7 @@
     // test methods as needed.
     @Override
     public void setUp() {
+        TestEnvironment.reset();
         numberLoaded = loadDrivers();
     } // end setUp()
 
diff --git a/libcore/support/src/test/java/tests/util/PrefsTester.java b/libcore/support/src/test/java/tests/util/PrefsTester.java
deleted file mode 100644
index 047b357..0000000
--- a/libcore/support/src/test/java/tests/util/PrefsTester.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.util;
-
-import java.util.prefs.BackingStoreException;
-import java.util.prefs.Preferences;
-import java.util.Arrays;
-
-/**
- * Prepares the shared preferences store for a test by wiping preference data
- * before and after the test. Sample usage:
- * <pre>
- * public void MyPreferencesTest extends TestCase {
- *     private final PrefsTester prefsTester = new PrefsTester();
- *
- *     public void setUp() throws BackingStoreException {
- *         super.setUp();
- *         prefsTester.setUp();
- *     }
- *
- *     public void tearDown() throws BackingStoreException {
- *         prefsTester.tearDown();
- *         super.tearDown();
- *     }
- *
- *     ...
- * }</pre>
- *
- * <p>Once the preferences classes have been initialized, the path where their
- * data is stored is fixed. For that reason, every test that reads or writes
- * preferences must first prepare preferences for testing by using this class.
- */
-public final class PrefsTester {
-
-    static {
-        String tmp = System.getProperty("java.io.tmpdir");
-        System.setProperty("user.home", tmp);
-        System.setProperty("java.home", tmp);
-    }
-
-    public void setUp() throws BackingStoreException {
-        clear();
-    }
-
-    public void tearDown() throws BackingStoreException {
-        clear();
-    }
-
-    private void clear() throws BackingStoreException {
-        for (Preferences root : Arrays .asList(
-                Preferences.systemRoot(), Preferences.userRoot())) {
-            for (String child : root.childrenNames()) {
-                root.node(child).removeNode();
-            }
-            root.clear();
-            root.flush();
-        }
-    }
-}
diff --git a/libcore/support/src/test/java/tests/util/TestEnvironment.java b/libcore/support/src/test/java/tests/util/TestEnvironment.java
new file mode 100644
index 0000000..92facda
--- /dev/null
+++ b/libcore/support/src/test/java/tests/util/TestEnvironment.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * 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.util;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Properties;
+import java.util.prefs.BackingStoreException;
+import java.util.prefs.Preferences;
+
+/**
+ * Prepares system properties and preferences to hygienic values for testing:
+ * <ul>
+ *   <li>System properties are set to reasonable defaults. Referenced
+ *       directories such as the user and Java home directories will be
+ *       writable.
+ *   <li>System and user preferences are cleared. Once the preferences classes
+ *       have been initialized, the path where their data is stored is fixed.
+ *       For this reason, every test that reads or writes preferences should
+ *       first reset the system configuration with this API.
+ * </ul>
+ *
+ * <p>Use this class to clean up before and/or after your test. Sample usage:
+ * <pre>
+ * public void MyTest extends TestCase {
+ *
+ *     protected void setUp() throws Exception {
+ *         super.setUp();
+ *         TestEnvironment().reset();
+ *     }
+ *
+ *     protected void tearDown() throws Exception {
+ *         TestEnvironment().reset();
+ *         super.tearDown();
+ *     }
+ *
+ *     ...
+ * }</pre>
+ */
+public final class TestEnvironment {
+    private TestEnvironment() {}
+
+    public static synchronized void reset() {
+        resetSystemProperties();
+        resetPreferences();
+
+        // TODO: TimeZone?, SecurityManager?
+    }
+
+    private static void resetSystemProperties() {
+        String tmpDir = System.getProperty("java.io.tmpdir");
+        if (tmpDir == null) {
+            throw new IllegalStateException("Test execution requires the"
+                    + " system property java.io.tmpdir to be set.");
+        }
+
+        Properties p = new Properties();
+
+        // runtime properties that we never want to clobber
+        copyProperty(p, "android.vm.dexfile");
+        copyProperty(p, "java.boot.class.path");
+        copyProperty(p, "java.class.path");
+        copyProperty(p, "java.io.tmpdir");
+        copyProperty(p, "java.library.path");
+        copyProperty(p, "os.arch");
+        copyProperty(p, "os.name");
+        copyProperty(p, "os.version");
+
+        // paths with writable values for testing
+        String userHome = tmpDir + "/user.home";
+        String javaHome = tmpDir + "/java.home";
+        String userDir = tmpDir + "/user.dir";
+        makeDirectory(new File(userHome));
+        makeDirectory(new File(javaHome));
+        makeDirectory(new File(userDir));
+        p.put("java.home", javaHome);
+        p.put("user.dir", userDir);
+        p.put("user.home", userHome);
+
+        // hardcoded properties
+        p.put("file.encoding", "UTF-8");
+        p.put("file.separator", "/");
+        p.put("java.class.version", "46.0");
+        p.put("java.compiler", "");
+        p.put("java.ext.dirs", "");
+        p.put("java.net.preferIPv6Addresses", "true");
+        p.put("java.runtime.name", "Android Runtime");
+        p.put("java.runtime.version", "0.9");
+        p.put("java.specification.name", "Dalvik Core Library");
+        p.put("java.specification.vendor", "The Android Project");
+        p.put("java.specification.version", "0.9");
+        p.put("java.vendor", "The Android Project");
+        p.put("java.vendor.url", "http://www.android.com/");
+        p.put("java.version", "0");
+        p.put("java.vm.name", "Dalvik");
+        p.put("java.vm.specification.name", "Dalvik Virtual Machine Specification");
+        p.put("java.vm.specification.vendor", "The Android Project");
+        p.put("java.vm.specification.version", "0.9");
+        p.put("java.vm.vendor", "The Android Project");
+        p.put("java.vm.vendor.url", "http://www.android.com/");
+        p.put("java.vm.version", "1.2.0");
+        p.put("javax.net.ssl.trustStore", "/etc/security/cacerts.bks");
+        p.put("line.separator", "\n");
+        p.put("path.separator", ":");
+        p.put("user.language", "en");
+        p.put("user.name", "");
+        p.put("user.region", "US");
+
+        System.setProperties(p);
+    }
+
+    private static void copyProperty(Properties p, String key) {
+        p.put(key, System.getProperty(key));
+    }
+
+    private static void makeDirectory(File path) {
+        boolean success;
+        if (!path.exists()) {
+            success = path.mkdirs();
+        } else if (!path.isDirectory()) {
+            success = path.delete() && path.mkdirs();
+        } else {
+            success = true;
+        }
+
+        if (!success) {
+            throw new RuntimeException("Failed to make directory " + path);
+        }
+    }
+
+    private static void resetPreferences() {
+        try {
+            for (Preferences root : Arrays.asList(
+                    Preferences.systemRoot(), Preferences.userRoot())) {
+                for (String child : root.childrenNames()) {
+                    root.node(child).removeNode();
+                }
+                root.clear();
+                root.flush();
+            }
+        } catch (BackingStoreException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/libcore/x-net/src/test/java/tests/api/javax/net/ssl/SSLEngineTest.java b/libcore/x-net/src/test/java/tests/api/javax/net/ssl/SSLEngineTest.java
index 0e3fee3..f659919 100644
--- a/libcore/x-net/src/test/java/tests/api/javax/net/ssl/SSLEngineTest.java
+++ b/libcore/x-net/src/test/java/tests/api/javax/net/ssl/SSLEngineTest.java
@@ -49,6 +49,7 @@
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
+import tests.util.TestEnvironment;
 
 
 /**
@@ -65,6 +66,11 @@
         junit.textui.TestRunner.run(SSLEngineTest.class);
     }
 
+    @Override protected void setUp() throws Exception {
+        super.setUp();
+        TestEnvironment.reset();
+    }
+
     /**
      * Test for <code>SSLEngine()</code> constructor Assertion: creates
      * SSLEngine object with null host and -1 port
diff --git a/libcore/xml/src/test/java/tests/api/javax/xml/parsers/DocumentBuilderFactoryTest.java b/libcore/xml/src/test/java/tests/api/javax/xml/parsers/DocumentBuilderFactoryTest.java
index 1e1ffdd..b6c400f 100644
--- a/libcore/xml/src/test/java/tests/api/javax/xml/parsers/DocumentBuilderFactoryTest.java
+++ b/libcore/xml/src/test/java/tests/api/javax/xml/parsers/DocumentBuilderFactoryTest.java
@@ -31,6 +31,7 @@
 import org.xml.sax.SAXParseException;
 
 import tests.api.javax.xml.parsers.SAXParserFactoryTest.MyHandler;
+import tests.util.TestEnvironment;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -57,6 +58,7 @@
 
     protected void setUp() throws Exception {
         super.setUp();
+        TestEnvironment.reset();
         dbf = DocumentBuilderFactory.newInstance();
 
         cdataElements = new ArrayList<String>();
diff --git a/libcore/xml/src/test/java/tests/api/javax/xml/parsers/SAXParserFactoryTest.java b/libcore/xml/src/test/java/tests/api/javax/xml/parsers/SAXParserFactoryTest.java
index 5d41356..a918ac2 100644
--- a/libcore/xml/src/test/java/tests/api/javax/xml/parsers/SAXParserFactoryTest.java
+++ b/libcore/xml/src/test/java/tests/api/javax/xml/parsers/SAXParserFactoryTest.java
@@ -41,6 +41,7 @@
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(SAXParserFactory.class) 
 public class SAXParserFactoryTest extends TestCase {
@@ -66,7 +67,9 @@
     }
 
     public void tearDown() throws Exception {
+        TestEnvironment.reset();
         is1.close();
+        super.tearDown();
     }
 
     @TestTargetNew(
@@ -175,13 +178,10 @@
         args = {}
     )
     public void test_newInstance() {
-        String className = null;
         try {
             SAXParserFactory dtf = SAXParserFactory.newInstance();
             assertNotNull("New Instance of DatatypeFactory is null", dtf);
 
-            className = System.getProperty("javax.xml.parsers.SAXParserFactory");
-
             System.setProperty("javax.xml.parsers.SAXParserFactory",
             "org.apache.harmony.xml.parsers.SAXParserFactoryImpl");
 
@@ -205,13 +205,6 @@
             }
         } catch (IOException ioe) {
             fail("Unexpected exception " + ioe.toString());
-        } finally {
-            if (className == null) {
-                System.clearProperty("javax.xml.parsers.SAXParserFactory");
-            } else {
-                System.setProperty("javax.xml.parsers.SAXParserFactory",
-                        className);
-            }
         }
     }
 
diff --git a/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/ParserAdapterTest.java b/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/ParserAdapterTest.java
index 27a7e78..608d52c 100644
--- a/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/ParserAdapterTest.java
+++ b/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/ParserAdapterTest.java
@@ -44,6 +44,7 @@
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
+import tests.util.TestEnvironment;
 
 @SuppressWarnings("deprecation")
 @TestTargetClass(ParserAdapter.class)
@@ -79,11 +80,17 @@
 
     @Override
     public void setUp() {
+        TestEnvironment.reset();
         adapter.setContentHandler(handler);
         adapter.setDTDHandler(handler);
         adapter.setErrorHandler(handler);
     }
-    
+
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         method = "ParserAdapter",
diff --git a/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/ParserFactoryTest.java b/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/ParserFactoryTest.java
index dd4b1c3..113a569 100644
--- a/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/ParserFactoryTest.java
+++ b/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/ParserFactoryTest.java
@@ -23,6 +23,7 @@
 import junit.framework.TestCase;
 
 import org.xml.sax.helpers.ParserFactory;
+import tests.util.TestEnvironment;
 
 import java.util.Iterator;
 import java.util.Properties;
@@ -32,6 +33,11 @@
 @TestTargetClass(ParserFactory.class)
 public class ParserFactoryTest extends TestCase {
 
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         method = "makeParser",
diff --git a/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/XMLReaderAdapterTest.java b/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/XMLReaderAdapterTest.java
index 20488c5..0fe6f52 100644
--- a/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/XMLReaderAdapterTest.java
+++ b/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/XMLReaderAdapterTest.java
@@ -42,6 +42,7 @@
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
+import tests.util.TestEnvironment;
 
 @SuppressWarnings("deprecation")
 @TestTargetClass(XMLReaderAdapter.class)
@@ -68,11 +69,17 @@
 
     @Override
     public void setUp() {
+        TestEnvironment.reset();
         adapter.setDocumentHandler(handler);
         adapter.setDTDHandler(handler);
         adapter.setErrorHandler(handler);
     }
-    
+
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         method = "XMLReaderAdapter",
diff --git a/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/XMLReaderFactoryTest.java b/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/XMLReaderFactoryTest.java
index bfb1bd1..2edb918 100644
--- a/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/XMLReaderFactoryTest.java
+++ b/libcore/xml/src/test/java/tests/api/org/xml/sax/helpers/XMLReaderFactoryTest.java
@@ -24,10 +24,21 @@
 
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.XMLReaderFactory;
+import tests.util.TestEnvironment;
 
 @TestTargetClass(XMLReaderFactory.class)
 public class XMLReaderFactoryTest extends TestCase {
 
+    @Override protected void setUp() throws Exception {
+        TestEnvironment.reset();
+        super.setUp();
+    }
+
+    @Override protected void tearDown() throws Exception {
+        TestEnvironment.reset();
+        super.tearDown();
+    }
+
     @TestTargetNew(
         level = TestLevel.SUFFICIENT,
         method = "createXMLReader",