1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
23 import com.google.common.annotations.GwtCompatible;
24 import com.google.common.base.Preconditions;
25 import com.google.common.escape.UnicodeEscaper;
26
27 import junit.framework.TestCase;
28
29
30
31
32
33
34 @GwtCompatible
35 public class PercentEscaperTest extends TestCase {
36
37
38 public void testSimpleEscaper() {
39 UnicodeEscaper e = new PercentEscaper("", false);
40 for (char c = 0; c < 128; c++) {
41 if ((c >= '0' && c <= '9') ||
42 (c >= 'a' && c <= 'z') ||
43 (c >= 'A' && c <= 'Z')) {
44 assertUnescaped(e, c);
45 } else {
46 assertEscaping(e, escapeAscii(c), c);
47 }
48 }
49
50
51 assertEscaping(e, "%00", '\u0000');
52 assertEscaping(e, "%7F", '\u007f');
53 assertEscaping(e, "%C2%80", '\u0080');
54 assertEscaping(e, "%DF%BF", '\u07ff');
55 assertEscaping(e, "%E0%A0%80", '\u0800');
56 assertEscaping(e, "%EF%BF%BF", '\uffff');
57 assertUnicodeEscaping(e, "%F0%90%80%80", '\uD800', '\uDC00');
58 assertUnicodeEscaping(e, "%F4%8F%BF%BF", '\uDBFF', '\uDFFF');
59
60
61 assertEquals("", e.escape(""));
62 assertEquals("safestring", e.escape("safestring"));
63 assertEquals("embedded%00null", e.escape("embedded\0null"));
64 assertEquals("max%EF%BF%BFchar", e.escape("max\uffffchar"));
65 }
66
67
68 public void testPlusForSpace() {
69 UnicodeEscaper basicEscaper = new PercentEscaper("", false);
70 UnicodeEscaper plusForSpaceEscaper = new PercentEscaper("", true);
71 UnicodeEscaper spaceEscaper = new PercentEscaper(" ", false);
72
73 assertEquals("string%20with%20spaces",
74 basicEscaper.escape("string with spaces"));
75 assertEquals("string+with+spaces",
76 plusForSpaceEscaper.escape("string with spaces"));
77 assertEquals("string with spaces",
78 spaceEscaper.escape("string with spaces"));
79 }
80
81
82 public void testCustomEscaper() {
83 UnicodeEscaper e = new PercentEscaper("+*/-", false);
84 for (char c = 0; c < 128; c++) {
85 if ((c >= '0' && c <= '9') ||
86 (c >= 'a' && c <= 'z') ||
87 (c >= 'A' && c <= 'Z') ||
88 "+*/-".indexOf(c) >= 0) {
89 assertUnescaped(e, c);
90 } else {
91 assertEscaping(e, escapeAscii(c), c);
92 }
93 }
94 }
95
96
97 public void testCustomEscaper_withpercent() {
98 UnicodeEscaper e = new PercentEscaper("%", false);
99 assertEquals("foo%7Cbar", e.escape("foo|bar"));
100 assertEquals("foo%7Cbar", e.escape("foo%7Cbar"));
101 }
102
103
104
105
106
107 public void testBadArguments_null() {
108 try {
109 new PercentEscaper(null, false);
110 fail("Expected null pointer exception for null parameter");
111 } catch (NullPointerException expected) {
112
113 }
114 }
115
116
117
118
119
120 public void testBadArguments_badchars() {
121 String msg = "Alphanumeric characters are always 'safe' " +
122 "and should not be explicitly specified";
123 try {
124 new PercentEscaper("-+#abc.!", false);
125 fail(msg);
126 } catch (IllegalArgumentException expected) {
127 assertEquals(msg, expected.getMessage());
128 }
129 }
130
131
132
133
134
135 public void testBadArguments_plusforspace() {
136 try {
137 new PercentEscaper(" ", false);
138 } catch (IllegalArgumentException e) {
139 fail("Space can be a 'safe' character if plusForSpace is false");
140 }
141 String msg =
142 "plusForSpace cannot be specified when space is a 'safe' character";
143 try {
144 new PercentEscaper(" ", true);
145 fail(msg);
146 } catch (IllegalArgumentException expected) {
147 assertEquals(msg, expected.getMessage());
148 }
149 }
150
151
152 private String escapeAscii(char c) {
153 Preconditions.checkArgument(c < 128);
154 String hex = "0123456789ABCDEF";
155 return "%" + hex.charAt((c >> 4) & 0xf) + hex.charAt(c & 0xf);
156 }
157 }