[ros-diffs] [cwittich] 41309: sync jscript and msi winetests with wine 1.1.23

cwittich at svn.reactos.org cwittich at svn.reactos.org
Sat Jun 6 17:59:12 CEST 2009


Author: cwittich
Date: Sat Jun  6 19:59:11 2009
New Revision: 41309

URL: http://svn.reactos.org/svn/reactos?rev=41309&view=rev
Log:
sync jscript and msi winetests with wine 1.1.23

Modified:
    trunk/rostests/winetests/jscript/api.js
    trunk/rostests/winetests/jscript/lang.js
    trunk/rostests/winetests/msi/db.c
    trunk/rostests/winetests/msi/install.c
    trunk/rostests/winetests/msi/msi.c
    trunk/rostests/winetests/msi/package.c
    trunk/rostests/winetests/msi/source.c

Modified: trunk/rostests/winetests/jscript/api.js
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/jscript/api.js?rev=41309&r1=41308&r2=41309&view=diff
==============================================================================
--- trunk/rostests/winetests/jscript/api.js [iso-8859-1] (original)
+++ trunk/rostests/winetests/jscript/api.js [iso-8859-1] Sat Jun  6 19:59:11 2009
@@ -618,6 +618,12 @@
 tmp = Math.pow(2, 2, 3);
 ok(tmp === 4, "Math.pow(2, 2, 3) = " + tmp);
 
+tmp = Math.pow(2);
+ok(isNaN(tmp), "Math.pow(2) is not NaN");
+
+tmp = Math.pow();
+ok(isNaN(tmp), "Math.pow() is not NaN");
+
 tmp = Math.random();
 ok(typeof(tmp) == "number", "typeof(tmp) = " + typeof(tmp));
 ok(0 <= tmp && tmp <= 1, "Math.random() = " + tmp);
@@ -625,6 +631,285 @@
 tmp = Math.random(100);
 ok(typeof(tmp) == "number", "typeof(tmp) = " + typeof(tmp));
 ok(0 <= tmp && tmp <= 1, "Math.random(100) = " + tmp);
