Blame nss/cmd/libpkix/pkix_pl/system/test_string2.c

Packit 40b132
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit 40b132
/*
Packit 40b132
 * test_string2.c
Packit 40b132
 *
Packit 40b132
 * Tests International Strings
Packit 40b132
 *
Packit 40b132
 */
Packit 40b132
Packit 40b132
#include "testutil.h"
Packit 40b132
#include "testutil_nss.h"
Packit 40b132
Packit 40b132
static void *plContext = NULL;
Packit 40b132
Packit 40b132
static void
Packit 40b132
createString(
Packit 40b132
        PKIX_PL_String **vivaEspanaString,
Packit 40b132
        PKIX_PL_String **straussString,
Packit 40b132
        PKIX_PL_String **gorbachevString,
Packit 40b132
        PKIX_PL_String **testUTF16String,
Packit 40b132
        PKIX_PL_String **chineseString,
Packit 40b132
        PKIX_PL_String **jeanRenoString)
Packit 40b132
{
Packit 40b132
        /* this is meant to fail - it highlights bug 0002 */
Packit 40b132
        unsigned char utf16String[4] = { 0xF8, 0x60,
Packit 40b132
                                        0xFC, 0x60};
Packit 40b132
Packit 40b132
        unsigned char chinese[16] = { 0xe7, 0xab, 0xa0,
Packit 40b132
                                        0xe5, 0xad, 0x90,
Packit 40b132
                                        0xe6, 0x80, 0xa1,
Packit 40b132
                                        0x20,
Packit 40b132
                                        0xe4, 0xb8, 0xad,
Packit 40b132
                                        0xe5, 0x9b, 0xbd
Packit 40b132
        };
Packit 40b132
Packit 40b132
        char* jeanReno = "Jean R\303\251no is an actor.";
Packit 40b132
        char* gorbachev = /* This is the name "Gorbachev" in cyrllic */
Packit 40b132
        "\xd0\x93\xd0\xbe\xd1\x80\xd0\xb1\xd0\xb0\xd1\x87\xd1\x91\xd0\xb2";
Packit 40b132
Packit 40b132
        char *vivaEspana =
Packit 40b132
                "¡Viva España!";
Packit 40b132
Packit 40b132
        char *strauss =
Packit 40b132
                "Strauß was born in Österreich";
Packit 40b132
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
        /* ---------------------------- */
Packit 40b132
        subTest("String Creation");
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
Packit 40b132
                                        PKIX_ESCASCII,
Packit 40b132
                                        vivaEspana,
Packit 40b132
                                        PL_strlen(vivaEspana),
Packit 40b132
                                        vivaEspanaString,
Packit 40b132
                                        plContext));
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
Packit 40b132
                                        PKIX_ESCASCII,
Packit 40b132
                                        strauss,
Packit 40b132
                                        PL_strlen(strauss),
Packit 40b132
                                        straussString,
Packit 40b132
                                        plContext));
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
Packit 40b132
                                        PKIX_UTF8,
Packit 40b132
                                        gorbachev,
Packit 40b132
                                        PL_strlen(gorbachev),
Packit 40b132
                                        gorbachevString,
Packit 40b132
                                        plContext));
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
Packit 40b132
                                        PKIX_UTF16,
Packit 40b132
                                        utf16String,
Packit 40b132
                                        4,
Packit 40b132
                                        testUTF16String,
Packit 40b132
                                        plContext));
Packit 40b132
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
Packit 40b132
                                        PKIX_UTF8,
Packit 40b132
                                        chinese,
Packit 40b132
                                        16,
Packit 40b132
                                        chineseString,
Packit 40b132
                                        plContext));
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
Packit 40b132
                                        PKIX_UTF8,
Packit 40b132
                                        jeanReno,
Packit 40b132
                                        PL_strlen(jeanReno),
Packit 40b132
                                        jeanRenoString,
Packit 40b132
                                        plContext));
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
Packit 40b132
        PKIX_TEST_RETURN();
Packit 40b132
}
Packit 40b132
Packit 40b132
static void
Packit 40b132
testGetEncoded(PKIX_PL_String *string, PKIX_UInt32 format)
Packit 40b132
{
Packit 40b132
        void *dest = NULL;
Packit 40b132
        PKIX_UInt32 length;
Packit 40b132
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded
Packit 40b132
                                (string,
Packit 40b132
                                format,
Packit 40b132
                                &dest,
Packit 40b132
                                &length,
Packit 40b132
                                plContext));
Packit 40b132
Packit 40b132
        if (dest){
Packit 40b132
                (void) printf("\tResult: %s\n", (char *)dest);
Packit 40b132
                PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
Packit 40b132
        }
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
        PKIX_TEST_RETURN();
