J. Duke | 319a3b9 | 2007-12-01 00:00:00 +0000 | [diff] [blame^] | 1 | /* |
| 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 | |
| 41 | import java.text.ParseException; |
| 42 | import java.io.InputStream; |
| 43 | |
| 44 | import sun.net.idn.StringPrep; |
| 45 | import sun.text.normalizer.UCharacterIterator; |
| 46 | |
| 47 | public 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 | } |