+
+tmp = Math.acos(0);
+ok(Math.floor(tmp*100) === 157, "Math.acos(0) = " + tmp);
+
+tmp = Math.acos(1);
+ok(Math.floor(tmp*100) === 0, "Math.acos(1) = " + tmp);
+
+tmp = Math.acos(-1);
+ok(Math.floor(tmp*100) === 314, "Math.acos(-1) = " + tmp);
+
+tmp = Math.acos(Math.PI/4, 2);
+ok(Math.floor(tmp*100) === 66, "Math.acos(Math.PI/4, 2) = " + tmp);
+
+tmp = Math.acos(true);
+ok(Math.floor(tmp*100) === 0, "Math.acos(true) = " + tmp);
+
+tmp = Math.acos(false);
+ok(Math.floor(tmp*100) === 157, "Math.acos(false) = " + tmp);
+
+tmp = Math.acos(1.1);
+ok(isNaN(tmp), "Math.acos(1.1) is not NaN");
+
+tmp = Math.acos();
+ok(isNaN(tmp), "Math.acos() is not NaN");
+
+tmp = Math.acos(NaN);
+ok(isNaN(tmp), "Math.acos(NaN) is not NaN");
+
+tmp = Math.acos(Infinity);
+ok(isNaN(tmp), "Math.acos(Infinity) is not NaN");
+
+tmp = Math.acos(-Infinity);
+ok(isNaN(tmp), "Math.acos(-Infinity) is not NaN");
+
+tmp = Math.asin(0);
+ok(Math.floor(tmp*100) === 0, "Math.asin(0) = " + tmp);
+
+tmp = Math.asin(1);
+ok(Math.floor(tmp*100) === 157, "Math.asin(1) = " + tmp);
+
+tmp = Math.asin(-1);
+ok(Math.floor(tmp*100) === -158, "Math.asin(-1) = " + tmp);
+
+tmp = Math.asin(Math.PI/4, 2);
+ok(Math.floor(tmp*100) === 90, "Math.asin(Math.PI/4, 2) = " + tmp);
+
+tmp = Math.asin(true);
+ok(Math.floor(tmp*100) === 157, "Math.asin(true) = " + tmp);
+
+tmp = Math.asin(false);
+ok(Math.floor(tmp*100) === 0, "Math.asin(false) = " + tmp);
+
+tmp = Math.asin(1.1);
+ok(isNaN(tmp), "Math.asin(1.1) is not NaN");
+
+tmp = Math.asin();
+ok(isNaN(tmp), "Math.asin() is not NaN");
+
+tmp = Math.asin(NaN);
+ok(isNaN(tmp), "Math.asin(NaN) is not NaN");
+
+tmp = Math.asin(Infinity);
+ok(isNaN(tmp), "Math.asin(Infinity) is not NaN");
+
+tmp = Math.asin(-Infinity);
+ok(isNaN(tmp), "Math.asin(-Infinity) is not NaN");
+
+tmp = Math.atan(0);
+ok(Math.floor(tmp*100) === 0, "Math.atan(0) = " + tmp);
+
+tmp = Math.atan(1);
+ok(Math.floor(tmp*100) === 78, "Math.atan(1) = " + tmp);
+
+tmp = Math.atan(-1);
+ok(Math.floor(tmp*100) === -79, "Math.atan(-1) = " + tmp);
+
+tmp = Math.atan(true);
+ok(Math.floor(tmp*100) === 78, "Math.atan(true) = " + tmp);
+
+tmp = Math.atan(false);
+ok(Math.floor(tmp*100) === 0, "Math.atan(false) = " + tmp);
+
+tmp = Math.atan();
+ok(isNaN(tmp), "Math.atan() is not NaN");
+
+tmp = Math.atan(NaN);
+ok(isNaN(tmp), "Math.atan(NaN) is not NaN");
+
+tmp = Math.atan(Infinity);
+ok(Math.floor(tmp*100) === 157, "Math.atan(Infinity) = " + tmp);
+
+tmp = Math.atan(-Infinity);
+ok(Math.floor(tmp*100) === -158, "Math.atan(Infinity) = " + tmp);
+
+tmp = Math.atan2(0, 0);
+ok(Math.floor(tmp*100) === 0, "Math.atan2(0, 0) = " + tmp);
+
+tmp = Math.atan2(0, 1);
+ok(Math.floor(tmp*100) === 0, "Math.atan2(0, 1) = " + tmp);
+
+tmp = Math.atan2(0, Infinity);
+ok(Math.floor(tmp*100) === 0, "Math.atan2(0, Infinity) = " + tmp);
+
+tmp = Math.atan2(0, -1);
+ok(Math.floor(tmp*100) === 314, "Math.atan2(0, -1) = " + tmp);
+
+tmp = Math.atan2(0, -Infinity);
+ok(Math.floor(tmp*100) === 314, "Math.atan2(0, -Infinity) = " + tmp);
+
+tmp = Math.atan2(1, 0);
+ok(Math.floor(tmp*100) === 157, "Math.atan2(1, 0) = " + tmp);
+
+tmp = Math.atan2(Infinity, 0);
+ok(Math.floor(tmp*100) === 157, "Math.atan2(Infinity, 0) = " + tmp);
+
+tmp = Math.atan2(-1, 0);
+ok(Math.floor(tmp*100) === -158, "Math.atan2(-1, 0) = " + tmp);
+
+tmp = Math.atan2(-Infinity, 0);
+ok(Math.floor(tmp*100) === -158, "Math.atan2(-Infinity, 0) = " + tmp);
+
+tmp = Math.atan2(1, 1);
+ok(Math.floor(tmp*100) === 78, "Math.atan2(1, 1) = " + tmp);
+
+tmp = Math.atan2(-1, -1);
+ok(Math.floor(tmp*100) === -236, "Math.atan2(-1, -1) = " + tmp);
+
+tmp = Math.atan2(-1, 1);
+ok(Math.floor(tmp*100) === -79, "Math.atan2(-1, 1) = " + tmp);
+
+tmp = Math.atan2(Infinity, Infinity);
+ok(Math.floor(tmp*100) === 78, "Math.atan2(Infinity, Infinity) = " + tmp);
+
+tmp = Math.atan2(Infinity, -Infinity, 1);
+ok(Math.floor(tmp*100) === 235, "Math.atan2(Infinity, -Infinity, 1) = " + tmp);
+
+tmp = Math.atan2();
+ok(isNaN(tmp), "Math.atan2() is not NaN");
+
+tmp = Math.atan2(1);
+ok(isNaN(tmp), "Math.atan2(1) is not NaN");
+
+tmp = Math.exp(0);
+ok(tmp === 1, "Math.exp(0) = " + tmp);
+
+tmp = Math.exp(1);
+ok(Math.floor(tmp*100) === 271, "Math.exp(1) = " + tmp);
+
+tmp = Math.exp(-1);
+ok(Math.floor(tmp*100) === 36, "Math.exp(-1) = " + tmp);
+
+tmp = Math.exp(true);
+ok(Math.floor(tmp*100) === 271, "Math.exp(true) = " + tmp);
+
+tmp = Math.exp(1, 1);
+ok(Math.floor(tmp*100) === 271, "Math.exp(1, 1) = " + tmp);
+
+tmp = Math.exp();
+ok(isNaN(tmp), "Math.exp() is not NaN");
+
+tmp = Math.exp(NaN);
+ok(isNaN(tmp), "Math.exp(NaN) is not NaN");
+
+tmp = Math.exp(Infinity);
+ok(tmp === Infinity, "Math.exp(Infinity) = " + tmp);
+
+tmp = Math.exp(-Infinity);
+ok(tmp === 0, "Math.exp(-Infinity) = " + tmp);
+
+tmp = Math.log(1);
+ok(Math.floor(tmp*100) === 0, "Math.log(1) = " + tmp);
+
+tmp = Math.log(-1);
+ok(isNaN(tmp), "Math.log(-1) is not NaN");
+
+tmp = Math.log(true);
+ok(Math.floor(tmp*100) === 0, "Math.log(true) = " + tmp);
+
+tmp = Math.log(1, 1);
+ok(Math.floor(tmp*100) === 0, "Math.log(1, 1) = " + tmp);
+
+tmp = Math.log();
+ok(isNaN(tmp), "Math.log() is not NaN");
+
+tmp = Math.log(NaN);
+ok(isNaN(tmp), "Math.log(NaN) is not NaN");
+
+tmp = Math.log(Infinity);
+ok(tmp === Infinity, "Math.log(Infinity) = " + tmp);
+
+tmp = Math.log(-Infinity);
+ok(isNaN(tmp), "Math.log(-Infinity) is not NaN");
+
+tmp = Math.sin(0);
+ok(tmp === 0, "Math.sin(0) = " + tmp);
+
+tmp = Math.sin(Math.PI/2);
+ok(tmp === 1, "Math.sin(Math.PI/2) = " + tmp);
+
+tmp = Math.sin(-Math.PI/2);
+ok(tmp === -1, "Math.sin(-Math.PI/2) = " + tmp);
+
+tmp = Math.sin(Math.PI/3, 2);
+ok(Math.floor(tmp*100) === 86, "Math.sin(Math.PI/3, 2) = " + tmp);
+
+tmp = Math.sin(true);
+ok(Math.floor(tmp*100) === 84, "Math.sin(true) = " + tmp);
+
+tmp = Math.sin(false);
+ok(tmp === 0, "Math.sin(false) = " + tmp);
+
+tmp = Math.sin();
+ok(isNaN(tmp), "Math.sin() is not NaN");
+
+tmp = Math.sin(NaN);
+ok(isNaN(tmp), "Math.sin(NaN) is not NaN");
+
+tmp = Math.sin(Infinity);
+ok(isNaN(tmp), "Math.sin(Infinity) is not NaN");
+
+tmp = Math.sin(-Infinity);
+ok(isNaN(tmp), "Math.sin(-Infinity) is not NaN");
+
+tmp = Math.sqrt(0);
+ok(tmp === 0, "Math.sqrt(0) = " + tmp);
+
+tmp = Math.sqrt(4);
+ok(tmp === 2, "Math.sqrt(4) = " + tmp);
+
+tmp = Math.sqrt(-1);
+ok(isNaN(tmp), "Math.sqrt(-1) is not NaN");
+
+tmp = Math.sqrt(2, 2);
+ok(Math.floor(tmp*100) === 141, "Math.sqrt(2, 2) = " + tmp);
+
+tmp = Math.sqrt(true);
+ok(tmp === 1, "Math.sqrt(true) = " + tmp);
+
+tmp = Math.sqrt(false);
+ok(tmp === 0, "Math.sqrt(false) = " + tmp);
+
+tmp = Math.sqrt();
+ok(isNaN(tmp), "Math.sqrt() is not NaN");
+
+tmp = Math.sqrt(NaN);
+ok(isNaN(tmp), "Math.sqrt(NaN) is not NaN");
+
+tmp = Math.sqrt(Infinity);
+ok(tmp === Infinity, "Math.sqrt(Infinity) = " + tmp);
+
+tmp = Math.sqrt(-Infinity);
+ok(isNaN(tmp), "Math.sqrt(-Infinity) is not NaN");
+
+tmp = Math.tan(0);
+ok(tmp === 0, "Math.tan(0) = " + tmp);
+
+tmp = Math.tan(Math.PI);
+ok(Math.floor(tmp*100) === -1, "Math.tan(Math.PI) = " + tmp);
+
+tmp = Math.tan(2, 2);
+ok(Math.floor(tmp*100) === -219, "Math.tan(2, 2) = " + tmp);
+
+tmp = Math.tan(true);
+ok(Math.floor(tmp*100) === 155, "Math.tan(true) = " + tmp);
+
+tmp = Math.tan(false);
+ok(tmp === 0, "Math.tan(false) = " + tmp);
+
+tmp = Math.tan();
+ok(isNaN(tmp), "Math.tan() is not NaN");
+
+tmp = Math.tan(NaN);
+ok(isNaN(tmp), "Math.tan(NaN) is not NaN");
+
+tmp = Math.tan(Infinity);
+ok(isNaN(tmp), "Math.tan(Infinity) is not NaN");
+
+tmp = Math.tan(-Infinity);
+ok(isNaN(tmp), "Math.tan(-Infinity) is not NaN");
 
 var func = function  (a) {
         var a = 1;
@@ -649,6 +934,16 @@
 date = new Date(100);
 ok(date.getTime() === 100, "date.getTime() = " + date.getTime());
 ok(Date.prototype.getTime() === 0, "date.prototype.getTime() = " + Date.prototype.getTime());
+date = new Date(8.64e15);
+ok(date.getTime() === 8.64e15, "date.getTime() = " + date.getTime());
+date = new Date(8.64e15+1);
+ok(isNaN(0+date.getTime()), "date.getTime() is not NaN");
+date = new Date(Infinity);
+ok(isNaN(0+date.getTime()), "date.getTime() is not NaN");
+
+ok(date.setTime(123) === 123, "date.setTime(123) !== 123");
+ok(date.setTime("123", NaN) === 123, "date.setTime(\"123\") !== 123");
+ok(isNaN(date.setTime(NaN)), "date.setTime(NaN) is not NaN");
 
 ok(typeof(Math.PI) === "number", "typeof(Math.PI) = " + typeof(Math.PI));
 ok(Math.floor(Math.PI*100) === 314, "Math.PI = " + Math.PI);
@@ -675,4 +970,19 @@
 Math.LN2 = "test";
 ok(Math.floor(Math.LN2*100) === 69, "modified Math.LN2 = " + Math.LN2);
 
+ok(typeof(Math.LN10) === "number", "typeof(Math.LN10) = " + typeof(Math.LN10));
+ok(Math.floor(Math.LN10*100) === 230, "Math.LN10 = " + Math.LN10);
+Math.LN10 = "test";
+ok(Math.floor(Math.LN10*100) === 230, "modified Math.LN10 = " + Math.LN10);
+
+ok(typeof(Math.SQRT2) === "number", "typeof(Math.SQRT2) = " + typeof(Math.SQRT2));
+ok(Math.floor(Math.SQRT2*100) === 141, "Math.SQRT2 = " + Math.SQRT2);
+Math.SQRT2 = "test";
+ok(Math.floor(Math.SQRT2*100) === 141, "modified Math.SQRT2 = " + Math.SQRT2);
+
+ok(typeof(Math.SQRT1_2) === "number", "typeof(Math.SQRT1_2) = " + typeof(Math.SQRT1_2));
+ok(Math.floor(Math.SQRT1_2*100) === 70, "Math.SQRT1_2 = " + Math.SQRT1_2);
+Math.SQRT1_2 = "test";
+ok(Math.floor(Math.SQRT1_2*100) === 70, "modified Math.SQRT1_2 = " + Math.SQRT1_2);
+
 reportSuccess();

Modified: trunk/rostests/winetests/jscript/lang.js
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/jscript/lang.js?rev=41309&r1=41308&r2=41309&view=diff
==============================================================================
--- trunk/rostests/winetests/jscript/lang.js [iso-8859-1] (original)
+++ trunk/rostests/winetests/jscript/lang.js [iso-8859-1] Sat Jun  6 19:59:11 2009
@@ -33,6 +33,10 @@
 ok(null === null, "null === null is false");
 ok(undefined === undefined, "undefined === undefined is false");
 ok(!(undefined === null), "!(undefined === null) is false");
+ok(1E0 === 1, "1E0 === 1 is false");
+ok(1000000*1000000 === 1000000000000, "1000000*1000000 === 1000000000000 is false");
+ok(8.64e15 === 8640000000000000, "8.64e15 !== 8640000000000000"+8.64e15);
+ok(1e2147483648 === Infinity, "1e2147483648 !== Infinity");
 
 ok(1 !== 2, "1 !== 2 is false");
 ok(null !== undefined, "null !== undefined is false");

Modified: trunk/rostests/winetests/msi/db.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/db.c?rev=41309&r1=41308&r2=41309&view=diff
==============================================================================
--- trunk/rostests/winetests/msi/db.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/msi/db.c [iso-8859-1] Sat Jun  6 19:59:11 2009
@@ -24,6 +24,7 @@
 
 #include <windows.h>
 #include <msi.h>
+#include <msidefs.h>
 #include <msiquery.h>
 
 #include <objidl.h>
@@ -1482,6 +1483,89 @@
     DeleteFile(msifile);
 }
 
