Integrate unsubmitted cupcake change 147342:
	CTS: clean up code in android.net package
diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
index abcfb22..a8a149f 100644
--- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -16,11 +16,11 @@
 
 package android.net.cts;
 
-import dalvik.annotation.BrokenTest;
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
 import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.net.ConnectivityManager;
@@ -45,7 +45,6 @@
 
     @TestTargetNew(
         level = TestLevel.COMPLETE,
-        notes = "Test getNetworkInfo(int networkType).",
         method = "getNetworkInfo",
         args = {int.class}
     )
@@ -77,13 +76,11 @@
     @TestTargets({
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test isNetworkTypeValid(int networkType).",
             method = "isNetworkTypeValid",
             args = {int.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test isNetworkTypeValid(int networkType).",
             method = "getAllNetworkInfo",
             args = {}
         )
@@ -105,33 +102,58 @@
             args = {}
         ),
         @TestTargetNew(
-            level = TestLevel.COMPLETE,
+            level = TestLevel.SUFFICIENT,
             method = "setNetworkPreference",
             args = {int.class}
         )
     })
-    @BrokenTest("Cannot write secure settings table")
     public void testAccessNetworkPreference() {
+        int initialSetting = mCm.getNetworkPreference();
 
-        final int expected = 1;
-        int per = mCm.getNetworkPreference();
-        mCm.setNetworkPreference(expected);
-        assertEquals(expected, mCm.getNetworkPreference());
+        // Changing the network preference requires android.permission.WRITE_SECURE_SETTINGS,
+        // which is only available to signed or system applications.
 
-        mCm.setNetworkPreference(0);
-        assertEquals(0, mCm.getNetworkPreference());
+        // Setting the same preference that is already set is a no-op and does not throw
+        // a SecurityException.
+        mCm.setNetworkPreference(initialSetting);
+        assertEquals(initialSetting, mCm.getNetworkPreference());
 
+        // find a valid setting that is different from the initial setting
+        int validSetting = -1;
+        NetworkInfo[] ni = mCm.getAllNetworkInfo();
+        for (NetworkInfo n : ni) {
+            int type = n.getType();
+            if (type != initialSetting) {
+                validSetting = type;
+                break;
+            }
+        }
+        if (validSetting >= 0) {
+            try {
+                mCm.setNetworkPreference(validSetting);
+                fail("Trying to change the network preference should throw SecurityException");
+            } catch (SecurityException expected) {
+                // expected
+            }
+        }
+
+        // find an invalid setting
+        int invalidSetting = -1;
+        for (int i = 0; i < 10; i++) {
+            if (!ConnectivityManager.isNetworkTypeValid(i)) {
+                invalidSetting = i;
+                break;
+            }
+        }
+        if (invalidSetting >= 0) {
+            // illegal setting should be ignored
+            mCm.setNetworkPreference(invalidSetting);
+            assertEquals(initialSetting, mCm.getNetworkPreference());
+        }
+
+        // illegal setting should be ignored
         mCm.setNetworkPreference(-1);
-        assertEquals(0, mCm.getNetworkPreference());
-
-        mCm.setNetworkPreference(2);
-        assertEquals(0, mCm.getNetworkPreference());
-
-        mCm.setNetworkPreference(1);
-
-        assertEquals(1, mCm.getNetworkPreference());
-
-        mCm.setNetworkPreference(per);
+        assertEquals(initialSetting, mCm.getNetworkPreference());
     }
 
     @TestTargetNew(
@@ -177,7 +199,6 @@
 
     @TestTargetNew(
         level = TestLevel.COMPLETE,
-        notes = "Test requestRouteToHost(int networkType, int hostAddress).",
         method = "requestRouteToHost",
         args = {int.class, int.class}
     )
@@ -193,18 +214,24 @@
 
     @TestTargetNew(
         level = TestLevel.COMPLETE,
-        notes = "Test getActiveNetworkInfo().",
         method = "getActiveNetworkInfo",
         args = {}
     )
+    @ToBeFixed(bug="1695243", explanation="No Javadoc")
     public void testGetActiveNetworkInfo() {
-
         NetworkInfo ni = mCm.getActiveNetworkInfo();
+
         if (ni != null) {
             assertTrue(ni.getType() >= 0);
-        } else {
-            fail("There is no active network connected, should be at least one kind of network");
         }
     }
 
+    @TestTargetNew(
+        level = TestLevel.SUFFICIENT,
+        method = "getBackgroundDataSetting",
+        args = {}
+    )
+    public void testTest() {
+        mCm.getBackgroundDataSetting();
+    }
 }
