blob: a072367fe2980130276698d82128921f13715a33 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/*
25 * @test
26 * @summary Unit test for sun.net.idn.Punycode
27 * @bug 4737170
28 * @library .
29 * @compile -XDignore.symbol.file TestStringPrep.java NFS4StringPrep.java
30 * TestData.java
31 * @run main/othervm -ea TestStringPrep
32 * @author Edward Wang
33 */
34/*
35 *******************************************************************************
36 * Copyright (C) 2003-2004, International Business Machines Corporation and *
37 * others. All Rights Reserved. *
38 *******************************************************************************
39*/
40
41import java.text.ParseException;
42import java.io.InputStream;
43
44import sun.net.idn.StringPrep;
45import sun.text.normalizer.UCharacterIterator;
46
47public class TestStringPrep {
48 public static void main(String[] args) throws Exception {
49 TestNFS4MixedPrep();
50 TestCISPrep();
51 TestCSPrep();
52 TestNamePrepConformance();
53 }
54 /*
55 There are several special identifiers ("who") which need to be
56 understood universally, rather than in the context of a particular
57 DNS domain. Some of these identifiers cannot be understood when an
58 NFS client accesses the server, but have meaning when a local process
59 accesses the file. The ability to display and modify these
60 permissions is permitted over NFS, even if none of the access methods
61 on the server understands the identifiers.
62
63 Who Description
64 _______________________________________________________________
65
66 "OWNER" The owner of the file.
67 "GROUP" The group associated with the file.
68 "EVERYONE" The world.
69 "INTERACTIVE" Accessed from an interactive terminal.
70 "NETWORK" Accessed via the network.
71 "DIALUP" Accessed as a dialup user to the server.
72 "BATCH" Accessed from a batch job.
73 "ANONYMOUS" Accessed without any authentication.
74 "AUTHENTICATED" Any authenticated user (opposite of
75 ANONYMOUS)
76 "SERVICE" Access from a system service.
77
78 To avoid conflict, these special identifiers are distinguish by an
79 appended "@" and should appear in the form "xxxx@" (note: no domain
80 name after the "@"). For example: ANONYMOUS@.
81 */
82 private static String[] mixed_prep_data ={
83 "OWNER@",
84 "GROUP@",
85 "EVERYONE@",
86 "INTERACTIVE@",
87 "NETWORK@",
88 "DIALUP@",
89 "BATCH@",
90 "ANONYMOUS@",
91 "AUTHENTICATED@",
92 "\u0930\u094D\u092E\u094D\u0915\u094D\u0937\u0947\u0924\u094D@slip129-37-118-146.nc.us.ibm.net",
93 "\u0936\u094d\u0930\u0940\u092e\u0926\u094d@saratoga.pe.utexas.edu",
94 "\u092d\u0917\u0935\u0926\u094d\u0917\u0940\u0924\u093e@dial-120-45.ots.utexas.edu",
95 "\u0905\u0927\u094d\u092f\u093e\u092f@woo-085.dorms.waller.net",
96 "\u0905\u0930\u094d\u091c\u0941\u0928@hd30-049.hil.compuserve.com",
97 "\u0935\u093f\u0937\u093e\u0926@pem203-31.pe.ttu.edu",
98 "\u092f\u094b\u0917@56K-227.MaxTNT3.pdq.net",
99 "\u0927\u0943\u0924\u0930\u093e\u0937\u094d\u091f\u094d\u0930@dial-36-2.ots.utexas.edu",
100 "\u0909\u0935\u093E\u091A\u0943@slip129-37-23-152.ga.us.ibm.net",
101 "\u0927\u0930\u094d\u092e\u0915\u094d\u0937\u0947\u0924\u094d\u0930\u0947@ts45ip119.cadvision.com",
102 "\u0915\u0941\u0930\u0941\u0915\u094d\u0937\u0947\u0924\u094d\u0930\u0947@sdn-ts-004txaustP05.dialsprint.net",
103 "\u0938\u092e\u0935\u0947\u0924\u093e@bar-tnt1s66.erols.com",
104 "\u092f\u0941\u092f\u0941\u0924\u094d\u0938\u0935\u0903@101.st-louis-15.mo.dial-access.att.net",
105 "\u092e\u093e\u092e\u0915\u093e\u0903@h92-245.Arco.COM",
106 "\u092a\u093e\u0923\u094d\u0921\u0935\u093e\u0936\u094d\u091a\u0948\u0935@dial-13-2.ots.utexas.edu",
107 "\u0915\u093f\u092e\u0915\u0941\u0930\u094d\u0935\u0924@net-redynet29.datamarkets.com.ar",
108 "\u0938\u0902\u091c\u0935@ccs-shiva28.reacciun.net.ve",
109 "\u0c30\u0c18\u0c41\u0c30\u0c3e\u0c2e\u0c4d@7.houston-11.tx.dial-access.att.net",
110 "\u0c35\u0c3f\u0c36\u0c4d\u0c35\u0c28\u0c3e\u0c27@ingw129-37-120-26.mo.us.ibm.net",
111 "\u0c06\u0c28\u0c02\u0c26\u0c4d@dialup6.austintx.com",
112 "\u0C35\u0C26\u0C4D\u0C26\u0C3F\u0C30\u0C3E\u0C1C\u0C41@dns2.tpao.gov.tr",
113 "\u0c30\u0c3e\u0c1c\u0c40\u0c35\u0c4d@slip129-37-119-194.nc.us.ibm.net",
114 "\u0c15\u0c36\u0c30\u0c2c\u0c3e\u0c26@cs7.dillons.co.uk.203.119.193.in-addr.arpa",
115 "\u0c38\u0c02\u0c1c\u0c40\u0c35\u0c4d@swprd1.innovplace.saskatoon.sk.ca",
116 "\u0c15\u0c36\u0c30\u0c2c\u0c3e\u0c26@bikini.bologna.maraut.it",
117 "\u0c38\u0c02\u0c1c\u0c40\u0c2c\u0c4d@node91.subnet159-198-79.baxter.com",
118 "\u0c38\u0c46\u0c28\u0c4d\u0c17\u0c41\u0c2a\u0c4d\u0c24@cust19.max5.new-york.ny.ms.uu.net",
119 "\u0c05\u0c2e\u0c30\u0c47\u0c02\u0c26\u0c4d\u0c30@balexander.slip.andrew.cmu.edu",
120 "\u0c39\u0c28\u0c41\u0c2e\u0c3e\u0c28\u0c41\u0c32@pool029.max2.denver.co.dynip.alter.net",
121 "\u0c30\u0c35\u0c3f@cust49.max9.new-york.ny.ms.uu.net",
122 "\u0c15\u0c41\u0c2e\u0c3e\u0c30\u0c4d@s61.abq-dialin2.hollyberry.com",
123 "\u0c35\u0c3f\u0c36\u0c4d\u0c35\u0c28\u0c3e\u0c27@\u0917\u0928\u0947\u0936.sanjose.ibm.com",
124 "\u0c06\u0c26\u0c3f\u0c24\u0c4d\u0c2f@www.\u00E0\u00B3\u00AF.com",
125 "\u0C15\u0C02\u0C26\u0C4D\u0C30\u0C47\u0C17\u0C41\u0c32@www.\u00C2\u00A4.com",
126 "\u0c36\u0c4d\u0c30\u0c40\u0C27\u0C30\u0C4D@www.\u00C2\u00A3.com",
127 "\u0c15\u0c02\u0c1f\u0c2e\u0c36\u0c46\u0c1f\u0c4d\u0c1f\u0c3f@\u0025",
128 "\u0c2e\u0c3e\u0c27\u0c35\u0c4d@\u005C\u005C",
129 "\u0c26\u0c46\u0c36\u0c46\u0c1f\u0c4d\u0c1f\u0c3f@www.\u0021.com",
130 "test@www.\u0024.com",
131 "help@\u00C3\u00BC.com",
132 };
133 public static void TestNFS4MixedPrep(){
134 for(int i=0; i< mixed_prep_data.length; i++){
135 try{
136 String src = mixed_prep_data[i];
137 byte[] dest = NFS4StringPrep.mixed_prepare(src.getBytes("UTF-8"));
138 String destString = new String(dest, "UTF-8");
139 int destIndex = destString.indexOf('@');
140 if(destIndex < 0){
141 fail("Delimiter @ disappeared from the output!");
142 }
143 }catch(Exception e){
144 fail("mixed_prepare for string: " + mixed_prep_data[i] +" failed with " + e.toString());
145 }
146 }
147 /* test the error condition */
148 {
149 String src = "OWNER@oss.software.ibm.com";
150 try{
151 byte[] dest = NFS4StringPrep.mixed_prepare(src.getBytes("UTF-8"));
152 if(dest!=null){
153 fail("Did not get the expected exception");
154 }
155 }catch(Exception e){
156 System.out.println("mixed_prepare for string: " + src +" passed with " + e.toString());
157 }
158
159 }
160 }
161 public static void TestCISPrep(){
162
163 for(int i=0;i< (TestData.conformanceTestCases.length);i++){
164 TestData.ConformanceTestCase testCase = TestData.conformanceTestCases[i];
165 String src = testCase.input;
166 Exception expected = testCase.expected;
167 String expectedDest = testCase.output;
168 try{
169 byte[] dest =NFS4StringPrep.cis_prepare(src.getBytes("UTF-8"));
170 String destString = new String(dest, "UTF-8");
171 if(!expectedDest.equalsIgnoreCase(destString)){
172 fail("Did not get the expected output for nfs4_cis_prep at index " + i);
173 }
174 }catch(Exception e){
175 if(!((expected instanceof ParseException) && (e instanceof ParseException))) {
176 fail("Did not get the expected exception");
177 }
178 }
179
180 }
181 }
182
183 public static void TestCSPrep(){
184
185 // Checking for bidi is turned off
186 String src = "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774\u0644\u064A\u0647\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74";
187 try{
188 NFS4StringPrep.cs_prepare(src.getBytes("UTF-8"), false);
189 }catch(Exception e){
190 fail("Got unexpected exception: " + e.toString());
191 }
192
193 // normalization is turned off
194 try{
195 src = "www.\u00E0\u00B3\u00AF.com";
196 byte[] dest = NFS4StringPrep.cs_prepare(src.getBytes("UTF-8"), false);
197 String destStr = new String(dest, "UTF-8");
198 if(!src.equals(destStr)){
199 fail("Did not get expected output. Expected: "+ prettify(src)+
200 " Got: " + prettify(destStr));
201 }
202 }catch(Exception e){
203 fail("Got unexpected exception: " + e.toString());
204 }
205
206 // test case insensitive string
207 try{
208 src = "THISISATEST";
209 byte[] dest = NFS4StringPrep.cs_prepare(src.getBytes("UTF-8"), false);
210 String destStr = new String(dest, "UTF-8");
211 if(!src.toLowerCase().equals(destStr)){
212 fail("Did not get expected output. Expected: "+ prettify(src)+
213 " Got: " + prettify(destStr));
214 }
215 }catch(Exception e){
216 fail("Got unexpected exception: " + e.toString());
217 }
218 // test case sensitive string
219 try{
220 src = "THISISATEST";
221 byte[] dest = NFS4StringPrep.cs_prepare(src.getBytes("UTF-8"), true);
222 String destStr = new String(dest, "UTF-8");
223 if(!src.equals(destStr)){
224 fail("Did not get expected output. Expected: "+ prettify(src)+
225 " Got: " + prettify(destStr));
226 }
227 }catch(Exception e){
228 fail("Got unexpected exception: " + e.toString());
229 }
230 }
231
232 public static void TestNamePrepConformance() throws Exception {
233 InputStream stream = StringPrep.class.getResourceAsStream("uidna.spp");
234 StringPrep namePrep = new StringPrep(stream);
235 stream.close();
236 int i;
237 for(i=0; i<TestData.conformanceTestCases.length;i++){
238 TestData.ConformanceTestCase testCase = TestData.conformanceTestCases[i];
239 try{
240 UCharacterIterator iter = UCharacterIterator.getInstance(testCase.input);
241 StringBuffer output = namePrep.prepare(iter, testCase.flags);
242 if(testCase.output !=null && output!=null && !testCase.output.equals(output.toString())){
243 fail("Did not get the expected output. Expected: " + prettify(testCase.output)+
244 " Got: "+ prettify(output.toString()) );
245 }
246 } catch(ParseException ex) {
247 if (testCase.expected == null) {
248 fail("get the unexpected exception for source: " +testCase.input +" Got: "+ ex.toString());
249 }
250 }
251 }
252 System.out.println("Nameprep test count: " + i);
253 }
254
255 private static void fail(String msg) {
256 throw new RuntimeException(msg);
257 }
258
259 private static String prettify(String s) {
260 StringBuffer result = new StringBuffer();
261 for (int i = 0; i < s.length(); ++i) {
262 char ch =s.charAt(i);
263 if(ch > 0x7f){
264 result.append("\\u");
265 result.append(hex(ch));
266 }else{
267 result.append(ch);
268 }
269
270 }
271 return result.toString();
272 }
273
274 private static String hex(char ch) {
275 StringBuffer result = new StringBuffer();
276 String foo = Integer.toString(ch,16).toUpperCase();
277 for (int i = foo.length(); i < 4; ++i) {
278 result.append('0');
279 }
280 return result + foo;
281 }
282}