+static void test_binary(void)
+{
+    MSIHANDLE hdb = 0, rec;
+    char file[MAX_PATH];
+    char buf[MAX_PATH];
+    DWORD size;
+    LPCSTR query;
+    UINT r;
+
+    /* insert a file into the Binary table */
+    r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb );
+    ok( r == ERROR_SUCCESS , "Failed to open database\n" );
+
+    query = "CREATE TABLE `Binary` ( `Name` CHAR(72) NOT NULL, `ID` INT NOT NULL, `Data` OBJECT  PRIMARY KEY `Name`, `ID`)";
+    r = run_query( hdb, 0, query );
+    ok( r == ERROR_SUCCESS, "Cannot create Binary table: %d\n", r );
+
+    create_file( "test.txt" );
+    rec = MsiCreateRecord( 1 );
+    r = MsiRecordSetStream( rec, 1, "test.txt" );
+    ok( r == ERROR_SUCCESS, "Failed to add stream data to the record: %d\n", r);
+    DeleteFile( "test.txt" );
+
+    query = "INSERT INTO `Binary` ( `Name`, `ID`, `Data` ) VALUES ( 'filename1', 1, ? )";
+    r = run_query( hdb, rec, query );
+    ok( r == ERROR_SUCCESS, "Insert into Binary table failed: %d\n", r );
+
+    r = MsiCloseHandle( rec );
+    ok( r == ERROR_SUCCESS , "Failed to close record handle\n" );
+
+    r = MsiDatabaseCommit( hdb );
+    ok( r == ERROR_SUCCESS , "Failed to commit database\n" );
+
+    r = MsiCloseHandle( hdb );
+    ok( r == ERROR_SUCCESS , "Failed to close database\n" );
+
+    /* read file from the Stream table */
+    r = MsiOpenDatabase( msifile, MSIDBOPEN_READONLY, &hdb );
+    ok( r == ERROR_SUCCESS , "Failed to open database\n" );
+
+    query = "SELECT * FROM `_Streams`";
+    r = do_query( hdb, query, &rec );
+    ok( r == ERROR_SUCCESS, "SELECT query failed: %d\n", r );
+
+    size = MAX_PATH;
+    r = MsiRecordGetString( rec, 1, file, &size );
+    ok( r == ERROR_SUCCESS, "Failed to get string: %d\n", r );
+    ok( !lstrcmp(file, "Binary.filename1.1"), "Expected 'Binary.filename1.1', got %s\n", file );
+
+    size = MAX_PATH;
+    memset( buf, 0, MAX_PATH );
+    r = MsiRecordReadStream( rec, 2, buf, &size );
+    ok( r == ERROR_SUCCESS, "Failed to get stream: %d\n", r );
+    ok( !lstrcmp(buf, "test.txt\n"), "Expected 'test.txt\\n', got %s\n", buf );
+
+    r = MsiCloseHandle( rec );
+    ok( r == ERROR_SUCCESS , "Failed to close record handle\n" );
+
+    /* read file from the Binary table */
+    query = "SELECT * FROM `Binary`";
+    r = do_query( hdb, query, &rec );
+    ok( r == ERROR_SUCCESS, "SELECT query failed: %d\n", r );
+
+    size = MAX_PATH;
+    r = MsiRecordGetString( rec, 1, file, &size );
+    ok( r == ERROR_SUCCESS, "Failed to get string: %d\n", r );
+    ok( !lstrcmp(file, "filename1"), "Expected 'filename1', got %s\n", file );
+
+    size = MAX_PATH;
+    memset( buf, 0, MAX_PATH );
+    r = MsiRecordReadStream( rec, 3, buf, &size );
+    ok( r == ERROR_SUCCESS, "Failed to get stream: %d\n", r );
+    ok( !lstrcmp(buf, "test.txt\n"), "Expected 'test.txt\\n', got %s\n", buf );
+
+    r = MsiCloseHandle( rec );
+    ok( r == ERROR_SUCCESS , "Failed to close record handle\n" );
+
+    r = MsiCloseHandle( hdb );
+    ok( r == ERROR_SUCCESS , "Failed to close database\n" );
+
+    DeleteFile( msifile );
+}
+
 static void test_where(void)
 {
     MSIHANDLE hdb = 0, rec, view;
@@ -1628,6 +1712,24 @@
                                 "a\tb\tc\td\te\tf\n"
                                 "g\th\ti\tj\tk\tl\r\n";
 
+static const CHAR suminfo[] = "PropertyId\tValue\n"
+                              "i2\tl255\n"
+                              "_SummaryInformation\tPropertyId\n"
+                              "1\t1252\n"
+                              "2\tInstaller Database\n"
+                              "3\tInstaller description\n"
+                              "4\tWineHQ\n"
+                              "5\tInstaller\n"
+                              "6\tInstaller comments\n"
+                              "7\tIntel;1033\n"
+                              "9\t{12345678-1234-1234-1234-123456789012}\n"
+                              "12\t2009/04/12 15:46:11\n"
+                              "13\t2009/04/12 15:46:11\n"
+                              "14\t200\n"
+                              "15\t2\n"
+                              "18\tVim\n"
+                              "19\t2\n";
+
 static void write_file(const CHAR *filename, const char *data, int data_size)
 {
     DWORD size;
@@ -1648,6 +1750,128 @@
     DeleteFileA("temp_file");
 
     return r;
+}
+
+static void test_suminfo_import(void)
+{
+    MSIHANDLE hdb, hsi, view = 0;
+    LPCSTR query;
+    UINT r, count, size, type;
+    char str_value[50];
+    INT int_value;
+    FILETIME ft_value;
+
+    GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
+
+    r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATE, &hdb);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+
+    r = add_table_to_db(hdb, suminfo);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+
+    /* _SummaryInformation is not imported as a regular table... */
+
+    query = "SELECT * FROM `_SummaryInformation`";
+    r = MsiDatabaseOpenViewA(hdb, query, &view);
+    ok(r == ERROR_BAD_QUERY_SYNTAX, "Expected ERROR_BAD_QUERY_SYNTAX, got %u\n", r);
+    MsiCloseHandle(view);
+
+    /* ...its data is added to the special summary information stream */
+
+    r = MsiGetSummaryInformationA(hdb, NULL, 0, &hsi);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+
+    r = MsiSummaryInfoGetPropertyCount(hsi, &count);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(count == 14, "Expected 14, got %u\n", count);
+
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_CODEPAGE, &type, &int_value, NULL, NULL, NULL);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type ==  VT_I2, "Expected VT_I2, got %u\n", type);
+    ok(int_value == 1252, "Expected 1252, got %d\n", int_value);
+
+    size = sizeof(str_value);
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_TITLE, &type, NULL, NULL, str_value, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type);
+    ok(size == 18, "Expected 18, got %u\n", size);
+    ok(!strcmp(str_value, "Installer Database"),
+       "Expected \"Installer Database\", got %s\n", str_value);
+
+    size = sizeof(str_value);
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_SUBJECT, &type, NULL, NULL, str_value, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type);
+    ok(!strcmp(str_value, "Installer description"),
+       "Expected \"Installer description\", got %s\n", str_value);
+
+    size = sizeof(str_value);
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_AUTHOR, &type, NULL, NULL, str_value, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type);
+    ok(!strcmp(str_value, "WineHQ"),
+       "Expected \"WineHQ\", got %s\n", str_value);
+
+    size = sizeof(str_value);
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_KEYWORDS, &type, NULL, NULL, str_value, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type);
+    ok(!strcmp(str_value, "Installer"),
+       "Expected \"Installer\", got %s\n", str_value);
+
+    size = sizeof(str_value);
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_COMMENTS, &type, NULL, NULL, str_value, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type);
+    ok(!strcmp(str_value, "Installer comments"),
+       "Expected \"Installer comments\", got %s\n", str_value);
+
+    size = sizeof(str_value);
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_TEMPLATE, &type, NULL, NULL, str_value, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type);
+    ok(!strcmp(str_value, "Intel;1033"),
+       "Expected \"Intel;1033\", got %s\n", str_value);
+
+    size = sizeof(str_value);
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_REVNUMBER, &type, NULL, NULL, str_value, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type);
+    ok(!strcmp(str_value, "{12345678-1234-1234-1234-123456789012}"),
+       "Expected \"{12345678-1234-1234-1234-123456789012}\", got %s\n", str_value);
+
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_CREATE_DTM, &type, NULL, &ft_value, NULL, NULL);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_FILETIME, "Expected VT_FILETIME, got %u\n", type);
+
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_LASTSAVE_DTM, &type, NULL, &ft_value, NULL, NULL);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_FILETIME, "Expected VT_FILETIME, got %u\n", type);
+
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_PAGECOUNT, &type, &int_value, NULL, NULL, NULL);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type ==  VT_I4, "Expected VT_I4, got %u\n", type);
+    ok(int_value == 200, "Expected 200, got %d\n", int_value);
+
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_WORDCOUNT, &type, &int_value, NULL, NULL, NULL);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type ==  VT_I4, "Expected VT_I4, got %u\n", type);
+    ok(int_value == 2, "Expected 2, got %d\n", int_value);
+
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_SECURITY, &type, &int_value, NULL, NULL, NULL);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type ==  VT_I4, "Expected VT_I4, got %u\n", type);
+    ok(int_value == 2, "Expected 2, got %d\n", int_value);
+
+    size = sizeof(str_value);
+    r = MsiSummaryInfoGetPropertyA(hsi, PID_APPNAME, &type, NULL, NULL, str_value, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
+    ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type);
+    ok(!strcmp(str_value, "Vim"), "Expected \"Vim\", got %s\n", str_value);
+
+    MsiCloseHandle(hsi);
+    MsiCloseHandle(hdb);
+    DeleteFileA(msifile);
 }
 
 static void test_msiimport(void)
@@ -1854,6 +2078,63 @@
     MsiCloseHandle(view);
     MsiCloseHandle(hdb);
     DeleteFileA(msifile);
+}
+
+static const CHAR bin_import_dat[] = "Name\tData\r\n"
+                                     "s72\tV0\r\n"
+                                     "Binary\tName\r\n"
+                                     "filename1\tfilename1.ibd\r\n";
+
+static void test_binary_import(void)
+{
+    MSIHANDLE hdb = 0, rec;
+    char file[MAX_PATH];
+    char buf[MAX_PATH];
+    char path[MAX_PATH];
+    DWORD size;
+    LPCSTR query;
+    UINT r;
+
+    /* create files to import */
+    write_file("bin_import.idt", bin_import_dat,
+          (sizeof(bin_import_dat) - 1) * sizeof(char));
+    CreateDirectory("bin_import", NULL);
+    create_file_data("bin_import/filename1.ibd", "just some words", 15);
+
+    /* import files into database */
+    r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
+    ok( r == ERROR_SUCCESS , "Failed to open database\n");
+
+    GetCurrentDirectory(MAX_PATH, path);
+    r = MsiDatabaseImport(hdb, path, "bin_import.idt");
+    ok(r == ERROR_SUCCESS , "Failed to import Binary table\n");
+
+    /* read file from the Binary table */
+    query = "SELECT * FROM `Binary`";
+    r = do_query(hdb, query, &rec);
+    ok(r == ERROR_SUCCESS, "SELECT query failed: %d\n", r);
+
+    size = MAX_PATH;
+    r = MsiRecordGetString(rec, 1, file, &size);
+    ok(r == ERROR_SUCCESS, "Failed to get string: %d\n", r);
+    ok(!lstrcmp(file, "filename1"), "Expected 'filename1', got %s\n", file);
+
+    size = MAX_PATH;
+    memset(buf, 0, MAX_PATH);
+    r = MsiRecordReadStream(rec, 2, buf, &size);
+    ok(r == ERROR_SUCCESS, "Failed to get stream: %d\n", r);
+    ok(!lstrcmp(buf, "just some words"),
+        "Expected 'just some words', got %s\n", buf);
+
+    r = MsiCloseHandle(rec);
+    ok(r == ERROR_SUCCESS , "Failed to close record handle\n");
+
+    r = MsiCloseHandle(hdb);
+    ok(r == ERROR_SUCCESS , "Failed to close database\n");
+
+    DeleteFile("bin_import/filename1.ibd");
+    RemoveDirectory("bin_import");
+    DeleteFile("bin_import.idt");
 }
 
 static void test_markers(void)
@@ -6804,6 +7085,92 @@
     r = run_query(hdb, 0, query);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
 
+    query = "DROP TABLE `One`";
+    r = run_query(hdb, 0, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    query = "DROP TABLE `One`";
+    r = run_query(href, 0, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    query = "CREATE TABLE `One` ( `A` INT, `B` CHAR(72) PRIMARY KEY `A` )";
+    r = run_query(href, 0, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    query = "INSERT INTO `One` ( `A`, `B` ) VALUES ( 1, 'hi' )";
+    r = run_query(href, 0, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    /* table from merged database is not in target database */
+    r = MsiDatabaseMergeA(hdb, href, "MergeErrors");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    query = "SELECT * FROM `One`";
+    r = do_query(hdb, query, &hrec);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    r = MsiRecordGetInteger(hrec, 1);
+    ok(r == 1, "Expected 1, got %d\n", r);
+
+    size = MAX_PATH;
+    r = MsiRecordGetStringA(hrec, 2, buf, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(buf, "hi"), "Expected \"hi\", got \"%s\"\n", buf);
+
+    MsiCloseHandle(hrec);
+
+    /* nothing in MergeErrors */
+    query = "SELECT * FROM `MergeErrors`";
+    r = do_query(hdb, query, &hrec);
+    ok(r == ERROR_BAD_QUERY_SYNTAX,
+       "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
+
+    query = "DROP TABLE `One`";
+    r = run_query(hdb, 0, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    query = "DROP TABLE `One`";
+    r = run_query(href, 0, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    query = "CREATE TABLE `One` ( "
+            "`A` CHAR(72), `B` INT PRIMARY KEY `A` )";
+    r = run_query(hdb, 0, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    query = "CREATE TABLE `One` ( "
+            "`A` CHAR(72), `B` INT PRIMARY KEY `A` )";
+    r = run_query(href, 0, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    query = "INSERT INTO `One` ( `A`, `B` ) VALUES ( 'hi', 1 )";
+    r = run_query(href, 0, query);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    /* primary key is string */
+    r = MsiDatabaseMergeA(hdb, href, "MergeErrors");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    query = "SELECT * FROM `One`";
+    r = do_query(hdb, query, &hrec);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    size = MAX_PATH;
+    r = MsiRecordGetStringA(hrec, 1, buf, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(buf, "hi"), "Expected \"hi\", got \"%s\"\n", buf);
+
+    r = MsiRecordGetInteger(hrec, 2);
+    ok(r == 1, "Expected 1, got %d\n", r);
+
+    MsiCloseHandle(hrec);
+
+    /* nothing in MergeErrors */
+    query = "SELECT * FROM `MergeErrors`";
+    r = do_query(hdb, query, &hrec);
+    ok(r == ERROR_BAD_QUERY_SYNTAX,
+       "Expected ERROR_BAD_QUERY_SYNTAX, got %d\n", r);
+
     create_file_data("codepage.idt", "\r\n\r\n850\t_ForceCodepage\r\n", 0);
 
     GetCurrentDirectoryA(MAX_PATH, buf);
@@ -6899,12 +7266,9 @@
     size = MAX_PATH;
     ZeroMemory(buf, MAX_PATH);
     r = MsiRecordReadStream(hrec, 2, buf, &size);
-    todo_wine
-    {
-        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-        ok(!lstrcmpA(buf, "binary.dat\n"),
-           "Expected \"binary.dat\\n\", got \"%s\"\n", buf);
-    }
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(buf, "binary.dat\n"),
+       "Expected \"binary.dat\\n\", got \"%s\"\n", buf);
 
     MsiCloseHandle(hrec);
 
@@ -7528,8 +7892,10 @@
     test_msiexport();
     test_longstrings();
     test_streamtable();
+    test_binary();
     test_where();
     test_msiimport();
+    test_binary_import();
     test_markers();
     test_handle_limit();
     test_try_transform();
@@ -7559,4 +7925,5 @@
     test_dbmerge();
     test_insertorder();
     test_columnorder();
+    test_suminfo_import();
 }

Modified: trunk/rostests/winetests/msi/install.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/install.c?rev=41309&r1=41308&r2=41309&view=diff
==============================================================================
--- trunk/rostests/winetests/msi/install.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/msi/install.c [iso-8859-1] Sat Jun  6 19:59:11 2009
@@ -39,6 +39,8 @@
     (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD);
 static UINT (WINAPI *pMsiSourceListGetInfoA)
     (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD);
+
+static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
 
 static HMODULE hsrclient = 0;
 static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD);
@@ -1316,6 +1318,7 @@
 static void init_functionpointers(void)
 {
     HMODULE hmsi = GetModuleHandleA("msi.dll");
+    HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
 
 #define GET_PROC(mod, func) \
     p ## func = (void*)GetProcAddress(mod, #func); \
@@ -1326,6 +1329,8 @@
     GET_PROC(hmsi, MsiSourceListEnumSourcesA);
     GET_PROC(hmsi, MsiSourceListGetInfoA);
 
+    GET_PROC(hadvapi32, ConvertSidToStringSidA);
+
     hsrclient = LoadLibraryA("srclient.dll");
     GET_PROC(hsrclient, SRRemoveRestorePoint);
     GET_PROC(hsrclient, SRSetRestorePointA);
@@ -1346,26 +1351,28 @@
     return FALSE;
 }
 
-static void get_user_sid(LPSTR *usersid)
+static LPSTR get_user_sid(LPSTR *usersid)
 {
     HANDLE token;
     BYTE buf[1024];
     DWORD size;
     PTOKEN_USER user;
-    HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
-    static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
+
+    if (!pConvertSidToStringSidA)
+    {
+        win_skip("ConvertSidToStringSidA is not available\n");
+        return NULL;
+    }
 
     *usersid = NULL;
-    pConvertSidToStringSidA = (void *)GetProcAddress(hadvapi32, "ConvertSidToStringSidA");
-    if (!pConvertSidToStringSidA)
-        return;
-
     OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
     size = sizeof(buf);
     GetTokenInformation(token, TokenUser, buf, size, &size);
     user = (PTOKEN_USER)buf;
     pConvertSidToStringSidA(user->User.Sid, usersid);
+    ok(*usersid != NULL, "pConvertSidToStringSidA failed lre=%d\n", GetLastError());
     CloseHandle(token);
+    return *usersid;
 }
 
 static BOOL check_record(MSIHANDLE rec, UINT field, LPCSTR val)
@@ -2511,12 +2518,8 @@
     static const CHAR userugkey[] = "Software\\Microsoft\\Installer\\UpgradeCodes"
                                     "\\51AAE0C44620A5E4788506E91F249BD2";
 
-    get_user_sid(&usersid);
-    if (!usersid)
-    {
-        skip("ConvertSidToStringSidA is not available\n");
+    if (!get_user_sid(&usersid))
         return;
-    }
 
     get_date_str(date);
     GetTempPath(MAX_PATH, temp);
@@ -2756,12 +2759,8 @@
     static const CHAR machprod[] = "Installer\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB";
     static const CHAR machup[] = "Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2";
 
-    get_user_sid(&usersid);
-    if (!usersid)
-    {
-        skip("ConvertSidToStringSidA is not available\n");
+    if (!get_user_sid(&usersid))
         return;
-    }
 
     GetTempPath(MAX_PATH, temp);
 
@@ -2952,12 +2951,8 @@
     static const CHAR classfeat[] = "Software\\Classes\\Installer\\Features"
                                     "\\84A88FD7F6998CE40A22FB59F6B9C2BB";
 
-    get_user_sid(&usersid);
-    if (!usersid)
-    {
-        skip("ConvertSidToStringSidA is not available\n");
+    if (!get_user_sid(&usersid))
         return;
-    }
 
     CreateDirectoryA("msitest", NULL);
     create_file("msitest\\maximus", 500);
@@ -3114,12 +3109,8 @@
         "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\"
         "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties";
 
-    get_user_sid(&usersid);
-    if (!usersid)
-    {
-        skip("ConvertSidToStringSidA is not available\n");
+    if (!get_user_sid(&usersid))
         return;
-    }
 
     get_owner_company(&owner, &company);
 
@@ -3197,12 +3188,8 @@
     static const CHAR compkey[] =
         "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components";
 
-    get_user_sid(&usersid);
-    if (!usersid)
-    {
-        skip("ConvertSidToStringSidA is not available\n");
+    if (!get_user_sid(&usersid))
         return;
-    }
 
     CreateDirectoryA("msitest", NULL);
     create_file("msitest\\maximus", 500);
@@ -3322,7 +3309,7 @@
 
     if (!pMsiQueryComponentStateA)
     {
-        skip("MsiQueryComponentStateA is not available\n");
+        win_skip("MsiQueryComponentStateA is not available\n");
         return;
     }
 
@@ -3810,7 +3797,7 @@
 
     if (!pMsiSourceListEnumSourcesA || !pMsiSourceListGetInfoA)
     {
-        skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n");
+        win_skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n");
         return;
     }
 

Modified: trunk/rostests/winetests/msi/msi.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/msi.c?rev=41309&r1=41308&r2=41309&view=diff
==============================================================================
--- trunk/rostests/winetests/msi/msi.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/msi/msi.c [iso-8859-1] Sat Jun  6 19:59:11 2009
@@ -190,7 +190,7 @@
 
     if (!pMsiUseFeatureExA)
     {
-        skip("MsiUseFeatureExA not implemented\n");
+        win_skip("MsiUseFeatureExA not implemented\n");
         return;
     }
 
@@ -408,7 +408,7 @@
 
     if (!pMsiGetFileHashA)
     {
-        skip("MsiGetFileHash not implemented\n");
+        win_skip("MsiGetFileHash not implemented\n");
         return;
     }
 
@@ -1221,7 +1221,7 @@
 
     if (!pMsiQueryComponentStateA)
     {
-        skip("MsiQueryComponentStateA not implemented\n");
+        win_skip("MsiQueryComponentStateA not implemented\n");
         return;
     }
 
@@ -3864,7 +3864,7 @@
 
     if (!pMsiGetProductInfoExA)
     {
-        skip("MsiGetProductInfoExA is not available\n");
+        win_skip("MsiGetProductInfoExA is not available\n");
         return;
     }
 
@@ -10958,7 +10958,7 @@
     test_MsiGetFileHash();
 
     if (!pConvertSidToStringSidA)
-        skip("ConvertSidToStringSidA not implemented\n");
+        win_skip("ConvertSidToStringSidA not implemented\n");
     else
     {
         /* These tests rely on get_user_sid that needs ConvertSidToStringSidA */

Modified: trunk/rostests/winetests/msi/package.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/package.c?rev=41309&r1=41308&r2=41309&view=diff
==============================================================================
--- trunk/rostests/winetests/msi/package.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/msi/package.c [iso-8859-1] Sat Jun  6 19:59:11 2009
@@ -34,26 +34,46 @@
 
 static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR);
 
-static void get_user_sid(LPSTR *usersid)
+static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
+
+static void init_functionpointers(void)
+{
+    HMODULE hmsi = GetModuleHandleA("msi.dll");
+    HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
+
+#define GET_PROC(mod, func) \
+    p ## func = (void*)GetProcAddress(mod, #func);
+
+    GET_PROC(hmsi, MsiApplyMultiplePatchesA);
+
+    GET_PROC(hadvapi32, ConvertSidToStringSidA);
+
+#undef GET_PROC
+}
+
+
+static LPSTR get_user_sid(LPSTR *usersid)
 {
     HANDLE token;
     BYTE buf[1024];
     DWORD size;
     PTOKEN_USER user;
-    HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll");
-    static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*);
+
+    if (!pConvertSidToStringSidA)
+    {
+        win_skip("ConvertSidToStringSidA is not available\n");
+        return NULL;
+    }
 
     *usersid = NULL;
-    pConvertSidToStringSidA = (void *)GetProcAddress(hadvapi32, "ConvertSidToStringSidA");
-    if (!pConvertSidToStringSidA)
-        return;
-
     OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token);
     size = sizeof(buf);
     GetTokenInformation(token, TokenUser, buf, size, &size);
     user = (PTOKEN_USER)buf;
     pConvertSidToStringSidA(user->User.Sid, usersid);
+    ok(*usersid != NULL, "pConvertSidToStringSidA failed lre=%d\n", GetLastError());
     CloseHandle(token);
+    return *usersid;
 }
 
 /* RegDeleteTreeW from dlls/advapi32/registry.c */
@@ -919,6 +939,7 @@
     sz = sizeof tempdir - 1;
     r = MsiGetTargetPath( hpkg, "TARGETDIR", tempdir, &sz );
     sprintf( file, "%srootfile.txt", tempdir );
+    buffer[0] = 0;
     query_file_path( hpkg, "[#RootFile]", buffer );
     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
     ok( !lstrcmp(buffer, file), "Expected %s, got %s\n", file, buffer );
@@ -959,13 +980,13 @@
     ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r );
 
     query_file_path( hpkg, "[#TestFile]", buffer );
-    ok( !lstrcmp(buffer, "C:\\one\\two\\TestDir\\testfile.txt"),
+    ok( !lstrcmpi(buffer, "C:\\one\\two\\TestDir\\testfile.txt"),
         "Expected C:\\one\\two\\TestDir\\testfile.txt, got %s\n", buffer );
 
     sz = sizeof buffer - 1;
     r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz );
     ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r);
-    ok( !lstrcmp(buffer, "C:\\one\\two\\"), "Expected C:\\one\\two\\, got %s\n", buffer);
+    ok( !lstrcmpi(buffer, "C:\\one\\two\\"), "Expected C:\\one\\two\\, got %s\n", buffer);
 
     MsiCloseHandle( hpkg );
 }
@@ -7336,12 +7357,8 @@
     DWORD size;
     UINT r;
 
-    get_user_sid(&usersid);
-    if (!usersid)
-    {
-        skip("ConvertSidToStringSidA is not available\n");
+    if (!get_user_sid(&usersid))
         return;
-    }
 
     create_test_file("FileName1");
     create_test_file("FileName4");
@@ -8773,7 +8790,7 @@
     search_absolute_directory(path, CURR_DIR + 3);
     r = MsiGetPropertyA(hpkg, "SIGPROP3", prop, &size);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
+    ok(!lstrcmpiA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
 
     size = MAX_PATH;
     r = MsiGetPropertyA(hpkg, "SIGPROP4", prop, &size);
@@ -8820,7 +8837,7 @@
     search_absolute_directory(path, "");
     r = MsiGetPropertyA(hpkg, "SIGPROP11", prop, &size);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
+    ok(!lstrcmpiA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop);
 
     DeleteFileA("FileName1");
     DeleteFileA("FileName3.dll");
@@ -10045,6 +10062,14 @@
        "Expected path to be unchanged, got \"%s\"\n", path);
     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
 
+    /* source path does not exist, but the property exists */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
     /* try SubDir after FileCost */
     size = MAX_PATH;
     lstrcpyA(path, "kiwi");
@@ -10088,6 +10113,14 @@
     ok(!lstrcmpA(path, "kiwi"),
        "Expected path to be unchanged, got \"%s\"\n", path);
     ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
+
+    /* source path does not exist, but the property exists */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
 
     /* try SubDir after CostFinalize */
     size = MAX_PATH;
@@ -10166,22 +10199,71 @@
     hpkg = package_from_db(hdb);
     ok(hpkg, "failed to create package\n");
 
-    r = MsiDoAction(hpkg, "CostInitialize");
-    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    r = MsiDoAction(hpkg, "FileCost");
-    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-    r = MsiDoAction(hpkg, "CostFinalize");
-    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
-
-    /* try TARGETDIR after CostFinalize */
+    /* try TARGETDIR */
     size = MAX_PATH;
     lstrcpyA(path, "kiwi");
     r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
+    ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
+    ok(!lstrcmpA(path, "kiwi"),
+       "Expected path to be unchanged, got \"%s\"\n", path);
+    ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
+
+    /* try SourceDir */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
+    ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
+    ok(!lstrcmpA(path, "kiwi"),
+       "Expected path to be unchanged, got \"%s\"\n", path);
+    ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
+
+    /* try SOURCEDIR */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
+    ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
+    ok(!lstrcmpA(path, "kiwi"),
+       "Expected path to be unchanged, got \"%s\"\n", path);
+    ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
+
+    /* source path nor the property exist */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path);
+    ok(size == 0, "Expected 0, got %d\n", size);
+
+    /* try SubDir */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
+    ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
+    ok(!lstrcmpA(path, "kiwi"),
+       "Expected path to be unchanged, got \"%s\"\n", path);
+    ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
+
+    /* try SubDir2 */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
+    ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r);
+    ok(!lstrcmpA(path, "kiwi"),
+       "Expected path to be unchanged, got \"%s\"\n", path);
+    ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size);
+
+    r = MsiDoAction(hpkg, "CostInitialize");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    /* try TARGETDIR after CostInitialize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
     ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
 
-    /* try SourceDir after CostFinalize */
+    /* try SourceDir after CostInitialize */
     size = MAX_PATH;
     lstrcpyA(path, "kiwi");
     r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
