Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (C) 2009 The Guava Authors
      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 
     17 package com.google.common.net;
     18 
     19 import static com.google.common.escape.testing.EscaperAsserts.assertEscaping;
     20 import static com.google.common.escape.testing.EscaperAsserts.assertUnescaped;
     21 import static com.google.common.escape.testing.EscaperAsserts.assertUnicodeEscaping;
     22 import static com.google.common.net.UrlEscapers.urlFormParameterEscaper;
     23 import static com.google.common.net.UrlEscapers.urlFragmentEscaper;
     24 import static com.google.common.net.UrlEscapers.urlPathSegmentEscaper;
     25 
     26 import com.google.common.annotations.GwtCompatible;
     27 import com.google.common.escape.UnicodeEscaper;
     28 
     29 import junit.framework.TestCase;
     30 
     31 /**
     32  * Tests for the {@link UrlEscapers} class.
     33  *
     34  * @author David Beaumont
     35  */
     36 @GwtCompatible
     37 public class UrlEscapersTest extends TestCase {
     38   /**
     39    * Helper to assert common expected behaviour of uri escapers. You should call
     40    * assertBasicUrlEscaper() unless the escaper explicitly does not escape '%'.
     41    */
     42   static void assertBasicUrlEscaperExceptPercent(UnicodeEscaper e) {
     43     // URL escapers should throw null pointer exceptions for null input
     44     try {
     45       e.escape((String) null);
     46       fail("Escaping null string should throw exception");
     47     } catch (NullPointerException x) {
     48       // pass
     49     }
     50 
     51     // All URL escapers should leave 0-9, A-Z, a-z unescaped
     52     assertUnescaped(e, 'a');
     53     assertUnescaped(e, 'z');
     54     assertUnescaped(e, 'A');
     55     assertUnescaped(e, 'Z');
     56     assertUnescaped(e, '0');
     57     assertUnescaped(e, '9');
     58 
     59     // Unreserved characters used in java.net.URLEncoder
     60     assertUnescaped(e, '-');
     61     assertUnescaped(e, '_');
     62     assertUnescaped(e, '.');
     63     assertUnescaped(e, '*');
     64 
     65     assertEscaping(e, "%00", '\u0000');       // nul
     66     assertEscaping(e, "%7F", '\u007f');       // del
     67     assertEscaping(e, "%C2%80", '\u0080');    // xx-00010,x-000000
     68     assertEscaping(e, "%DF%BF", '\u07ff');    // xx-11111,x-111111
     69     assertEscaping(e, "%E0%A0%80", '\u0800'); // xxx-0000,x-100000,x-00,0000
     70     assertEscaping(e, "%EF%BF%BF", '\uffff'); // xxx-1111,x-111111,x-11,1111
     71     assertUnicodeEscaping(e, "%F0%90%80%80", '\uD800', '\uDC00');
     72     assertUnicodeEscaping(e, "%F4%8F%BF%BF", '\uDBFF', '\uDFFF');
     73 
     74     assertEquals("", e.escape(""));
     75     assertEquals("safestring", e.escape("safestring"));
     76     assertEquals("embedded%00null", e.escape("embedded\0null"));
     77     assertEquals("max%EF%BF%BFchar", e.escape("max\uffffchar"));
     78   }
     79 
     80   // Helper to assert common expected behaviour of uri escapers.
     81   static void assertBasicUrlEscaper(UnicodeEscaper e) {
     82     assertBasicUrlEscaperExceptPercent(e);
     83     // The escape character must always be escaped
     84     assertEscaping(e, "%25", '%');
     85   }
     86 
     87   public void testUrlFormParameterEscaper() {
     88     UnicodeEscaper e = (UnicodeEscaper) urlFormParameterEscaper();
     89     // Verify that these are the same escaper (as documented)
     90     assertSame(e, urlFormParameterEscaper());
     91     assertBasicUrlEscaper(e);
     92 
     93     /*
     94      * Specified as safe by RFC 2396 but not by java.net.URLEncoder. These tests will start failing
     95      * when the escaper is made compliant with RFC 2396, but that's a good thing (just change them
     96      * to assertUnescaped).
     97      */
     98     assertEscaping(e, "%21", '!');
     99     assertEscaping(e, "%28", '(');
    100     assertEscaping(e, "%29", ')');
    101     assertEscaping(e, "%7E", '~');
    102     assertEscaping(e, "%27", '\'');
    103 
    104     // Plus for spaces
    105     assertEscaping(e, "+", ' ');
    106     assertEscaping(e, "%2B", '+');
    107 
    108     assertEquals("safe+with+spaces", e.escape("safe with spaces"));
    109     assertEquals("foo%40bar.com", e.escape("foo (at) bar.com"));
    110   }
    111 
    112   public void testUrlPathSegmentEscaper() {
    113     UnicodeEscaper e = (UnicodeEscaper) urlPathSegmentEscaper();
    114     assertPathEscaper(e);
    115     assertUnescaped(e, '+');
    116   }
    117 
    118   static void assertPathEscaper(UnicodeEscaper e) {
    119     assertBasicUrlEscaper(e);
    120 
    121     assertUnescaped(e, '!');
    122     assertUnescaped(e, '\'');
    123     assertUnescaped(e, '(');
    124     assertUnescaped(e, ')');
    125     assertUnescaped(e, '~');
    126     assertUnescaped(e, ':');
    127     assertUnescaped(e, '@');
    128 
    129     // Don't use plus for spaces
    130     assertEscaping(e, "%20", ' ');
    131 
    132     assertEquals("safe%20with%20spaces", e.escape("safe with spaces"));
    133     assertEquals("foo (at) bar.com", e.escape("foo (at) bar.com"));
    134   }
    135 
    136   public void testUrlFragmentEscaper() {
    137     UnicodeEscaper e = (UnicodeEscaper) urlFragmentEscaper();
    138     assertUnescaped(e, '+');
    139     assertUnescaped(e, '/');
    140     assertUnescaped(e, '?');
    141 
    142     assertPathEscaper(e);
    143   }
    144 }
    145