From 4462536f16f59ac56413587dfa425d2b6a667395 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 26 Mar 2014 11:36:42 -0700 Subject: [PATCH] testing: split up local testing "evolution" tests used to be a traditional name for all Client::Source and SyncEvolution unit tests. This caused problems when adding Akonadi (crash in Akonadi client lib when EDS was used before) and was not nice in the test reporting (multiple different tests all mixed into one summary line). It also prevented running these tests in parallel. All of this gets fixed by splitting "evolution" into "eds", "kde", "file" and "unittests". To avoid updating the nightly test run scripts, --enable evolution=.... is still understood. --- test/resultchecker.py | 4 ++ test/runtests.py | 139 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 118 insertions(+), 25 deletions(-) diff --git a/test/resultchecker.py b/test/resultchecker.py index bae4da40..821b4e4a 100755 --- a/test/resultchecker.py +++ b/test/resultchecker.py @@ -222,6 +222,10 @@ def step2(resultdir, result, servers, indents, srcdir, shellprefix, backenddir): #list source test servers statically, we have no idea how to differenciate #automatically whether the server is a source test or sync test. sourceServers = ['evolution', + 'eds', + 'kde', + 'file', + 'unittests', 'evolution-prebuilt-build', 'yahoo', 'owndrive', diff --git a/test/runtests.py b/test/runtests.py index e519c90e..140bb9f9 100755 --- a/test/runtests.py +++ b/test/runtests.py @@ -1478,31 +1478,120 @@ distcheck = SyncEvolutionDistcheck("distcheck", [ compile.name ]) context.add(distcheck) -evolutiontest = SyncEvolutionTest("evolution", compile, - "", options.shell, - "Client::Source SyncEvolution", - [], - "CLIENT_TEST_FAILURES=" - # testReadItem404 works with some Akonadi versions (Ubuntu Lucid), - # but not all (Debian Testing). The other tests always fail, - # the code needs to be fixed. - "Client::Source::kde_.*::testReadItem404," - "Client::Source::kde_.*::testDelete404," - "Client::Source::kde_.*::testLinkedItems.*404," - "Client::Source::kde_.*::testImport.*," - "Client::Source::kde_.*::testRemoveProperties," - " " - "CLIENT_TEST_SKIP=" - "Client::Source::file_event::LinkedItemsDefault::testLinkedItemsInsertBothUpdateChildNoIDs," - "Client::Source::file_event::LinkedItemsDefault::testLinkedItemsUpdateChildNoIDs," - "Client::Source::file_event::LinkedItemsWithVALARM::testLinkedItemsInsertBothUpdateChildNoIDs," - "Client::Source::file_event::LinkedItemsWithVALARM::testLinkedItemsUpdateChildNoIDs," - "Client::Source::file_event::LinkedItemsAllDay::testLinkedItemsInsertBothUpdateChildNoIDs," - "Client::Source::file_event::LinkedItemsAllDay::testLinkedItemsUpdateChildNoIDs," - "Client::Source::file_event::LinkedItemsNoTZ::testLinkedItemsInsertBothUpdateChildNoIDs," - "Client::Source::file_event::LinkedItemsNoTZ::testLinkedItemsUpdateChildNoIDs", - testPrefix=options.testprefix) -context.add(evolutiontest) +# Special case "evolution": this used to be a catch-all for all +# Client::Source and unit tests in the "SyncEvolution" test group. +# In practice it was always run with specific sources enabled. +# +# Now runtests.py has separate test runs for all of these but continues +# to use --enable evolution=... This is done by mapping the enabled["evolution"] +# value into the new categories (kde, eds, file, unittests). +# The advantage is parallel testing and some separation between running incompatible +# sources in the same process. +# +# Akonadi is known to crash randomly when used after EDS in the same +# process (from Client::Source::kde_contact::testOpen): +# +# [DEBUG 00:00:00] ClientTest.cpp:1004: starting source->open() +# [ERROR 00:20:00] stderr: syncevolution(787)/libakonadi Akonadi::SessionPrivate::socketError: Socket error occurred: "QLocalSocket::connectToServer: Invalid name" +# [DEVELOPER 00:20:00] stderr: QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave. +# [DEVELOPER 00:20:00] stderr: kres-migrator: cannot connect to X server +# [DEVELOPER 00:20:00] stderr: QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave. +# [DEVELOPER 00:20:00] stderr: kres-migrator: cannot connect to X server +# [DEVELOPER 00:20:00] stderr: Qt has caught an exception thrown from an event handler. Throwing +# [DEVELOPER 00:20:00] stderr: exceptions from an event handler is not supported in Qt. You must +# [DEVELOPER 00:20:00] stderr: reimplement QApplication::notify() and catch all exceptions there. + +localtests = [] + +test = SyncEvolutionTest("eds", compile, + "", options.shell, + "Client::Source::eds_contact Client::Source::eds_event Client::Source::eds_task Client::Source::eds_memo ", + [], + "CLIENT_TEST_FAILURES=" + " " + "CLIENT_TEST_SKIP=" + " " + , + testPrefix=options.testprefix) +localtests.append(test) +context.add(test) + +test = SyncEvolutionTest("kde", compile, + "", options.shell, + "Client::Source::kde_contact Client::Source::kde_event Client::Source::kde_task Client::Source::kde_memo", + [], + "CLIENT_TEST_FAILURES=" + # testReadItem404 works with some Akonadi versions (Ubuntu Lucid), + # but not all (Debian Testing). The other tests always fail, + # the code needs to be fixed. + "Client::Source::kde_.*::testReadItem404," + "Client::Source::kde_.*::testDelete404," + "Client::Source::kde_.*::testLinkedItems.*404," + "Client::Source::kde_.*::testImport.*," + "Client::Source::kde_.*::testRemoveProperties," + " " + "CLIENT_TEST_SKIP=" + " " + , + testPrefix=options.testprefix) +localtests.append(test) +context.add(test) + +test = SyncEvolutionTest("file", compile, + "", options.shell, + "Client::Source::file_contact Client::Source::file_event Client::Source::file_task Client::Source::file_memo", + [], + "CLIENT_TEST_FAILURES=" + " " + "CLIENT_TEST_SKIP=" + "Client::Source::file_event::LinkedItemsDefault::testLinkedItemsInsertBothUpdateChildNoIDs," + "Client::Source::file_event::LinkedItemsDefault::testLinkedItemsUpdateChildNoIDs," + "Client::Source::file_event::LinkedItemsWithVALARM::testLinkedItemsInsertBothUpdateChildNoIDs," + "Client::Source::file_event::LinkedItemsWithVALARM::testLinkedItemsUpdateChildNoIDs," + "Client::Source::file_event::LinkedItemsAllDay::testLinkedItemsInsertBothUpdateChildNoIDs," + "Client::Source::file_event::LinkedItemsAllDay::testLinkedItemsUpdateChildNoIDs," + "Client::Source::file_event::LinkedItemsNoTZ::testLinkedItemsInsertBothUpdateChildNoIDs," + "Client::Source::file_event::LinkedItemsNoTZ::testLinkedItemsUpdateChildNoIDs" + " " + , + testPrefix=options.testprefix) +localtests.append(test) +context.add(test) + +test = SyncEvolutionTest("unittests", compile, + "", options.shell, + "SyncEvolution", + [], + "CLIENT_TEST_FAILURES=" + " " + "CLIENT_TEST_SKIP=" + " " + , + testPrefix=options.testprefix) +localtests.append(test) +context.add(test) + +# Implement the mapping from "evolution" to the new test names. +if enabled.has_key("evolution"): + if enabled["evolution"] is None: + # Everything is enabled. + for test in localtests: + enable[test.name] = None + else: + # Specific tests are enabled. + evolution = enabled["evolution"].split(",") + localtestsEnabled = {} + for e in evolution: + if e: + for localtest in localtests: + # Match "Client:source::eds_contact::testImport" against + # "Client::source::eds_contact Client::source::eds_event ...". + for defTest in localtest.tests.split(): + if defTest.startswith(e): + localtestsEnabled.setdefault(localtest.name, []).append(e) + break + for name, e in localtestsEnabled.iteritems(): + enabled[name] = ','.join(e) # test-dbus.py itself doesn't need to run under valgrind, remove it... shell = re.sub(r'\S*valgrind\S*', '', options.shell)