@@ -10189,7 +10271,7 @@
     ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
     ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
 
-    /* try SOURCEDIR after CostFinalize */
+    /* try SOURCEDIR after CostInitialize */
     size = MAX_PATH;
     lstrcpyA(path, "kiwi");
     r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
@@ -10199,6 +10281,179 @@
         ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
         ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
     }
+
+    /* source path does not exist, but the property exists */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    todo_wine
+    {
+        ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+        ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+    }
+
+    /* try SubDir after CostInitialize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SubDir2 after CostInitialize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    r = MsiDoAction(hpkg, "ResolveSource");
+    ok(r == ERROR_SUCCESS, "file cost failed\n");
+
+    /* try TARGETDIR after ResolveSource */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SourceDir after ResolveSource */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SOURCEDIR after ResolveSource */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+        ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+    }
+
+    /* source path and the property exist */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SubDir after ResolveSource */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SubDir2 after ResolveSource */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    r = MsiDoAction(hpkg, "FileCost");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    /* try TARGETDIR after CostFinalize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SourceDir after CostFinalize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SOURCEDIR after CostFinalize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+        ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+    }
+
+    /* source path and the property exist */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SubDir after CostFinalize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SubDir", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SubDir2 after CostFinalize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SubDir2", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    r = MsiDoAction(hpkg, "CostFinalize");
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+
+    /* try TARGETDIR after CostFinalize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "TARGETDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SourceDir after CostFinalize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SourceDir", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+
+    /* try SOURCEDIR after CostFinalize */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size);
+    todo_wine
+    {
+        ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+        ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+        ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
+    }
+
+    /* source path and the property exist */
+    size = MAX_PATH;
+    lstrcpyA(path, "kiwi");
+    r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size);
+    ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
+    ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path);
+    ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size);
 
     /* try SubDir after CostFinalize */
     size = MAX_PATH;