diff --git a/tests/cts/net/src/android/net/cts/CredentialsTest.java b/tests/cts/net/src/android/net/cts/CredentialsTest.java
index fe65805..6cf8c23 100644
--- a/tests/cts/net/src/android/net/cts/CredentialsTest.java
+++ b/tests/cts/net/src/android/net/cts/CredentialsTest.java
@@ -29,25 +29,21 @@
     @TestTargets({
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test constructor of Credentials, and test getGid, getPid, getUid.",
             method = "Credentials",
             args = {int.class, int.class, int.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test constructor of Credentials, and test getGid, getPid, getUid.",
             method = "getGid",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test constructor of Credentials, and test getGid, getPid, getUid.",
             method = "getPid",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test constructor of Credentials, and test getGid, getPid, getUid.",
             method = "getUid",
             args = {}
         )
diff --git a/tests/cts/net/src/android/net/cts/DhcpInfoTest.java b/tests/cts/net/src/android/net/cts/DhcpInfoTest.java
index 1a1ad47..97bd27a 100644
--- a/tests/cts/net/src/android/net/cts/DhcpInfoTest.java
+++ b/tests/cts/net/src/android/net/cts/DhcpInfoTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * 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.
@@ -18,10 +18,9 @@
 
 import android.net.DhcpInfo;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
 import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
 
 @TestTargetClass(DhcpInfo.class)
 public class DhcpInfoTest extends AndroidTestCase {
diff --git a/tests/cts/net/src/android/net/cts/LocalServerSocketTest.java b/tests/cts/net/src/android/net/cts/LocalServerSocketTest.java
index 07f29c6..21c7d5e 100644
--- a/tests/cts/net/src/android/net/cts/LocalServerSocketTest.java
+++ b/tests/cts/net/src/android/net/cts/LocalServerSocketTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * 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.
@@ -15,58 +15,50 @@
  */
 package android.net.cts;
 
-import java.io.FileDescriptor;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.net.Socket;
 import android.net.LocalServerSocket;
 import android.net.LocalSocket;
 import android.net.LocalSocketAddress;
-import android.os.ParcelFileDescriptor;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
 import dalvik.annotation.ToBeFixed;
 
 @TestTargetClass(LocalServerSocket.class)
 public class LocalServerSocketTest extends AndroidTestCase {
+
     @TestTargets({
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "test LocalServerSocket",
             method = "accept",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "test LocalServerSocket",
             method = "close",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "test LocalServerSocket",
             method = "getFileDescriptor",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "test LocalServerSocket",
             method = "getLocalSocketAddress",
             args = {}
         ),
         @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test LocalServerSocket",
+            level = TestLevel.NOT_FEASIBLE,
             method = "LocalServerSocket",
             args = {java.io.FileDescriptor.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "test LocalServerSocket",
             method = "LocalServerSocket",
             args = {java.lang.String.class}
         )
@@ -77,15 +69,6 @@
         LocalServerSocket localServerSocket = new LocalServerSocket(LocalSocketTest.mSockAddr);
         assertNotNull(localServerSocket.getLocalSocketAddress());
         commonFunctions(localServerSocket);
-
-        Socket socket = new Socket("www.google.com", 80);
-        ParcelFileDescriptor parcelFD = ParcelFileDescriptor.fromSocket(socket);
-        FileDescriptor fd = parcelFD.getFileDescriptor();
-
-        // enable the following after bug 1520987 fixed
-//        localServerSocket = new LocalServerSocket(fd);
-//        assertNull(localServerSocket.getLocalSocketAddress());
-//        commonFunctions(localServerSocket);
     }
 
     public void commonFunctions(LocalServerSocket localServerSocket) throws IOException {
diff --git a/tests/cts/net/src/android/net/cts/LocalSocketAddressTest.java b/tests/cts/net/src/android/net/cts/LocalSocketAddressTest.java
index 75232c4..e3141d5 100644
--- a/tests/cts/net/src/android/net/cts/LocalSocketAddressTest.java
+++ b/tests/cts/net/src/android/net/cts/LocalSocketAddressTest.java
@@ -27,11 +27,6 @@
 @TestTargetClass(LocalSocketAddress.class)
 public class LocalSocketAddressTest extends AndroidTestCase {
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
     @TestTargets({
         @TestTargetNew(
             level = TestLevel.COMPLETE,
@@ -65,17 +60,17 @@
         assertEquals(Namespace.ABSTRACT, localSocketAddress.getNamespace());
 
         // specify the namespace
-        LocalSocketAddress localSocketAddress2 = 
+        LocalSocketAddress localSocketAddress2 =
                 new LocalSocketAddress("name2", Namespace.ABSTRACT);
         assertEquals("name2", localSocketAddress2.getName());
         assertEquals(Namespace.ABSTRACT, localSocketAddress2.getNamespace());
 
-        LocalSocketAddress localSocketAddress3 = 
+        LocalSocketAddress localSocketAddress3 =
                 new LocalSocketAddress("name3", Namespace.FILESYSTEM);
         assertEquals("name3", localSocketAddress3.getName());
         assertEquals(Namespace.FILESYSTEM, localSocketAddress3.getNamespace());
 
-        LocalSocketAddress localSocketAddress4 = 
+        LocalSocketAddress localSocketAddress4 =
                 new LocalSocketAddress("name4", Namespace.RESERVED);
         assertEquals("name4", localSocketAddress4.getName());
         assertEquals(Namespace.RESERVED, localSocketAddress4.getNamespace());
diff --git a/tests/cts/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java b/tests/cts/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java
index 5d29c81..fc9de5b 100644
--- a/tests/cts/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java
+++ b/tests/cts/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * 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.
@@ -18,19 +18,13 @@
 
 import android.net.LocalSocketAddress.Namespace;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
 import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
 
 @TestTargetClass(Namespace.class)
 public class LocalSocketAddress_NamespaceTest extends AndroidTestCase {
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         notes = "Test valueOf(String name).",
diff --git a/tests/cts/net/src/android/net/cts/NetworkInfoTest.java b/tests/cts/net/src/android/net/cts/NetworkInfoTest.java
index 2c3d73c..d2de4e4 100644
--- a/tests/cts/net/src/android/net/cts/NetworkInfoTest.java
+++ b/tests/cts/net/src/android/net/cts/NetworkInfoTest.java
@@ -53,16 +53,31 @@
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
+            method = "isRoaming",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
             method = "getType",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
+            method = "getSubtype",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
             method = "getTypeName",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
+            method = "getSubtypeName",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
             method = "setIsAvailable",
             args = {boolean.class}
         ),
@@ -116,25 +131,24 @@
         assertEquals(TYPE_MOBILE, ni[TYPE_MOBILE].getType());
         assertEquals(TYPE_WIFI, ni[TYPE_WIFI].getType());
 
+        // don't know the return value
+        ni[TYPE_MOBILE].getSubtype();
+        ni[TYPE_WIFI].getSubtype();
+
         assertEquals(MOBILE_TYPE_NAME, ni[TYPE_MOBILE].getTypeName());
         assertEquals(WIFI_TYPE_NAME, ni[TYPE_WIFI].getTypeName());
 
+        // don't know the return value
+        ni[TYPE_MOBILE].getSubtypeName();
+        ni[TYPE_WIFI].getSubtypeName();
+
         if(ni[TYPE_MOBILE].isConnectedOrConnecting()) {
             assertTrue(ni[TYPE_MOBILE].isAvailable());
             assertTrue(ni[TYPE_MOBILE].isConnected());
             assertEquals(State.CONNECTED, ni[TYPE_MOBILE].getState());
             assertEquals(DetailedState.CONNECTED, ni[TYPE_MOBILE].getDetailedState());
-            assertNotNull(ni[TYPE_MOBILE].getReason());
-            assertNotNull(ni[TYPE_MOBILE].getExtraInfo());
-        } else {
-            assertFalse(ni[TYPE_MOBILE].isAvailable());
-            assertFalse(ni[TYPE_MOBILE].isConnected());
-
-            // mobile state is undefined
-
-            assertEquals(DetailedState.IDLE, ni[TYPE_MOBILE].getDetailedState());
-            assertNull(ni[TYPE_MOBILE].getReason());
-            assertNull(ni[TYPE_MOBILE].getExtraInfo());
+            ni[TYPE_MOBILE].getReason();
+            ni[TYPE_MOBILE].getExtraInfo();
         }
 
         if(ni[TYPE_WIFI].isConnectedOrConnecting()) {
@@ -142,19 +156,13 @@
             assertTrue(ni[TYPE_WIFI].isConnected());
             assertEquals(State.CONNECTED, ni[TYPE_WIFI].getState());
             assertEquals(DetailedState.CONNECTED, ni[TYPE_WIFI].getDetailedState());
-            assertNotNull(ni[TYPE_WIFI].getReason());
-            assertNotNull(ni[TYPE_WIFI].getExtraInfo());
-        } else {
-            assertFalse(ni[TYPE_WIFI].isAvailable());
-            assertFalse(ni[TYPE_WIFI].isConnected());
-
-            // wifi state is undefined
-
-            assertEquals(DetailedState.IDLE, ni[TYPE_WIFI].getDetailedState());
-            assertNull(ni[TYPE_WIFI].getReason());
-            assertNull(ni[TYPE_WIFI].getExtraInfo());
+            ni[TYPE_WIFI].getReason();
+            ni[TYPE_WIFI].getExtraInfo();
         }
 
+        assertFalse(ni[TYPE_MOBILE].isRoaming());
+        assertFalse(ni[TYPE_WIFI].isRoaming());
+
         assertNotNull(ni[TYPE_MOBILE].toString());
         assertNotNull(ni[TYPE_WIFI].toString());
     }
diff --git a/tests/cts/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java b/tests/cts/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
index 0e05b28..196e102 100644
--- a/tests/cts/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
+++ b/tests/cts/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * 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.
@@ -18,19 +18,13 @@
 
 import android.net.NetworkInfo.DetailedState;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
 
 @TestTargetClass(DetailedState.class)
 public class NetworkInfo_DetailedStateTest extends AndroidTestCase {
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         notes = "Test valueOf(String name).",
@@ -38,23 +32,16 @@
         args = {java.lang.String.class}
     )
     public void testValueOf() {
-        assertEquals(DetailedState.AUTHENTICATING, DetailedState
-                .valueOf("AUTHENTICATING"));
-        assertEquals(DetailedState.CONNECTED, DetailedState
-                .valueOf("CONNECTED"));
-        assertEquals(DetailedState.CONNECTING, DetailedState
-                .valueOf("CONNECTING"));
-        assertEquals(DetailedState.DISCONNECTED, DetailedState
-                .valueOf("DISCONNECTED"));
-        assertEquals(DetailedState.DISCONNECTING, DetailedState
-                .valueOf("DISCONNECTING"));
+        assertEquals(DetailedState.AUTHENTICATING, DetailedState.valueOf("AUTHENTICATING"));
+        assertEquals(DetailedState.CONNECTED, DetailedState.valueOf("CONNECTED"));
+        assertEquals(DetailedState.CONNECTING, DetailedState.valueOf("CONNECTING"));
+        assertEquals(DetailedState.DISCONNECTED, DetailedState.valueOf("DISCONNECTED"));
+        assertEquals(DetailedState.DISCONNECTING, DetailedState.valueOf("DISCONNECTING"));
         assertEquals(DetailedState.FAILED, DetailedState.valueOf("FAILED"));
         assertEquals(DetailedState.IDLE, DetailedState.valueOf("IDLE"));
-        assertEquals(DetailedState.OBTAINING_IPADDR, DetailedState
-                .valueOf("OBTAINING_IPADDR"));
+        assertEquals(DetailedState.OBTAINING_IPADDR, DetailedState.valueOf("OBTAINING_IPADDR"));
         assertEquals(DetailedState.SCANNING, DetailedState.valueOf("SCANNING"));
-        assertEquals(DetailedState.SUSPENDED, DetailedState
-                .valueOf("SUSPENDED"));
+        assertEquals(DetailedState.SUSPENDED, DetailedState.valueOf("SUSPENDED"));
     }
 
     @TestTargetNew(
diff --git a/tests/cts/net/src/android/net/cts/NetworkInfo_StateTest.java b/tests/cts/net/src/android/net/cts/NetworkInfo_StateTest.java
index 249df4b..1a51acd 100644
--- a/tests/cts/net/src/android/net/cts/NetworkInfo_StateTest.java
+++ b/tests/cts/net/src/android/net/cts/NetworkInfo_StateTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * 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.
@@ -16,21 +16,15 @@
 
 package android.net.cts;
 
+import android.net.NetworkInfo.State;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
 import dalvik.annotation.TestLevel;
 import dalvik.annotation.TestTargetClass;
-import android.net.NetworkInfo.State;
+import dalvik.annotation.TestTargetNew;
 
 @TestTargetClass(State.class)
 public class NetworkInfo_StateTest extends AndroidTestCase {
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         notes = "Test valueOf(String name).",
@@ -62,5 +56,4 @@
         assertEquals(State.DISCONNECTED, expected[4]);
         assertEquals(State.UNKNOWN, expected[5]);
     }
-
 }
diff --git a/tests/cts/net/src/android/net/cts/UrlQuerySanitizerTest.java b/tests/cts/net/src/android/net/cts/UrlQuerySanitizerTest.java
index e9ae95c..0dd5db1 100644
--- a/tests/cts/net/src/android/net/cts/UrlQuerySanitizerTest.java
+++ b/tests/cts/net/src/android/net/cts/UrlQuerySanitizerTest.java
@@ -49,189 +49,168 @@
     @TestTargets({
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link UrlQuerySanitizer}",
             method = "UrlQuerySanitizer",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link UrlQuerySanitizer}",
             method = "UrlQuerySanitizer",
             args = {String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: parseUrl",
             method = "parseUrl",
             args = {String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: parseQuery",
             method = "parseQuery",
             args = {String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: parseEntry",
             method = "parseEntry",
             args = {String.class, String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getValue",
             method = "getValue",
             args = {String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: addSanitizedEntry",
             method = "addSanitizedEntry",
             args = {String.class, String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: hasParameter",
             method = "hasParameter",
             args = {String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getParameterSet",
             method = "getParameterSet",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getParameterList",
             method = "getParameterList",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: setUnregisteredParameterValueSanitizer",
             method = "setUnregisteredParameterValueSanitizer",
             args = {ValueSanitizer.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getUnregisteredParameterValueSanitizer",
             method = "getUnregisteredParameterValueSanitizer",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getAllButNulAndAngleBracketsLegal",
             method = "getAllButNulAndAngleBracketsLegal",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getAllButNulLegal",
             method = "getAllButNulLegal",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getAllButWhitespaceLegal",
             method = "getAllButWhitespaceLegal",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getAllIllegal",
             method = "getAllIllegal",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getAmpAndSpaceLegal",
             method = "getAmpAndSpaceLegal",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getAmpLegal",
             method = "getAmpLegal",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getSpaceLegal",
             method = "getSpaceLegal",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getUrlAndSpaceLegal",
             method = "getUrlAndSpaceLegal",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getUrlLegal",
             method = "getUrlLegal",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test mehtod: unescape",
             method = "unescape",
             args = {String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test mehtod: isHexDigit",
             method = "isHexDigit",
             args = {char.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test mehtod: decodeHexDigit",
             method = "decodeHexDigit",
             args = {char.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: setAllowUnregisteredParamaters",
             method = "setAllowUnregisteredParamaters",
             args = {boolean.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getAllowUnregisteredParamaters",
             method = "getAllowUnregisteredParamaters",
             args = {}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: registerParameter",
             method = "registerParameter",
             args = {String.class, ValueSanitizer.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: registerParameters",
             method = "registerParameters",
             args = {String[].class, ValueSanitizer.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getEffectiveValueSanitizer",
             method = "getEffectiveValueSanitizer",
             args = {String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: getValueSanitizer",
             method = "getValueSanitizer",
             args = {String.class}
         ),
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            notes = "Test method: clear",
             method = "clear",
             args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setPreferFirstRepeatedParameter",
+            args = {boolean.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "getPreferFirstRepeatedParameter",
+            args = {}
         )
     })
     public void testUrlQuerySanitizer() {
@@ -377,6 +356,30 @@
         uqs.clear();
         assertEquals(0, urlSet.size());
         assertEquals(0, urlList.size());
+
+        uqs.setPreferFirstRepeatedParameter(true);
+        assertTrue(uqs.getPreferFirstRepeatedParameter());
+        uqs.setPreferFirstRepeatedParameter(false);
+        assertFalse(uqs.getPreferFirstRepeatedParameter());
+
+        UrlQuerySanitizer uq = new UrlQuerySanitizer();
+        uq.setPreferFirstRepeatedParameter(true);
+        final String PARA_ANSWER = "answer";
+        uq.registerParameter(PARA_ANSWER, new MockValueSanitizer());
+        uq.parseUrl("http://www.google.com/question?answer=13&answer=42");
+        assertEquals("13", uq.getValue(PARA_ANSWER));
+
+        uq.setPreferFirstRepeatedParameter(false);
+        uq.parseQuery("http://www.google.com/question?answer=13&answer=42");
+        assertEquals("42", uq.getValue(PARA_ANSWER));
+
+    }
+
+    private static class MockValueSanitizer implements ValueSanitizer{
+
+        public String sanitize(String value) {
+            return value;
+        }
     }
 
     class MockUrlQuerySanitizer extends UrlQuerySanitizer {