Packit 40b132
}
Packit 40b132
Packit 40b132
Packit 40b132
static void
Packit 40b132
testHTMLOutput(
Packit 40b132
        PKIX_PL_String *vivaEspanaString,
Packit 40b132
        PKIX_PL_String *straussString,
Packit 40b132
        PKIX_PL_String *gorbachevString,
Packit 40b132
        PKIX_PL_String *testUTF16String,
Packit 40b132
        PKIX_PL_String *chineseString,
Packit 40b132
        PKIX_PL_String *jeanRenoString)
Packit 40b132
{
Packit 40b132
        void *dest = NULL;
Packit 40b132
        PKIX_UInt32 length;
Packit 40b132
Packit 40b132
        FILE *htmlFile = NULL;
Packit 40b132
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
        /* Opening a file for output */
Packit 40b132
        htmlFile = fopen("utf8.html", "w");
Packit 40b132
Packit 40b132
        if (htmlFile != plContext) {
Packit 40b132
                (void) fprintf(htmlFile, "<html><head>\n");
Packit 40b132
                (void) fprintf(htmlFile, "
Packit 40b132
                (void) fprintf(htmlFile,
Packit 40b132
                        "content = \"text/html; charset = UTF-8\">\n");
Packit 40b132
                (void) fprintf(htmlFile, "</head><body>\n");
Packit 40b132
                (void) fprintf(htmlFile, "<font size =\"+2\">\n");
Packit 40b132
        } else
Packit 40b132
                (void) printf("Could not open HTML file\n");
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(testUTF16String,
Packit 40b132
                                            PKIX_UTF8,
Packit 40b132
                                            &dest,
Packit 40b132
                                            &length,
Packit 40b132
                                            plContext));
Packit 40b132
        if (htmlFile != plContext) {
Packit 40b132
                (void) printf("%d bytes written to HTML file\n",
Packit 40b132
                        fwrite(dest, length, 1, htmlFile));
Packit 40b132
                (void) fprintf(htmlFile, "
\n");
Packit 40b132
        }
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
Packit 40b132
        dest = NULL;
Packit 40b132
        length = 0;
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(chineseString,
Packit 40b132
                                            PKIX_UTF8,
Packit 40b132
                                            &dest,
Packit 40b132
                                            &length,
Packit 40b132
                                            plContext));
Packit 40b132
        if (htmlFile != plContext) {
Packit 40b132
                (void) printf("%d bytes written to HTML file\n",
Packit 40b132
                        fwrite(dest, length, 1, htmlFile));
Packit 40b132
                (void) fprintf(htmlFile, "
\n");
Packit 40b132
        }
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
Packit 40b132
        dest = NULL;
Packit 40b132
        length = 0;
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(jeanRenoString,
Packit 40b132
                                            PKIX_UTF8,
Packit 40b132
                                            &dest,
Packit 40b132
                                            &length,
Packit 40b132
                                            plContext));
Packit 40b132
        if (htmlFile != plContext) {
Packit 40b132
                (void) printf("%d bytes written to HTML file\n",
Packit 40b132
                        fwrite(dest, length, 1, htmlFile));
Packit 40b132
                (void) fprintf(htmlFile, "
\n");
Packit 40b132
        }
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
Packit 40b132
        dest = NULL;
Packit 40b132
        length = 0;
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(vivaEspanaString,
Packit 40b132
                                            PKIX_UTF8,
Packit 40b132
                                            &dest,
Packit 40b132
                                            &length,
Packit 40b132
                                            plContext));
Packit 40b132
        if (htmlFile != plContext) {
Packit 40b132
                (void) printf("%d bytes written to HTML file\n",
Packit 40b132
                        fwrite(dest, length, 1, htmlFile));
Packit 40b132
                (void) fprintf(htmlFile, "
\n");
Packit 40b132
        }
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
Packit 40b132
        dest = NULL;
Packit 40b132
        length = 0;
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(straussString,
Packit 40b132
                                            PKIX_UTF8,
Packit 40b132
                                            &dest,
Packit 40b132
                                            &length,
Packit 40b132
                                            plContext));
Packit 40b132
        if (htmlFile != plContext) {
Packit 40b132
                (void) printf("%d bytes written to HTML file\n",
Packit 40b132
                        fwrite(dest, length, 1, htmlFile));
Packit 40b132
                (void) fprintf(htmlFile, "
\n");
Packit 40b132
        }
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
Packit 40b132
        dest = NULL;
Packit 40b132
        length = 0;
Packit 40b132
Packit 40b132
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(straussString,
Packit 40b132
                                            PKIX_UTF8,
Packit 40b132
                                            &dest,
Packit 40b132
                                            &length,
Packit 40b132
                                            plContext));
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
Packit 40b132
        dest = NULL;
Packit 40b132
        length = 0;
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_GetEncoded(gorbachevString,
Packit 40b132
                                            PKIX_UTF8,
Packit 40b132
                                            &dest,
Packit 40b132
                                            &length,
Packit 40b132
                                            plContext));
Packit 40b132
        if (htmlFile != plContext) {
Packit 40b132
                (void) printf("%d bytes written to HTML file\n",
Packit 40b132
                        fwrite(dest, length, 1, htmlFile));
Packit 40b132
                (void) fprintf(htmlFile, "
\n");
Packit 40b132
        }
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(dest, plContext));
Packit 40b132
        dest = NULL;
Packit 40b132
        length = 0;
Packit 40b132
Packit 40b132
        if (htmlFile != plContext) {
Packit 40b132
                (void) fprintf(htmlFile, "</font>\n");
Packit 40b132
                (void) fprintf(htmlFile, "</body></html>\n");
Packit 40b132
                (void) fclose(htmlFile);
Packit 40b132
        }
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
Packit 40b132
        PKIX_TEST_RETURN();
Packit 40b132
}
Packit 40b132
Packit 40b132
static void
Packit 40b132
testDestroy(
Packit 40b132
        PKIX_PL_String *string)
Packit 40b132
{
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
        PKIX_TEST_DECREF_BC(string);
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
Packit 40b132
        PKIX_TEST_RETURN();
Packit 40b132
}
Packit 40b132
Packit 40b132
int test_string2(int argc, char *argv[]) {
Packit 40b132
Packit 40b132
        PKIX_PL_String *vivaEspanaString, *straussString, *testUTF16String;
Packit 40b132
        PKIX_PL_String *chineseString, *jeanRenoString, *gorbachevString;
Packit 40b132
        PKIX_UInt32 actualMinorVersion;
Packit 40b132
        PKIX_UInt32 j = 0;
Packit 40b132
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
        startTests("Unicode Strings");
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(
Packit 40b132
            PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext));
Packit 40b132
Packit 40b132
        subTest("PKIX_PL_String_Create");
Packit 40b132
        createString(&vivaEspanaString,
Packit 40b132
                    &straussString,
Packit 40b132
                    &gorbachevString,
Packit 40b132
                    &testUTF16String,
Packit 40b132
                    &chineseString,
Packit 40b132
                    &jeanRenoString);
Packit 40b132
Packit 40b132
        subTest("Converting UTF-16 to EscASCII");
Packit 40b132
        testGetEncoded(testUTF16String, PKIX_ESCASCII);
Packit 40b132
Packit 40b132
        subTest("Converting UTF-8 to EscASCII");
Packit 40b132
        testGetEncoded(chineseString, PKIX_ESCASCII);
Packit 40b132
Packit 40b132
        subTest("Converting UTF-8 to EscASCII");
Packit 40b132
        testGetEncoded(jeanRenoString, PKIX_ESCASCII);
Packit 40b132
Packit 40b132
        subTest("Converting EscASCII to UTF-16");
Packit 40b132
        testGetEncoded(vivaEspanaString, PKIX_UTF16);
Packit 40b132
Packit 40b132
        subTest("Converting UTF-8 to UTF-16");
Packit 40b132
        testGetEncoded(chineseString, PKIX_UTF16);
Packit 40b132
Packit 40b132
        subTest("Creating HTML Output File \'utf8.html\'");
Packit 40b132
        testHTMLOutput(vivaEspanaString,
Packit 40b132
                    straussString,
Packit 40b132
                    gorbachevString,
Packit 40b132
                    testUTF16String,
Packit 40b132
                    chineseString,
Packit 40b132
                    jeanRenoString);
Packit 40b132
Packit 40b132
        subTest("Unicode Destructors");
Packit 40b132
        testDestroy(testUTF16String);
Packit 40b132
        testDestroy(chineseString);
Packit 40b132
        testDestroy(jeanRenoString);
Packit 40b132
        testDestroy(vivaEspanaString);
Packit 40b132
        testDestroy(straussString);
Packit 40b132
        testDestroy(gorbachevString);
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
Packit 40b132
        PKIX_Shutdown(plContext);
Packit 40b132
Packit 40b132
        PKIX_TEST_RETURN();
Packit 40b132
Packit 40b132
        endTests("Unicode Strings");
Packit 40b132
Packit 40b132
        return (0);
Packit 40b132
Packit 40b132
}