aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-06-03 15:36:06 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-06-03 15:36:06 +0200
commit2e929f27541c8bd7795bfc21e308cb08a4c1e7f1 (patch)
tree883c13cbe6497eea8c8f67a81ccd74cda436196c
parent06eb746c1b1a41254af5f20aed19ba634120e827 (diff)
parent577ee1cc427308e42a8ff0289ca2500e18f0217e (diff)
Merge remote-tracking branch 'origin/5.13' into dev
-rw-r--r--examples/coap/coap.pro8
-rw-r--r--src/coap/qcoapclient.cpp5
-rw-r--r--src/coap/qcoapconnection.cpp6
-rw-r--r--src/coap/qcoapinternalmessage.cpp1
-rw-r--r--src/coap/qcoapinternalrequest.cpp1
-rw-r--r--tests/auto/qcoapinternalrequest/tst_qcoapinternalrequest.cpp138
6 files changed, 152 insertions, 7 deletions
diff --git a/examples/coap/coap.pro b/examples/coap/coap.pro
index ba1d57a..006c281 100644
--- a/examples/coap/coap.pro
+++ b/examples/coap/coap.pro
@@ -1,7 +1,11 @@
TEMPLATE = subdirs
SUBDIRS += \
- quicksecureclient \
- quickmulticastclient \
simplecoapclient \
consolecoapclient
+
+qtHaveModule(quick) {
+ SUBDIRS += \
+ quicksecureclient \
+ quickmulticastclient
+}
diff --git a/src/coap/qcoapclient.cpp b/src/coap/qcoapclient.cpp
index dc02464..999c5ea 100644
--- a/src/coap/qcoapclient.cpp
+++ b/src/coap/qcoapclient.cpp
@@ -460,7 +460,10 @@ QCoapResourceDiscoveryReply *QCoapClient::discover(const QUrl &url, const QStrin
*/
QCoapReply *QCoapClient::observe(const QCoapRequest &request)
{
- QCoapRequest copyRequest = QCoapRequestPrivate::createRequest(request, QtCoap::Method::Get);
+ Q_D(QCoapClient);
+
+ QCoapRequest copyRequest = QCoapRequestPrivate::createRequest(request, QtCoap::Method::Get,
+ d->connection->isSecure());
copyRequest.enableObserve();
return get(copyRequest);
diff --git a/src/coap/qcoapconnection.cpp b/src/coap/qcoapconnection.cpp
index 23cb0d9..f74ceab 100644
--- a/src/coap/qcoapconnection.cpp
+++ b/src/coap/qcoapconnection.cpp
@@ -243,8 +243,10 @@ void QCoapConnection::startToSendRequest()
Q_D(QCoapConnection);
Q_ASSERT(!d->framesToSend.isEmpty());
- const CoapFrame frame = d->framesToSend.dequeue();
- writeData(frame.currentPdu, frame.host, frame.port);
+ while (!d->framesToSend.isEmpty()) {
+ const CoapFrame frame = d->framesToSend.dequeue();
+ writeData(frame.currentPdu, frame.host, frame.port);
+ }
}
/*!
diff --git a/src/coap/qcoapinternalmessage.cpp b/src/coap/qcoapinternalmessage.cpp
index 121ee74..271ab30 100644
--- a/src/coap/qcoapinternalmessage.cpp
+++ b/src/coap/qcoapinternalmessage.cpp
@@ -123,7 +123,6 @@ void QCoapInternalMessage::setFromDescriptiveBlockOption(const QCoapOption &opti
{
Q_D(QCoapInternalMessage);
- //! TODO Cover with tests
const quint8 *optionData = reinterpret_cast<const quint8 *>(option.opaqueValue().data());
const quint8 lastByte = optionData[option.length() - 1];
quint32 blockNumber = 0;
diff --git a/src/coap/qcoapinternalrequest.cpp b/src/coap/qcoapinternalrequest.cpp
index ff6354c..01fd058 100644
--- a/src/coap/qcoapinternalrequest.cpp
+++ b/src/coap/qcoapinternalrequest.cpp
@@ -315,7 +315,6 @@ QCoapOption QCoapInternalRequest::blockOption(QCoapOption::OptionName name, uint
{
Q_D(const QCoapInternalRequest);
- //! TODO Cover this in tests
Q_ASSERT((blockSize & (blockSize - 1)) == 0); // is a power of two
Q_ASSERT(!(blockSize >> 11)); // blockSize <= 1024
diff --git a/tests/auto/qcoapinternalrequest/tst_qcoapinternalrequest.cpp b/tests/auto/qcoapinternalrequest/tst_qcoapinternalrequest.cpp
index d14edc1..d1c53e3 100644
--- a/tests/auto/qcoapinternalrequest/tst_qcoapinternalrequest.cpp
+++ b/tests/auto/qcoapinternalrequest/tst_qcoapinternalrequest.cpp
@@ -50,6 +50,10 @@ private Q_SLOTS:
void invalidUrls();
void isMulticast_data();
void isMulticast();
+ void parseBlockOption_data();
+ void parseBlockOption();
+ void createBlockOption_data();
+ void createBlockOption();
};
void tst_QCoapInternalRequest::requestToFrame_data()
@@ -313,6 +317,140 @@ void tst_QCoapInternalRequest::isMulticast()
QCOMPARE(internalRequest.isMulticast(), result);
}
+void tst_QCoapInternalRequest::parseBlockOption_data()
+{
+ QTest::addColumn<QByteArray>("value");
+ QTest::addColumn<uint>("blockNumber");
+ QTest::addColumn<bool>("hasNext");
+ QTest::addColumn<uint>("blockSize");
+
+ QTest::newRow("block_option_1byte_more_blocks") << QByteArray::fromHex("3B")
+ << 3u
+ << true
+ << 128u;
+ QTest::newRow("block_option_1byte_no_more_blocks") << QByteArray::fromHex("93")
+ << 9u
+ << false
+ << 128u;
+ QTest::newRow("block_option_2bytes_more_blocks") << QByteArray::fromHex("12A")
+ << 18u
+ << true
+ << 64u;
+ QTest::newRow("block_option_2bytes_no_more_blocks") << QByteArray::fromHex("132")
+ << 19u
+ << false
+ << 64u;
+ QTest::newRow("block_option_3bytes_more_blocks") << QByteArray::fromHex("3AB2A")
+ << 15026u
+ << true
+ << 64u;
+ QTest::newRow("block_option_3bytes_no_more_blocks") << QByteArray::fromHex("3AB22")
+ << 15026u
+ << false
+ << 64u;
+}
+
+void tst_QCoapInternalRequest::parseBlockOption()
+{
+ QFETCH(QByteArray, value);
+ QFETCH(uint, blockNumber);
+ QFETCH(bool, hasNext);
+ QFETCH(uint, blockSize);
+
+ QCoapInternalRequest request;
+ request.addOption(QCoapOption::Block1, value);
+
+ QCOMPARE(request.currentBlockNumber(), blockNumber);
+ QCOMPARE(request.hasMoreBlocksToReceive(), hasNext);
+ QCOMPARE(request.blockSize(), blockSize);
+}
+
+void tst_QCoapInternalRequest::createBlockOption_data()
+{
+ QTest::addColumn<QByteArray>("payload");
+ QTest::addColumn<uint>("blockNumber");
+ QTest::addColumn<uint>("blockSize");
+ QTest::addColumn<QCoapOption>("expectedOption");
+
+ QByteArray data;
+ for (uint i = 0; i < 1024; ++i)
+ data.append(0xF);
+
+ QByteArray largeData;
+ for (uint i = 0; i < 32; ++i)
+ largeData.append(data);
+
+ QTest::newRow("block1_option_1byte_more_blocks")
+ << data
+ << 3u
+ << 64u
+ << QCoapOption(QCoapOption::Block1, QByteArray::fromHex("3A"));
+ QTest::newRow("block1_option_1byte_no_more_blocks")
+ << data
+ << 8u
+ << 128u
+ << QCoapOption(QCoapOption::Block1, QByteArray::fromHex("83"));
+ QTest::newRow("block2_option_1byte")
+ << data
+ << 3u
+ << 64u
+ << QCoapOption(QCoapOption::Block2, QByteArray::fromHex("32"));
+ QTest::newRow("block1_option_2bytes_more_blocks")
+ << data
+ << 29u
+ << 32u
+ << QCoapOption(QCoapOption::Block1, QByteArray::fromHex("1D9"));
+ QTest::newRow("block1_option_2bytes_no_more_blocks")
+ << data
+ << 32u
+ << 32u
+ << QCoapOption(QCoapOption::Block1, QByteArray::fromHex("201"));
+ QTest::newRow("block2_option_2bytes")
+ << data
+ << 29u
+ << 32u
+ << QCoapOption(QCoapOption::Block2, QByteArray::fromHex("1D1"));
+ QTest::newRow("block1_option_3bytes_more_blocks")
+ << largeData
+ << 4096u
+ << 4u
+ << QCoapOption(QCoapOption::Block1, QByteArray::fromHex("10008"));
+ QTest::newRow("block1_option_3bytes_no_more_blocks")
+ << largeData
+ << 8192u
+ << 4u
+ << QCoapOption(QCoapOption::Block1, QByteArray::fromHex("20000"));
+ QTest::newRow("block2_option_3bytes")
+ << largeData
+ << 4096u
+ << 4u
+ << QCoapOption(QCoapOption::Block2, QByteArray::fromHex("10000"));
+}
+
+void tst_QCoapInternalRequest::createBlockOption()
+{
+ QFETCH(QByteArray, payload);
+ QFETCH(uint, blockNumber);
+ QFETCH(uint, blockSize);
+ QFETCH(QCoapOption, expectedOption);
+
+ QCoapRequest request;
+ request.setPayload(payload);
+ QCoapInternalRequest internalRequest(request);
+ if (expectedOption.name() == QCoapOption::Block1)
+ internalRequest.setToSendBlock(blockNumber, blockSize);
+ else if (expectedOption.name() == QCoapOption::Block2)
+ internalRequest.setToRequestBlock(blockNumber, blockSize);
+ else
+ QFAIL("Incorrect option, the test expects Block1 or Block2 options.");
+
+ QCOMPARE(internalRequest.message()->options().size(), 1);
+
+ const auto option = internalRequest.message()->options().back();
+ QCOMPARE(option.name(), expectedOption.name());
+ QCOMPARE(option.opaqueValue(), expectedOption.opaqueValue());
+}
+
QTEST_APPLESS_MAIN(tst_QCoapInternalRequest)
#include "tst_qcoapinternalrequest.moc"