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?…
==============================================================================
--- 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…
==============================================================================
--- 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=41…
==============================================================================
--- 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?r…
==============================================================================
--- 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=4…
==============================================================================
--- 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?r…
==============================================================================
--- 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?re…
==============================================================================
--- 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;
}