mirror of
https://github.com/aria2/aria2.git
synced 2025-01-04 09:03:46 +00:00
118 lines
3.3 KiB
C++
118 lines
3.3 KiB
C++
#include "UTMetadataDataExtensionMessage.h"
|
|
|
|
#include <iostream>
|
|
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
#include "BtConstants.h"
|
|
#include "PieceStorage.h"
|
|
#include "DownloadContext.h"
|
|
#include "DirectDiskAdaptor.h"
|
|
#include "ByteArrayDiskWriter.h"
|
|
#include "DownloadContext.h"
|
|
#include "MockPieceStorage.h"
|
|
#include "UTMetadataRequestTracker.h"
|
|
#include "bittorrent_helper.h"
|
|
#include "MessageDigest.h"
|
|
#include "message_digest_helper.h"
|
|
|
|
namespace aria2 {
|
|
|
|
class UTMetadataDataExtensionMessageTest : public CppUnit::TestFixture {
|
|
|
|
CPPUNIT_TEST_SUITE(UTMetadataDataExtensionMessageTest);
|
|
CPPUNIT_TEST(testGetExtensionMessageID);
|
|
CPPUNIT_TEST(testGetBencodedData);
|
|
CPPUNIT_TEST(testToString);
|
|
CPPUNIT_TEST(testDoReceivedAction);
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
public:
|
|
void testGetExtensionMessageID();
|
|
void testGetBencodedData();
|
|
void testToString();
|
|
void testDoReceivedAction();
|
|
};
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataDataExtensionMessageTest);
|
|
|
|
void UTMetadataDataExtensionMessageTest::testGetExtensionMessageID()
|
|
{
|
|
UTMetadataDataExtensionMessage msg(1);
|
|
CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID());
|
|
}
|
|
|
|
void UTMetadataDataExtensionMessageTest::testGetBencodedData()
|
|
{
|
|
std::string data(METADATA_PIECE_SIZE, '0');
|
|
|
|
UTMetadataDataExtensionMessage msg(1);
|
|
msg.setIndex(1);
|
|
msg.setTotalSize(data.size());
|
|
msg.setData(data);
|
|
CPPUNIT_ASSERT_EQUAL(
|
|
std::string("d8:msg_typei1e5:piecei1e10:total_sizei16384ee") + data,
|
|
msg.getPayload());
|
|
}
|
|
|
|
void UTMetadataDataExtensionMessageTest::testToString()
|
|
{
|
|
UTMetadataDataExtensionMessage msg(1);
|
|
msg.setIndex(100);
|
|
CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata data piece=100"),
|
|
msg.toString());
|
|
}
|
|
|
|
void UTMetadataDataExtensionMessageTest::testDoReceivedAction()
|
|
{
|
|
auto diskAdaptor = std::make_shared<DirectDiskAdaptor>();
|
|
ByteArrayDiskWriter* diskWriter;
|
|
{
|
|
auto dw = make_unique<ByteArrayDiskWriter>();
|
|
diskWriter = dw.get();
|
|
diskAdaptor->setDiskWriter(std::move(dw));
|
|
}
|
|
auto pieceStorage = make_unique<MockPieceStorage>();
|
|
pieceStorage->setDiskAdaptor(diskAdaptor);
|
|
auto tracker = make_unique<UTMetadataRequestTracker>();
|
|
auto dctx = make_unique<DownloadContext>();
|
|
|
|
std::string piece0 = std::string(METADATA_PIECE_SIZE, '0');
|
|
std::string piece1 = std::string(METADATA_PIECE_SIZE, '1');
|
|
std::string metadata = piece0 + piece1;
|
|
|
|
unsigned char infoHash[INFO_HASH_LENGTH];
|
|
message_digest::digest(infoHash, INFO_HASH_LENGTH,
|
|
MessageDigest::sha1().get(), metadata.data(),
|
|
metadata.size());
|
|
{
|
|
auto attrs = make_unique<TorrentAttribute>();
|
|
attrs->infoHash = std::string(&infoHash[0], &infoHash[20]);
|
|
dctx->setAttribute(CTX_ATTR_BT, std::move(attrs));
|
|
}
|
|
UTMetadataDataExtensionMessage m(1);
|
|
m.setPieceStorage(pieceStorage.get());
|
|
m.setUTMetadataRequestTracker(tracker.get());
|
|
m.setDownloadContext(dctx.get());
|
|
|
|
m.setIndex(1);
|
|
m.setData(piece1);
|
|
|
|
tracker->add(1);
|
|
m.doReceivedAction();
|
|
CPPUNIT_ASSERT(!tracker->tracks(1));
|
|
|
|
pieceStorage->setDownloadFinished(true);
|
|
// If piece is not tracked, it is ignored.
|
|
m.setIndex(0);
|
|
m.setData(piece0);
|
|
m.doReceivedAction();
|
|
|
|
tracker->add(0);
|
|
m.doReceivedAction();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(metadata, diskWriter->getString());
|
|
}
|
|
|
|
} // namespace aria2
|