ICU-6714 Add test for new string prep profiles in ICU4C.
X-SVN-Rev: 25749
diff --git a/icu4c/source/test/cintltst/spreptst.c b/icu4c/source/test/cintltst/spreptst.c
index 8a2fa96..eec7815 100644
--- a/icu4c/source/test/cintltst/spreptst.c
+++ b/icu4c/source/test/cintltst/spreptst.c
@@ -1,7 +1,7 @@
/*
*******************************************************************************
*
- * Copyright (C) 2003-2008, International Business Machines
+ * Copyright (C) 2003-2009, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@@ -21,6 +21,7 @@
#include "unicode/ustring.h"
#include "unicode/usprep.h"
+#include "cstring.h"
#include "cintltst.h"
#include "nfsprep.h"
@@ -39,6 +40,9 @@
static void Test_nfs4_mixed_prep(void);
static void TestBEAMWarning(void);
static void TestCoverage(void);
+static void TestStringPrepProfiles(void);
+
+UStringPrepProfileType getTypeFromProfileName(const char* profileName);
void
addUStringPrepTest(TestNode** root)
@@ -51,6 +55,7 @@
addTest(root, &Test_nfs4_mixed_prep, "spreptst/Test_nfs4_mixed_prep");
addTest(root, &TestBEAMWarning, "spreptst/TestBEAMWarning");
addTest(root, &TestCoverage, "spreptst/TestCoverage");
+ addTest(root, &TestStringPrepProfiles, "spreptst/TestStringPrepProfiles");
}
static void
@@ -629,6 +634,178 @@
usprep_close(NULL);
}
+/**** Profile Test ****/
+
+#define SPREP_PROFILE_TEST_MAX_LENGTH 64
+/* The format of the test cases should be the following:
+* {
+* Profile name
+* src string1
+* expected result1
+* src string2
+* expected result2
+* ...
+* }
+*
+* *Note: For expected failures add FAIL to beginning of the source string and for expected result use "FAIL".
+*/
+static const char *profile_test_case[] = {
+/**** RFC4013_SASLPREP ****/
+ "RFC4013_SASLPREP",
+ "user:\\u00A0\\u0AC6\\u1680\\u00ADpassword1",
+ "user: \\u0AC6 password1",
+
+/**** RFC4011_MIB ****/
+ "RFC4011_MIB",
+ "Policy\\u034F\\u200DBase\\u0020d\\u1806\\u200C",
+ "PolicyBase d",
+
+/**** RFC4505_TRACE ****/
+ "RFC4505_TRACE",
+ "Anony\\u0020\\u00A0mous\\u3000\\u0B9D\\u034F\\u00AD",
+ "Anony\\u0020\\u00A0mous\\u3000\\u0B9D\\u034F\\u00AD",
+
+/**** RFC4518_LDAP ****/
+ "RFC4518_LDAP",
+ "Ldap\\uFB01\\u00ADTest\\u0020\\u00A0\\u2062ing",
+ "LdapfiTest ing",
+
+/**** RFC4518_LDAP_CI ****/
+ "RFC4518_LDAP_CI",
+ "Ldap\\uFB01\\u00ADTest\\u0020\\u00A0\\u2062ing12345",
+ "ldapfitest ing12345",
+
+/**** RFC3920_RESOURCEPREP ****/
+ "RFC3920_RESOURCEPREP",
+ "ServerXM\\u2060\\uFE00\\uFE09PP s p ",
+ "ServerXMPP s p ",
+
+/**** RFC3920_NODEPREP ****/
+ "RFC3920_NODEPREP",
+ "Server\\u200DXMPPGreEK\\u03D0",
+ "serverxmppgreek\\u03B2",
+
+/**** RFC3722_ISCI ****/
+ "RFC3722_ISCSI",
+ "InternetSmallComputer\\uFB01\\u0032\\u2075Interface",
+ "internetsmallcomputerfi25interface",
+ "FAILThisShouldFailBecauseOfThis\\u002F",
+ "FAIL",
+
+/**** RFC3530_NFS4_CS_PREP ****/
+ "RFC3530_NFS4_CS_PREP",
+ "\\u00ADUser\\u2060Name@ \\u06DDDOMAIN.com",
+ "UserName@ \\u06DDDOMAIN.com",
+
+/**** RFC3530_NFS4_CS_PREP_CI ****/
+ "RFC3530_NFS4_CS_PREP_CI",
+ "\\u00ADUser\\u2060Name@ \\u06DDDOMAIN.com",
+ "username@ \\u06DDdomain.com",
+
+/**** RFC3530_NFS4_CIS_PREP ****/
+ "RFC3530_NFS4_CIS_PREP",
+ "AA\\u200C\\u200D @@DomAin.org",
+ "aa @@domain.org",
+
+/**** RFC3530_NFS4_MIXED_PREP_PREFIX ****/
+ "RFC3530_NFS4_MIXED_PREP_PREFIX",
+ "PrefixUser \\u007F\\uFB01End",
+ "PrefixUser \\u007FfiEnd",
+
+/**** RFC3530_NFS4_MIXED_PREP_SUFFIX ****/
+ "RFC3530_NFS4_MIXED_PREP_SUFFIX",
+ "SuffixDomain \\u007F\\uFB01EnD",
+ "suffixdomain \\u007Ffiend",
+};
+
+UStringPrepProfileType getTypeFromProfileName(const char* profileName) {
+ if (uprv_strcmp(profileName, "RFC4013_SASLPREP") == 0) {
+ return USPREP_RFC4013_SASLPREP;
+ } else if (uprv_strcmp(profileName, "RFC4011_MIB") == 0) {
+ return USPREP_RFC4011_MIB;
+ } else if (uprv_strcmp(profileName, "RFC4505_TRACE") == 0) {
+ return USPREP_RFC4505_TRACE;
+ } else if (uprv_strcmp(profileName, "RFC4518_LDAP") == 0) {
+ return USPREP_RFC4518_LDAP;
+ } else if (uprv_strcmp(profileName, "RFC4518_LDAP_CI") == 0) {
+ return USPREP_RFC4518_LDAP_CI;
+ } else if (uprv_strcmp(profileName, "RFC3920_RESOURCEPREP") == 0) {
+ return USPREP_RFC3920_RESOURCEPREP;
+ } else if (uprv_strcmp(profileName, "RFC3920_NODEPREP") == 0) {
+ return USPREP_RFC3920_NODEPREP;
+ } else if (uprv_strcmp(profileName, "RFC3722_ISCSI") == 0) {
+ return USPREP_RFC3722_ISCSI;
+ } else if (uprv_strcmp(profileName, "RFC3530_NFS4_CS_PREP") == 0) {
+ return USPREP_RFC3530_NFS4_CS_PREP;
+ } else if (uprv_strcmp(profileName, "RFC3530_NFS4_CS_PREP_CI") == 0) {
+ return USPREP_RFC3530_NFS4_CS_PREP_CI;
+ } else if (uprv_strcmp(profileName, "RFC3530_NFS4_CIS_PREP") == 0) {
+ return USPREP_RFC3530_NFS4_CIS_PREP;
+ } else if (uprv_strcmp(profileName, "RFC3530_NFS4_MIXED_PREP_PREFIX") == 0) {
+ return USPREP_RFC3530_NFS4_MIXED_PREP_PREFIX;
+ } else if (uprv_strcmp(profileName, "RFC3530_NFS4_MIXED_PREP_SUFFIX") == 0) {
+ return USPREP_RFC3530_NFS4_MIXED_PREP_SUFFIX;
+ }
+ /* Should not happen. */
+ return USPREP_RFC3491_NAMEPREP;
+}
+static void TestStringPrepProfiles(void) {
+ UErrorCode status = U_ZERO_ERROR;
+ char *profileName;
+ UChar src[SPREP_PROFILE_TEST_MAX_LENGTH];
+ UChar expected[SPREP_PROFILE_TEST_MAX_LENGTH];
+ UChar result[SPREP_PROFILE_TEST_MAX_LENGTH];
+ int32_t srcLength, resultLength, expectedLength;
+ int32_t i, testNum = 0;
+ UStringPrepProfile *sprep = NULL;
+
+ for (i = 0; i < LENGTHOF(profile_test_case); i++) {
+ if (uprv_strstr(profile_test_case[i], "RFC")) {
+ if (sprep != NULL) {
+ usprep_close(sprep);
+ sprep = NULL;
+ }
+ profileName = profile_test_case[i];
+ sprep = usprep_openByType(getTypeFromProfileName(profileName), &status);
+ if (U_FAILURE(status)) {
+ log_err("Unable to open String Prep Profile with: %s\n", profileName);
+ break;
+ }
+
+ testNum = 0;
+ continue;
+ }
+ srcLength = resultLength = expectedLength = SPREP_PROFILE_TEST_MAX_LENGTH;
+
+ testNum++;
+
+ srcLength = u_unescape(profile_test_case[i], src, srcLength);
+ expectedLength = u_unescape(profile_test_case[++i], expected, expectedLength);
+
+ resultLength = usprep_prepare(sprep, src, srcLength, result, resultLength, USPREP_ALLOW_UNASSIGNED, NULL, &status);
+ if (U_FAILURE(status)) {
+ if (uprv_strstr(profile_test_case[i], "FAIL") == NULL) {
+ log_err("Error occurred on test[%d] for profile: %s\n", testNum, profileName);
+ } else {
+ /* Error is expected so reset the status. */
+ status = U_ZERO_ERROR;
+ }
+ } else {
+ if (uprv_strstr(profile_test_case[i], "FAIL") != NULL) {
+ log_err("Error expected on test[%d] for profile: %s\n", testNum, profileName);
+ }
+
+ if (resultLength != expectedLength || u_strcmp(result, expected) != 0) {
+ log_err("Results do not match expected on test[%d] for profile: %s\n", testNum, profileName);
+ }
+ }
+ }
+
+ if (sprep != NULL) {
+ usprep_close(sprep);
+ }
+}
+
#endif
/*