UriTest.java revision 58a345936d7e2b66bdeefb492e4f777754792d7e
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net;
18
19import android.net.Uri;
20import android.content.ContentUris;
21import android.os.Parcel;
22import android.test.suitebuilder.annotation.SmallTest;
23import junit.framework.TestCase;
24
25import java.io.File;
26import java.util.Arrays;
27import java.util.Iterator;
28import java.util.List;
29import java.util.Set;
30
31public class UriTest extends TestCase {
32
33    @SmallTest
34    public void testToStringWithPathOnly() {
35        Uri.Builder builder = new Uri.Builder();
36
37        // Not a valid path, but this came from a user's test case.
38        builder.path("//foo");
39        Uri uri = builder.build();
40        assertEquals("//foo", uri.toString());
41    }
42
43    @SmallTest
44    public void testParcelling() {
45        parcelAndUnparcel(Uri.parse("foo:bob%20lee"));
46        parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment"));
47        parcelAndUnparcel(new Uri.Builder()
48            .scheme("http")
49            .authority("crazybob.org")
50            .path("/rss/")
51            .encodedQuery("a=b")
52            .fragment("foo")
53            .build());
54    }
55
56    private void parcelAndUnparcel(Uri u) {
57        Parcel p = Parcel.obtain();
58        try {
59            Uri.writeToParcel(p, u);
60            p.setDataPosition(0);
61            assertEquals(u, Uri.CREATOR.createFromParcel(p));
62
63            p.setDataPosition(0);
64            u = u.buildUpon().build();
65            Uri.writeToParcel(p, u);
66            p.setDataPosition(0);
67            assertEquals(u, Uri.CREATOR.createFromParcel(p));
68        }
69        finally {
70            p.recycle();
71        }
72    }
73
74    @SmallTest
75    public void testBuildUponOpaqueStringUri() {
76        Uri u = Uri.parse("bob:lee").buildUpon().scheme("robert").build();
77        assertEquals("robert", u.getScheme());
78        assertEquals("lee", u.getEncodedSchemeSpecificPart());
79        assertEquals("lee", u.getSchemeSpecificPart());
80        assertNull(u.getQuery());
81        assertNull(u.getPath());
82        assertNull(u.getAuthority());
83        assertNull(u.getHost());
84    }
85
86    @SmallTest
87    public void testStringUri() {
88        assertEquals("bob lee",
89                Uri.parse("foo:bob%20lee").getSchemeSpecificPart());
90        assertEquals("bob%20lee",
91                Uri.parse("foo:bob%20lee").getEncodedSchemeSpecificPart());
92        assertEquals("/bob%20lee",
93                Uri.parse("foo:/bob%20lee").getEncodedPath());
94        assertNull(Uri.parse("foo:bob%20lee").getPath());
95        assertEquals("bob%20lee",
96                Uri.parse("foo:?bob%20lee").getEncodedQuery());
97        assertNull(Uri.parse("foo:bar#?bob%20lee").getQuery());
98        assertEquals("bob%20lee",
99                Uri.parse("foo:#bob%20lee").getEncodedFragment());
100    }
101
102    @SmallTest
103    public void testStringUriIsHierarchical() {
104        assertTrue(Uri.parse("bob").isHierarchical());
105        assertFalse(Uri.parse("bob:").isHierarchical());
106    }
107
108    @SmallTest
109    public void testNullUriString() {
110        try {
111            Uri.parse(null);
112            fail();
113        } catch (NullPointerException e) {}
114    }
115
116    @SmallTest
117    public void testNullFile() {
118        try {
119            Uri.fromFile(null);
120            fail();
121        } catch (NullPointerException e) {}
122    }
123
124    @SmallTest
125    public void testCompareTo() {
126        Uri a = Uri.parse("foo:a");
127        Uri b = Uri.parse("foo:b");
128        Uri b2 = Uri.parse("foo:b");
129
130        assertTrue(a.compareTo(b) < 0);
131        assertTrue(b.compareTo(a) > 0);
132        assertEquals(0, b.compareTo(b2));
133    }
134
135    @SmallTest
136    public void testEqualsAndHashCode() {
137
138        Uri a = Uri.parse("http://crazybob.org/test/?foo=bar#tee");
139
140        Uri b = new Uri.Builder()
141                .scheme("http")
142                .authority("crazybob.org")
143                .path("/test/")
144                .encodedQuery("foo=bar")
145                .fragment("tee")
146                .build();
147
148        // Try alternate builder methods.
149        Uri c = new Uri.Builder()
150                .scheme("http")
151                .encodedAuthority("crazybob.org")
152                .encodedPath("/test/")
153                .encodedQuery("foo=bar")
154                .encodedFragment("tee")
155                .build();
156
157        assertFalse(Uri.EMPTY.equals(null));
158
159        assertEquals(a, b);
160        assertEquals(b, c);
161        assertEquals(c, a);
162
163        assertEquals(a.hashCode(), b.hashCode());
164        assertEquals(b.hashCode(), c.hashCode());
165    }
166
167    @SmallTest
168    public void testAuthorityParsing() {
169        Uri uri = Uri.parse("http://localhost:42");
170        assertEquals("localhost", uri.getHost());
171        assertEquals(42, uri.getPort());
172
173        uri = Uri.parse("http://bob@localhost:42");
174        assertEquals("bob", uri.getUserInfo());
175        assertEquals("localhost", uri.getHost());
176        assertEquals(42, uri.getPort());
177
178        uri = Uri.parse("http://bob%20lee@localhost:42");
179        assertEquals("bob lee", uri.getUserInfo());
180        assertEquals("bob%20lee", uri.getEncodedUserInfo());
181
182        uri = Uri.parse("http://bob%40lee%3ajr@local%68ost:4%32");
183        assertEquals("bob@lee:jr", uri.getUserInfo());
184        assertEquals("localhost", uri.getHost());
185        assertEquals(42, uri.getPort());
186
187        uri = Uri.parse("http://localhost");
188        assertEquals("localhost", uri.getHost());
189        assertEquals(-1, uri.getPort());
190    }
191
192    @SmallTest
193    public void testBuildUponOpaqueUri() {
194        Uri a = Uri.fromParts("foo", "bar", "tee");
195        Uri b = a.buildUpon().fragment("new").build();
196        assertEquals("new", b.getFragment());
197        assertEquals("bar", b.getSchemeSpecificPart());
198        assertEquals("foo", b.getScheme());
199    }
200
201    @SmallTest
202    public void testBuildUponEncodedOpaqueUri() {
203        Uri a = new Uri.Builder()
204                .scheme("foo")
205                .encodedOpaquePart("bar")
206                .fragment("tee")
207                .build();
208        Uri b = a.buildUpon().fragment("new").build();
209        assertEquals("new", b.getFragment());
210        assertEquals("bar", b.getSchemeSpecificPart());
211        assertEquals("foo", b.getScheme());
212    }
213
214    @SmallTest
215    public void testPathSegmentDecoding() {
216        Uri uri = Uri.parse("foo://bar/a%20a/b%20b");
217        assertEquals("a a", uri.getPathSegments().get(0));
218        assertEquals("b b", uri.getPathSegments().get(1));
219    }
220
221    @SmallTest
222    public void testSms() {
223        Uri base = Uri.parse("content://sms");
224        Uri appended = base.buildUpon()
225                .appendEncodedPath("conversations/addr=555-1212")
226                .build();
227        assertEquals("content://sms/conversations/addr=555-1212",
228                appended.toString());
229        assertEquals(2, appended.getPathSegments().size());
230        assertEquals("conversations", appended.getPathSegments().get(0));
231        assertEquals("addr=555-1212", appended.getPathSegments().get(1));
232    }
233
234    @SmallTest
235    public void testEncodeWithAllowedChars() {
236        String encoded = Uri.encode("Bob:/", "/");
237        assertEquals(-1, encoded.indexOf(':'));
238        assertTrue(encoded.indexOf('/') > -1);
239    }
240
241    @SmallTest
242    public void testEncodeDecode() {
243        code(null);
244        code("");
245        code("Bob");
246        code(":Bob");
247        code("::Bob");
248        code("Bob::Lee");
249        code("Bob:Lee");
250        code("Bob::");
251        code("Bob:");
252        code("::Bob::");
253    }
254
255    private void code(String s) {
256        assertEquals(s, Uri.decode(Uri.encode(s, null)));
257    }
258
259    @SmallTest
260    public void testFile() {
261        File f = new File("/tmp/bob");
262
263        Uri uri = Uri.fromFile(f);
264
265        assertEquals("file:///tmp/bob", uri.toString());
266    }
267
268    @SmallTest
269    public void testQueryParameters() {
270        Uri uri = Uri.parse("content://user");
271
272        assertEquals(null, uri.getQueryParameter("a"));
273
274        uri = uri.buildUpon().appendQueryParameter("a", "b").build();
275
276        assertEquals("b", uri.getQueryParameter("a"));
277
278        uri = uri.buildUpon().appendQueryParameter("a", "b2").build();
279
280        assertEquals(Arrays.asList("b", "b2"), uri.getQueryParameters("a"));
281
282        uri = uri.buildUpon().appendQueryParameter("c", "d").build();
283
284        assertEquals(Arrays.asList("b", "b2"), uri.getQueryParameters("a"));
285        assertEquals("d", uri.getQueryParameter("c"));
286    }
287
288    @SmallTest
289    public void testSchemeOnly() {
290        Uri uri = Uri.parse("empty:");
291        assertEquals("empty", uri.getScheme());
292        assertTrue(uri.isAbsolute());
293        assertNull(uri.getPath());
294    }
295
296    @SmallTest
297    public void testEmptyPath() {
298        Uri uri = Uri.parse("content://user");
299        assertEquals(0, uri.getPathSegments().size());
300    }
301
302    @SmallTest
303    public void testPathOperations() {
304        Uri uri = Uri.parse("content://user/a/b");
305
306        assertEquals(2, uri.getPathSegments().size());
307        assertEquals("b", uri.getLastPathSegment());
308
309        Uri first = uri;
310        uri = uri.buildUpon().appendPath("c").build();
311
312        assertEquals(3, uri.getPathSegments().size());
313        assertEquals("c", uri.getLastPathSegment());
314        assertEquals("content://user/a/b/c", uri.toString());
315
316        uri = ContentUris.withAppendedId(uri, 100);
317
318        assertEquals(4, uri.getPathSegments().size());
319        assertEquals("100", uri.getLastPathSegment());
320        assertEquals(100, ContentUris.parseId(uri));
321        assertEquals("content://user/a/b/c/100", uri.toString());
322
323        // Make sure the original URI is still intact.
324        assertEquals(2, first.getPathSegments().size());
325        assertEquals("b", first.getLastPathSegment());
326
327        try {
328            first.getPathSegments().get(2);
329            fail();
330        } catch (IndexOutOfBoundsException e) {}
331
332        assertEquals(null, Uri.EMPTY.getLastPathSegment());
333
334        Uri withC = Uri.parse("foo:/a/b/").buildUpon().appendPath("c").build();
335        assertEquals("/a/b/c", withC.getPath());
336    }
337
338    @SmallTest
339    public void testOpaqueUri() {
340        Uri uri = Uri.parse("mailto:nobody");
341        testOpaqueUri(uri);
342
343        uri = uri.buildUpon().build();
344        testOpaqueUri(uri);
345
346        uri = Uri.fromParts("mailto", "nobody", null);
347        testOpaqueUri(uri);
348
349        uri = uri.buildUpon().build();
350        testOpaqueUri(uri);
351
352        uri = new Uri.Builder()
353                .scheme("mailto")
354                .opaquePart("nobody")
355                .build();
356        testOpaqueUri(uri);
357
358        uri = uri.buildUpon().build();
359        testOpaqueUri(uri);
360    }
361
362    private void testOpaqueUri(Uri uri) {
363        assertEquals("mailto", uri.getScheme());
364        assertEquals("nobody", uri.getSchemeSpecificPart());
365        assertEquals("nobody", uri.getEncodedSchemeSpecificPart());
366
367        assertNull(uri.getFragment());
368        assertTrue(uri.isAbsolute());
369        assertTrue(uri.isOpaque());
370        assertFalse(uri.isRelative());
371        assertFalse(uri.isHierarchical());
372
373        assertNull(uri.getAuthority());
374        assertNull(uri.getEncodedAuthority());
375        assertNull(uri.getPath());
376        assertNull(uri.getEncodedPath());
377        assertNull(uri.getUserInfo());
378        assertNull(uri.getEncodedUserInfo());
379        assertNull(uri.getQuery());
380        assertNull(uri.getEncodedQuery());
381        assertNull(uri.getHost());
382        assertEquals(-1, uri.getPort());
383
384        assertTrue(uri.getPathSegments().isEmpty());
385        assertNull(uri.getLastPathSegment());
386
387        assertEquals("mailto:nobody", uri.toString());
388
389        Uri withFragment = uri.buildUpon().fragment("top").build();
390        assertEquals("mailto:nobody#top", withFragment.toString());
391    }
392
393    @SmallTest
394    public void testHierarchicalUris() {
395        testHierarchical("http", "google.com", "/p1/p2", "query", "fragment");
396        testHierarchical("file", null, "/p1/p2", null, null);
397        testHierarchical("content", "contact", "/p1/p2", null, null);
398        testHierarchical("http", "google.com", "/p1/p2", null, "fragment");
399        testHierarchical("http", "google.com", "", null, "fragment");
400        testHierarchical("http", "google.com", "", "query", "fragment");
401        testHierarchical("http", "google.com", "", "query", null);
402        testHierarchical("http", null, "/", "query", null);
403    }
404
405    private static void testHierarchical(String scheme, String authority,
406            String path, String query, String fragment) {
407        StringBuilder sb = new StringBuilder();
408
409        if (authority != null) {
410            sb.append("//").append(authority);
411        }
412        if (path != null) {
413            sb.append(path);
414        }
415        if (query != null) {
416            sb.append('?').append(query);
417        }
418
419        String ssp = sb.toString();
420
421        if (scheme != null) {
422            sb.insert(0, scheme + ":");
423        }
424        if (fragment != null) {
425            sb.append('#').append(fragment);
426        }
427
428        String uriString = sb.toString();
429
430        Uri uri = Uri.parse(uriString);
431
432        // Run these twice to test caching.
433        compareHierarchical(
434                uriString, ssp, uri, scheme, authority, path, query, fragment);
435        compareHierarchical(
436                uriString, ssp, uri, scheme, authority, path, query, fragment);
437
438        // Test rebuilt version.
439        uri = uri.buildUpon().build();
440
441        // Run these twice to test caching.
442        compareHierarchical(
443                uriString, ssp, uri, scheme, authority, path, query, fragment);
444        compareHierarchical(
445                uriString, ssp, uri, scheme, authority, path, query, fragment);
446
447        // The decoded and encoded versions of the inputs are all the same.
448        // We'll test the actual encoding decoding separately.
449
450        // Test building with encoded versions.
451        Uri built = new Uri.Builder()
452                .scheme(scheme)
453                .encodedAuthority(authority)
454                .encodedPath(path)
455                .encodedQuery(query)
456                .encodedFragment(fragment)
457                .build();
458
459        compareHierarchical(
460                uriString, ssp, built, scheme, authority, path, query, fragment);
461        compareHierarchical(
462                uriString, ssp, built, scheme, authority, path, query, fragment);
463
464        // Test building with decoded versions.
465        built = new Uri.Builder()
466                .scheme(scheme)
467                .authority(authority)
468                .path(path)
469                .query(query)
470                .fragment(fragment)
471                .build();
472
473        compareHierarchical(
474                uriString, ssp, built, scheme, authority, path, query, fragment);
475        compareHierarchical(
476                uriString, ssp, built, scheme, authority, path, query, fragment);
477
478        // Rebuild.
479        built = built.buildUpon().build();
480
481        compareHierarchical(
482                uriString, ssp, built, scheme, authority, path, query, fragment);
483        compareHierarchical(
484                uriString, ssp, built, scheme, authority, path, query, fragment);
485    }
486
487    private static void compareHierarchical(String uriString, String ssp,
488            Uri uri,
489            String scheme, String authority, String path, String query,
490            String fragment) {
491        assertEquals(scheme, uri.getScheme());
492        assertEquals(authority, uri.getAuthority());
493        assertEquals(authority, uri.getEncodedAuthority());
494        assertEquals(path, uri.getPath());
495        assertEquals(path, uri.getEncodedPath());
496        assertEquals(query, uri.getQuery());
497        assertEquals(query, uri.getEncodedQuery());
498        assertEquals(fragment, uri.getFragment());
499        assertEquals(fragment, uri.getEncodedFragment());
500        assertEquals(ssp, uri.getSchemeSpecificPart());
501
502        if (scheme != null) {
503            assertTrue(uri.isAbsolute());
504            assertFalse(uri.isRelative());
505        } else {
506            assertFalse(uri.isAbsolute());
507            assertTrue(uri.isRelative());
508        }
509
510        assertFalse(uri.isOpaque());
511        assertTrue(uri.isHierarchical());
512
513        assertEquals(uriString, uri.toString());
514    }
515
516    public void testEmptyToStringNotNull() {
517        assertNotNull(Uri.EMPTY.toString());
518    }
519
520    @SmallTest
521    public void testParcellingWithoutFragment() {
522        parcelAndUnparcel(Uri.parse("foo:bob%20lee"));
523        parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment"));
524        parcelAndUnparcel(new Uri.Builder()
525            .scheme("http")
526            .authority("crazybob.org")
527            .path("/rss/")
528            .encodedQuery("a=b")
529            .build());
530    }
531
532    public void testGetQueryParameter() {
533        String nestedUrl = "http://crazybob.org/?a=1&b=2";
534        Uri uri = Uri.parse("http://test/").buildUpon()
535                .appendQueryParameter("foo", "bar")
536                .appendQueryParameter("nested", nestedUrl).build();
537        assertEquals(nestedUrl, uri.getQueryParameter("nested"));
538        assertEquals(nestedUrl, uri.getQueryParameters("nested").get(0));
539    }
540
541    public void testGetQueryParameterWorkaround() {
542        // This was a workaround for a bug where getQueryParameter called
543        // getQuery() instead of getEncodedQuery().
544        String nestedUrl = "http://crazybob.org/?a=1&b=2";
545        Uri uri = Uri.parse("http://test/").buildUpon()
546                .appendQueryParameter("foo", "bar")
547                .appendQueryParameter("nested", Uri.encode(nestedUrl)).build();
548        assertEquals(nestedUrl, Uri.decode(uri.getQueryParameter("nested")));
549        assertEquals(nestedUrl,
550                Uri.decode(uri.getQueryParameters("nested").get(0)));
551    }
552
553    public void testGetQueryParameterEdgeCases() {
554        Uri uri;
555
556        // key at beginning of URL
557        uri = Uri.parse("http://test/").buildUpon()
558            .appendQueryParameter("key", "a b")
559            .appendQueryParameter("keya", "c d")
560            .appendQueryParameter("bkey", "e f")
561            .build();
562        assertEquals("a b", uri.getQueryParameter("key"));
563
564        // key in middle of URL
565        uri = Uri.parse("http://test/").buildUpon()
566            .appendQueryParameter("akeyb", "a b")
567            .appendQueryParameter("keya", "c d")
568            .appendQueryParameter("key", "e f")
569            .appendQueryParameter("bkey", "g h")
570            .build();
571        assertEquals("e f", uri.getQueryParameter("key"));
572
573        // key at end of URL
574        uri = Uri.parse("http://test/").buildUpon()
575            .appendQueryParameter("akeyb", "a b")
576            .appendQueryParameter("keya", "c d")
577            .appendQueryParameter("key", "y z")
578            .build();
579        assertEquals("y z", uri.getQueryParameter("key"));
580
581        // key is a substring of parameters, but not present
582        uri = Uri.parse("http://test/").buildUpon()
583            .appendQueryParameter("akeyb", "a b")
584            .appendQueryParameter("keya", "c d")
585            .appendQueryParameter("bkey", "e f")
586            .build();
587        assertNull(uri.getQueryParameter("key"));
588
589        // key is a prefix or suffix of the query
590        uri = Uri.parse("http://test/?qq=foo");
591        assertNull(uri.getQueryParameter("q"));
592        assertNull(uri.getQueryParameter("oo"));
593
594        // escaped keys
595        uri = Uri.parse("http://www.google.com/?a%20b=foo&c%20d=");
596        assertEquals("foo", uri.getQueryParameter("a b"));
597        assertEquals("", uri.getQueryParameter("c d"));
598        assertNull(uri.getQueryParameter("e f"));
599        assertNull(uri.getQueryParameter("b"));
600        assertNull(uri.getQueryParameter("c"));
601        assertNull(uri.getQueryParameter(" d"));
602
603        // empty values
604        uri = Uri.parse("http://www.google.com/?a=&b=&&c=");
605        assertEquals("", uri.getQueryParameter("a"));
606        assertEquals("", uri.getQueryParameter("b"));
607        assertEquals("", uri.getQueryParameter("c"));
608    }
609
610    public void testGetQueryParameterEmptyKey() {
611        Uri uri = Uri.parse("http://www.google.com/?=b");
612        assertEquals("b", uri.getQueryParameter(""));
613    }
614
615    public void testGetQueryParameterEmptyKey2() {
616      Uri uri = Uri.parse("http://www.google.com/?a=b&&c=d");
617      assertEquals("", uri.getQueryParameter(""));
618    }
619
620    public void testGetQueryParameterEmptyKey3() {
621      Uri uri = Uri.parse("http://www.google.com?");
622      assertEquals("", uri.getQueryParameter(""));
623    }
624
625    public void testGetQueryParameterEmptyKey4() {
626      Uri uri = Uri.parse("http://www.google.com?a=b&");
627      assertEquals("", uri.getQueryParameter(""));
628    }
629
630    public void testGetQueryParametersEmptyKey() {
631        Uri uri = Uri.parse("http://www.google.com/?=b&");
632        List<String> values = uri.getQueryParameters("");
633        assertEquals(2, values.size());
634        assertEquals("b", values.get(0));
635        assertEquals("", values.get(1));
636    }
637
638    public void testGetQueryParametersEmptyKey2() {
639        Uri uri = Uri.parse("http://www.google.com?");
640        List<String> values = uri.getQueryParameters("");
641        assertEquals(1, values.size());
642        assertEquals("", values.get(0));
643    }
644
645    public void testGetQueryParametersEmptyKey3() {
646      Uri uri = Uri.parse("http://www.google.com/?a=b&&c=d");
647      List<String> values = uri.getQueryParameters("");
648      assertEquals(1, values.size());
649      assertEquals("", values.get(0));
650    }
651
652    public void testGetQueryParameterNames() {
653        Uri uri = Uri.parse("http://test?a=1");
654        Set<String> names = uri.getQueryParameterNames();
655        assertEquals(1, names.size());
656        assertEquals("a", names.iterator().next());
657    }
658
659    public void testGetQueryParameterNamesEmptyKey() {
660        Uri uri = Uri.parse("http://www.google.com/?a=x&&c=z");
661        Set<String> names = uri.getQueryParameterNames();
662        Iterator<String> iter = names.iterator();
663        assertEquals(3, names.size());
664        assertEquals("a", iter.next());
665        assertEquals("", iter.next());
666        assertEquals("c", iter.next());
667    }
668
669    public void testGetQueryParameterNamesEmptyKey2() {
670        Uri uri = Uri.parse("http://www.google.com/?a=x&=d&c=z");
671        Set<String> names = uri.getQueryParameterNames();
672        Iterator<String> iter = names.iterator();
673        assertEquals(3, names.size());
674        assertEquals("a", iter.next());
675        assertEquals("", iter.next());
676        assertEquals("c", iter.next());
677    }
678
679    public void testGetQueryParameterNamesEmptyValues() {
680        Uri uri = Uri.parse("http://www.google.com/?a=foo&b=&c=");
681        Set<String> names = uri.getQueryParameterNames();
682        Iterator<String> iter = names.iterator();
683        assertEquals(3, names.size());
684        assertEquals("a", iter.next());
685        assertEquals("b", iter.next());
686        assertEquals("c", iter.next());
687    }
688
689    public void testGetQueryParameterNamesEdgeCases() {
690        Uri uri = Uri.parse("http://foo?a=bar&b=bar&c=&&d=baz&e&f&g=buzz&&&a&b=bar&h");
691        Set<String> names = uri.getQueryParameterNames();
692        Iterator<String> iter = names.iterator();
693        assertEquals(9, names.size());
694        assertEquals("a", iter.next());
695        assertEquals("b", iter.next());
696        assertEquals("c", iter.next());
697        assertEquals("", iter.next());
698        assertEquals("d", iter.next());
699        assertEquals("e", iter.next());
700        assertEquals("f", iter.next());
701        assertEquals("g", iter.next());
702        assertEquals("h", iter.next());
703    }
704
705    public void testGetQueryParameterNamesEscapedKeys() {
706        Uri uri = Uri.parse("http://www.google.com/?a%20b=foo&c%20d=");
707        Set<String> names = uri.getQueryParameterNames();
708        assertEquals(2, names.size());
709        Iterator<String> iter = names.iterator();
710        assertEquals("a b", iter.next());
711        assertEquals("c d", iter.next());
712    }
713
714    public void testGetQueryParameterEscapedKeys() {
715        Uri uri = Uri.parse("http://www.google.com/?a%20b=foo&c%20d=");
716        String value = uri.getQueryParameter("a b");
717        assertEquals("foo", value);
718    }
719
720    public void testClearQueryParameters() {
721        Uri uri = Uri.parse("http://www.google.com/?a=x&b=y&c=z").buildUpon()
722            .clearQuery().appendQueryParameter("foo", "bar").build();
723        Set<String> names = uri.getQueryParameterNames();
724        assertEquals(1, names.size());
725        assertEquals("foo", names.iterator().next());
726    }
727}
728