tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_string2.c (10342B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 /*
      5 * test_string2.c
      6 *
      7 * Tests International Strings
      8 *
      9 */
     10 
     11 #include "testutil.h"
     12 #include "testutil_nss.h"
     13 
     14 static void *plContext = NULL;
     15 
     16 static void
     17 createString(
     18    PKIX_PL_String **vivaEspanaString,
     19    PKIX_PL_String **straussString,
     20    PKIX_PL_String **gorbachevString,
     21    PKIX_PL_String **testUTF16String,
     22    PKIX_PL_String **chineseString,
     23    PKIX_PL_String **jeanRenoString)
     24 {
     25    /* this is meant to fail - it highlights bug 0002 */
     26    unsigned char utf16String[4] = { 0xF8, 0x60,
     27                                     0xFC, 0x60 };
     28 
     29    unsigned char chinese[16] = { 0xe7, 0xab, 0xa0,
     30                                  0xe5, 0xad, 0x90,
     31                                  0xe6, 0x80, 0xa1,
     32                                  0x20,
     33                                  0xe4, 0xb8, 0xad,
     34                                  0xe5, 0x9b, 0xbd };
     35 
     36    char *jeanReno = "Jean R\303\251no is an actor.";
     37    char *gorbachev = /* This is the name "Gorbachev" in cyrllic */
     38        "\xd0\x93\xd0\xbe\xd1\x80\xd0\xb1\xd0\xb0\xd1\x87\xd1\x91\xd0\xb2";
     39 
     40    char *vivaEspana =
     41        "¡Viva España!";
     42 
     43    char *strauss =
     44        "Strauß was born in Österreich";
     45 
     46    PKIX_TEST_STD_VARS();
     47 
     48    /* ---------------------------- */
     49    subTest("String Creation");
     50 
     51    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
     52        PKIX_ESCASCII,
     53        vivaEspana,
     54        PL_strlen(vivaEspana),
     55        vivaEspanaString,
     56        plContext));
     57 
     58    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
     59        PKIX_ESCASCII,
     60        strauss,
     61        PL_strlen(strauss),
     62        straussString,
     63        plContext));
     64 
     65    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
     66        PKIX_UTF8,
     67        gorbachev,
     68        PL_strlen(gorbachev),
     69        gorbachevString,
     70        plContext));
     71 
     72    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
     73        PKIX_UTF16,
     74        utf16String,
     75        4,
     76        testUTF16String,
     77        plContext));
     78 
     79    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
     80        PKIX_UTF8,
     81        chinese,
     82        16,
     83        chineseString,
     84        plContext));
     85 
     86    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
     87        PKIX_UTF8,
     88        jeanReno,
     89        PL_strlen(jeanReno),
     90        jeanRenoString,
     91        plContext));
     92 
     93 cleanup:
     94 
     95    PKIX_TEST_RETURN();
     96 }
     97 
     98 static void
     99 testGetEncoded(PKIX_PL_String *string, PKIX_UInt32 format)
    100 {
    101    void *dest = NULL;
    102    PKIX_UInt32 length;
    103 
    104    PKIX_TEST_STD_VARS();
    105 
    106    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(string,
    107                                                        format,
    108                                                        &dest,
    109                                                        &length,
    110                                                        plContext));
    111 
    112    if (dest) {
    113        (void)printf("\tResult: %s\n", (char *)dest);
    114        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
    115    }
    116 
    117 cleanup:
    118    PKIX_TEST_RETURN();
    119 }
    120 
    121 static void
    122 testHTMLOutput(
    123    PKIX_PL_String *vivaEspanaString,
    124    PKIX_PL_String *straussString,
    125    PKIX_PL_String *gorbachevString,
    126    PKIX_PL_String *testUTF16String,
    127    PKIX_PL_String *chineseString,
    128    PKIX_PL_String *jeanRenoString)
    129 {
    130    void *dest = NULL;
    131    PKIX_UInt32 length;
    132 
    133    FILE *htmlFile = NULL;
    134 
    135    PKIX_TEST_STD_VARS();
    136 
    137    /* Opening a file for output */
    138    htmlFile = fopen("utf8.html", "w");
    139 
    140    if (htmlFile != plContext) {
    141        (void)fprintf(htmlFile, "<html><head>\n");
    142        (void)fprintf(htmlFile, "<meta http-equiv=\"Content-Type\"");
    143        (void)fprintf(htmlFile,
    144                      "content = \"text/html; charset = UTF-8\">\n");
    145        (void)fprintf(htmlFile, "</head><body>\n");
    146        (void)fprintf(htmlFile, "<font size =\"+2\">\n");
    147    } else
    148        (void)printf("Could not open HTML file\n");
    149    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(testUTF16String,
    150                                                        PKIX_UTF8,
    151                                                        &dest,
    152                                                        &length,
    153                                                        plContext));
    154    if (htmlFile != plContext) {
    155        (void)printf("%d bytes written to HTML file\n",
    156                     fwrite(dest, length, 1, htmlFile));
    157        (void)fprintf(htmlFile, "<BR>\n");
    158    }
    159 
    160    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
    161    dest = NULL;
    162    length = 0;
    163 
    164    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(chineseString,
    165                                                        PKIX_UTF8,
    166                                                        &dest,
    167                                                        &length,
    168                                                        plContext));
    169    if (htmlFile != plContext) {
    170        (void)printf("%d bytes written to HTML file\n",
    171                     fwrite(dest, length, 1, htmlFile));
    172        (void)fprintf(htmlFile, "<BR>\n");
    173    }
    174 
    175    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
    176    dest = NULL;
    177    length = 0;
    178 
    179    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(jeanRenoString,
    180                                                        PKIX_UTF8,
    181                                                        &dest,
    182                                                        &length,
    183                                                        plContext));
    184    if (htmlFile != plContext) {
    185        (void)printf("%d bytes written to HTML file\n",
    186                     fwrite(dest, length, 1, htmlFile));
    187        (void)fprintf(htmlFile, "<BR>\n");
    188    }
    189 
    190    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
    191    dest = NULL;
    192    length = 0;
    193 
    194    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(vivaEspanaString,
    195                                                        PKIX_UTF8,
    196                                                        &dest,
    197                                                        &length,
    198                                                        plContext));
    199    if (htmlFile != plContext) {
    200        (void)printf("%d bytes written to HTML file\n",
    201                     fwrite(dest, length, 1, htmlFile));
    202        (void)fprintf(htmlFile, "<BR>\n");
    203    }
    204 
    205    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
    206    dest = NULL;
    207    length = 0;
    208 
    209    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(straussString,
    210                                                        PKIX_UTF8,
    211                                                        &dest,
    212                                                        &length,
    213                                                        plContext));
    214    if (htmlFile != plContext) {
    215        (void)printf("%d bytes written to HTML file\n",
    216                     fwrite(dest, length, 1, htmlFile));
    217        (void)fprintf(htmlFile, "<BR>\n");
    218    }
    219 
    220    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
    221    dest = NULL;
    222    length = 0;
    223 
    224    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(straussString,
    225                                                        PKIX_UTF8,
    226                                                        &dest,
    227                                                        &length,
    228                                                        plContext));
    229 
    230    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
    231    dest = NULL;
    232    length = 0;
    233 
    234    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(gorbachevString,
    235                                                        PKIX_UTF8,
    236                                                        &dest,
    237                                                        &length,
    238                                                        plContext));
    239    if (htmlFile != plContext) {
    240        (void)printf("%d bytes written to HTML file\n",
    241                     fwrite(dest, length, 1, htmlFile));
    242        (void)fprintf(htmlFile, "<BR>\n");
    243    }
    244 
    245    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
    246    dest = NULL;
    247    length = 0;
    248 
    249    if (htmlFile != plContext) {
    250        (void)fprintf(htmlFile, "</font>\n");
    251        (void)fprintf(htmlFile, "</body></html>\n");
    252        (void)fclose(htmlFile);
    253    }
    254 
    255 cleanup:
    256 
    257    PKIX_TEST_RETURN();
    258 }
    259 
    260 static void
    261 testDestroy(
    262    PKIX_PL_String *string)
    263 {
    264    PKIX_TEST_STD_VARS();
    265 
    266    PKIX_TEST_DECREF_BC(string);
    267 
    268 cleanup:
    269 
    270    PKIX_TEST_RETURN();
    271 }
    272 
    273 int
    274 test_string2(int argc, char *argv[])
    275 {
    276 
    277    PKIX_PL_String *vivaEspanaString, *straussString, *testUTF16String;
    278    PKIX_PL_String *chineseString, *jeanRenoString, *gorbachevString;
    279    PKIX_UInt32 actualMinorVersion;
    280    PKIX_UInt32 j = 0;
    281 
    282    PKIX_TEST_STD_VARS();
    283 
    284    startTests("Unicode Strings");
    285 
    286    PKIX_TEST_EXPECT_NO_ERROR(
    287        PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext));
    288 
    289    subTest("PKIX_PL_String_Create");
    290    createString(&vivaEspanaString,
    291                 &straussString,
    292                 &gorbachevString,
    293                 &testUTF16String,
    294                 &chineseString,
    295                 &jeanRenoString);
    296 
    297    subTest("Converting UTF-16 to EscASCII");
    298    testGetEncoded(testUTF16String, PKIX_ESCASCII);
    299 
    300    subTest("Converting UTF-8 to EscASCII");
    301    testGetEncoded(chineseString, PKIX_ESCASCII);
    302 
    303    subTest("Converting UTF-8 to EscASCII");
    304    testGetEncoded(jeanRenoString, PKIX_ESCASCII);
    305 
    306    subTest("Converting EscASCII to UTF-16");
    307    testGetEncoded(vivaEspanaString, PKIX_UTF16);
    308 
    309    subTest("Converting UTF-8 to UTF-16");
    310    testGetEncoded(chineseString, PKIX_UTF16);
    311 
    312    subTest("Creating HTML Output File \'utf8.html\'");
    313    testHTMLOutput(vivaEspanaString,
    314                   straussString,
    315                   gorbachevString,
    316                   testUTF16String,
    317                   chineseString,
    318                   jeanRenoString);
    319 
    320    subTest("Unicode Destructors");
    321    testDestroy(testUTF16String);
    322    testDestroy(chineseString);
    323    testDestroy(jeanRenoString);
    324    testDestroy(vivaEspanaString);
    325    testDestroy(straussString);
    326    testDestroy(gorbachevString);
    327 
    328 cleanup:
    329 
    330    PKIX_Shutdown(plContext);
    331 
    332    PKIX_TEST_RETURN();
    333 
    334    endTests("Unicode Strings");
    335 
    336    return (0);
    337 }