Commit 7ff91278 authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/berrange/tags/filemon-test-pull-request' into staging



Fix filemonitor test broken with newest Linux kernel

# gpg: Signature made Wed 11 Sep 2019 10:31:05 BST
# gpg:                using RSA key DAF3A6FDB26B62912D0E8E3FBE86EBB415104FDF
# gpg: Good signature from "Daniel P. Berrange <dan@berrange.com>" [full]
# gpg:                 aka "Daniel P. Berrange <berrange@redhat.com>" [full]
# Primary key fingerprint: DAF3 A6FD B26B 6291 2D0E  8E3F BE86 EBB4 1510 4FDF

* remotes/berrange/tags/filemon-test-pull-request:
  tests: make filemonitor test more robust to event ordering

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents a30cb4b1 bf9e0313
Loading
Loading
Loading
Loading
+34 −9
Original line number Diff line number Diff line
@@ -45,6 +45,11 @@ typedef struct {
    const char *filedst;
    int64_t *watchid;
    int eventid;
    /*
     * Only valid with OP_EVENT - this event might be
     * swapped with the next OP_EVENT
     */
    bool swapnext;
} QFileMonitorTestOp;

typedef struct {
@@ -98,6 +103,10 @@ qemu_file_monitor_test_handler(int64_t id,
    QFileMonitorTestData *data = opaque;
    QFileMonitorTestRecord *rec = g_new0(QFileMonitorTestRecord, 1);

    if (debug) {
        g_printerr("Queue event id %" PRIx64 " event %d file %s\n",
                   id, event, filename);
    }
    rec->id = id;
    rec->event = event;
    rec->filename = g_strdup(filename);
@@ -125,7 +134,8 @@ qemu_file_monitor_test_record_free(QFileMonitorTestRecord *rec)
 * to wait for the event to be queued for us.
 */
static QFileMonitorTestRecord *
qemu_file_monitor_test_next_record(QFileMonitorTestData *data)
qemu_file_monitor_test_next_record(QFileMonitorTestData *data,
                                   QFileMonitorTestRecord *pushback)
{
    GTimer *timer = g_timer_new();
    QFileMonitorTestRecord *record = NULL;
@@ -139,10 +149,16 @@ qemu_file_monitor_test_next_record(QFileMonitorTestData *data)
    }
    if (data->records) {
        record = data->records->data;
        if (pushback) {
            data->records->data = pushback;
        } else {
            tmp = data->records;
            data->records = g_list_remove_link(data->records, tmp);
            g_list_free(tmp);
        }
    } else if (pushback) {
        qemu_file_monitor_test_record_free(pushback);
    }
    qemu_mutex_unlock(&data->lock);

    g_timer_destroy(timer);
@@ -158,13 +174,15 @@ static bool
qemu_file_monitor_test_expect(QFileMonitorTestData *data,
                              int64_t id,
                              QFileMonitorEvent event,
                              const char *filename)
                              const char *filename,
                              bool swapnext)
{
    QFileMonitorTestRecord *rec;
    bool ret = false;

    rec = qemu_file_monitor_test_next_record(data);
    rec = qemu_file_monitor_test_next_record(data, NULL);

 retry:
    if (!rec) {
        g_printerr("Missing event watch id %" PRIx64 " event %d file %s\n",
                   id, event, filename);
@@ -172,6 +190,11 @@ qemu_file_monitor_test_expect(QFileMonitorTestData *data,
    }

    if (id != rec->id) {
        if (swapnext) {
            rec = qemu_file_monitor_test_next_record(data, rec);
            swapnext = false;
            goto retry;
        }
        g_printerr("Expected watch id %" PRIx64 " but got %" PRIx64 "\n",
                   id, rec->id);
        goto cleanup;
@@ -347,7 +370,8 @@ test_file_monitor_events(void)
          .filesrc = "fish", },
        { .type = QFILE_MONITOR_TEST_OP_EVENT,
          .filesrc = "", .watchid = &watch4,
          .eventid = QFILE_MONITOR_EVENT_IGNORED },
          .eventid = QFILE_MONITOR_EVENT_IGNORED,
          .swapnext = true },
        { .type = QFILE_MONITOR_TEST_OP_EVENT,
          .filesrc = "fish", .watchid = &watch0,
          .eventid = QFILE_MONITOR_EVENT_DELETED },
@@ -493,8 +517,9 @@ test_file_monitor_events(void)
                g_printerr("Event id=%" PRIx64 " event=%d file=%s\n",
                           *op->watchid, op->eventid, op->filesrc);
            }
            if (!qemu_file_monitor_test_expect(
                    &data, *op->watchid, op->eventid, op->filesrc))
            if (!qemu_file_monitor_test_expect(&data, *op->watchid,
                                               op->eventid, op->filesrc,
                                               op->swapnext))
                goto cleanup;
            break;
        case QFILE_MONITOR_TEST_OP_CREATE: