crypt32: Fix test failures across Windows versions.
authorJuan Lang <juan.lang@gmail.com>
Tue, 10 Nov 2009 19:47:59 +0000 (11:47 -0800)
committerAlexander Morozov <amorozov@etersoft.ru>
Thu, 1 Jul 2010 13:18:11 +0000 (17:18 +0400)
dlls/crypt32/tests/encode.c

index 934acebcee5e43215774e9f1f6e2587fe56b4259..9c2d7391501fa774b5aad8f85640a76b6ab9bd16 100644 (file)
@@ -1391,11 +1391,35 @@ static void test_decodeNameValue(DWORD dwEncoding)
      embeddedNullNameValue.value.dwValueType, GetLastError());
     if (ret)
     {
-        CERT_NAME_VALUE value = { CERT_RDN_ENCODED_BLOB,
+        CERT_NAME_VALUE rdnEncodedValue = { CERT_RDN_ENCODED_BLOB,
          { sizeof(ia5EmbeddedNull), ia5EmbeddedNull } };
-
-        todo_wine
-        compareNameValues(&value, (const CERT_NAME_VALUE *)buf);
+        CERT_NAME_VALUE embeddedNullValue = { CERT_RDN_IA5_STRING,
+         { sizeof(embedded_null) - 1, (BYTE *)embedded_null } };
+        const CERT_NAME_VALUE *got = (const CERT_NAME_VALUE *)buf,
+         *expected = NULL;
+
+        /* Some Windows versions decode name values with embedded NULLs,
+         * others leave them encoded, even with the same version of crypt32.
+         * Accept either.
+         */
+        ok(got->dwValueType == CERT_RDN_ENCODED_BLOB ||
+         got->dwValueType == CERT_RDN_IA5_STRING,
+         "Expected CERT_RDN_ENCODED_BLOB or CERT_RDN_IA5_STRING, got %d\n",
+         got->dwValueType);
+        if (got->dwValueType == CERT_RDN_ENCODED_BLOB)
+            expected = &rdnEncodedValue;
+        else if (got->dwValueType == CERT_RDN_IA5_STRING)
+            expected = &embeddedNullValue;
+        if (expected)
+        {
+            ok(got->Value.cbData == expected->Value.cbData,
+             "String type %d: unexpected data size, got %d, expected %d\n",
+             got->dwValueType, got->Value.cbData, expected->Value.cbData);
+            if (got->Value.cbData && got->Value.pbData)
+                ok(!memcmp(got->Value.pbData, expected->Value.pbData,
+                 min(got->Value.cbData, expected->Value.cbData)),
+                 "String type %d: unexpected value\n", expected->dwValueType);
+        }
         LocalFree(buf);
     }
 }