1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#include "Piece.h"
#include <string>
#include <cppunit/extensions/HelperMacros.h>
#include "util.h"
#include "DirectDiskAdaptor.h"
#include "ByteArrayDiskWriter.h"
#include "WrDiskCache.h"
namespace aria2 {
class PieceTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(PieceTest);
CPPUNIT_TEST(testCompleteBlock);
CPPUNIT_TEST(testGetCompletedLength);
CPPUNIT_TEST(testFlushWrCache);
CPPUNIT_TEST(testAppendWrCache);
CPPUNIT_TEST(testGetDigestWithWrCache);
CPPUNIT_TEST(testUpdateHash);
CPPUNIT_TEST_SUITE_END();
private:
std::shared_ptr<DirectDiskAdaptor> adaptor_;
ByteArrayDiskWriter* writer_;
public:
void setUp()
{
adaptor_ = std::make_shared<DirectDiskAdaptor>();
auto dw = make_unique<ByteArrayDiskWriter>();
writer_ = dw.get();
adaptor_->setDiskWriter(std::move(dw));
}
void testCompleteBlock();
void testGetCompletedLength();
void testFlushWrCache();
void testAppendWrCache();
void testGetDigestWithWrCache();
void testUpdateHash();
};
CPPUNIT_TEST_SUITE_REGISTRATION(PieceTest);
void PieceTest::testCompleteBlock()
{
size_t blockLength = 32_k;
Piece p(0, blockLength * 10, blockLength);
p.completeBlock(5);
CPPUNIT_ASSERT(p.hasBlock(5));
}
void PieceTest::testGetCompletedLength()
{
int32_t blockLength = 16_k;
Piece p(0, blockLength * 10 + 100, blockLength);
p.completeBlock(1);
p.completeBlock(2);
p.completeBlock(9);
p.completeBlock(10); // <-- 100 bytes
CPPUNIT_ASSERT_EQUAL((int64_t)(blockLength * 3 + 100),
p.getCompletedLength());
}
void PieceTest::testFlushWrCache()
{
unsigned char* data;
Piece p(0, 1_k);
WrDiskCache dc(64);
p.initWrCache(&dc, adaptor_);
data = new unsigned char[3];
memcpy(data, "foo", 3);
p.updateWrCache(&dc, data, 0, 3, 0);
data = new unsigned char[4];
memcpy(data, " bar", 4);
p.updateWrCache(&dc, data, 0, 4, 3);
p.flushWrCache(&dc);
CPPUNIT_ASSERT_EQUAL(std::string("foo bar"), writer_->getString());
data = new unsigned char[3];
memcpy(data, "foo", 3);
p.updateWrCache(&dc, data, 0, 3, 0);
CPPUNIT_ASSERT_EQUAL((size_t)3, dc.getSize());
p.clearWrCache(&dc);
CPPUNIT_ASSERT_EQUAL((size_t)0, dc.getSize());
p.releaseWrCache(&dc);
CPPUNIT_ASSERT(!p.getWrDiskCacheEntry());
}
void PieceTest::testAppendWrCache()
{
unsigned char* data;
Piece p(0, 1_k);
WrDiskCache dc(1_k);
p.initWrCache(&dc, adaptor_);
size_t capacity = 6;
data = new unsigned char[capacity];
memcpy(data, "foo", 3);
p.updateWrCache(&dc, data, 0, 3, capacity, 0);
size_t alen = p.appendWrCache(
&dc, 3, reinterpret_cast<const unsigned char*>("barbaz"), 6);
CPPUNIT_ASSERT_EQUAL((size_t)3, alen);
p.flushWrCache(&dc);
CPPUNIT_ASSERT_EQUAL(std::string("foobar"), writer_->getString());
}
void PieceTest::testGetDigestWithWrCache()
{
unsigned char* data;
Piece p(0, 26);
p.setHashType("sha-1");
WrDiskCache dc(64);
// 012345678901234567890123456
writer_->setString("abcde...ijklmnopq...uvwx.z");
p.initWrCache(&dc, adaptor_);
data = new unsigned char[3];
memcpy(data, "fgh", 3);
p.updateWrCache(&dc, data, 0, 3, 5);
data = new unsigned char[3];
memcpy(data, "rst", 3);
p.updateWrCache(&dc, data, 0, 3, 17);
data = new unsigned char[1];
memcpy(data, "y", 1);
p.updateWrCache(&dc, data, 0, 1, 24);
CPPUNIT_ASSERT_EQUAL(
std::string("32d10c7b8cf96570ca04ce37f2a19d84240d3a89"),
util::toHex(p.getDigestWithWrCache(p.getLength(), adaptor_)));
}
void PieceTest::testUpdateHash()
{
Piece p(0, 16, 2_m);
p.setHashType("sha-1");
std::string spam("SPAM!");
CPPUNIT_ASSERT(p.updateHash(
0, reinterpret_cast<const unsigned char*>(spam.c_str()), spam.size()));
CPPUNIT_ASSERT(!p.isHashCalculated());
std::string spamspam("SPAM!SPAM!!");
CPPUNIT_ASSERT(p.updateHash(
spam.size(), reinterpret_cast<const unsigned char*>(spamspam.c_str()),
spamspam.size()));
CPPUNIT_ASSERT(p.isHashCalculated());
CPPUNIT_ASSERT_EQUAL(std::string("d9189aff79e075a2e60271b9556a710dc1bc7de7"),
util::toHex(p.getDigest()));
}
} // namespace aria2
|