From e9579feef5d9dc2979d2e281b025d1745b42c96c Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 10 Feb 2014 00:41:15 -0800 Subject: [PATCH] Reordering testing. --- .../metavoxels/src/DatagramSequencer.cpp | 7 +++- libraries/metavoxels/src/DatagramSequencer.h | 3 +- tests/metavoxels/src/MetavoxelTests.cpp | 33 +++++++++++++++++-- tests/metavoxels/src/MetavoxelTests.h | 1 + 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/libraries/metavoxels/src/DatagramSequencer.cpp b/libraries/metavoxels/src/DatagramSequencer.cpp index adaefc9af1..1d56f45c9e 100644 --- a/libraries/metavoxels/src/DatagramSequencer.cpp +++ b/libraries/metavoxels/src/DatagramSequencer.cpp @@ -20,7 +20,8 @@ const int MAX_DATAGRAM_SIZE = MAX_PACKET_SIZE; const int DEFAULT_MAX_PACKET_SIZE = 3000; -DatagramSequencer::DatagramSequencer(const QByteArray& datagramHeader) : +DatagramSequencer::DatagramSequencer(const QByteArray& datagramHeader, QObject* parent) : + QObject(parent), _outgoingPacketStream(&_outgoingPacketData, QIODevice::WriteOnly), _outputStream(_outgoingPacketStream), _incomingDatagramStream(&_incomingDatagramBuffer), @@ -397,6 +398,10 @@ bool CircularBuffer::atEnd() const { return _offset >= _size; } +qint64 CircularBuffer::bytesAvailable() const { + return _size - _offset + QIODevice::bytesAvailable(); +} + bool CircularBuffer::canReadLine() const { for (int offset = _offset; offset < _size; offset++) { if (_data.at((_position + offset) % _data.size()) == '\n') { diff --git a/libraries/metavoxels/src/DatagramSequencer.h b/libraries/metavoxels/src/DatagramSequencer.h index 5afd5175a2..27a4f05379 100644 --- a/libraries/metavoxels/src/DatagramSequencer.h +++ b/libraries/metavoxels/src/DatagramSequencer.h @@ -32,7 +32,7 @@ public: int firstPacketNumber; }; - DatagramSequencer(const QByteArray& datagramHeader = QByteArray()); + DatagramSequencer(const QByteArray& datagramHeader = QByteArray(), QObject* parent = NULL); /// Returns the packet number of the last packet sent. int getOutgoingPacketNumber() const { return _outgoingPacketNumber; } @@ -195,6 +195,7 @@ public: void appendToBuffer(int offset, int length, CircularBuffer& buffer) const; virtual bool atEnd() const; + virtual qint64 bytesAvailable() const; virtual bool canReadLine() const; virtual bool open(OpenMode flags); virtual qint64 pos() const; diff --git a/tests/metavoxels/src/MetavoxelTests.cpp b/tests/metavoxels/src/MetavoxelTests.cpp index 4d7569f2d6..15d7463742 100644 --- a/tests/metavoxels/src/MetavoxelTests.cpp +++ b/tests/metavoxels/src/MetavoxelTests.cpp @@ -76,7 +76,7 @@ static QByteArray createRandomBytes() { } Endpoint::Endpoint(const QByteArray& datagramHeader) : - _sequencer(new DatagramSequencer(datagramHeader)), + _sequencer(new DatagramSequencer(datagramHeader, this)), _highPriorityMessagesToSend(0.0f) { connect(_sequencer, SIGNAL(readyToWrite(const QByteArray&)), SLOT(sendDatagram(const QByteArray&))); @@ -136,6 +136,18 @@ static bool messagesEqual(const QVariant& firstMessage, const QVariant& secondMe } bool Endpoint::simulate(int iterationNumber) { + // update/send our delayed datagrams + for (QList >::iterator it = _delayedDatagrams.begin(); it != _delayedDatagrams.end(); ) { + if (it->second-- == 1) { + _other->_sequencer->receivedDatagram(it->first); + datagramsReceived++; + it = _delayedDatagrams.erase(it); + + } else { + it++; + } + } + // enqueue some number of high priority messages const float MIN_HIGH_PRIORITY_MESSAGES = 0.0f; const float MAX_HIGH_PRIORITY_MESSAGES = 2.0f; @@ -177,10 +189,27 @@ void Endpoint::sendDatagram(const QByteArray& datagram) { datagramsSent++; // some datagrams are dropped - const float DROP_PROBABILITY = 0.25f; + const float DROP_PROBABILITY = 0.1f; if (randFloat() < DROP_PROBABILITY) { return; } + + // some are received out of order + const float REORDER_PROBABILITY = 0.1f; + if (randFloat() < REORDER_PROBABILITY) { + const int MIN_DELAY = 1; + const int MAX_DELAY = 5; + // have to copy the datagram; the one we're passed is a reference to a shared buffer + _delayedDatagrams.append(QPair(QByteArray(datagram.constData(), datagram.size()), + randIntInRange(MIN_DELAY, MAX_DELAY))); + + // and some are duplicated + const float DUPLICATE_PROBABILITY = 0.01f; + if (randFloat() > DUPLICATE_PROBABILITY) { + return; + } + } + _other->_sequencer->receivedDatagram(datagram); datagramsReceived++; } diff --git a/tests/metavoxels/src/MetavoxelTests.h b/tests/metavoxels/src/MetavoxelTests.h index 372718afc4..b73f7eb07e 100644 --- a/tests/metavoxels/src/MetavoxelTests.h +++ b/tests/metavoxels/src/MetavoxelTests.h @@ -55,6 +55,7 @@ private: DatagramSequencer* _sequencer; Endpoint* _other; + QList > _delayedDatagrams; float _highPriorityMessagesToSend; QVariantList _highPriorityMessagesSent; QList _unreliableMessagesSent;