@@ -11041,8 +11296,8 @@
 
 static void test_emptypackage(void)
 {
-    MSIHANDLE hpkg, hdb, hsuminfo;
-    MSIHANDLE hview, hrec;
+    MSIHANDLE hpkg = 0, hdb = 0, hsuminfo = 0;
+    MSIHANDLE hview = 0, hrec = 0;
     MSICONDITION condition;
     CHAR buffer[MAX_PATH];
     DWORD size;
@@ -11208,7 +11463,6 @@
     CHAR prodcode[MAX_PATH];
     CHAR prod_squashed[MAX_PATH];
     HKEY prodkey, userkey, props;
-    LPSTR usersid;
     DWORD size;
     LONG res;
     UINT r;
@@ -11226,7 +11480,6 @@
     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);
@@ -11617,9 +11870,7 @@
 
 START_TEST(package)
 {
-    HMODULE hmsi = GetModuleHandleA("msi.dll");
-
-    pMsiApplyMultiplePatchesA = (void *)GetProcAddress(hmsi, "MsiApplyMultiplePatchesA");
+    init_functionpointers();
 
     GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
 

Modified: trunk/rostests/winetests/msi/source.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msi/source.c?rev=41309&r1=41308&r2=41309&view=diff
==============================================================================
--- trunk/rostests/winetests/msi/source.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/msi/source.c [iso-8859-1] Sat Jun  6 19:59:11 2009
@@ -193,7 +193,7 @@
 
     if (!pMsiSourceListGetInfoA)
     {
-        skip("Skipping MsiSourceListGetInfoA tests\n");
+        win_skip("Skipping MsiSourceListGetInfoA tests\n");
         return;
     }
 
@@ -645,7 +645,7 @@
 
     if (!pMsiSourceListAddSourceExA)
     {
-        skip("Skipping MsiSourceListAddSourceExA tests\n");
+        win_skip("Skipping MsiSourceListAddSourceExA tests\n");
         return;
     }
 
@@ -1018,7 +1018,7 @@
 
     if (!pMsiSourceListEnumSourcesA)
     {
-        skip("MsiSourceListEnumSourcesA is not available\n");
+        win_skip("MsiSourceListEnumSourcesA is not available\n");
         return;
     }
 
@@ -1620,7 +1620,7 @@
 
     if (!pMsiSourceListSetInfoA)
     {
-        skip("MsiSourceListSetInfoA is not available\n");
+        win_skip("MsiSourceListSetInfoA is not available\n");
         return;
     }
 
@@ -2030,7 +2030,7 @@
 
     if (!pMsiSourceListAddMediaDiskA)
     {
-        skip("MsiSourceListAddMediaDiskA is not available\n");
+        win_skip("MsiSourceListAddMediaDiskA is not available\n");
         return;
     }
 
@@ -2332,7 +2332,7 @@
 
     if (!pMsiSourceListEnumMediaDisksA)
     {
-        skip("MsiSourceListEnumMediaDisksA is not available\n");
+        win_skip("MsiSourceListEnumMediaDisksA is not available\n");
         return;
     }
 
@@ -3131,7 +3131,7 @@
 
     if (!pMsiSourceListAddSourceA)
     {
-        skip("Skipping MsiSourceListAddSourceA tests\n");
+        win_skip("Skipping MsiSourceListAddSourceA tests\n");
         return;
     }
 



More information about the Ros-diffs mailing list