James Hawkins : msi: Add tests for MsiGetProductProperty.

Alexandre Julliard julliard at winehq.org
Tue Dec 9 06:24:52 CST 2008


Module: wine
Branch: master
Commit: dfb8b664d69f03efaac76b099b5c098b16bea1cf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=dfb8b664d69f03efaac76b099b5c098b16bea1cf

Author: James Hawkins <jhawkins at codeweavers.com>
Date:   Tue Dec  9 00:21:47 2008 -0600

msi: Add tests for MsiGetProductProperty.

---

 dlls/msi/tests/package.c |  232 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 232 insertions(+), 0 deletions(-)

diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 47ffa35..6645c06 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -149,6 +149,25 @@ static BOOL squash_guid(LPCWSTR in, LPWSTR out)
     return TRUE;
 }
 
+static void create_test_guid(LPSTR prodcode, LPSTR squashed)
+{
+    WCHAR guidW[MAX_PATH];
+    WCHAR squashedW[MAX_PATH];
+    GUID guid;
+    HRESULT hr;
+    int size;
+
+    hr = CoCreateGuid(&guid);
+    ok(hr == S_OK, "Expected S_OK, got %d\n", hr);
+
+    size = StringFromGUID2(&guid, (LPOLESTR)guidW, MAX_PATH);
+    ok(size == 39, "Expected 39, got %d\n", hr);
+
+    WideCharToMultiByte(CP_ACP, 0, guidW, size, prodcode, MAX_PATH, NULL, NULL);
+    squash_guid(guidW, squashedW);
+    WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL);
+}
+
 static void set_component_path(LPCSTR filename, MSIINSTALLCONTEXT context,
                                LPCSTR guid, LPSTR usersid, BOOL dir)
 {
@@ -9490,6 +9509,218 @@ static void test_emptypackage(void)
     MsiCloseHandle(hpkg);
 }
 
+static void test_MsiGetProductProperty(void)
+{
+    MSIHANDLE hprod, hdb;
+    CHAR val[MAX_PATH];
+    CHAR path[MAX_PATH];
+    CHAR query[MAX_PATH];
+    CHAR keypath[MAX_PATH*2];
+    CHAR prodcode[MAX_PATH];
+    CHAR prod_squashed[MAX_PATH];
+    HKEY prodkey, userkey, props;
+    LPSTR usersid;
+    DWORD size;
+    LONG res;
+    UINT r;
+
+    GetCurrentDirectoryA(MAX_PATH, path);
+    lstrcatA(path, "\\");
+
+    create_test_guid(prodcode, prod_squashed);
+    get_user_sid(&usersid);
+
+    r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    r = MsiDatabaseCommit(hdb);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    r = set_summary_info(hdb);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    r = run_query(hdb,
+            "CREATE TABLE `Directory` ( "
+            "`Directory` CHAR(255) NOT NULL, "
+            "`Directory_Parent` CHAR(255), "
+            "`DefaultDir` CHAR(255) NOT NULL "
+            "PRIMARY KEY `Directory`)");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    r = run_query(hdb,
+            "CREATE TABLE `Property` ( "
+            "`Property` CHAR(72) NOT NULL, "
+            "`Value` CHAR(255) "
+            "PRIMARY KEY `Property`)");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    sprintf(query, "INSERT INTO `Property` "
+            "(`Property`, `Value`) "
+            "VALUES( 'ProductCode', '%s' )", prodcode);
+    r = run_query(hdb, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    r = MsiDatabaseCommit(hdb);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    MsiCloseHandle(hdb);
+
+    lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\");
+    lstrcatA(keypath, prod_squashed);
+
+    res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\");
+    lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\");
+    lstrcatA(keypath, prod_squashed);
+
+    res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    res = RegCreateKeyA(userkey, "InstallProperties", &props);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    lstrcpyA(val, path);
+    lstrcatA(val, "\\winetest.msi");
+    res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ,
+                         (const BYTE *)val, lstrlenA(val) + 1);
+    ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res);
+
+    hprod = 0xdeadbeef;
+    r = MsiOpenProductA(prodcode, &hprod);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(hprod != 0 && hprod != 0xdeadbeef, "Expected a valid product handle\n");
+
+    /* hProduct is invalid */
+    size = MAX_PATH;
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(0xdeadbeef, "ProductCode", val, &size);
+    ok(r == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", r);
+    ok(!lstrcmpA(val, "apple"),
+       "Expected val to be unchanged, got \"%s\"\n", val);
+    ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
+
+    /* szProperty is NULL */
+    size = MAX_PATH;
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, NULL, val, &size);
+    ok(r == ERROR_INVALID_PARAMETER,
+       "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+    ok(!lstrcmpA(val, "apple"),
+       "Expected val to be unchanged, got \"%s\"\n", val);
+    ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
+
+    /* szProperty is empty */
+    size = MAX_PATH;
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, "", val, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(val, ""), "Expected \"\", got \"%s\"\n", val);
+    ok(size == 0, "Expected 0, got %d\n", size);
+
+    /* get the property */
+    size = MAX_PATH;
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(val, prodcode),
+       "Expected \"%s\", got \"%s\"\n", prodcode, val);
+    ok(size == lstrlenA(prodcode),
+       "Expected %d, got %d\n", lstrlenA(prodcode), size);
+
+    /* lpValueBuf is NULL */
+    size = MAX_PATH;
+    r = MsiGetProductPropertyA(hprod, "ProductCode", NULL, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(size == lstrlenA(prodcode),
+       "Expected %d, got %d\n", lstrlenA(prodcode), size);
+
+    /* pcchValueBuf is NULL */
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, "ProductCode", val, NULL);
+    ok(r == ERROR_INVALID_PARAMETER,
+       "Expected ERROR_INVALID_PARAMETER, got %d\n", r);
+    ok(!lstrcmpA(val, "apple"),
+       "Expected val to be unchanged, got \"%s\"\n", val);
+    ok(size == lstrlenA(prodcode),
+       "Expected %d, got %d\n", lstrlenA(prodcode), size);
+
+    /* pcchValueBuf is too small */
+    size = 4;
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
+    ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
+    ok(!strncmp(val, prodcode, 3),
+       "Expected first 3 chars of \"%s\", got \"%s\"\n", prodcode, val);
+    ok(size == lstrlenA(prodcode),
+       "Expected %d, got %d\n", lstrlenA(prodcode), size);
+
+    /* pcchValueBuf does not leave room for NULL terminator */
+    size = lstrlenA(prodcode);
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
+    ok(r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", r);
+    ok(!strncmp(val, prodcode, lstrlenA(prodcode) - 1),
+       "Expected first 37 chars of \"%s\", got \"%s\"\n", prodcode, val);
+    ok(size == lstrlenA(prodcode),
+       "Expected %d, got %d\n", lstrlenA(prodcode), size);
+
+    /* pcchValueBuf has enough room for NULL terminator */
+    size = lstrlenA(prodcode) + 1;
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(val, prodcode),
+       "Expected \"%s\", got \"%s\"\n", prodcode, val);
+    ok(size == lstrlenA(prodcode),
+       "Expected %d, got %d\n", lstrlenA(prodcode), size);
+
+    /* nonexistent property */
+    size = MAX_PATH;
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, "IDontExist", val, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(val, ""), "Expected \"\", got \"%s\"\n", val);
+    ok(size == 0, "Expected 0, got %d\n", size);
+
+    r = MsiSetPropertyA(hprod, "NewProperty", "value");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    /* non-product property set */
+    size = MAX_PATH;
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, "NewProperty", val, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(val, ""), "Expected \"\", got \"%s\"\n", val);
+    ok(size == 0, "Expected 0, got %d\n", size);
+
+    r = MsiSetPropertyA(hprod, "ProductCode", "value");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    /* non-product property that is also a product property set */
+    size = MAX_PATH;
+    lstrcpyA(val, "apple");
+    r = MsiGetProductPropertyA(hprod, "ProductCode", val, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(val, prodcode),
+       "Expected \"%s\", got \"%s\"\n", prodcode, val);
+    ok(size == lstrlenA(prodcode),
+       "Expected %d, got %d\n", lstrlenA(prodcode), size);
+
+    MsiCloseHandle(hprod);
+
+    RegDeleteValueA(props, "LocalPackage");
+    RegDeleteKeyA(props, "");
+    RegCloseKey(props);
+    RegDeleteKeyA(userkey, "");
+    RegCloseKey(userkey);
+    RegDeleteKeyA(prodkey, "");
+    RegCloseKey(prodkey);
+    DeleteFileA(msifile);
+}
+
 START_TEST(package)
 {
     GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
@@ -9521,4 +9752,5 @@ START_TEST(package)
     test_sourcedir();
     test_access();
     test_emptypackage();
+    test_MsiGetProductProperty();
 }




More information about the wine-cvs mailing list