r18371: made the directory depth notify test independent of timing
authorAndrew Tridgell <tridge@samba.org>
Mon, 11 Sep 2006 07:58:08 +0000 (07:58 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:18:20 +0000 (14:18 -0500)
(This used to be commit 39458e62f576c551df016a7be4d35175dc21696e)

source4/torture/raw/notify.c

index 0036f10f40a4817f401305d4d3b717f08dc48335..966b32ce91fc30747cf260da967bcf072631249a 100644 (file)
@@ -979,12 +979,14 @@ static BOOL test_notify_tree(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        union smb_notify notify;
        union smb_open io;
        struct smbcli_request *req;
+       struct timeval tv;
        struct {
                const char *path;
                BOOL recursive;
                uint32_t filter;
                int expected;
                int fnum;
+               int counted;
        } dirs[] = {
                {BASEDIR "\\abc",               True, FILE_NOTIFY_CHANGE_NAME, 30 },
                {BASEDIR "\\zqy",               True, FILE_NOTIFY_CHANGE_NAME, 8 },
@@ -1009,6 +1011,7 @@ static BOOL test_notify_tree(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        };
        int i;
        NTSTATUS status;
+       BOOL all_done = False;
 
        printf("TESTING CHANGE NOTIFY FOR DIFFERENT DEPTHS\n");
 
@@ -1053,20 +1056,35 @@ static BOOL test_notify_tree(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
                talloc_free(path);
        }
 
-       /* give a bit of time for all the events to propogate */
-       sleep(4);
+       /* give a bit of time for the events to propogate */
+       tv = timeval_current();
+
+       do {
+               /* count events that have happened in each dir */
+               for (i=0;i<ARRAY_SIZE(dirs);i++) {
+                       notify.nttrans.in.file.fnum = dirs[i].fnum;
+                       req = smb_raw_changenotify_send(cli->tree, &notify);
+                       smb_raw_ntcancel(req);
+                       notify.nttrans.out.num_changes = 0;
+                       status = smb_raw_changenotify_recv(req, mem_ctx, &notify);
+                       dirs[i].counted += notify.nttrans.out.num_changes;
+               }
+               
+               all_done = True;
+
+               for (i=0;i<ARRAY_SIZE(dirs);i++) {
+                       if (dirs[i].counted != dirs[i].expected) {
+                               all_done = False;
+                       }
+               }
+       } while (!all_done && timeval_elapsed(&tv) < 20);
+
+       printf("took %.4f seconds to propogate all events\n", timeval_elapsed(&tv));
 
-       /* count events that have happened in each dir */
        for (i=0;i<ARRAY_SIZE(dirs);i++) {
-               notify.nttrans.in.file.fnum = dirs[i].fnum;
-               req = smb_raw_changenotify_send(cli->tree, &notify);
-               smb_raw_ntcancel(req);
-               notify.nttrans.out.num_changes = 0;
-               status = smb_raw_changenotify_recv(req, mem_ctx, &notify);
-               if (notify.nttrans.out.num_changes != dirs[i].expected) {
+               if (dirs[i].counted != dirs[i].expected) {
                        printf("ERROR: i=%d expected %d got %d for '%s'\n",
-                              i, dirs[i].expected, notify.nttrans.out.num_changes,
-                              dirs[i].path);
+                              i, dirs[i].expected, dirs[i].counted, dirs[i].path);
                        ret = False;
                }
        }