Zebediah Figura : kernel32/tests: Handle notifications on the parent dir more gracefully.
Module: wine Branch: master Commit: 50ca65d17270f3d9b308c7603e30351aa9ce2fcf URL: https://source.winehq.org/git/wine.git/?a=commit;h=50ca65d17270f3d9b308c7603... Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Mon Feb 19 16:10:18 2018 -0600 kernel32/tests: Handle notifications on the parent dir more gracefully. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/tests/change.c | 49 +++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/dlls/kernel32/tests/change.c b/dlls/kernel32/tests/change.c index 4accad0..f4abad4 100644 --- a/dlls/kernel32/tests/change.c +++ b/dlls/kernel32/tests/change.c @@ -383,6 +383,7 @@ static void test_readdirectorychanges(void) static const WCHAR szHoo[] = { '\\','h','o','o',0 }; static const WCHAR szGa[] = { '\\','h','o','o','\\','g','a',0 }; PFILE_NOTIFY_INFORMATION pfni; + BOOL got_subdir_change = FALSE; if (!pReadDirectoryChangesW) { @@ -550,26 +551,40 @@ static void test_readdirectorychanges(void) r = CreateDirectoryW( subsubdir, NULL ); ok( r == TRUE, "failed to create directory\n"); - r = WaitForSingleObject( ov.hEvent, 1000 ); - ok( r == WAIT_OBJECT_0, "should be ready\n" ); + while (1) + { + r = WaitForSingleObject( ov.hEvent, 1000 ); + ok(r == WAIT_OBJECT_0, "should be ready\n" ); + if (r == WAIT_TIMEOUT) break; - ok( (NTSTATUS)ov.Internal == STATUS_SUCCESS, "ov.Internal wrong\n"); - ok( ov.InternalHigh == 0x18 || ov.InternalHigh == 0x12 + 0x18, - "ov.InternalHigh wrong %lx\n", ov.InternalHigh); + ok((NTSTATUS) ov.Internal == STATUS_SUCCESS, "ov.Internal wrong\n"); - pfni = (PFILE_NOTIFY_INFORMATION) buffer; - if (pfni->NextEntryOffset) /* we may get a modified event on the parent dir */ - { - ok( pfni->NextEntryOffset == 0x12, "offset wrong %x\n", pfni->NextEntryOffset ); - ok( pfni->Action == FILE_ACTION_MODIFIED, "action wrong %d\n", pfni->Action ); - ok( pfni->FileNameLength == 3*sizeof(WCHAR), "len wrong\n" ); - ok( !memcmp(pfni->FileName,&szGa[1],3*sizeof(WCHAR)), "name wrong\n"); - pfni = (PFILE_NOTIFY_INFORMATION)((char *)pfni + pfni->NextEntryOffset); + pfni = (PFILE_NOTIFY_INFORMATION) buffer; + while (1) + { + /* We might get one or more modified events on the parent dir */ + if (pfni->Action == FILE_ACTION_MODIFIED) + { + ok(pfni->FileNameLength == 3 * sizeof(WCHAR), "len wrong\n" ); + ok(!memcmp(pfni->FileName, &szGa[1], 3 * sizeof(WCHAR)), "name wrong\n"); + } + else + { + ok(pfni->Action == FILE_ACTION_ADDED, "action wrong\n"); + ok(pfni->FileNameLength == 6 * sizeof(WCHAR), "len wrong\n" ); + ok(!memcmp(pfni->FileName, &szGa[1], 6 * sizeof(WCHAR)), "name wrong\n"); + got_subdir_change = TRUE; + } + if (!pfni->NextEntryOffset) break; + pfni = (PFILE_NOTIFY_INFORMATION)((char *)pfni + pfni->NextEntryOffset); + } + + if (got_subdir_change) break; + + r = pReadDirectoryChangesW(hdir,buffer,sizeof buffer,FALSE,filter,NULL,&ov,NULL); + ok(r==TRUE, "should return true\n"); } - ok( pfni->NextEntryOffset == 0, "offset wrong\n" ); - ok( pfni->Action == FILE_ACTION_ADDED, "action wrong\n" ); - ok( pfni->FileNameLength == 6*sizeof(WCHAR), "len wrong\n" ); - ok( !memcmp(pfni->FileName,&szGa[1],6*sizeof(WCHAR)), "name wrong\n" ); + ok(got_subdir_change, "didn't get subdir change\n"); r = RemoveDirectoryW( subsubdir ); ok( r == TRUE, "failed to remove directory\n");
participants (1)
-
Alexandre Julliard