diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index 2205e094d3e..a253c11c899 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -1082,6 +1082,93 @@ static void test_ParseURL(void) } } +static void test_HashData(void) +{ + HRESULT res; + BYTE input[16] = {0x51, 0x33, 0x4F, 0xA7, 0x45, 0x15, 0xF0, 0x52, 0x90, + 0x2B, 0xE7, 0xF5, 0xFD, 0xE1, 0xA6, 0xA7}; + BYTE output[32]; + static const BYTE expected[] = {0x54, 0x9C, 0x92, 0x55, 0xCD, 0x82, 0xFF, + 0xA1, 0x8E, 0x0F, 0xCF, 0x93, 0x14, 0xAA, + 0xE3, 0x2D}; + static const BYTE expected2[] = {0x54, 0x9C, 0x92, 0x55, 0xCD, 0x82, 0xFF, + 0xA1, 0x8E, 0x0F, 0xCF, 0x93, 0x14, 0xAA, + 0xE3, 0x2D, 0x47, 0xFC, 0x80, 0xB8, 0xD0, + 0x49, 0xE6, 0x13, 0x2A, 0x30, 0x51, 0x8D, + 0xF9, 0x4B, 0x07, 0xA6}; + static const BYTE expected3[] = {0x2B, 0xDC, 0x9A, 0x1B, 0xF0, 0x5A, 0xF9, + 0xC6, 0xBE, 0x94, 0x6D, 0xF3, 0x33, 0xC1, + 0x36, 0x07}; + int i; + + /* Test hashing with identically sized input/output buffers. */ + res = HashData(input, 16, output, 16); + ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res); + if(res == S_OK) + ok(!memcmp(output, expected, sizeof(expected)), + "Output buffer did not match expected contents\n"); + + /* Test hashing with larger output buffer. */ + res = HashData(input, 16, output, 32); + ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res); + if(res == S_OK) + ok(!memcmp(output, expected2, sizeof(expected2)), + "Output buffer did not match expected contents\n"); + + /* Test hashing with smaller input buffer. */ + res = HashData(input, 8, output, 16); + ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res); + if(res == S_OK) + ok(!memcmp(output, expected3, sizeof(expected3)), + "Output buffer did not match expected contents\n"); + + /* Test passing NULL pointers for input/output parameters. */ + res = HashData(NULL, 0, NULL, 0); + ok(res == E_INVALIDARG || broken(res == S_OK), /* Windows 2000 */ + "Expected HashData to return E_INVALIDARG, got 0x%08x\n", res); + + res = HashData(input, 0, NULL, 0); + ok(res == E_INVALIDARG || broken(res == S_OK), /* Windows 2000 */ + "Expected HashData to return E_INVALIDARG, got 0x%08x\n", res); + + res = HashData(NULL, 0, output, 0); + ok(res == E_INVALIDARG || broken(res == S_OK), /* Windows 2000 */ + "Expected HashData to return E_INVALIDARG, got 0x%08x\n", res); + + /* Test passing valid pointers with sizes of zero. */ + for (i = 0; i < sizeof(input)/sizeof(BYTE); i++) + input[i] = 0x00; + + for (i = 0; i < sizeof(output)/sizeof(BYTE); i++) + output[i] = 0xFF; + + res = HashData(input, 0, output, 0); + ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res); + + /* The buffers should be unchanged. */ + for (i = 0; i < sizeof(input)/sizeof(BYTE); i++) + { + ok(input[i] == 0x00, "Expected the input buffer to be unchanged\n"); + if(input[i] != 0x00) break; + } + + for (i = 0; i < sizeof(output)/sizeof(BYTE); i++) + { + ok(output[i] == 0xFF, "Expected the output buffer to be unchanged\n"); + if(output[i] != 0xFF) break; + } + + /* Input/output parameters are not validated. */ + res = HashData((BYTE *)0xdeadbeef, 0, (BYTE *)0xdeadbeef, 0); + ok(res == S_OK, "Expected HashData to return S_OK, got 0x%08x\n", res); + + if (0) + { + res = HashData((BYTE *)0xdeadbeef, 1, (BYTE *)0xdeadbeef, 1); + trace("HashData returned 0x%08x\n", res); + } +} + /* ########################### */ START_TEST(url) @@ -1103,4 +1190,5 @@ START_TEST(url) test_UrlIs(); test_UrlUnescape(); test_ParseURL(); + test_HashData(); }