2010-03-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Reduced copying/std::string instantiation in sending/receiving
	BitTorrent messages.
	* src/BtBitfieldMessage.cc
	* src/BtBitfieldMessage.h
	* src/BtExtendedMessage.cc
	* src/BtExtendedMessage.h
	* src/BtHandshakeMessage.cc
	* src/BtHandshakeMessage.h
	* src/BtKeepAliveMessage.cc
	* src/BtKeepAliveMessage.h
	* src/BtPieceMessage.cc
	* src/BtPieceMessage.h
	* src/BtPortMessage.cc
	* src/BtPortMessage.h
	* src/BtUnchokeMessage.h
	* src/DefaultBtMessageReceiver.cc
	* src/IndexBtMessage.cc
	* src/IndexBtMessage.h
	* src/PeerConnection.cc
	* src/PeerConnection.h
	* src/RangeBtMessage.cc
	* src/RangeBtMessage.h
	* src/SimpleBtMessage.cc
	* src/SimpleBtMessage.h
	* src/SocketBuffer.cc
	* src/SocketBuffer.h
	* src/ZeroBtMessage.cc
	* src/ZeroBtMessage.h
	* test/BtAllowedFastMessageTest.cc
	* test/BtBitfieldMessageTest.cc
	* test/BtCancelMessageTest.cc
	* test/BtChokeMessageTest.cc
	* test/BtExtendedMessageTest.cc
	* test/BtHandshakeMessageTest.cc
	* test/BtHaveAllMessageTest.cc
	* test/BtHaveMessageTest.cc
	* test/BtHaveNoneMessageTest.cc
	* test/BtInterestedMessageTest.cc
	* test/BtKeepAliveMessageTest.cc
	* test/BtNotInterestedMessageTest.cc
	* test/BtPieceMessageTest.cc
	* test/BtPortMessageTest.cc
	* test/BtRejectMessageTest.cc
	* test/BtRequestMessageTest.cc
	* test/BtSuggestPieceMessageTest.cc
	* test/BtUnchokeMessageTest.cc
pull/1/head
Tatsuhiro Tsujikawa 2010-03-04 16:24:03 +00:00
parent 5d05ef0e75
commit 8b73c2843f
45 changed files with 470 additions and 316 deletions

View File

@ -1,3 +1,52 @@
2010-03-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Reduced copying/std::string instantiation in sending/receiving
BitTorrent messages.
* src/BtBitfieldMessage.cc
* src/BtBitfieldMessage.h
* src/BtExtendedMessage.cc
* src/BtExtendedMessage.h
* src/BtHandshakeMessage.cc
* src/BtHandshakeMessage.h
* src/BtKeepAliveMessage.cc
* src/BtKeepAliveMessage.h
* src/BtPieceMessage.cc
* src/BtPieceMessage.h
* src/BtPortMessage.cc
* src/BtPortMessage.h
* src/BtUnchokeMessage.h
* src/DefaultBtMessageReceiver.cc
* src/IndexBtMessage.cc
* src/IndexBtMessage.h
* src/PeerConnection.cc
* src/PeerConnection.h
* src/RangeBtMessage.cc
* src/RangeBtMessage.h
* src/SimpleBtMessage.cc
* src/SimpleBtMessage.h
* src/SocketBuffer.cc
* src/SocketBuffer.h
* src/ZeroBtMessage.cc
* src/ZeroBtMessage.h
* test/BtAllowedFastMessageTest.cc
* test/BtBitfieldMessageTest.cc
* test/BtCancelMessageTest.cc
* test/BtChokeMessageTest.cc
* test/BtExtendedMessageTest.cc
* test/BtHandshakeMessageTest.cc
* test/BtHaveAllMessageTest.cc
* test/BtHaveMessageTest.cc
* test/BtHaveNoneMessageTest.cc
* test/BtInterestedMessageTest.cc
* test/BtKeepAliveMessageTest.cc
* test/BtNotInterestedMessageTest.cc
* test/BtPieceMessageTest.cc
* test/BtPortMessageTest.cc
* test/BtRejectMessageTest.cc
* test/BtRequestMessageTest.cc
* test/BtSuggestPieceMessageTest.cc
* test/BtUnchokeMessageTest.cc
2010-03-03 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2010-03-03 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Rewritten SocketBuffer. Old implementation uses single std::string Rewritten SocketBuffer. Old implementation uses single std::string

View File

