[PATCH] kernel32/tests: Handle notifications on the parent dir more gracefully.

Zebediah Figura z.figura12 at gmail.com
Mon Feb 19 16:10:18 CST 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
Fixes an intermittent test failure.

The recursive watch might give us a notification on the parent dir. The test
already handles this, but expects only one notification to occur and that it
will precede the creation notification. However, sometimes the server will
return before we receive the creation notification; additionally, sometimes
inotify will give us multiple modifications on the parent dir.

The point of the test is that recursive watch *works*, i.e. that we receive
a notification on the subdirectory at all. So keep calling
ReadDirectoryChanges() until we get it (or time out).

 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");
-- 
2.7.4




More information about the wine-devel mailing list