Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msi/tests/db.c | 176 +++++++++++++++++++++++++++++++++----------- 1 file changed, 132 insertions(+), 44 deletions(-)
diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 9fbf43eaee..16b20e530b 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -879,45 +879,17 @@ static void test_viewmodify(void) r = run_query( hdb, 0, query ); ok(r == ERROR_SUCCESS, "query failed\n");
- /* check what the error function reports without doing anything */ - sz = 0; - /* passing NULL as the 3rd param make function to crash on older platforms */ - err = MsiViewGetErrorA( 0, NULL, &sz ); - ok(err == MSIDBERROR_INVALIDARG, "MsiViewGetError return\n"); - - /* open a view */ query = "SELECT * FROM `phone`"; r = MsiDatabaseOpenViewA(hdb, query, &hview); ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
- /* see what happens with a good hview and bad args */ - err = MsiViewGetErrorA( hview, NULL, NULL ); - ok(err == MSIDBERROR_INVALIDARG || err == MSIDBERROR_NOERROR, - "MsiViewGetError returns %u (expected -3)\n", err); - err = MsiViewGetErrorA( hview, buffer, NULL ); - ok(err == MSIDBERROR_INVALIDARG, "MsiViewGetError return\n"); - - /* see what happens with a zero length buffer */ - sz = 0; - buffer[0] = 'x'; - err = MsiViewGetErrorA( hview, buffer, &sz ); - ok(err == MSIDBERROR_MOREDATA, "MsiViewGetError return\n"); - ok(buffer[0] == 'x', "buffer cleared\n"); - ok(sz == 0, "size not zero\n"); - - /* ok this one is strange */ - sz = 0; - err = MsiViewGetErrorA( hview, NULL, &sz ); - ok(err == MSIDBERROR_NOERROR, "MsiViewGetError return\n"); - ok(sz == 0, "size not zero\n"); - - /* see if it really has an error */ - sz = sizeof buffer; - buffer[0] = 'x'; + /* check what the error function reports without doing anything */ + sz = sizeof(buffer); + strcpy(buffer, "x"); err = MsiViewGetErrorA( hview, buffer, &sz ); - ok(err == MSIDBERROR_NOERROR, "MsiViewGetError return\n"); - ok(buffer[0] == 0, "buffer not cleared\n"); - ok(sz == 0, "size not zero\n"); + ok(err == MSIDBERROR_NOERROR, "got %d\n", err); + ok(!buffer[0], "got "%s"\n", buffer); + ok(sz == 0, "got size %u\n", sz);
r = MsiViewExecute(hview, 0); ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); @@ -933,12 +905,12 @@ static void test_viewmodify(void) r = MsiViewModify(hview, -1, hrec ); ok(r == ERROR_INVALID_DATA, "MsiViewModify failed\n");
- sz = sizeof buffer; - buffer[0] = 'x'; + sz = sizeof(buffer); + strcpy(buffer, "x"); err = MsiViewGetErrorA( hview, buffer, &sz ); - ok(err == MSIDBERROR_NOERROR, "MsiViewGetError return\n"); - ok(buffer[0] == 0, "buffer not cleared\n"); - ok(sz == 0, "size not zero\n"); + ok(err == MSIDBERROR_NOERROR, "got %d\n", err); + ok(!buffer[0], "got "%s"\n", buffer); + ok(sz == 0, "got size %u\n", sz);
r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n"); @@ -965,12 +937,12 @@ static void test_viewmodify(void) r = MsiViewModify(hview, MSIMODIFY_VALIDATE_NEW, hrec ); ok(r == ERROR_INVALID_DATA, "MsiViewModify failed %u\n", r);
- sz = sizeof buffer; - buffer[0] = 'x'; + sz = sizeof(buffer); + strcpy(buffer, "x"); err = MsiViewGetErrorA( hview, buffer, &sz ); - ok(err == MSIDBERROR_DUPLICATEKEY, "MsiViewGetError returned %u\n", err); - ok(!strcmp(buffer, "id"), "expected "id" c, got "%s"\n", buffer); - ok(sz == 2, "size not 2\n"); + ok(err == MSIDBERROR_DUPLICATEKEY, "got %d\n", err); + ok(!strcmp(buffer, "id"), "got "%s"\n", buffer); + ok(sz == 2, "got size %u\n", sz);
/* insert the same thing again */ r = MsiViewExecute(hview, 0); @@ -9109,6 +9081,121 @@ static void test_viewmodify_insert(void) DeleteFileA(msifile); }
+static void test_view_get_error(void) +{ + MSIHANDLE view, rec, db = create_db(); + MSIDBERROR err; + char buffer[5]; + DWORD sz; + UINT r; + + r = run_query(db, 0, "CREATE TABLE `T` (`A` SHORT, `B` SHORT NOT NULL PRIMARY KEY `A`)"); + ok(!r, "got %u\n", r); + r = run_query(db, 0, "INSERT INTO `T` (`A`, `B`) VALUES (1, 2)"); + r = run_query(db, 0, "CREATE TABLE `_Validation` (" + "`Table` CHAR(32) NOT NULL, `Column` CHAR(32) NOT NULL, " + "`Nullable` CHAR(4) NOT NULL, `MinValue` INT, `MaxValue` INT, " + "`KeyTable` CHAR(255), `KeyColumn` SHORT, `Category` CHAR(32), " + "`Set` CHAR(255), `Description` CHAR(255) PRIMARY KEY `Table`, `Column`)"); + ok(!r, "got %u\n", r); + r = run_query(db, 0, "INSERT INTO `_Validation` (`Table`, `Column`, `Nullable`) VALUES ('T', 'A', 'N')"); + ok(!r, "got %u\n", r); + r = run_query(db, 0, "INSERT INTO `_Validation` (`Table`, `Column`, `Nullable`) VALUES ('T', 'B', 'N')"); + ok(!r, "got %u\n", r); + + r = MsiDatabaseOpenViewA(db, "SELECT * FROM `T`", &view); + ok(!r, "got %u\n", r); + + r = MsiViewExecute(view, 0); + ok(!r, "got %u\n", r); + + sz = 0; + err = MsiViewGetErrorA(0, NULL, &sz); + ok(err == MSIDBERROR_INVALIDARG, "got %d\n", err); + ok(sz == 0, "got size %u\n", sz); + + err = MsiViewGetErrorA(view, NULL, NULL); + ok(err == MSIDBERROR_INVALIDARG, "got %d\n", err); + + sz = 0; + err = MsiViewGetErrorA(view, NULL, &sz); + ok(err == MSIDBERROR_NOERROR, "got %d\n", err); + ok(sz == 0, "got size %u\n", sz); + + sz = 0; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(err == MSIDBERROR_MOREDATA, "got %d\n", err); + ok(!strcmp(buffer, "x"), "got "%s"\n", buffer); + ok(sz == 0, "got size %u\n", sz); + + sz = 1; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(err == MSIDBERROR_NOERROR, "got %d\n", err); + ok(!buffer[0], "got "%s"\n", buffer); + ok(sz == 0, "got size %u\n", sz); + + rec = MsiCreateRecord(2); + MsiRecordSetInteger(rec, 1, 1); + MsiRecordSetInteger(rec, 2, 2); + r = MsiViewModify(view, MSIMODIFY_VALIDATE_NEW, rec); + ok(r == ERROR_INVALID_DATA, "got %u\n", r); + + sz = 2; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(err == MSIDBERROR_DUPLICATEKEY, "got %d\n", err); + ok(!strcmp(buffer, "A"), "got "%s"\n", buffer); + ok(sz == 1, "got size %u\n", sz); + + sz = 2; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + todo_wine ok(err == MSIDBERROR_NOERROR, "got %d\n", err); + todo_wine ok(!buffer[0], "got "%s"\n", buffer); + todo_wine ok(sz == 0, "got size %u\n", sz); + + r = MsiViewModify(view, MSIMODIFY_VALIDATE_NEW, rec); + ok(r == ERROR_INVALID_DATA, "got %u\n", r); + + sz = 1; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(err == MSIDBERROR_MOREDATA, "got %d\n", err); + todo_wine ok(!buffer[0], "got "%s"\n", buffer); + ok(sz == 1, "got size %u\n", sz); + + sz = 1; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + todo_wine ok(err == MSIDBERROR_NOERROR, "got %d\n", err); + todo_wine ok(!buffer[0], "got "%s"\n", buffer); + todo_wine ok(sz == 0, "got size %u\n", sz); + + r = MsiViewModify(view, MSIMODIFY_VALIDATE_NEW, rec); + ok(r == ERROR_INVALID_DATA, "got %u\n", r); + + sz = 0; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(err == MSIDBERROR_MOREDATA, "got %d\n", err); + ok(!strcmp(buffer, "x"), "got "%s"\n", buffer); + ok(sz == 1, "got size %u\n", sz); + + sz = 0; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(err == MSIDBERROR_MOREDATA, "got %d\n", err); + ok(!strcmp(buffer, "x"), "got "%s"\n", buffer); + todo_wine ok(sz == 0, "got size %u\n", sz); + + MsiCloseHandle(rec); + MsiCloseHandle(view); + MsiCloseHandle(db); + DeleteFileA(msifile); +} + START_TEST(db) { test_msidatabase(); @@ -9167,4 +9254,5 @@ START_TEST(db) test_primary_keys(); test_viewmodify_merge(); test_viewmodify_insert(); + test_view_get_error(); }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msi/msiquery.c | 26 ++++++-------------------- dlls/msi/tests/db.c | 4 ++-- 2 files changed, 8 insertions(+), 22 deletions(-)
diff --git a/dlls/msi/msiquery.c b/dlls/msi/msiquery.c index 862805fdbd..3c22a2159f 100644 --- a/dlls/msi/msiquery.c +++ b/dlls/msi/msiquery.c @@ -772,7 +772,6 @@ MSIDBERROR WINAPI MsiViewGetErrorW( MSIHANDLE handle, LPWSTR buffer, LPDWORD buf MSIQUERY *query; const WCHAR *column; MSIDBERROR r; - DWORD len;
TRACE("%u %p %p\n", handle, buffer, buflen);
@@ -786,15 +785,9 @@ MSIDBERROR WINAPI MsiViewGetErrorW( MSIHANDLE handle, LPWSTR buffer, LPDWORD buf if ((r = query->view->error)) column = query->view->error_column; else column = szEmpty;
- len = strlenW( column ); - if (buffer) - { - if (*buflen > len) - strcpyW( buffer, column ); - else - r = MSIDBERROR_MOREDATA; - } - *buflen = len; + if (msi_strncpyW(column, -1, buffer, buflen) == ERROR_MORE_DATA) + r = MSIDBERROR_MOREDATA; + msiobj_release( &query->hdr ); return r; } @@ -804,7 +797,6 @@ MSIDBERROR WINAPI MsiViewGetErrorA( MSIHANDLE handle, LPSTR buffer, LPDWORD bufl MSIQUERY *query; const WCHAR *column; MSIDBERROR r; - DWORD len;
TRACE("%u %p %p\n", handle, buffer, buflen);
@@ -818,15 +810,9 @@ MSIDBERROR WINAPI MsiViewGetErrorA( MSIHANDLE handle, LPSTR buffer, LPDWORD bufl if ((r = query->view->error)) column = query->view->error_column; else column = szEmpty;
- len = WideCharToMultiByte( CP_ACP, 0, column, -1, NULL, 0, NULL, NULL ); - if (buffer) - { - if (*buflen >= len) - WideCharToMultiByte( CP_ACP, 0, column, -1, buffer, *buflen, NULL, NULL ); - else - r = MSIDBERROR_MOREDATA; - } - *buflen = len - 1; + if (msi_strncpyWtoA(column, -1, buffer, buflen, FALSE) == ERROR_MORE_DATA) + r = MSIDBERROR_MOREDATA; + msiobj_release( &query->hdr ); return r; } diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 16b20e530b..181301e1fe 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -9163,14 +9163,14 @@ static void test_view_get_error(void) strcpy(buffer, "x"); err = MsiViewGetErrorA(view, buffer, &sz); ok(err == MSIDBERROR_MOREDATA, "got %d\n", err); - todo_wine ok(!buffer[0], "got "%s"\n", buffer); + ok(!buffer[0], "got "%s"\n", buffer); ok(sz == 1, "got size %u\n", sz);
sz = 1; strcpy(buffer, "x"); err = MsiViewGetErrorA(view, buffer, &sz); todo_wine ok(err == MSIDBERROR_NOERROR, "got %d\n", err); - todo_wine ok(!buffer[0], "got "%s"\n", buffer); + ok(!buffer[0], "got "%s"\n", buffer); todo_wine ok(sz == 0, "got size %u\n", sz);
r = MsiViewModify(view, MSIMODIFY_VALIDATE_NEW, rec);
Signed-off-by: Hans Leidekker hans@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46830 Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msi/msiquery.c | 80 +++++++++++++++++++++++++++--- dlls/msi/tests/custom.c | 104 +++++++++++++++++++++++++++++++++++++++ dlls/msi/tests/install.c | 15 ++++++ dlls/msi/winemsi.idl | 2 + 4 files changed, 195 insertions(+), 6 deletions(-)
diff --git a/dlls/msi/msiquery.c b/dlls/msi/msiquery.c index 3c22a2159f..2569d214c9 100644 --- a/dlls/msi/msiquery.c +++ b/dlls/msi/msiquery.c @@ -778,9 +778,35 @@ MSIDBERROR WINAPI MsiViewGetErrorW( MSIHANDLE handle, LPWSTR buffer, LPDWORD buf if (!buflen) return MSIDBERROR_INVALIDARG;
- query = msihandle2msiinfo( handle, MSIHANDLETYPE_VIEW ); - if( !query ) - return MSIDBERROR_INVALIDARG; + if (!(query = msihandle2msiinfo(handle, MSIHANDLETYPE_VIEW))) + { + WCHAR *remote_column = NULL; + MSIHANDLE remote; + + if (!(remote = msi_get_remote(handle))) + return MSIDBERROR_INVALIDARG; + + if (!*buflen) + return MSIDBERROR_FUNCTIONERROR; + + __TRY + { + r = remote_ViewGetError(remote, &remote_column); + } + __EXCEPT(rpc_filter) + { + r = GetExceptionCode(); + } + __ENDTRY; + + if (msi_strncpyW(remote_column ? remote_column : szEmpty, -1, buffer, buflen) == ERROR_MORE_DATA) + r = MSIDBERROR_MOREDATA; + + if (remote_column) + midl_user_free(remote_column); + + return r; + }
if ((r = query->view->error)) column = query->view->error_column; else column = szEmpty; @@ -803,9 +829,35 @@ MSIDBERROR WINAPI MsiViewGetErrorA( MSIHANDLE handle, LPSTR buffer, LPDWORD bufl if (!buflen) return MSIDBERROR_INVALIDARG;
- query = msihandle2msiinfo( handle, MSIHANDLETYPE_VIEW ); - if (!query) - return MSIDBERROR_INVALIDARG; + if (!(query = msihandle2msiinfo(handle, MSIHANDLETYPE_VIEW))) + { + WCHAR *remote_column = NULL; + MSIHANDLE remote; + + if (!(remote = msi_get_remote(handle))) + return MSIDBERROR_INVALIDARG; + + if (!*buflen) + return MSIDBERROR_FUNCTIONERROR; + + __TRY + { + r = remote_ViewGetError(remote, &remote_column); + } + __EXCEPT(rpc_filter) + { + r = GetExceptionCode(); + } + __ENDTRY; + + if (msi_strncpyWtoA(remote_column ? remote_column : szEmpty, -1, buffer, buflen, FALSE) == ERROR_MORE_DATA) + r = MSIDBERROR_MOREDATA; + + if (remote_column) + midl_user_free(remote_column); + + return r; + }
if ((r = query->view->error)) column = query->view->error_column; else column = szEmpty; @@ -1199,6 +1251,22 @@ UINT __cdecl s_remote_ViewGetColumnInfo(MSIHANDLE view, MSICOLINFO info, struct return r; }
+MSIDBERROR __cdecl s_remote_ViewGetError(MSIHANDLE view, LPWSTR *column) +{ + WCHAR empty[1]; + DWORD size = 1; + UINT r; + + r = MsiViewGetErrorW(view, empty, &size); + if (r == MSIDBERROR_MOREDATA) + { + if (!(*column = midl_user_allocate(++size * sizeof(WCHAR)))) + return MSIDBERROR_FUNCTIONERROR; + r = MsiViewGetErrorW(view, *column, &size); + } + return r; +} + UINT __cdecl s_remote_ViewModify(MSIHANDLE view, MSIMODIFY mode, struct wire_record *remote_rec, struct wire_record **remote_refreshed) { diff --git a/dlls/msi/tests/custom.c b/dlls/msi/tests/custom.c index 43b8369b17..3a189efff6 100644 --- a/dlls/msi/tests/custom.c +++ b/dlls/msi/tests/custom.c @@ -1159,6 +1159,109 @@ static void test_invalid_functions(MSIHANDLE hinst) MsiCloseHandle(db); }
+static void test_view_get_error(MSIHANDLE hinst) +{ + MSIHANDLE db, view, rec; + char buffer[5]; + MSIDBERROR err; + DWORD sz; + UINT r; + + db = MsiGetActiveDatabase(hinst); + ok(hinst, db, "MsiGetActiveDatabase failed\n"); + + r = MsiDatabaseOpenViewA(db, "SELECT * FROM `test2`", &view); + ok(hinst, !r, "got %u\n", r); + + r = MsiViewExecute(view, 0); + ok(hinst, !r, "got %u\n", r); + + sz = 0; + err = MsiViewGetErrorA(0, NULL, &sz); + todo_wine ok(hinst, err == MSIDBERROR_FUNCTIONERROR, "got %d\n", err); + ok(hinst, sz == 0, "got size %u\n", sz); + + err = MsiViewGetErrorA(view, NULL, NULL); + ok(hinst, err == MSIDBERROR_INVALIDARG, "got %d\n", err); + + sz = 0; + err = MsiViewGetErrorA(view, NULL, &sz); + ok(hinst, err == MSIDBERROR_FUNCTIONERROR, "got %d\n", err); + ok(hinst, sz == 0, "got size %u\n", sz); + + sz = 0; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(hinst, err == MSIDBERROR_FUNCTIONERROR, "got %d\n", err); + ok(hinst, !strcmp(buffer, "x"), "got "%s"\n", buffer); + ok(hinst, sz == 0, "got size %u\n", sz); + + sz = 1; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(hinst, err == MSIDBERROR_NOERROR, "got %d\n", err); + ok(hinst, !buffer[0], "got "%s"\n", buffer); + ok(hinst, sz == 0, "got size %u\n", sz); + + rec = MsiCreateRecord(2); + MsiRecordSetInteger(rec, 1, 1); + MsiRecordSetInteger(rec, 2, 2); + r = MsiViewModify(view, MSIMODIFY_VALIDATE_NEW, rec); + ok(hinst, r == ERROR_INVALID_DATA, "got %u\n", r); + + sz = 2; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(hinst, err == MSIDBERROR_DUPLICATEKEY, "got %d\n", err); + ok(hinst, !strcmp(buffer, "A"), "got "%s"\n", buffer); + ok(hinst, sz == 1, "got size %u\n", sz); + + sz = 2; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + todo_wine ok(hinst, err == MSIDBERROR_NOERROR, "got %d\n", err); + todo_wine ok(hinst, !buffer[0], "got "%s"\n", buffer); + todo_wine ok(hinst, sz == 0, "got size %u\n", sz); + + r = MsiViewModify(view, MSIMODIFY_VALIDATE_NEW, rec); + ok(hinst, r == ERROR_INVALID_DATA, "got %u\n", r); + + sz = 1; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(hinst, err == MSIDBERROR_MOREDATA, "got %d\n", err); + ok(hinst, !buffer[0], "got "%s"\n", buffer); + ok(hinst, sz == 1, "got size %u\n", sz); + + sz = 1; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + todo_wine ok(hinst, err == MSIDBERROR_NOERROR, "got %d\n", err); + ok(hinst, !buffer[0], "got "%s"\n", buffer); + todo_wine ok(hinst, sz == 0, "got size %u\n", sz); + + r = MsiViewModify(view, MSIMODIFY_VALIDATE_NEW, rec); + ok(hinst, r == ERROR_INVALID_DATA, "got %u\n", r); + + sz = 0; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(hinst, err == MSIDBERROR_FUNCTIONERROR, "got %d\n", err); + ok(hinst, !strcmp(buffer, "x"), "got "%s"\n", buffer); + ok(hinst, sz == 0, "got size %u\n", sz); + + sz = 0; + strcpy(buffer, "x"); + err = MsiViewGetErrorA(view, buffer, &sz); + ok(hinst, err == MSIDBERROR_FUNCTIONERROR, "got %d\n", err); + ok(hinst, !strcmp(buffer, "x"), "got "%s"\n", buffer); + ok(hinst, sz == 0, "got size %u\n", sz); + + MsiCloseHandle(rec); + MsiCloseHandle(view); + MsiCloseHandle(db); +} + /* Main test. Anything that doesn't depend on a specific install configuration * or have undesired side effects should go here. */ UINT WINAPI main_test(MSIHANDLE hinst) @@ -1186,6 +1289,7 @@ UINT WINAPI main_test(MSIHANDLE hinst) test_format_record(hinst); test_costs(hinst); test_invalid_functions(hinst); + test_view_get_error(hinst);
return ERROR_SUCCESS; } diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index 9c8652b353..3c040e350c 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -699,6 +699,19 @@ static const CHAR ca1_test_seq_dat[] = "Action\tCondition\tSequence\n" "nested1\t\t1\n" "nested51\t\t2\n";
+static const CHAR ca1_test2_dat[] = + "A\tB\n" + "i2\ti2\n" + "test2\tA\n" + "1\t2\n"; + +static const CHAR ca1__validation_dat[] = + "Table\tColumn\tNullable\tMinValue\tMaxValue\tKeyTable\tKeyColumn\tCategory\tSet\tDescription\n" + "s32\ts32\ts4\tI4\tI4\tS255\tI2\tS32\tS255\tS255\n" + "_Validation\tTable\tColumn\n" + "test2\tA\tN\t\t\t\t\t\t\t\n" + "test2\tB\tN\t\t\t\t\t\t\t\n"; + static const CHAR ca51_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" @@ -1713,6 +1726,8 @@ static const msi_table ca1_tables[] = ADD_TABLE(ca1_install_exec_seq), ADD_TABLE(ca1_custom_action), ADD_TABLE(ca1_test_seq), + ADD_TABLE(ca1_test2), + ADD_TABLE(ca1__validation), };
static const msi_table ca51_tables[] = diff --git a/dlls/msi/winemsi.idl b/dlls/msi/winemsi.idl index 1658603694..7888b0ceb4 100644 --- a/dlls/msi/winemsi.idl +++ b/dlls/msi/winemsi.idl @@ -32,6 +32,7 @@ typedef int INSTALLSTATE; typedef int MSICOLINFO; typedef int MSIMODIFY; typedef int MSICOSTTREE; +typedef int MSIDBERROR;
#define MSIFIELD_NULL 0 #define MSIFIELD_INT 1 @@ -68,6 +69,7 @@ interface IWineMsiRemote UINT remote_ViewExecute( [in] MSIHANDLE view, [in, unique] struct wire_record *record ); UINT remote_ViewFetch( [in] MSIHANDLE view, [out] struct wire_record **record ); UINT remote_ViewGetColumnInfo( [in] MSIHANDLE view, [in] MSICOLINFO info, [out] struct wire_record **record ); + MSIDBERROR remote_ViewGetError( [in] MSIHANDLE view, [out, string] LPWSTR *column ); UINT remote_ViewModify( [in] MSIHANDLE view, [in] MSIMODIFY mode, [in] struct wire_record *record, [out] struct wire_record **refreshed );
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=50013
Your paranoid android.
=== w2008s64 (task log) ===
Task errors: The task timed out
=== w1064 (64 bit report) ===
msi: action.c:6247: Test failed: Expected ERROR_SUCCESS, got 1618 action.c:6253: Test failed: Expected ERROR_FILE_NOT_FOUND, got 0 action.c:6259: Test failed: Expected ERROR_FILE_NOT_FOUND, got 0 action.c:6265: Test failed: Expected ERROR_FILE_NOT_FOUND, got 0 action.c:6271: Test failed: Expected ERROR_FILE_NOT_FOUND, got 0 custom.c:1636: Test failed: failed to get value "Wine.Dotnet.Assembly,processorArchitecture="MSIL",publicKeyToken="abcdef0123456789",version="1.0.0.0",culture="neutral"": 2 custom.c:1638: Test failed: "Wine.Dotnet.Assembly,processorArchitecture="MSIL",publicKeyToken="abcdef0123456789",version="1.0.0.0",culture="neutral"": expected "rcHQPHq?CA@Uv-XqMI1e>Z'q,T*76M@=YEg6My?~]", got "ØÒ%Éx" action.c:6284: Test failed: Expected ERROR_SUCCESS, got 2 action.c:6285: Test failed: Key doesn't exist or wrong type action.c:6290: Test failed: Expected ERROR_SUCCESS, got 2 action.c:6291: Test failed: Key doesn't exist or wrong type action.c:6295: Test failed: Expected ERROR_SUCCESS, got 2 action.c:6296: Test failed: Key doesn't exist or wrong type action.c:6301: Test failed: Expected ERROR_SUCCESS, got 2 action.c:6302: Test failed: Key doesn't exist or wrong type custom.c:1636: Test failed: failed to get value "Wine.Dotnet.Assembly,processorArchitecture="MSIL",publicKeyToken="abcdef0123456789",version="1.0.0.0",culture="neutral"": 2 custom.c:1638: Test failed: "Wine.Dotnet.Assembly,processorArchitecture="MSIL",publicKeyToken="abcdef0123456789",version="1.0.0.0",culture="neutral"": expected "rcHQPHq?CA@Uv-XqMI1e>Z'q,T*76M@=YEg6My?~]", got "xÕp·"
Report errors: msi:action contains a misplaced failure message for custom
=== wxppro (32 bit report) ===
msi: custom.c:1134: Test failed: got 1620
Report errors: msi:install contains a misplaced failure message for custom
=== w2008s64 (task log) ===
Task errors: The task timed out
=== w7u (task log) ===
Task errors: The task timed out
=== w2008s64 (64 bit report) ===
msi: install: Timeout
=== w7u (32 bit report) ===
msi: msi: Timeout
=== wxppro (task log) ===
Task errors: TestBot process got stuck or died unexpectedly The previous 1 run(s) terminated abnormally
Signed-off-by: Hans Leidekker hans@codeweavers.com
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=50011
Your paranoid android.
=== w2008s64 (task log) ===
Task errors: Unable to set the VM system time: network read timed out (settime/connect:AgentVersion.h:0/9). Maybe the TestAgentd process is missing the required privileges.