@ -81,25 +81,22 @@ void BtBitfieldMessage::doReceivedAction() {
} }
} }
const unsigned char* BtBitfieldMessage::getMessage() { unsigned char* BtBitfieldMessage::createMessage() {
if(!msg) {
/** /**
* len --- 1+bitfieldLength, 4bytes * len --- 1+bitfieldLength, 4bytes
* id --- 5, 1byte * id --- 5, 1byte
* bitfield --- bitfield, len bytes * bitfield --- bitfield, len bytes
* total: 5+len bytes * total: 5+len bytes
*/ */
msgLength = 5+bitfieldLength; const size_t msgLength = 5+bitfieldLength;
msg = new unsigned char[msgLength]; unsigned char* msg = new unsigned char[msgLength];
bittorrent::createPeerMessageString(msg, msgLength, 1+bitfieldLength, ID); bittorrent::createPeerMessageString(msg, msgLength, 1+bitfieldLength, ID);
memcpy(msg+5, bitfield, bitfieldLength); memcpy(msg+5, bitfield, bitfieldLength);
}
return msg; return msg;
} }
size_t BtBitfieldMessage::getMessageLength() { size_t BtBitfieldMessage::getMessageLength() {
getMessage(); return 5+bitfieldLength;
return msgLength;
} }
std::string BtBitfieldMessage::toString() const { std::string BtBitfieldMessage::toString() const {

View File

@ -47,14 +47,10 @@ class BtBitfieldMessage : public SimpleBtMessage {
private: private:
unsigned char* bitfield; unsigned char* bitfield;
size_t bitfieldLength; size_t bitfieldLength;
unsigned char* msg;
size_t msgLength;
void init() { void init() {
bitfield = 0; bitfield = 0;
bitfieldLength = 0; bitfieldLength = 0;
msg = 0;
msgLength = 0;
} }
public: public:
BtBitfieldMessage():SimpleBtMessage(ID, NAME) BtBitfieldMessage():SimpleBtMessage(ID, NAME)
@ -71,7 +67,6 @@ public:
virtual ~BtBitfieldMessage() { virtual ~BtBitfieldMessage() {
delete [] bitfield; delete [] bitfield;
delete [] msg;
} }
static const uint8_t ID = 5; static const uint8_t ID = 5;
@ -88,7 +83,7 @@ public:
virtual void doReceivedAction(); virtual void doReceivedAction();
virtual const unsigned char* getMessage(); virtual unsigned char* createMessage();
virtual size_t getMessageLength(); virtual size_t getMessageLength();

View File

@ -55,17 +55,11 @@ BtExtendedMessage::BtExtendedMessage
(const ExtensionMessageHandle& extensionMessage): (const ExtensionMessageHandle& extensionMessage):
SimpleBtMessage(ID, NAME), SimpleBtMessage(ID, NAME),
_extensionMessage(extensionMessage), _extensionMessage(extensionMessage),
_msg(0),
_msgLength(0) _msgLength(0)
{} {}
BtExtendedMessage::~BtExtendedMessage() unsigned char* BtExtendedMessage::createMessage()
{ {
delete [] _msg;
}
const unsigned char* BtExtendedMessage::getMessage() {
if(!_msg) {
/** /**
* len --- 2+extpayload.length, 4bytes * len --- 2+extpayload.length, 4bytes
* id --- 20, 1byte * id --- 20, 1byte
@ -75,16 +69,17 @@ const unsigned char* BtExtendedMessage::getMessage() {
*/ */
std::string payload = _extensionMessage->getPayload(); std::string payload = _extensionMessage->getPayload();
_msgLength = 6+payload.size(); _msgLength = 6+payload.size();
_msg = new unsigned char[_msgLength]; unsigned char* msg = new unsigned char[_msgLength];
bittorrent::createPeerMessageString(_msg, _msgLength, 2+payload.size(), ID); bittorrent::createPeerMessageString(msg, _msgLength, 2+payload.size(), ID);
*(_msg+5) = _extensionMessage->getExtensionMessageID(); *(msg+5) = _extensionMessage->getExtensionMessageID();
memcpy(_msg+6, payload.c_str(), payload.size()); memcpy(msg+6, payload.data(), payload.size());
} return msg;
return _msg;
} }
size_t BtExtendedMessage::getMessageLength() { size_t BtExtendedMessage::getMessageLength() {
getMessage(); if(!_msgLength) {
_msgLength = 6+_extensionMessage->getPayload().size();
}
return _msgLength; return _msgLength;
} }

View File

@ -49,15 +49,11 @@ class BtExtendedMessage:public SimpleBtMessage
private: private:
SharedHandle<ExtensionMessage> _extensionMessage; SharedHandle<ExtensionMessage> _extensionMessage;
unsigned char* _msg;
size_t _msgLength; size_t _msgLength;
public: public:
BtExtendedMessage(const SharedHandle<ExtensionMessage>& extensionMessage = BtExtendedMessage(const SharedHandle<ExtensionMessage>& extensionMessage =
SharedHandle<ExtensionMessage>()); SharedHandle<ExtensionMessage>());
virtual ~BtExtendedMessage();
static const uint8_t ID = 20; static const uint8_t ID = 20;
static const std::string NAME; static const std::string NAME;
@ -70,7 +66,7 @@ public:
virtual void doReceivedAction(); virtual void doReceivedAction();
virtual const unsigned char* getMessage(); virtual unsigned char* createMessage();
virtual size_t getMessageLength(); virtual size_t getMessageLength();

View File

@ -62,7 +62,6 @@ BtHandshakeMessage::BtHandshakeMessage(const unsigned char* infoHash,
} }
void BtHandshakeMessage::init() { void BtHandshakeMessage::init() {
msg = 0;
this->pstrlen = 19; this->pstrlen = 19;
pstr = new unsigned char[PSTR_LENGTH]; pstr = new unsigned char[PSTR_LENGTH];
reserved = new unsigned char[RESERVED_LENGTH]; reserved = new unsigned char[RESERVED_LENGTH];
@ -88,15 +87,14 @@ BtHandshakeMessage::create(const unsigned char* data, size_t dataLength)
return message; return message;
} }
const unsigned char* BtHandshakeMessage::getMessage() { unsigned char* BtHandshakeMessage::createMessage()
if(!msg) { {
msg = new unsigned char[MESSAGE_LENGTH]; unsigned char* msg = new unsigned char[MESSAGE_LENGTH];
msg[0] = pstrlen; msg[0] = pstrlen;
memcpy(msg+1, pstr, PSTR_LENGTH); memcpy(msg+1, pstr, PSTR_LENGTH);
memcpy(msg+20, reserved, RESERVED_LENGTH); memcpy(msg+20, reserved, RESERVED_LENGTH);
memcpy(msg+28, infoHash, INFO_HASH_LENGTH); memcpy(msg+28, infoHash, INFO_HASH_LENGTH);
memcpy(msg+48, peerId, PEER_ID_LENGTH); memcpy(msg+48, peerId, PEER_ID_LENGTH);
}
return msg; return msg;
} }

View File

@ -51,7 +51,6 @@ private:
unsigned char* reserved; unsigned char* reserved;
unsigned char* infoHash; unsigned char* infoHash;
unsigned char* peerId; unsigned char* peerId;
unsigned char* msg;
void init(); void init();
public: public:
BtHandshakeMessage(); BtHandshakeMessage();
@ -65,7 +64,6 @@ public:
create(const unsigned char* data, size_t dataLength); create(const unsigned char* data, size_t dataLength);
virtual ~BtHandshakeMessage() { virtual ~BtHandshakeMessage() {
delete [] msg;
delete [] pstr; delete [] pstr;
delete [] reserved; delete [] reserved;
delete [] infoHash; delete [] infoHash;
@ -78,7 +76,7 @@ public:
virtual void doReceivedAction() {}; virtual void doReceivedAction() {};
virtual const unsigned char* getMessage(); virtual unsigned char* createMessage();
virtual size_t getMessageLength(); virtual size_t getMessageLength();

View File

@ -39,19 +39,19 @@ namespace aria2 {
const std::string BtKeepAliveMessage::NAME("keep alive"); const std::string BtKeepAliveMessage::NAME("keep alive");
const unsigned char* BtKeepAliveMessage::getMessage() { unsigned char* BtKeepAliveMessage::createMessage()
if(!msg) { {
/** /**
* len --- 0, 4bytes * len --- 0, 4bytes
* total: 4bytes * total: 4bytes
*/ */
msg = new unsigned char[MESSAGE_LENGTH]; unsigned char* msg = new unsigned char[MESSAGE_LENGTH];
memset(msg, 0, MESSAGE_LENGTH); memset(msg, 0, MESSAGE_LENGTH);
}
return msg; return msg;
} }
size_t BtKeepAliveMessage::getMessageLength() { size_t BtKeepAliveMessage::getMessageLength()
{
return MESSAGE_LENGTH; return MESSAGE_LENGTH;
} }

View File

@ -45,15 +45,9 @@ typedef SharedHandle<BtKeepAliveMessage> BtKeepAliveMessageHandle;
class BtKeepAliveMessage : public SimpleBtMessage { class BtKeepAliveMessage : public SimpleBtMessage {
private: private:
unsigned char* msg;
static const size_t MESSAGE_LENGTH = 4; static const size_t MESSAGE_LENGTH = 4;
public: public:
BtKeepAliveMessage():SimpleBtMessage(ID, NAME), msg(0) {} BtKeepAliveMessage():SimpleBtMessage(ID, NAME) {}
virtual ~BtKeepAliveMessage() {
delete [] msg;
}
static const uint8_t ID = 99; static const uint8_t ID = 99;
@ -61,11 +55,12 @@ public:
virtual void doReceivedAction() {} virtual void doReceivedAction() {}
virtual const unsigned char* getMessage(); virtual unsigned char* createMessage();
virtual size_t getMessageLength(); virtual size_t getMessageLength();
virtual std::string toString() const { virtual std::string toString() const
{
return NAME; return NAME;
} }
}; };

View File

@ -59,11 +59,11 @@ namespace aria2 {
const std::string BtPieceMessage::NAME("piece"); const std::string BtPieceMessage::NAME("piece");
void BtPieceMessage::setBlock(const unsigned char* block, size_t blockLength) { void BtPieceMessage::setRawMessage(unsigned char* data)
delete [] this->block; {
this->blockLength = blockLength; delete [] _rawData;
this->block = new unsigned char[this->blockLength]; _rawData = data;
memcpy(this->block, block, this->blockLength); this->block = data+9;
} }
BtPieceMessageHandle BtPieceMessage::create(const unsigned char* data, size_t dataLength) { BtPieceMessageHandle BtPieceMessage::create(const unsigned char* data, size_t dataLength) {
@ -72,7 +72,7 @@ BtPieceMessageHandle BtPieceMessage::create(const unsigned char* data, size_t da
BtPieceMessageHandle message(new BtPieceMessage()); BtPieceMessageHandle message(new BtPieceMessage());
message->setIndex(bittorrent::getIntParam(data, 1)); message->setIndex(bittorrent::getIntParam(data, 1));
message->setBegin(bittorrent::getIntParam(data, 5)); message->setBegin(bittorrent::getIntParam(data, 5));
message->setBlock(data+9, dataLength-9); message->setBlockLength(dataLength-9);
return message; return message;
} }
@ -119,8 +119,8 @@ void BtPieceMessage::doReceivedAction() {
size_t BtPieceMessage::MESSAGE_HEADER_LENGTH = 13; size_t BtPieceMessage::MESSAGE_HEADER_LENGTH = 13;
const unsigned char* BtPieceMessage::getMessageHeader() { unsigned char* BtPieceMessage::createMessageHeader()
if(!msgHeader) { {
/** /**
* len --- 9+blockLength, 4bytes * len --- 9+blockLength, 4bytes
* id --- 7, 1byte * id --- 7, 1byte
@ -128,12 +128,11 @@ const unsigned char* BtPieceMessage::getMessageHeader() {
* begin --- begin, 4bytes * begin --- begin, 4bytes
* total: 13bytes * total: 13bytes
*/ */
msgHeader = new unsigned char[MESSAGE_HEADER_LENGTH]; unsigned char* msgHeader = new unsigned char[MESSAGE_HEADER_LENGTH];
bittorrent::createPeerMessageString(msgHeader, MESSAGE_HEADER_LENGTH, bittorrent::createPeerMessageString(msgHeader, MESSAGE_HEADER_LENGTH,
9+blockLength, ID); 9+blockLength, ID);
bittorrent::setIntParam(&msgHeader[5], index); bittorrent::setIntParam(&msgHeader[5], index);
bittorrent::setIntParam(&msgHeader[9], begin); bittorrent::setIntParam(&msgHeader[9], begin);
}
return msgHeader; return msgHeader;
} }
@ -145,34 +144,44 @@ void BtPieceMessage::send() {
if(invalidate) { if(invalidate) {
return; return;
} }
size_t writtenLength;
if(!sendingInProgress) { if(!sendingInProgress) {
if(logger->info()) {
logger->info(MSG_SEND_PEER_MESSAGE, logger->info(MSG_SEND_PEER_MESSAGE,
cuid, peer->ipaddr.c_str(), peer->port, cuid, peer->ipaddr.c_str(), peer->port,
toString().c_str()); toString().c_str());
getMessageHeader(); }
peerConnection->sendMessage(msgHeader, getMessageHeaderLength()); unsigned char* msgHdr = createMessageHeader();
off_t pieceDataOffset = size_t msgHdrLen = getMessageHeaderLength();
(off_t)index*_downloadContext->getPieceLength()+begin;
size_t writtenLength = sendPieceData(pieceDataOffset, blockLength);
if(logger->debug()) { if(logger->debug()) {
logger->debug("msglength = %lu bytes", logger->debug("msglength = %lu bytes",
static_cast<unsigned long>(getMessageHeaderLength()+ static_cast<unsigned long>(msgHdrLen+blockLength));
blockLength));
} }
peer->updateUploadLength(writtenLength); peerConnection->pushBytes(msgHdr, msgHdrLen);
peerConnection->sendPendingData();
off_t pieceDataOffset =
(off_t)index*_downloadContext->getPieceLength()+begin;
writtenLength = sendPieceData(pieceDataOffset, blockLength);
} else { } else {
ssize_t writtenLength = peerConnection->sendPendingData(); writtenLength = peerConnection->sendPendingData();
peer->updateUploadLength(writtenLength);
} }
peer->updateUploadLength(writtenLength);
sendingInProgress = !peerConnection->sendBufferIsEmpty(); sendingInProgress = !peerConnection->sendBufferIsEmpty();
} }
size_t BtPieceMessage::sendPieceData(off_t offset, size_t length) const { size_t BtPieceMessage::sendPieceData(off_t offset, size_t length) const {
assert(length <= 16*1024); assert(length <= 16*1024);
unsigned char buf[16*1024]; unsigned char* buf = new unsigned char[length];
if(pieceStorage->getDiskAdaptor()->readData(buf, length, offset) == ssize_t r;
static_cast<ssize_t>(length)) { try {
return peerConnection->sendMessage(buf, length); r = pieceStorage->getDiskAdaptor()->readData(buf, length, offset);
} catch(RecoverableException& e) {
delete [] buf;
throw;
}
if(r == static_cast<ssize_t>(length)) {
peerConnection->pushBytes(buf, length);
return peerConnection->sendPendingData();
} else { } else {
throw DL_ABORT_EX(EX_DATA_READ); throw DL_ABORT_EX(EX_DATA_READ);
} }

View File

@ -51,7 +51,7 @@ private:
uint32_t begin; uint32_t begin;
uint32_t blockLength; uint32_t blockLength;
unsigned char* block; unsigned char* block;
unsigned char* msgHeader; unsigned char* _rawData;
SharedHandle<DownloadContext> _downloadContext; SharedHandle<DownloadContext> _downloadContext;
static size_t MESSAGE_HEADER_LENGTH; static size_t MESSAGE_HEADER_LENGTH;
@ -72,14 +72,13 @@ public:
begin(begin), begin(begin),
blockLength(blockLength), blockLength(blockLength),
block(0), block(0),
msgHeader(0) _rawData(0)
{ {
uploading = true; uploading = true;
} }
virtual ~BtPieceMessage() { virtual ~BtPieceMessage() {
delete [] msgHeader; delete [] _rawData;
delete [] block;
} }
static const uint8_t ID = 7; static const uint8_t ID = 7;
@ -96,10 +95,13 @@ public:
const unsigned char* getBlock() const { return block; } const unsigned char* getBlock() const { return block; }
void setBlock(const unsigned char* block, size_t blockLength);
size_t getBlockLength() const { return blockLength; } size_t getBlockLength() const { return blockLength; }
// Stores raw message data. After this function call, this object
// has ownership of data. Caller must not be free or alter data.
// Member block is pointed to block starting position in data.
void setRawMessage(unsigned char* data);
void setBlockLength(size_t blockLength) { this->blockLength = blockLength; } void setBlockLength(size_t blockLength) { this->blockLength = blockLength; }
void setDownloadContext(const SharedHandle<DownloadContext>& downloadContext); void setDownloadContext(const SharedHandle<DownloadContext>& downloadContext);
@ -108,7 +110,7 @@ public:
virtual void doReceivedAction(); virtual void doReceivedAction();
const unsigned char* getMessageHeader(); unsigned char* createMessageHeader();
size_t getMessageHeaderLength(); size_t getMessageHeaderLength();

View File

@ -52,14 +52,10 @@ namespace aria2 {
const std::string BtPortMessage::NAME("port"); const std::string BtPortMessage::NAME("port");
BtPortMessage::BtPortMessage(uint16_t port): BtPortMessage::BtPortMessage(uint16_t port):
SimpleBtMessage(ID, NAME), _port(port), _msg(0) {} SimpleBtMessage(ID, NAME), _port(port) {}
BtPortMessage::~BtPortMessage() SharedHandle<BtPortMessage> BtPortMessage::create
{ (const unsigned char* data, size_t dataLength)
delete [] _msg;
}
SharedHandle<BtPortMessage> BtPortMessage::create(const unsigned char* data, size_t dataLength)
{ {
bittorrent::assertPayloadLengthEqual(3, dataLength, NAME); bittorrent::assertPayloadLengthEqual(3, dataLength, NAME);
bittorrent::assertID(ID, data, NAME); bittorrent::assertID(ID, data, NAME);
@ -96,19 +92,18 @@ void BtPortMessage::doReceivedAction()
} }
} }
const unsigned char* BtPortMessage::getMessage() { unsigned char* BtPortMessage::createMessage()
if(!_msg) { {
/** /**
* len --- 5, 4bytes * len --- 5, 4bytes
* id --- 4, 1byte * id --- 4, 1byte
* port --- port number, 2bytes * port --- port number, 2bytes
* total: 7bytes * total: 7bytes
*/ */
_msg = new unsigned char[MESSAGE_LENGTH]; unsigned char* msg = new unsigned char[MESSAGE_LENGTH];
bittorrent::createPeerMessageString(_msg, MESSAGE_LENGTH, 3, ID); bittorrent::createPeerMessageString(msg, MESSAGE_LENGTH, 3, ID);
bittorrent::setShortIntParam(&_msg[5], _port); bittorrent::setShortIntParam(&msg[5], _port);
} return msg;
return _msg;
} }
size_t BtPortMessage::getMessageLength() { size_t BtPortMessage::getMessageLength() {

View File

@ -47,7 +47,6 @@ class DHTTaskFactory;
class BtPortMessage : public SimpleBtMessage { class BtPortMessage : public SimpleBtMessage {
private: private:
uint16_t _port; uint16_t _port;
unsigned char* _msg;
static const size_t MESSAGE_LENGTH = 7; static const size_t MESSAGE_LENGTH = 7;
WeakHandle<DHTNode> _localNode; WeakHandle<DHTNode> _localNode;
@ -60,8 +59,6 @@ private:
public: public:
BtPortMessage(uint16_t port); BtPortMessage(uint16_t port);
virtual ~BtPortMessage();
static const uint8_t ID = 9; static const uint8_t ID = 9;
static const std::string NAME; static const std::string NAME;
@ -72,7 +69,7 @@ public:
virtual void doReceivedAction(); virtual void doReceivedAction();
virtual const unsigned char* getMessage(); virtual unsigned char* createMessage();
virtual size_t getMessageLength(); virtual size_t getMessageLength();

View File

@ -45,7 +45,6 @@ typedef SharedHandle<BtUnchokeMessage> BtUnchokeMessageHandle;
class BtUnchokeMessage : public ZeroBtMessage { class BtUnchokeMessage : public ZeroBtMessage {
private: private:
unsigned char* msg;
static const size_t MESSAGE_LENGTH = 5; static const size_t MESSAGE_LENGTH = 5;
public: public:
BtUnchokeMessage():ZeroBtMessage(ID, NAME) {} BtUnchokeMessage():ZeroBtMessage(ID, NAME) {}

View File

@ -46,6 +46,7 @@
#include "Logger.h" #include "Logger.h"
#include "LogFactory.h" #include "LogFactory.h"
#include "bittorrent_helper.h" #include "bittorrent_helper.h"
#include "BtPieceMessage.h"
namespace aria2 { namespace aria2 {
@ -104,13 +105,19 @@ void DefaultBtMessageReceiver::sendHandshake() {
} }
BtMessageHandle DefaultBtMessageReceiver::receiveMessage() { BtMessageHandle DefaultBtMessageReceiver::receiveMessage() {
unsigned char data[MAX_PAYLOAD_LEN];
size_t dataLength = 0; size_t dataLength = 0;
if(!peerConnection->receiveMessage(data, dataLength)) { // Give 0 to PeerConnection::receiveMessage() to prevent memcpy.
if(!peerConnection->receiveMessage(0, dataLength)) {
return SharedHandle<BtMessage>(); return SharedHandle<BtMessage>();
} }
BtMessageHandle msg = messageFactory->createBtMessage(data, dataLength); BtMessageHandle msg =
messageFactory->createBtMessage(peerConnection->getBuffer(), dataLength);
msg->validate(); msg->validate();
if(msg->getId() == BtPieceMessage::ID) {
SharedHandle<BtPieceMessage> piecemsg =
dynamic_pointer_cast<BtPieceMessage>(msg);
piecemsg->setRawMessage(peerConnection->detachBuffer());
}
return msg; return msg;
} }

View File

@ -39,20 +39,18 @@
namespace aria2 { namespace aria2 {
const unsigned char* IndexBtMessage::getMessage() unsigned char* IndexBtMessage::createMessage()
{ {
if(!_msg) {
/** /**
* len --- 5, 4bytes * len --- 5, 4bytes
* id --- ?, 1byte * id --- ?, 1byte
* piece index --- index, 4bytes * piece index --- index, 4bytes
* total: 9bytes * total: 9bytes
*/ */
_msg = new unsigned char[MESSAGE_LENGTH]; unsigned char* msg = new unsigned char[MESSAGE_LENGTH];
bittorrent::createPeerMessageString(_msg, MESSAGE_LENGTH, 5, getId()); bittorrent::createPeerMessageString(msg, MESSAGE_LENGTH, 5, getId());
bittorrent::setIntParam(&_msg[5], _index); bittorrent::setIntParam(&msg[5], _index);
} return msg;
return _msg;
} }
size_t IndexBtMessage::getMessageLength() size_t IndexBtMessage::getMessageLength()

View File

@ -43,7 +43,6 @@ namespace aria2 {
class IndexBtMessage : public SimpleBtMessage { class IndexBtMessage : public SimpleBtMessage {
private: private:
size_t _index; size_t _index;
unsigned char* _msg;
static const size_t MESSAGE_LENGTH = 9; static const size_t MESSAGE_LENGTH = 9;
protected: protected:
@ -59,19 +58,13 @@ protected:
public: public:
IndexBtMessage(uint8_t id, const std::string& name, size_t index) IndexBtMessage(uint8_t id, const std::string& name, size_t index)
:SimpleBtMessage(id, name), :SimpleBtMessage(id, name),
_index(index), _index(index) {}
_msg(0) {}
virtual ~IndexBtMessage()
{
delete [] _msg;
}
void setIndex(size_t index) { _index = index; } void setIndex(size_t index) { _index = index; }
size_t getIndex() const { return _index; } size_t getIndex() const { return _index; }
virtual const unsigned char* getMessage(); virtual unsigned char* createMessage();
virtual size_t getMessageLength(); virtual size_t getMessageLength();

View File

@ -56,6 +56,7 @@ PeerConnection::PeerConnection(int32_t cuid, const SocketHandle& socket)
:cuid(cuid), :cuid(cuid),
socket(socket), socket(socket),
logger(LogFactory::getInstance()), logger(LogFactory::getInstance()),
resbuf(new unsigned char[MAX_PAYLOAD_LEN]),
resbufLength(0), resbufLength(0),
currentPayloadLength(0), currentPayloadLength(0),
lenbufLength(0), lenbufLength(0),
@ -64,7 +65,10 @@ PeerConnection::PeerConnection(int32_t cuid, const SocketHandle& socket)
_prevPeek(false) _prevPeek(false)
{} {}
PeerConnection::~PeerConnection() {} PeerConnection::~PeerConnection()
{
delete [] resbuf;
}
ssize_t PeerConnection::sendMessage(const unsigned char* data, ssize_t PeerConnection::sendMessage(const unsigned char* data,
size_t dataLength) size_t dataLength)
@ -76,6 +80,42 @@ ssize_t PeerConnection::sendMessage(const unsigned char* data,
return writtenLength; return writtenLength;
} }
void PeerConnection::pushStr(const std::string& data)
{
if(_encryptionEnabled) {
const size_t len = data.size();
unsigned char* chunk = new unsigned char[len];
try {
_encryptor->encrypt
(chunk, len, reinterpret_cast<const unsigned char*>(data.data()), len);
} catch(RecoverableException& e) {
delete [] chunk;
throw;
}
_socketBuffer.pushBytes(chunk, len);
} else {
_socketBuffer.feedSendBuffer(data);
}
}
void PeerConnection::pushBytes(unsigned char* data, size_t len)
{
if(_encryptionEnabled) {
unsigned char* chunk = new unsigned char[len];
try {
_encryptor->encrypt(chunk, len, data, len);
} catch(RecoverableException& e) {
delete [] data;
delete [] chunk;
throw;
}
delete [] data;
_socketBuffer.pushBytes(chunk, len);
} else {
_socketBuffer.pushBytes(data, len);
}
}
bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) { bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) {
if(resbufLength == 0 && 4 > lenbufLength) { if(resbufLength == 0 && 4 > lenbufLength) {
if(!socket->isReadable(0)) { if(!socket->isReadable(0)) {
@ -140,8 +180,9 @@ bool PeerConnection::receiveMessage(unsigned char* data, size_t& dataLength) {
// we got whole payload. // we got whole payload.
resbufLength = 0; resbufLength = 0;
lenbufLength = 0; lenbufLength = 0;
if(data) {
memcpy(data, resbuf, currentPayloadLength); memcpy(data, resbuf, currentPayloadLength);
}
dataLength = currentPayloadLength; dataLength = currentPayloadLength;
return true; return true;
} }

View File

@ -36,9 +36,11 @@
#define _D_PEER_CONNECTION_H_ #define _D_PEER_CONNECTION_H_
#include "common.h" #include "common.h"
#include <unistd.h>
#include "SharedHandle.h" #include "SharedHandle.h"
#include "SocketBuffer.h" #include "SocketBuffer.h"
#include <unistd.h>
namespace aria2 { namespace aria2 {
@ -57,7 +59,7 @@ private:
SharedHandle<SocketCore> socket; SharedHandle<SocketCore> socket;
Logger* logger; Logger* logger;
unsigned char resbuf[MAX_PAYLOAD_LEN]; unsigned char* resbuf;
size_t resbufLength; size_t resbufLength;
size_t currentPayloadLength; size_t currentPayloadLength;
unsigned char lenbuf[4]; unsigned char lenbuf[4];
@ -83,6 +85,10 @@ public:
// Returns the number of bytes written // Returns the number of bytes written
ssize_t sendMessage(const unsigned char* data, size_t dataLength); ssize_t sendMessage(const unsigned char* data, size_t dataLength);
void pushBytes(unsigned char* data, size_t len);
void pushStr(const std::string& data);
bool receiveMessage(unsigned char* data, size_t& dataLength); bool receiveMessage(unsigned char* data, size_t& dataLength);
/** /**
@ -101,6 +107,18 @@ public:
bool sendBufferIsEmpty() const; bool sendBufferIsEmpty() const;
ssize_t sendPendingData(); ssize_t sendPendingData();
const unsigned char* getBuffer() const
{
return resbuf;
}
unsigned char* detachBuffer()
{
unsigned char* detachbuf = resbuf;
resbuf = new unsigned char[MAX_PAYLOAD_LEN];
return detachbuf;
}
}; };
typedef SharedHandle<PeerConnection> PeerConnectionHandle; typedef SharedHandle<PeerConnection> PeerConnectionHandle;

View File

@ -45,17 +45,10 @@ RangeBtMessage::RangeBtMessage(uint8_t id,
:SimpleBtMessage(id, name), :SimpleBtMessage(id, name),
_index(index), _index(index),
_begin(begin), _begin(begin),
_length(length), _length(length) {}
_msg(0) {}
RangeBtMessage::~RangeBtMessage() unsigned char* RangeBtMessage::createMessage()
{ {
delete [] _msg;
}
const unsigned char* RangeBtMessage::getMessage()
{
if(!_msg) {
/** /**
* len --- 13, 4bytes * len --- 13, 4bytes
* id --- ?, 1byte * id --- ?, 1byte
@ -64,13 +57,12 @@ const unsigned char* RangeBtMessage::getMessage()
* length -- length, 4bytes * length -- length, 4bytes
* total: 17bytes * total: 17bytes
*/ */
_msg = new unsigned char[MESSAGE_LENGTH]; unsigned char* msg = new unsigned char[MESSAGE_LENGTH];
bittorrent::createPeerMessageString(_msg, MESSAGE_LENGTH, 13, getId()); bittorrent::createPeerMessageString(msg, MESSAGE_LENGTH, 13, getId());
bittorrent::setIntParam(&_msg[5], _index); bittorrent::setIntParam(&msg[5], _index);
bittorrent::setIntParam(&_msg[9], _begin); bittorrent::setIntParam(&msg[9], _begin);
bittorrent::setIntParam(&_msg[13], _length); bittorrent::setIntParam(&msg[13], _length);
} return msg;
return _msg;
} }
size_t RangeBtMessage::getMessageLength() size_t RangeBtMessage::getMessageLength()

View File

@ -45,7 +45,6 @@ private:
size_t _index; size_t _index;
uint32_t _begin; uint32_t _begin;
size_t _length; size_t _length;
unsigned char* _msg;
static const size_t MESSAGE_LENGTH = 17; static const size_t MESSAGE_LENGTH = 17;
protected: protected:
@ -65,8 +64,6 @@ public:
RangeBtMessage(uint8_t id, const std::string& name, RangeBtMessage(uint8_t id, const std::string& name,
size_t index, uint32_t begin, size_t length); size_t index, uint32_t begin, size_t length);
virtual ~RangeBtMessage();
size_t getIndex() const { return _index; } size_t getIndex() const { return _index; }
void setIndex(size_t index) { _index = index; } void setIndex(size_t index) { _index = index; }
@ -79,7 +76,7 @@ public:
void setLength(size_t length) { _length = length; } void setLength(size_t length) { _length = length; }
virtual const unsigned char* getMessage(); virtual unsigned char* createMessage();
virtual size_t getMessageLength(); virtual size_t getMessageLength();

View File

@ -53,20 +53,19 @@ void SimpleBtMessage::send() {
return; return;
} }
if(!sendingInProgress) { if(!sendingInProgress) {
const unsigned char* msg = getMessage();
size_t msgLength = getMessageLength();
if(logger->info()) { if(logger->info()) {
logger->info(MSG_SEND_PEER_MESSAGE, logger->info(MSG_SEND_PEER_MESSAGE,
cuid, peer->ipaddr.c_str(), peer->port, toString().c_str()); cuid, peer->ipaddr.c_str(), peer->port, toString().c_str());
} }
unsigned char* msg = createMessage();
size_t msgLength = getMessageLength();
if(logger->debug()) { if(logger->debug()) {
logger->debug("msglength = %lu bytes", logger->debug("msglength = %lu bytes",
static_cast<unsigned long>(msgLength)); static_cast<unsigned long>(msgLength));
} }
peerConnection->sendMessage(msg, msgLength); peerConnection->pushBytes(msg, msgLength);
} else {
peerConnection->sendPendingData();
} }
peerConnection->sendPendingData();
sendingInProgress = !peerConnection->sendBufferIsEmpty(); sendingInProgress = !peerConnection->sendBufferIsEmpty();
if(!sendingInProgress) { if(!sendingInProgress) {
onSendComplete(); onSendComplete();

View File

@ -47,7 +47,7 @@ public:
virtual void send(); virtual void send();
virtual const unsigned char* getMessage() = 0; virtual unsigned char* createMessage() = 0;
virtual size_t getMessageLength() = 0; virtual size_t getMessageLength() = 0;

View File

@ -48,9 +48,14 @@ SocketBuffer::SocketBuffer(const SharedHandle<SocketCore>& socket):
SocketBuffer::~SocketBuffer() {} SocketBuffer::~SocketBuffer() {}
void SocketBuffer::pushBytes(unsigned char* bytes, size_t len)
{
_bufq.push_back(BufEntry::createBytes(bytes, len));
}
void SocketBuffer::feedSendBuffer(const std::string& data) void SocketBuffer::feedSendBuffer(const std::string& data)
{ {
_bufq.push_back(data); _bufq.push_back(BufEntry::createStr(data));
} }
ssize_t SocketBuffer::feedAndSend(const std::string& data) ssize_t SocketBuffer::feedAndSend(const std::string& data)
@ -63,10 +68,18 @@ ssize_t SocketBuffer::send()
{ {
size_t totalslen = 0; size_t totalslen = 0;
while(!_bufq.empty()) { while(!_bufq.empty()) {
const std::string& data = _bufq[0]; BufEntry& buf = _bufq[0];
const size_t size = data.size(); const char* data;
ssize_t r = size-_offset; ssize_t r;
ssize_t slen = _socket->writeData(data.data()+_offset, r); if(buf.type == TYPE_BYTES) {
data = reinterpret_cast<const char*>(buf.bytes);
r = buf.bytesLen-_offset;
} else {
const std::string& str = *buf.str;
data = str.data();
r = str.size()-_offset;
}
ssize_t slen = _socket->writeData(data+_offset, r);
if(slen == 0 && !_socket->wantRead() && !_socket->wantWrite()) { if(slen == 0 && !_socket->wantRead() && !_socket->wantWrite()) {
throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND, throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND,
"Connection closed.").str()); "Connection closed.").str());
@ -77,6 +90,7 @@ ssize_t SocketBuffer::send()
break; break;
} else { } else {
_offset = 0; _offset = 0;
buf.deleteBuf();
_bufq.pop_front(); _bufq.pop_front();
} }
} }

View File

@ -48,9 +48,46 @@ class SocketCore;
class SocketBuffer { class SocketBuffer {
private: private:
enum BUF_TYPE {
TYPE_BYTES,
TYPE_STR
};
struct BufEntry {
BUF_TYPE type;
unsigned char* bytes;
size_t bytesLen;
std::string* str;
void deleteBuf()
{
if(type == TYPE_BYTES) {
delete [] bytes;
} else if(type == TYPE_STR) {
delete str;
}
}
static BufEntry createBytes(unsigned char* bytes, size_t len)
{
BufEntry b;
b.type = TYPE_BYTES;
b.bytes = bytes;
b.bytesLen = len;
return b;
}
static BufEntry createStr(const std::string& str)
{
BufEntry b;
b.type = TYPE_STR;
b.str = new std::string(str);
return b;
}
};
SharedHandle<SocketCore> _socket; SharedHandle<SocketCore> _socket;
std::deque<std::string> _bufq; std::deque<BufEntry> _bufq;
// Offset of data in _bufq[0]. SocketBuffer tries to send _bufq[0], // Offset of data in _bufq[0]. SocketBuffer tries to send _bufq[0],
// but it cannot always send whole data. In this case, offset points // but it cannot always send whole data. In this case, offset points
@ -61,6 +98,11 @@ public:
~SocketBuffer(); ~SocketBuffer();
// Feeds data pointered by bytes with length len. into queue. This
// object gets ownership of bytes, so caller must not delete or
// later bytes after this call.
void pushBytes(unsigned char* bytes, size_t len);
// Feeds data into queue. This function doesn't send data. // Feeds data into queue. This function doesn't send data.
void feedSendBuffer(const std::string& data); void feedSendBuffer(const std::string& data);

View File

@ -37,18 +37,16 @@
namespace aria2 { namespace aria2 {
const unsigned char* ZeroBtMessage::getMessage() unsigned char* ZeroBtMessage::createMessage()
{ {
if(!_msg) {
/** /**
* len --- 1, 4bytes * len --- 1, 4bytes
* id --- ?, 1byte * id --- ?, 1byte
* total: 5bytes * total: 5bytes
*/ */
_msg = new unsigned char[MESSAGE_LENGTH]; unsigned char* msg = new unsigned char[MESSAGE_LENGTH];
bittorrent::createPeerMessageString(_msg, MESSAGE_LENGTH, 1, getId()); bittorrent::createPeerMessageString(msg, MESSAGE_LENGTH, 1, getId());
} return msg;
return _msg;
} }
size_t ZeroBtMessage::getMessageLength() size_t ZeroBtMessage::getMessageLength()

View File

@ -42,8 +42,6 @@ namespace aria2 {
class ZeroBtMessage : public SimpleBtMessage { class ZeroBtMessage : public SimpleBtMessage {
private: private:
unsigned char* _msg;
static const size_t MESSAGE_LENGTH = 5; static const size_t MESSAGE_LENGTH = 5;
protected: protected:
template<typename T> template<typename T>
@ -57,14 +55,9 @@ protected:
public: public:
ZeroBtMessage(uint8_t id, const std::string& name): ZeroBtMessage(uint8_t id, const std::string& name):
SimpleBtMessage(id, name), _msg(0) {} SimpleBtMessage(id, name) {}
virtual ~ZeroBtMessage() virtual unsigned char* createMessage();
{
delete [] _msg;
}
virtual const unsigned char* getMessage();
virtual size_t getMessageLength(); virtual size_t getMessageLength();

View File

@ -13,7 +13,7 @@ class BtAllowedFastMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtAllowedFastMessageTest); CPPUNIT_TEST_SUITE(BtAllowedFastMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testOnSendComplete); CPPUNIT_TEST(testOnSendComplete);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
@ -25,7 +25,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testOnSendComplete(); void testOnSendComplete();
void testToString(); void testToString();
@ -60,13 +60,15 @@ void BtAllowedFastMessageTest::testCreate() {
} }
} }
void BtAllowedFastMessageTest::testGetMessage() { void BtAllowedFastMessageTest::testCreateMessage() {
BtAllowedFastMessage msg; BtAllowedFastMessage msg;
msg.setIndex(12345); msg.setIndex(12345);
unsigned char data[9]; unsigned char data[9];
bittorrent::createPeerMessageString(data, sizeof(data), 5, 17); bittorrent::createPeerMessageString(data, sizeof(data), 5, 17);
bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[5], 12345);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 9) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 9) == 0);
delete [] rawmsg;
} }
void BtAllowedFastMessageTest::testDoReceivedAction() { void BtAllowedFastMessageTest::testDoReceivedAction() {

View File

@ -16,7 +16,7 @@ class BtBitfieldMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtBitfieldMessageTest); CPPUNIT_TEST_SUITE(BtBitfieldMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testDoReceivedAction_goodByeSeeder); CPPUNIT_TEST(testDoReceivedAction_goodByeSeeder);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
@ -28,7 +28,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testDoReceivedAction_goodByeSeeder(); void testDoReceivedAction_goodByeSeeder();
void testToString(); void testToString();
@ -65,7 +65,7 @@ void BtBitfieldMessageTest::testCreate() {
} }
} }
void BtBitfieldMessageTest::testGetMessage() { void BtBitfieldMessageTest::testCreateMessage() {
BtBitfieldMessage msg; BtBitfieldMessage msg;
unsigned char bitfield[2]; unsigned char bitfield[2];
memset(bitfield, 0xff, sizeof(bitfield)); memset(bitfield, 0xff, sizeof(bitfield));
@ -73,7 +73,10 @@ void BtBitfieldMessageTest::testGetMessage() {
unsigned char data[5+2]; unsigned char data[5+2];
bittorrent::createPeerMessageString(data, sizeof(data), 3, 5); bittorrent::createPeerMessageString(data, sizeof(data), 3, 5);
memcpy(&data[5], bitfield, sizeof(bitfield)); memcpy(&data[5], bitfield, sizeof(bitfield));
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 7) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 7) == 0);
delete [] rawmsg;
CPPUNIT_ASSERT_EQUAL((size_t)7, msg.getMessageLength());
} }
void BtBitfieldMessageTest::testDoReceivedAction() { void BtBitfieldMessageTest::testDoReceivedAction() {

View File

@ -16,7 +16,7 @@ class BtCancelMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtCancelMessageTest); CPPUNIT_TEST_SUITE(BtCancelMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
private: private:
@ -27,7 +27,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
class MockBtMessageDispatcher2 : public MockBtMessageDispatcher { class MockBtMessageDispatcher2 : public MockBtMessageDispatcher {
@ -81,7 +81,7 @@ void BtCancelMessageTest::testCreate() {
} }
} }
void BtCancelMessageTest::testGetMessage() { void BtCancelMessageTest::testCreateMessage() {
BtCancelMessage msg; BtCancelMessage msg;
msg.setIndex(12345); msg.setIndex(12345);
msg.setBegin(256); msg.setBegin(256);
@ -91,7 +91,9 @@ void BtCancelMessageTest::testGetMessage() {
bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[5], 12345);
bittorrent::setIntParam(&data[9], 256); bittorrent::setIntParam(&data[9], 256);
bittorrent::setIntParam(&data[13], 1024); bittorrent::setIntParam(&data[13], 1024);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 17) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 17) == 0);
delete [] rawmsg;
} }
void BtCancelMessageTest::testDoReceivedAction() { void BtCancelMessageTest::testDoReceivedAction() {

View File

@ -16,7 +16,7 @@ class BtChokeMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtChokeMessageTest); CPPUNIT_TEST_SUITE(BtChokeMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testOnSendComplete); CPPUNIT_TEST(testOnSendComplete);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
@ -34,7 +34,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testOnSendComplete(); void testOnSendComplete();
void testToString(); void testToString();
@ -94,11 +94,13 @@ void BtChokeMessageTest::testCreate() {
} }
} }
void BtChokeMessageTest::testGetMessage() { void BtChokeMessageTest::testCreateMessage() {
BtChokeMessage msg; BtChokeMessage msg;
unsigned char data[5]; unsigned char data[5];
bittorrent::createPeerMessageString(data, sizeof(data), 1, 0); bittorrent::createPeerMessageString(data, sizeof(data), 1, 0);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 5) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0);
delete [] rawmsg;
} }
void BtChokeMessageTest::testDoReceivedAction() { void BtChokeMessageTest::testDoReceivedAction() {

View File

@ -16,7 +16,7 @@ class BtExtendedMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtExtendedMessageTest); CPPUNIT_TEST_SUITE(BtExtendedMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
@ -24,7 +24,7 @@ private:
public: public:
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testToString(); void testToString();
}; };
@ -70,7 +70,7 @@ void BtExtendedMessageTest::testCreate() {
} }
} }
void BtExtendedMessageTest::testGetMessage() { void BtExtendedMessageTest::testCreateMessage() {
std::string payload = "4:name3:foo"; std::string payload = "4:name3:foo";
uint8_t extendedMessageID = 1; uint8_t extendedMessageID = 1;
SharedHandle<MockExtensionMessage> exmsg SharedHandle<MockExtensionMessage> exmsg
@ -81,7 +81,10 @@ void BtExtendedMessageTest::testGetMessage() {
bittorrent::createPeerMessageString(data, sizeof(data), 13, 20); bittorrent::createPeerMessageString(data, sizeof(data), 13, 20);
*(data+5) = extendedMessageID; *(data+5) = extendedMessageID;
memcpy(data+6, payload.c_str(), payload.size()); memcpy(data+6, payload.c_str(), payload.size());
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 17) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 17) == 0);
delete [] rawmsg;
CPPUNIT_ASSERT_EQUAL((size_t)17, msg.getMessageLength());
} }
void BtExtendedMessageTest::testDoReceivedAction() { void BtExtendedMessageTest::testDoReceivedAction() {

View File

@ -13,7 +13,7 @@ class BtHandshakeMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtHandshakeMessageTest); CPPUNIT_TEST_SUITE(BtHandshakeMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
CPPUNIT_TEST(testSetDHTEnabled); CPPUNIT_TEST(testSetDHTEnabled);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
@ -24,7 +24,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testToString(); void testToString();
void testSetDHTEnabled(); void testSetDHTEnabled();
@ -70,7 +70,7 @@ void BtHandshakeMessageTest::testCreate() {
util::toHex(message->getPeerId(), PEER_ID_LENGTH)); util::toHex(message->getPeerId(), PEER_ID_LENGTH));
} }
void BtHandshakeMessageTest::testGetMessage() { void BtHandshakeMessageTest::testCreateMessage() {
unsigned char infoHash[] = { 0xff, 0xff, 0xff, 0xff, 0xff, unsigned char infoHash[] = { 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
@ -86,8 +86,10 @@ void BtHandshakeMessageTest::testGetMessage() {
unsigned char data[68]; unsigned char data[68];
createHandshakeMessageData(data); createHandshakeMessageData(data);
unsigned char* rawmsg = msg->createMessage();
CPPUNIT_ASSERT_EQUAL(util::toHex((const unsigned char*)data, 68), CPPUNIT_ASSERT_EQUAL(util::toHex((const unsigned char*)data, 68),
util::toHex((const unsigned char*)msg->getMessage(), 68)); util::toHex(rawmsg, 68));
delete [] rawmsg;
} }
void BtHandshakeMessageTest::testToString() { void BtHandshakeMessageTest::testToString() {

View File

@ -15,7 +15,7 @@ class BtHaveAllMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtHaveAllMessageTest); CPPUNIT_TEST_SUITE(BtHaveAllMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testDoReceivedAction_goodByeSeeder); CPPUNIT_TEST(testDoReceivedAction_goodByeSeeder);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
@ -26,7 +26,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testDoReceivedAction_goodByeSeeder(); void testDoReceivedAction_goodByeSeeder();
}; };
@ -58,11 +58,13 @@ void BtHaveAllMessageTest::testCreate() {
} }
} }
void BtHaveAllMessageTest::testGetMessage() { void BtHaveAllMessageTest::testCreateMessage() {
BtHaveAllMessage msg; BtHaveAllMessage msg;
unsigned char data[5]; unsigned char data[5];
bittorrent::createPeerMessageString(data, sizeof(data), 1, 14); bittorrent::createPeerMessageString(data, sizeof(data), 1, 14);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 5) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0);
delete [] rawmsg;
} }
void BtHaveAllMessageTest::testDoReceivedAction() { void BtHaveAllMessageTest::testDoReceivedAction() {

View File

@ -15,7 +15,7 @@ class BtHaveMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtHaveMessageTest); CPPUNIT_TEST_SUITE(BtHaveMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testDoReceivedAction_goodByeSeeder); CPPUNIT_TEST(testDoReceivedAction_goodByeSeeder);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
@ -27,7 +27,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testDoReceivedAction_goodByeSeeder(); void testDoReceivedAction_goodByeSeeder();
void testToString(); void testToString();
@ -62,13 +62,15 @@ void BtHaveMessageTest::testCreate() {
} }
} }
void BtHaveMessageTest::testGetMessage() { void BtHaveMessageTest::testCreateMessage() {
BtHaveMessage msg; BtHaveMessage msg;
msg.setIndex(12345); msg.setIndex(12345);
unsigned char data[9]; unsigned char data[9];
bittorrent::createPeerMessageString(data, sizeof(data), 5, 4); bittorrent::createPeerMessageString(data, sizeof(data), 5, 4);
bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[5], 12345);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 9) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 9) == 0);
delete [] rawmsg;
} }
void BtHaveMessageTest::testDoReceivedAction() { void BtHaveMessageTest::testDoReceivedAction() {

View File

@ -13,7 +13,7 @@ class BtHaveNoneMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtHaveNoneMessageTest); CPPUNIT_TEST_SUITE(BtHaveNoneMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
@ -24,7 +24,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testToString(); void testToString();
}; };
@ -56,11 +56,13 @@ void BtHaveNoneMessageTest::testCreate() {
} }
} }
void BtHaveNoneMessageTest::testGetMessage() { void BtHaveNoneMessageTest::testCreateMessage() {
BtHaveNoneMessage msg; BtHaveNoneMessage msg;
unsigned char data[5]; unsigned char data[5];
bittorrent::createPeerMessageString(data, sizeof(data), 1, 15); bittorrent::createPeerMessageString(data, sizeof(data), 1, 15);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 5) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0);
delete [] rawmsg;
} }
void BtHaveNoneMessageTest::testDoReceivedAction() { void BtHaveNoneMessageTest::testDoReceivedAction() {

View File

@ -14,14 +14,14 @@ class BtInterestedMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtInterestedMessageTest); CPPUNIT_TEST_SUITE(BtInterestedMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testOnSendComplete); CPPUNIT_TEST(testOnSendComplete);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
public: public:
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testOnSendComplete(); void testOnSendComplete();
void testToString(); void testToString();
@ -54,11 +54,13 @@ void BtInterestedMessageTest::testCreate() {
} }
} }
void BtInterestedMessageTest::testGetMessage() { void BtInterestedMessageTest::testCreateMessage() {
BtInterestedMessage msg; BtInterestedMessage msg;
unsigned char data[5]; unsigned char data[5];
bittorrent::createPeerMessageString(data, sizeof(data), 1, 2); bittorrent::createPeerMessageString(data, sizeof(data), 1, 2);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 5) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0);
delete [] rawmsg;
} }
void BtInterestedMessageTest::testDoReceivedAction() { void BtInterestedMessageTest::testDoReceivedAction() {

View File

@ -7,7 +7,7 @@ namespace aria2 {
class BtKeepAliveMessageTest:public CppUnit::TestFixture { class BtKeepAliveMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtKeepAliveMessageTest); CPPUNIT_TEST_SUITE(BtKeepAliveMessageTest);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
private: private:
@ -16,19 +16,21 @@ public:
void setUp() { void setUp() {
} }
void testGetMessage(); void testCreateMessage();
void testToString(); void testToString();
}; };
CPPUNIT_TEST_SUITE_REGISTRATION(BtKeepAliveMessageTest); CPPUNIT_TEST_SUITE_REGISTRATION(BtKeepAliveMessageTest);
void BtKeepAliveMessageTest::testGetMessage() { void BtKeepAliveMessageTest::testCreateMessage() {
char msg[4]; char data[4];
memset(msg, 0, sizeof(msg)); memset(data, 0, sizeof(data));
BtKeepAliveMessage message; BtKeepAliveMessage message;
CPPUNIT_ASSERT_EQUAL((uint8_t)99, message.getId()); CPPUNIT_ASSERT_EQUAL((uint8_t)99, message.getId());
CPPUNIT_ASSERT_EQUAL((size_t)4, message.getMessageLength()); CPPUNIT_ASSERT_EQUAL((size_t)4, message.getMessageLength());
CPPUNIT_ASSERT(memcmp(msg, message.getMessage(), 4) == 0); unsigned char* rawmsg = message.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 4) == 0);
delete [] rawmsg;
} }
void BtKeepAliveMessageTest::testToString() { void BtKeepAliveMessageTest::testToString() {

View File

@ -14,14 +14,14 @@ class BtNotInterestedMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtNotInterestedMessageTest); CPPUNIT_TEST_SUITE(BtNotInterestedMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testOnSendComplete); CPPUNIT_TEST(testOnSendComplete);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
public: public:
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testOnSendComplete(); void testOnSendComplete();
void testToString(); void testToString();
@ -54,11 +54,13 @@ void BtNotInterestedMessageTest::testCreate() {
} }
} }
void BtNotInterestedMessageTest::testGetMessage() { void BtNotInterestedMessageTest::testCreateMessage() {
BtNotInterestedMessage msg; BtNotInterestedMessage msg;
unsigned char data[5]; unsigned char data[5];
bittorrent::createPeerMessageString(data, sizeof(data), 1, 3); bittorrent::createPeerMessageString(data, sizeof(data), 1, 3);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 5) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0);
delete [] rawmsg;
} }
void BtNotInterestedMessageTest::testDoReceivedAction() { void BtNotInterestedMessageTest::testDoReceivedAction() {

View File

@ -22,7 +22,7 @@ class BtPieceMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtPieceMessageTest); CPPUNIT_TEST_SUITE(BtPieceMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessageHeader); CPPUNIT_TEST(testCreateMessageHeader);
CPPUNIT_TEST(testChokingEvent); CPPUNIT_TEST(testChokingEvent);
CPPUNIT_TEST(testChokingEvent_allowedFastEnabled); CPPUNIT_TEST(testChokingEvent_allowedFastEnabled);
CPPUNIT_TEST(testChokingEvent_inAmAllowedIndexSet); CPPUNIT_TEST(testChokingEvent_inAmAllowedIndexSet);
@ -38,7 +38,7 @@ class BtPieceMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
public: public:
void testCreate(); void testCreate();
void testGetMessageHeader(); void testCreateMessageHeader();
void testChokingEvent(); void testChokingEvent();
void testChokingEvent_allowedFastEnabled(); void testChokingEvent_allowedFastEnabled();
void testChokingEvent_inAmAllowedIndexSet(); void testChokingEvent_inAmAllowedIndexSet();
@ -114,7 +114,6 @@ void BtPieceMessageTest::testCreate() {
CPPUNIT_ASSERT_EQUAL((uint8_t)7, pm->getId()); CPPUNIT_ASSERT_EQUAL((uint8_t)7, pm->getId());
CPPUNIT_ASSERT_EQUAL((size_t)12345, pm->getIndex()); CPPUNIT_ASSERT_EQUAL((size_t)12345, pm->getIndex());
CPPUNIT_ASSERT_EQUAL((uint32_t)256, pm->getBegin()); CPPUNIT_ASSERT_EQUAL((uint32_t)256, pm->getBegin());
CPPUNIT_ASSERT(memcmp(data, pm->getBlock(), sizeof(data)) == 0);
CPPUNIT_ASSERT_EQUAL((size_t)2, pm->getBlockLength()); CPPUNIT_ASSERT_EQUAL((size_t)2, pm->getBlockLength());
// case: payload size is wrong // case: payload size is wrong
@ -135,7 +134,7 @@ void BtPieceMessageTest::testCreate() {
} }
} }
void BtPieceMessageTest::testGetMessageHeader() { void BtPieceMessageTest::testCreateMessageHeader() {
BtPieceMessage msg; BtPieceMessage msg;
msg.setIndex(12345); msg.setIndex(12345);
msg.setBegin(256); msg.setBegin(256);
@ -144,7 +143,9 @@ void BtPieceMessageTest::testGetMessageHeader() {
bittorrent::createPeerMessageString(data, sizeof(data), 9+1024, 7); bittorrent::createPeerMessageString(data, sizeof(data), 9+1024, 7);
bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[5], 12345);
bittorrent::setIntParam(&data[9], 256); bittorrent::setIntParam(&data[9], 256);
CPPUNIT_ASSERT(memcmp(msg.getMessageHeader(), data, 13) == 0); unsigned char* rawmsg = msg.createMessageHeader();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 13) == 0);
delete [] rawmsg;
} }
void BtPieceMessageTest::testChokingEvent() { void BtPieceMessageTest::testChokingEvent() {

View File

@ -21,7 +21,7 @@ class BtPortMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtPortMessageTest); CPPUNIT_TEST_SUITE(BtPortMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testDoReceivedAction_bootstrap); CPPUNIT_TEST(testDoReceivedAction_bootstrap);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
@ -33,7 +33,7 @@ public:
void testCreate(); void testCreate();
void testToString(); void testToString();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testDoReceivedAction_bootstrap(); void testDoReceivedAction_bootstrap();
@ -89,12 +89,14 @@ void BtPortMessageTest::testToString() {
CPPUNIT_ASSERT_EQUAL(std::string("port port=1"), msg.toString()); CPPUNIT_ASSERT_EQUAL(std::string("port port=1"), msg.toString());
} }
void BtPortMessageTest::testGetMessage() { void BtPortMessageTest::testCreateMessage() {
BtPortMessage msg(6881); BtPortMessage msg(6881);
unsigned char data[7]; unsigned char data[7];
bittorrent::createPeerMessageString(data, sizeof(data), 3, 9); bittorrent::createPeerMessageString(data, sizeof(data), 3, 9);
bittorrent::setShortIntParam(&data[5], 6881); bittorrent::setShortIntParam(&data[5], 6881);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 7) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 7) == 0);
delete [] rawmsg;
} }
void BtPortMessageTest::testDoReceivedAction() void BtPortMessageTest::testDoReceivedAction()

