17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2003-2009, International Business Machines Corporation and    *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.stringprep;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.StringPrep;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.StringPrepParseException;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author ram
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class TestStringPrep extends TestFmwk {
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) throws Exception {
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new TestStringPrep().run(args);
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       There are several special identifiers ("who") which need to be
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       understood universally, rather than in the context of a particular
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       DNS domain.  Some of these identifiers cannot be understood when an
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       NFS client accesses the server, but have meaning when a local process
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       accesses the file.  The ability to display and modify these
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       permissions is permitted over NFS, even if none of the access methods
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       on the server understands the identifiers.
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Who                    Description
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       _______________________________________________________________
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "OWNER"                The owner of the file.
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "GROUP"                The group associated with the file.
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "EVERYONE"             The world.
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "INTERACTIVE"          Accessed from an interactive terminal.
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "NETWORK"              Accessed via the network.
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "DIALUP"               Accessed as a dialup user to the server.
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "BATCH"                Accessed from a batch job.
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "ANONYMOUS"            Accessed without any authentication.
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "AUTHENTICATED"        Any authenticated user (opposite of
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              ANONYMOUS)
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       "SERVICE"              Access from a system service.
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       To avoid conflict, these special identifiers are distinguish by an
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       appended "@" and should appear in the form "xxxx@" (note: no domain
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       name after the "@").  For example: ANONYMOUS@.
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private String[] mixed_prep_data ={
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "OWNER@",
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "GROUP@",
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "EVERYONE@",
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "INTERACTIVE@",
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "NETWORK@",
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "DIALUP@",
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "BATCH@",
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "ANONYMOUS@",
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "AUTHENTICATED@",
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0930\u094D\u092E\u094D\u0915\u094D\u0937\u0947\u0924\u094D@slip129-37-118-146.nc.us.ibm.net",
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0936\u094d\u0930\u0940\u092e\u0926\u094d@saratoga.pe.utexas.edu",
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u092d\u0917\u0935\u0926\u094d\u0917\u0940\u0924\u093e@dial-120-45.ots.utexas.edu",
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0905\u0927\u094d\u092f\u093e\u092f@woo-085.dorms.waller.net",
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0905\u0930\u094d\u091c\u0941\u0928@hd30-049.hil.compuserve.com",
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0935\u093f\u0937\u093e\u0926@pem203-31.pe.ttu.edu",
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u092f\u094b\u0917@56K-227.MaxTNT3.pdq.net",
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0927\u0943\u0924\u0930\u093e\u0937\u094d\u091f\u094d\u0930@dial-36-2.ots.utexas.edu",
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0909\u0935\u093E\u091A\u0943@slip129-37-23-152.ga.us.ibm.net",
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0927\u0930\u094d\u092e\u0915\u094d\u0937\u0947\u0924\u094d\u0930\u0947@ts45ip119.cadvision.com",
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0915\u0941\u0930\u0941\u0915\u094d\u0937\u0947\u0924\u094d\u0930\u0947@sdn-ts-004txaustP05.dialsprint.net",
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0938\u092e\u0935\u0947\u0924\u093e@bar-tnt1s66.erols.com",
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u092f\u0941\u092f\u0941\u0924\u094d\u0938\u0935\u0903@101.st-louis-15.mo.dial-access.att.net",
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u092e\u093e\u092e\u0915\u093e\u0903@h92-245.Arco.COM",
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u092a\u093e\u0923\u094d\u0921\u0935\u093e\u0936\u094d\u091a\u0948\u0935@dial-13-2.ots.utexas.edu",
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0915\u093f\u092e\u0915\u0941\u0930\u094d\u0935\u0924@net-redynet29.datamarkets.com.ar",
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0938\u0902\u091c\u0935@ccs-shiva28.reacciun.net.ve",
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c30\u0c18\u0c41\u0c30\u0c3e\u0c2e\u0c4d@7.houston-11.tx.dial-access.att.net",
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c35\u0c3f\u0c36\u0c4d\u0c35\u0c28\u0c3e\u0c27@ingw129-37-120-26.mo.us.ibm.net",
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c06\u0c28\u0c02\u0c26\u0c4d@dialup6.austintx.com",
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0C35\u0C26\u0C4D\u0C26\u0C3F\u0C30\u0C3E\u0C1C\u0C41@dns2.tpao.gov.tr",
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c30\u0c3e\u0c1c\u0c40\u0c35\u0c4d@slip129-37-119-194.nc.us.ibm.net",
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c15\u0c36\u0c30\u0c2c\u0c3e\u0c26@cs7.dillons.co.uk.203.119.193.in-addr.arpa",
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c38\u0c02\u0c1c\u0c40\u0c35\u0c4d@swprd1.innovplace.saskatoon.sk.ca",
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c15\u0c36\u0c30\u0c2c\u0c3e\u0c26@bikini.bologna.maraut.it",
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c38\u0c02\u0c1c\u0c40\u0c2c\u0c4d@node91.subnet159-198-79.baxter.com",
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c38\u0c46\u0c28\u0c4d\u0c17\u0c41\u0c2a\u0c4d\u0c24@cust19.max5.new-york.ny.ms.uu.net",
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c05\u0c2e\u0c30\u0c47\u0c02\u0c26\u0c4d\u0c30@balexander.slip.andrew.cmu.edu",
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c39\u0c28\u0c41\u0c2e\u0c3e\u0c28\u0c41\u0c32@pool029.max2.denver.co.dynip.alter.net",
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c30\u0c35\u0c3f@cust49.max9.new-york.ny.ms.uu.net",
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c15\u0c41\u0c2e\u0c3e\u0c30\u0c4d@s61.abq-dialin2.hollyberry.com",
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c35\u0c3f\u0c36\u0c4d\u0c35\u0c28\u0c3e\u0c27@\u0917\u0928\u0947\u0936.sanjose.ibm.com",
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c06\u0c26\u0c3f\u0c24\u0c4d\u0c2f@www.\u00E0\u00B3\u00AF.com",
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0C15\u0C02\u0C26\u0C4D\u0C30\u0C47\u0C17\u0C41\u0c32@www.\u00C2\u00A4.com",
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c36\u0c4d\u0c30\u0c40\u0C27\u0C30\u0C4D@www.\u00C2\u00A3.com",
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c15\u0c02\u0c1f\u0c2e\u0c36\u0c46\u0c1f\u0c4d\u0c1f\u0c3f@\u0025",
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c2e\u0c3e\u0c27\u0c35\u0c4d@\u005C\u005C",
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0c26\u0c46\u0c36\u0c46\u0c1f\u0c4d\u0c1f\u0c3f@www.\u0021.com",
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "test@www.\u0024.com",
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "help@\u00C3\u00BC.com",
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNFS4MixedPrep(){
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i< mixed_prep_data.length; i++){
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String src = mixed_prep_data[i];
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                byte[] dest = NFS4StringPrep.mixed_prepare(src.getBytes("UTF-8"));
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String destString = new String(dest, "UTF-8");
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int destIndex = destString.indexOf('@');
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(destIndex < 0){
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Delimiter @ disappeared from the output!");
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }catch(Exception e){
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("mixed_prepare for string: " + mixed_prep_data[i] +" failed with " + e.toString());
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* test the error condition */
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String src = "OWNER@oss.software.ibm.com";
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                byte[] dest = NFS4StringPrep.mixed_prepare(src.getBytes("UTF-8"));
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(dest!=null){
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Did not get the expected exception");
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }catch(Exception e){
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("mixed_prepare for string: " + src +" passed with " + e.toString());
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         }
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCISPrep(){
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0;i< (TestData.conformanceTestCases.length);i++){
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TestData.ConformanceTestCase testCase = TestData.conformanceTestCases[i];
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String src = testCase.input;
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Exception expected = testCase.expected;
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String expectedDest = testCase.output;
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                byte[] dest =NFS4StringPrep.cis_prepare(src.getBytes("UTF-8"));
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String destString = new String(dest, "UTF-8");
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(!expectedDest.equalsIgnoreCase(destString)){
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      errln("Did not get the expected output for nfs4_cis_prep at index " + i);
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }catch(Exception e){
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(!expected.equals(e)){
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Did not get the expected exception");
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCSPrep(){
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Checking for bidi is turned off
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String src = "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774\u0644\u064A\u0647\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74";
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            NFS4StringPrep.cs_prepare(src.getBytes("UTF-8"), false);
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }catch(Exception e){
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Got unexpected exception: " + e.toString());
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // normalization is turned off
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            src = "www.\u00E0\u00B3\u00AF.com";
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            byte[] dest = NFS4StringPrep.cs_prepare(src.getBytes("UTF-8"), false);
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String destStr = new String(dest, "UTF-8");
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(!src.equals(destStr)){
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Did not get expected output. Expected: "+ prettify(src)+
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " Got: " + prettify(destStr));
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }catch(Exception e){
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Got unexpected exception: " + e.toString());
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test case insensitive string
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            src = "THISISATEST";
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            byte[] dest = NFS4StringPrep.cs_prepare(src.getBytes("UTF-8"), false);
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String destStr = new String(dest, "UTF-8");
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(!src.toLowerCase().equals(destStr)){
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Did not get expected output. Expected: "+ prettify(src)+
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " Got: " + prettify(destStr));
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }catch(Exception e){
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Got unexpected exception: " + e.toString());
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test case sensitive string
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            src = "THISISATEST";
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            byte[] dest = NFS4StringPrep.cs_prepare(src.getBytes("UTF-8"), true);
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String destStr = new String(dest, "UTF-8");
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(!src.equals(destStr)){
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Did not get expected output. Expected: "+ prettify(src)+
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " Got: " + prettify(destStr));
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }catch(Exception e){
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Got unexpected exception: " + e.toString());
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCoverage(){
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (new StringPrepParseException("coverage", 0, "", 0,0) == null){
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Construct StringPrepParseException(String, int, String, int, int)");
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* Tests the method public static StringPrep getInstance(int profile) */
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetInstance(){
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (profile < 0 || profile > MAX_PROFILE)" is true
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] neg_num_cases = {-100,-50,-10,-5,-2,-1};
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<neg_num_cases.length; i++){
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringPrep.getInstance(neg_num_cases[i]);
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("StringPrep.getInstance(int) expected an exception for " +
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "an invalid parameter of " + neg_num_cases[i]);
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] max_profile_cases = {StringPrep.RFC4518_LDAP_CI+1, StringPrep.RFC4518_LDAP_CI+2, StringPrep.RFC4518_LDAP_CI+5, StringPrep.RFC4518_LDAP_CI+10};
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<max_profile_cases.length; i++){
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringPrep.getInstance(max_profile_cases[i]);
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("StringPrep.getInstance(int) expected an exception for " +
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "an invalid parameter of " + max_profile_cases[i]);
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (instance == null)", "if (stream != null)", "if (instance != null)", and "if (ref != null)" is true
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] cases = {0, 1, StringPrep.RFC4518_LDAP_CI};
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<cases.length; i++){
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringPrep.getInstance(cases[i]);
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("StringPrep.getInstance(int) did not expected an exception for " +
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "an valid parameter of " + cases[i]);
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* Test the method public String prepare(String src, int options) */
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPrepare() {
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringPrep sp = StringPrep.getInstance(0);
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!(sp.prepare("dummy", 0)).equals("dummy")) {
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("StringPrep.prepare(String,int) was suppose to return " + "'dummy'");
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringPrep.prepare(String,int) was not suppose to return " + "an exception.");
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests the constructor public StringPrepParseException(String message, int error, String rules, int pos, int
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * lineNumber)
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestStringPrepParseException() {
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale locales[] = {Locale.US, Locale.FRENCH, Locale.SIMPLIFIED_CHINESE};
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String rules = "This is a very odd little set of rules, just for testing, you know...";
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringPrepParseException exceptions[] = new StringPrepParseException[locales.length];
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < locales.length; i += 1) {
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            exceptions[i] = new StringPrepParseException(locales[i].toString(), i, rules, i, i);
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* Tests the method public boolean equals(Object other) for StringPrepParseException */
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestStringPrepParseExceptionEquals(){
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringPrepParseException sppe = new StringPrepParseException("dummy",0,"dummy",0,0);
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringPrepParseException sppe_clone = new StringPrepParseException("dummy",0,"dummy",0,0);
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringPrepParseException sppe1 = new StringPrepParseException("dummy1",1,"dummy1",0,0);
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if(!(other instanceof StringPrepParseException))" is true
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(sppe.equals(0)){
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringPrepParseException.equals(Object) is suppose to return false when " +
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "passing integer '0'");
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(sppe.equals(0.0)){
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringPrepParseException.equals(Object) is suppose to return false when " +
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "passing float/double '0.0'");
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(sppe.equals("0")){
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringPrepParseException.equals(Object) is suppose to return false when " +
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "passing string '0'");
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if(!(other instanceof StringPrepParseException))" is true
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(!sppe.equals(sppe)){
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringPrepParseException.equals(Object) is suppose to return true when " +
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "comparing to the same object");
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(!sppe.equals(sppe_clone)){
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringPrepParseException.equals(Object) is suppose to return true when " +
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "comparing to the same initiated object");
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(sppe.equals(sppe1)){
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("StringPrepParseException.equals(Object) is suppose to return false when " +
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "comparing to another object that isn't the same");
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* Tests the method public int getError() */
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetError(){
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < 5; i++){
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringPrepParseException sppe = new StringPrepParseException("dummy",i,"dummy",0,0);
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(sppe.getError() != i){
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("StringPrepParseExcpetion.getError() was suppose to return " + i + " but got " + sppe.getError());
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* Tests the private void setPreContext(char[] str, int pos) */
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSetPreContext(){
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String WordAtLeast16Characters = "abcdefghijklmnopqrstuvwxyz";
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < 5; i++){
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                @SuppressWarnings("unused")
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringPrepParseException sppe = new StringPrepParseException("dummy",i,WordAtLeast16Characters,0,0);
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                sppe = new StringPrepParseException(WordAtLeast16Characters,i,"dummy",0,0);
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("StringPrepParseException.setPreContext was not suppose to return an exception");
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
327