Module: wine Branch: master Commit: 87a46493cfd8827ad8b2a1215f5aa27ccc66c4e9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=87a46493cfd8827ad8b2a1215f...
Author: Misha Koshelev mk144210@bcm.edu Date: Mon May 7 17:51:36 2007 -0500
msi/tests: automation: Add test for Installer::RegistryValue.
---
dlls/msi/tests/automation.c | 195 +++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 189 insertions(+), 6 deletions(-)
diff --git a/dlls/msi/tests/automation.c b/dlls/msi/tests/automation.c index b5ce434..86af1d6 100644 --- a/dlls/msi/tests/automation.c +++ b/dlls/msi/tests/automation.c @@ -267,12 +267,8 @@ static UINT len; \ if (lstrcmpW(szString1, szString2) != 0) \ { \ - len = WideCharToMultiByte(CP_ACP, 0, szString1, -1, string1, MAX_PATH, NULL, NULL); \ - ok(len, "WideCharToMultiByteChar returned error %d\n", GetLastError()); \ -\ - len = WideCharToMultiByte(CP_ACP, 0, szString2, -1, string2, MAX_PATH, NULL, NULL); \ - ok(len, "WideCharToMultiByteChar returned error %d\n", GetLastError()); \ -\ + WideCharToMultiByte(CP_ACP, 0, szString1, -1, string1, MAX_PATH, NULL, NULL); \ + WideCharToMultiByte(CP_ACP, 0, szString2, -1, string2, MAX_PATH, NULL, NULL); \ ok(0, format, string1, string2); \ }
@@ -517,6 +513,74 @@ static HRESULT Installer_CreateRecord(int count, IDispatch **pRecord) return hr; }
+static HRESULT Installer_RegistryValue(HKEY hkey, LPCWSTR szKey, BOOL *pBool) +{ + VARIANT varresult; + VARIANTARG vararg[3]; + DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0}; + HRESULT hr; + + VariantInit(&vararg[2]); + V_VT(&vararg[2]) = VT_I4; + V_I4(&vararg[2]) = (int)hkey; + VariantInit(&vararg[1]); + V_VT(&vararg[1]) = VT_BSTR; + V_BSTR(&vararg[1]) = SysAllocString(szKey); + VariantInit(&vararg[0]); + V_VT(&vararg[0]) = VT_EMPTY; + + hr = invoke(pInstaller, "RegistryValue", DISPATCH_METHOD, &dispparams, &varresult, VT_BOOL); + *pBool = V_BOOL(&varresult); + VariantClear(&varresult); + return hr; +} + +static HRESULT Installer_RegistryValueW(HKEY hkey, LPCWSTR szKey, LPCWSTR szValue, LPWSTR szString) +{ + VARIANT varresult; + VARIANTARG vararg[3]; + DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0}; + HRESULT hr; + + VariantInit(&vararg[2]); + V_VT(&vararg[2]) = VT_I4; + V_I4(&vararg[2]) = (int)hkey; + VariantInit(&vararg[1]); + V_VT(&vararg[1]) = VT_BSTR; + V_BSTR(&vararg[1]) = SysAllocString(szKey); + VariantInit(&vararg[0]); + V_VT(&vararg[0]) = VT_BSTR; + V_BSTR(&vararg[0]) = SysAllocString(szValue); + + hr = invoke(pInstaller, "RegistryValue", DISPATCH_METHOD, &dispparams, &varresult, VT_BSTR); + lstrcpyW(szString, V_BSTR(&varresult)); + VariantClear(&varresult); + return hr; +} + +static HRESULT Installer_RegistryValueI(HKEY hkey, LPCWSTR szKey, int iValue, LPWSTR szString, VARTYPE vtResult) +{ + VARIANT varresult; + VARIANTARG vararg[3]; + DISPPARAMS dispparams = {vararg, NULL, sizeof(vararg)/sizeof(VARIANTARG), 0}; + HRESULT hr; + + VariantInit(&vararg[2]); + V_VT(&vararg[2]) = VT_I4; + V_I4(&vararg[2]) = (int)hkey; + VariantInit(&vararg[1]); + V_VT(&vararg[1]) = VT_BSTR; + V_BSTR(&vararg[1]) = SysAllocString(szKey); + VariantInit(&vararg[0]); + V_VT(&vararg[0]) = VT_I4; + V_I4(&vararg[0]) = iValue; + + hr = invoke(pInstaller, "RegistryValue", DISPATCH_METHOD, &dispparams, &varresult, vtResult); + if (vtResult == VT_BSTR) lstrcpyW(szString, V_BSTR(&varresult)); + VariantClear(&varresult); + return hr; +} + static HRESULT Installer_OpenPackage(LPCWSTR szPackagePath, int options, IDispatch **pSession) { VARIANT varresult; @@ -1053,6 +1117,122 @@ static void test_Session(IDispatch *pSession) ok(myint == INSTALLSTATE_ADVERTISED, "Feature request state was %d but expected %d\n", myint, INSTALLSTATE_ADVERTISED); }
+/* delete key and all its subkeys */ +static DWORD delete_key( HKEY hkey ) +{ + char name[MAX_PATH]; + DWORD ret; + + while (!(ret = RegEnumKeyA(hkey, 0, name, sizeof(name)))) + { + HKEY tmp; + if (!(ret = RegOpenKeyExA( hkey, name, 0, KEY_ENUMERATE_SUB_KEYS, &tmp ))) + { + ret = delete_key( tmp ); + RegCloseKey( tmp ); + } + if (ret) break; + } + if (ret != ERROR_NO_MORE_ITEMS) return ret; + RegDeleteKeyA( hkey, "" ); + return 0; +} + +static void test_Installer_RegistryValue(void) +{ + static const DWORD qw[2] = { 0x12345678, 0x87654321 }; + static const WCHAR szKey[] = { 'S','o','f','t','w','a','r','e','\','W','i','n','e','\','T','e','s','t',0 }; + static const WCHAR szOne[] = { 'O','n','e',0 }; + static const WCHAR szTwo[] = { 'T','w','o',0 }; + static const WCHAR szThree[] = { 'T','h','r','e','e',0 }; + static const WCHAR szFour[] = { 'F','o','u','r',0 }; + static const WCHAR szBlank[] = { 0 }; + WCHAR szString[MAX_PATH]; + HKEY hkey, hkey_sub; + HRESULT hr; + BOOL bRet; + + /* Delete keys */ + if (!RegOpenKeyW( HKEY_CURRENT_USER, szKey, &hkey )) delete_key( hkey ); + + /* Does our key exist? Shouldn't; two different ways to check */ + todo_wine { + hr = Installer_RegistryValue(HKEY_CURRENT_USER, szKey, &bRet); + ok(SUCCEEDED(hr), "Installer_RegistryValue failed, hresult 0x%08x\n", hr); + if (SUCCEEDED(hr)) + ok(!bRet, "Registry key expected to not exist, but Installer_RegistryValue claims it does\n"); + + memset(szString, 0, sizeof(szString)); + hr = Installer_RegistryValueW(HKEY_CURRENT_USER, szKey, NULL, szString); + ok(hr == DISP_E_BADINDEX, "Installer_RegistryValueW failed, hresult 0x%08x\n", hr); + } + + /* Create key */ + ok(!RegCreateKeyW( HKEY_CURRENT_USER, szKey, &hkey ), "RegCreateKeyW failed\n"); + + ok(!RegSetValueExW(hkey,szOne,0,REG_SZ, (const BYTE *)szOne, sizeof(szOne)), + "RegSetValueExW failed\n"); + ok(!RegSetValueExW(hkey,szTwo,0,REG_DWORD, (const BYTE *)qw, 4), + "RegSetValueExW failed\n"); + ok(!RegSetValueExW(hkey,szThree,0,REG_BINARY, (const BYTE *)qw, 4), + "RegSetValueExW failed\n"); + ok(!RegSetValueExW(hkey,NULL,0,REG_SZ, (const BYTE *)szOne, sizeof(szOne)), + "RegSetValueExW failed\n"); + + ok(!RegCreateKeyW( hkey, szFour, &hkey_sub ), "RegCreateKeyW failed\n"); + + todo_wine { + /* Does our key exist? It should, and make sure we retrieve the correct default value */ + bRet = FALSE; + hr = Installer_RegistryValue(HKEY_CURRENT_USER, szKey, &bRet); + ok(SUCCEEDED(hr), "Installer_RegistryValue failed, hresult 0x%08x\n", hr); + if (SUCCEEDED(hr)) + ok(bRet, "Registry key expected to exist, but Installer_RegistryValue claims it does not\n"); + + memset(szString, 0, sizeof(szString)); + hr = Installer_RegistryValueW(HKEY_CURRENT_USER, szKey, NULL, szString); + ok(SUCCEEDED(hr), "Installer_RegistryValueW failed, hresult 0x%08x\n", hr); + ok_w2("Default registry value "%s" does not match expected "%s"\n", szString, szOne); + + /* Get value of key */ + memset(szString, 0, sizeof(szString)); + hr = Installer_RegistryValueW(HKEY_CURRENT_USER, szKey, szOne, szString); + ok(SUCCEEDED(hr), "Installer_RegistryValueW failed, hresult 0x%08x\n", hr); + ok_w2("Registry value "%s" does not match expected "%s"\n", szString, szOne); + + /* Get string class name for the key */ + memset(szString, 0, sizeof(szString)); + hr = Installer_RegistryValueI(HKEY_CURRENT_USER, szKey, 0, szString, VT_BSTR); + ok(SUCCEEDED(hr), "Installer_RegistryValueI failed, hresult 0x%08x\n", hr); + ok_w2("Registry name "%s" does not match expected "%s"\n", szString, szBlank); + + /* Get name of a value by positive number (RegEnumValue like), valid index */ + memset(szString, 0, sizeof(szString)); + hr = Installer_RegistryValueI(HKEY_CURRENT_USER, szKey, 2, szString, VT_BSTR); + ok(SUCCEEDED(hr), "Installer_RegistryValueI failed, hresult 0x%08x\n", hr); + ok_w2("Registry name "%s" does not match expected "%s"\n", szString, szTwo); + + /* Get name of a value by positive number (RegEnumValue like), invalid index */ + memset(szString, 0, sizeof(szString)); + hr = Installer_RegistryValueI(HKEY_CURRENT_USER, szKey, 10, szString, VT_EMPTY); + ok(SUCCEEDED(hr), "Installer_RegistryValueI failed, hresult 0x%08x\n", hr); + + /* Get name of a subkey by negative number (RegEnumValue like), valid index */ + memset(szString, 0, sizeof(szString)); + hr = Installer_RegistryValueI(HKEY_CURRENT_USER, szKey, -1, szString, VT_BSTR); + ok(SUCCEEDED(hr), "Installer_RegistryValueI failed, hresult 0x%08x\n", hr); + ok_w2("Registry name "%s" does not match expected "%s"\n", szString, szFour); + + /* Get name of a subkey by negative number (RegEnumValue like), invalid index */ + memset(szString, 0, sizeof(szString)); + hr = Installer_RegistryValueI(HKEY_CURRENT_USER, szKey, -10, szString, VT_EMPTY); + ok(SUCCEEDED(hr), "Installer_RegistryValueI failed, hresult 0x%08x\n", hr); + } + + /* clean up */ + delete_key(hkey); +} + static void test_Installer(void) { static WCHAR szProductCode[] = { '{','F','1','C','3','A','F','5','0','-','8','B','5','6','-','4','A','6','9','-','A','0','0','C','-','0','0','7','7','3','F','E','4','2','F','3','0','}',0 }; @@ -1104,6 +1284,9 @@ static void test_Installer(void)
DeleteFileA(msifile);
+ /* Installer::RegistryValue */ + test_Installer_RegistryValue(); + /* Installer::Products */ hr = Installer_Products(&pStringList); ok(SUCCEEDED(hr), "Installer_Products failed, hresult 0x%08x\n", hr);