View File

@ -15,7 +15,7 @@ class BtRejectMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtRejectMessageTest); CPPUNIT_TEST_SUITE(BtRejectMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testDoReceivedActionNoMatch); CPPUNIT_TEST(testDoReceivedActionNoMatch);
CPPUNIT_TEST(testDoReceivedActionFastExtensionDisabled); CPPUNIT_TEST(testDoReceivedActionFastExtensionDisabled);
@ -25,7 +25,7 @@ private:
public: public:
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testDoReceivedActionNoMatch(); void testDoReceivedActionNoMatch();
void testDoReceivedActionFastExtensionDisabled(); void testDoReceivedActionFastExtensionDisabled();
@ -114,7 +114,7 @@ void BtRejectMessageTest::testCreate() {
} }
} }
void BtRejectMessageTest::testGetMessage() { void BtRejectMessageTest::testCreateMessage() {
BtRejectMessage msg; BtRejectMessage msg;
msg.setIndex(12345); msg.setIndex(12345);
msg.setBegin(256); msg.setBegin(256);
@ -124,7 +124,9 @@ void BtRejectMessageTest::testGetMessage() {
bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[5], 12345);
bittorrent::setIntParam(&data[9], 256); bittorrent::setIntParam(&data[9], 256);
bittorrent::setIntParam(&data[13], 1024); bittorrent::setIntParam(&data[13], 1024);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 17) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 17) == 0);
delete [] rawmsg;
} }
void BtRejectMessageTest::testDoReceivedAction() { void BtRejectMessageTest::testDoReceivedAction() {

View File

@ -22,7 +22,7 @@ class BtRequestMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtRequestMessageTest); CPPUNIT_TEST_SUITE(BtRequestMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction_hasPieceAndAmNotChoking); CPPUNIT_TEST(testDoReceivedAction_hasPieceAndAmNotChoking);
CPPUNIT_TEST(testDoReceivedAction_hasPieceAndAmChokingAndFastExtensionEnabled); CPPUNIT_TEST(testDoReceivedAction_hasPieceAndAmChokingAndFastExtensionEnabled);
CPPUNIT_TEST(testDoReceivedAction_hasPieceAndAmChokingAndFastExtensionDisabled); CPPUNIT_TEST(testDoReceivedAction_hasPieceAndAmChokingAndFastExtensionDisabled);
@ -40,7 +40,7 @@ private:
public: public:
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction_hasPieceAndAmNotChoking(); void testDoReceivedAction_hasPieceAndAmNotChoking();
void testDoReceivedAction_hasPieceAndAmChokingAndFastExtensionEnabled(); void testDoReceivedAction_hasPieceAndAmChokingAndFastExtensionEnabled();
void testDoReceivedAction_hasPieceAndAmChokingAndFastExtensionDisabled(); void testDoReceivedAction_hasPieceAndAmChokingAndFastExtensionDisabled();
@ -156,7 +156,7 @@ void BtRequestMessageTest::testCreate() {
} }
} }
void BtRequestMessageTest::testGetMessage() { void BtRequestMessageTest::testCreateMessage() {
BtRequestMessage msg; BtRequestMessage msg;
msg.setIndex(12345); msg.setIndex(12345);
msg.setBegin(256); msg.setBegin(256);
@ -166,7 +166,9 @@ void BtRequestMessageTest::testGetMessage() {
bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[5], 12345);
bittorrent::setIntParam(&data[9], 256); bittorrent::setIntParam(&data[9], 256);
bittorrent::setIntParam(&data[13], 1024); bittorrent::setIntParam(&data[13], 1024);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 17) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 17) == 0);
delete [] rawmsg;
} }
void BtRequestMessageTest::testDoReceivedAction_hasPieceAndAmNotChoking() { void BtRequestMessageTest::testDoReceivedAction_hasPieceAndAmNotChoking() {

View File

@ -11,7 +11,7 @@ class BtSuggestPieceMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtSuggestPieceMessageTest); CPPUNIT_TEST_SUITE(BtSuggestPieceMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
private: private:
@ -21,7 +21,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testToString(); void testToString();
}; };
@ -54,13 +54,15 @@ void BtSuggestPieceMessageTest::testCreate() {
} }
} }
void BtSuggestPieceMessageTest::testGetMessage() { void BtSuggestPieceMessageTest::testCreateMessage() {
BtSuggestPieceMessage msg; BtSuggestPieceMessage msg;
msg.setIndex(12345); msg.setIndex(12345);
unsigned char data[9]; unsigned char data[9];
bittorrent::createPeerMessageString(data, sizeof(data), 5, 13); bittorrent::createPeerMessageString(data, sizeof(data), 5, 13);
bittorrent::setIntParam(&data[5], 12345); bittorrent::setIntParam(&data[5], 12345);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 9) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 9) == 0);
delete [] rawmsg;
} }
void BtSuggestPieceMessageTest::testToString() { void BtSuggestPieceMessageTest::testToString() {

View File

@ -10,7 +10,7 @@ class BtUnchokeMessageTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(BtUnchokeMessageTest); CPPUNIT_TEST_SUITE(BtUnchokeMessageTest);
CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testCreate);
CPPUNIT_TEST(testGetMessage); CPPUNIT_TEST(testCreateMessage);
CPPUNIT_TEST(testDoReceivedAction); CPPUNIT_TEST(testDoReceivedAction);
CPPUNIT_TEST(testOnSendComplete); CPPUNIT_TEST(testOnSendComplete);
CPPUNIT_TEST(testToString); CPPUNIT_TEST(testToString);
@ -22,7 +22,7 @@ public:
} }
void testCreate(); void testCreate();
void testGetMessage(); void testCreateMessage();
void testDoReceivedAction(); void testDoReceivedAction();
void testOnSendComplete(); void testOnSendComplete();
void testToString(); void testToString();
@ -54,11 +54,13 @@ void BtUnchokeMessageTest::testCreate() {
} }
} }
void BtUnchokeMessageTest::testGetMessage() { void BtUnchokeMessageTest::testCreateMessage() {
BtUnchokeMessage msg; BtUnchokeMessage msg;
unsigned char data[5]; unsigned char data[5];
bittorrent::createPeerMessageString(data, sizeof(data), 1, 1); bittorrent::createPeerMessageString(data, sizeof(data), 1, 1);
CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 5) == 0); unsigned char* rawmsg = msg.createMessage();
CPPUNIT_ASSERT(memcmp(rawmsg, data, 5) == 0);
delete [] rawmsg;
} }
void BtUnchokeMessageTest::testDoReceivedAction() { void BtUnchokeMessageTest::testDoReceivedAction() {