From patchwork Wed Aug 21 15:53:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= X-Patchwork-Id: 11107455 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C0AAF1399 for ; Wed, 21 Aug 2019 16:00:26 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A0C4B22CF7 for ; Wed, 21 Aug 2019 16:00:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A0C4B22CF7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:49786 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i0T29-0000l4-7U for patchwork-qemu-devel@patchwork.kernel.org; Wed, 21 Aug 2019 12:00:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52629) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i0T0X-0006XC-3L for qemu-devel@nongnu.org; Wed, 21 Aug 2019 11:58:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i0SvW-0001Wn-34 for qemu-devel@nongnu.org; Wed, 21 Aug 2019 11:53:35 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45910) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i0SvV-0001WG-QR for qemu-devel@nongnu.org; Wed, 21 Aug 2019 11:53:34 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CE68530832E9; Wed, 21 Aug 2019 15:53:32 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-112-61.ams2.redhat.com [10.36.112.61]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0E27D10016E8; Wed, 21 Aug 2019 15:53:28 +0000 (UTC) From: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= To: qemu-devel@nongnu.org Date: Wed, 21 Aug 2019 16:53:27 +0100 Message-Id: <20190821155327.25208-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Wed, 21 Aug 2019 15:53:32 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH] tests: make filemonitor test more robust to event ordering X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , Wei Yang , Peter Xu Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" The ordering of events that are emitted during the rmdir test have changed with kernel >= 5.3. Semantically both new & old orderings are correct, so we must be able to cope with either. To cope with this, when we see an unexpected event, we push it back onto the queue and look and the subsequent event to see if that matches instead. Signed-off-by: Daniel P. Berrangé Tested-by: Wei Yang Tested-by: Peter Xu Tested-by: Cornelia Huck Reviewed-by: Thomas Huth --- tests/test-util-filemonitor.c | 43 +++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/tests/test-util-filemonitor.c b/tests/test-util-filemonitor.c index 46e781c022..301cd2db61 100644 --- a/tests/test-util-filemonitor.c +++ b/tests/test-util-filemonitor.c @@ -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,9 +149,15 @@ qemu_file_monitor_test_next_record(QFileMonitorTestData *data) } if (data->records) { record = data->records->data; - tmp = data->records; - data->records = g_list_remove_link(data->records, tmp); - g_list_free(tmp); + 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); @@ -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: