From b0dc9c861d865cda8dd68c53b4aeb4a655ee03a6 Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 18 Apr 2018 23:46:17 +0200 Subject: [PATCH] Improve SyncthingProcess::splitArguments() parser --- connector/syncthingprocess.cpp | 10 +++++++--- connector/tests/misctests.cpp | 22 ++++++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/connector/syncthingprocess.cpp b/connector/syncthingprocess.cpp index 7def07f..2262cba 100644 --- a/connector/syncthingprocess.cpp +++ b/connector/syncthingprocess.cpp @@ -54,7 +54,9 @@ QStringList SyncthingProcess::splitArguments(const QString &arguments) case ' ': switch (lastInput) { case Slash: - currentArg += c; + if (!currentArg.isEmpty()) { + currentArg += c; + } lastInput = Any; break; case Space: @@ -68,8 +70,10 @@ QStringList SyncthingProcess::splitArguments(const QString &arguments) currentArg += c; lastInput = Any; } else { - result << currentArg; - currentArg.clear(); + if (!currentArg.isEmpty()) { + result << currentArg; + currentArg.clear(); + } lastInput = Space; } } diff --git a/connector/tests/misctests.cpp b/connector/tests/misctests.cpp index 855d873..8a114a9 100644 --- a/connector/tests/misctests.cpp +++ b/connector/tests/misctests.cpp @@ -102,12 +102,26 @@ void MiscTests::testParsingConfig() */ void MiscTests::testSplittingArguments() { - CPPUNIT_ASSERT_EQUAL(QStringList(), SyncthingProcess::splitArguments(QString())); - CPPUNIT_ASSERT_EQUAL(QStringList({ QStringLiteral("-simple") }), SyncthingProcess::splitArguments(QStringLiteral("-simple"))); - CPPUNIT_ASSERT_EQUAL(QStringList({ QStringLiteral("-home"), QStringLiteral("some dir"), QStringLiteral("-no-restart") }), + CPPUNIT_ASSERT_EQUAL_MESSAGE("empty arguments", QStringList(), SyncthingProcess::splitArguments(QString())); + CPPUNIT_ASSERT_EQUAL_MESSAGE("one argument without special characters", QStringList({ QStringLiteral("-simple") }), + SyncthingProcess::splitArguments(QStringLiteral("-simple"))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("multiple arguments without special characters", + QStringList({ QStringLiteral("-home"), QStringLiteral("some dir"), QStringLiteral("-no-restart") }), SyncthingProcess::splitArguments(QStringLiteral("-home \"some dir\" -no-restart"))); - CPPUNIT_ASSERT_EQUAL(QStringList({ QStringLiteral("-home"), QStringLiteral("\"some"), QStringLiteral("dir\""), QStringLiteral("-no-restart") }), + CPPUNIT_ASSERT_EQUAL_MESSAGE("quotation", QStringList({ QStringLiteral("-home"), QStringLiteral("some dir"), QStringLiteral("-no-restart") }), + SyncthingProcess::splitArguments(QStringLiteral(" -home \"some dir\" -no-restart "))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("escaped quotation", + QStringList({ QStringLiteral("-home"), QStringLiteral("\"some"), QStringLiteral("dir\""), QStringLiteral("-no-restart") }), SyncthingProcess::splitArguments(QStringLiteral("-home \\\"some dir\\\" -no-restart"))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("escaped spaces", + QStringList({ QStringLiteral("-home"), QStringLiteral("some dir"), QStringLiteral("-no-restart") }), + SyncthingProcess::splitArguments(QStringLiteral("-home \\ some\\ dir -no-restart"))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("spaces at the beginning through quotes", QStringList({ QStringLiteral("foo"), QStringLiteral(" bar") }), + SyncthingProcess::splitArguments(QStringLiteral("foo \" bar\""))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("spaces at the end through quotes", QStringList({ QStringLiteral("-home"), QStringLiteral("-no-restart ") }), + SyncthingProcess::splitArguments(QStringLiteral("-home \"-no-restart \""))); + CPPUNIT_ASSERT_EQUAL_MESSAGE("don't care about missing quote at the end", QStringList({ QStringLiteral("foo"), QStringLiteral(" bar") }), + SyncthingProcess::splitArguments(QStringLiteral("foo \" bar"))); } /*!