extend storage unit test to cover iovec operations
This commit is contained in:
parent
91270a0c2b
commit
40980df545
|
@ -168,6 +168,9 @@ namespace libtorrent
|
||||||
, std::string* error = 0);
|
, std::string* error = 0);
|
||||||
|
|
||||||
TORRENT_EXTRA_EXPORT int bufs_size(file::iovec_t const* bufs, int num_bufs);
|
TORRENT_EXTRA_EXPORT int bufs_size(file::iovec_t const* bufs, int num_bufs);
|
||||||
|
TORRENT_EXTRA_EXPORT int copy_bufs(file::iovec_t const* bufs, int bytes, file::iovec_t* target);
|
||||||
|
TORRENT_EXTRA_EXPORT void advance_bufs(file::iovec_t*& bufs, int bytes);
|
||||||
|
TORRENT_EXTRA_EXPORT void clear_bufs(file::iovec_t const* bufs, int num_bufs);
|
||||||
|
|
||||||
// flags for async_move_storage
|
// flags for async_move_storage
|
||||||
enum move_flags_t
|
enum move_flags_t
|
||||||
|
|
|
@ -186,7 +186,7 @@ namespace libtorrent
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear_bufs(file::iovec_t const* bufs, int num_bufs)
|
TORRENT_EXTRA_EXPORT void clear_bufs(file::iovec_t const* bufs, int num_bufs)
|
||||||
{
|
{
|
||||||
for (file::iovec_t const* i = bufs, *end(bufs + num_bufs); i < end; ++i)
|
for (file::iovec_t const* i = bufs, *end(bufs + num_bufs); i < end; ++i)
|
||||||
std::memset(i->iov_base, 0, i->iov_len);
|
std::memset(i->iov_base, 0, i->iov_len);
|
||||||
|
|
|
@ -802,8 +802,153 @@ void test_rename_file_in_fastresume(std::string const& test_path)
|
||||||
<< "': " << ec.message() << std::endl;
|
<< "': " << ec.message() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void alloc_iov(file::iovec_t* iov, int num_bufs)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < num_bufs; ++i)
|
||||||
|
{
|
||||||
|
iov[i].iov_base = malloc(num_bufs * (i + 1));
|
||||||
|
iov[i].iov_len = num_bufs * (i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fill_pattern(file::iovec_t* iov, int num_bufs)
|
||||||
|
{
|
||||||
|
int counter = 0;
|
||||||
|
for (int i = 0; i < num_bufs; ++i)
|
||||||
|
{
|
||||||
|
unsigned char* buf = (unsigned char*)iov[i].iov_base;
|
||||||
|
for (int k = 0; k < iov[i].iov_len; ++k)
|
||||||
|
{
|
||||||
|
buf[k] = counter & 0xff;
|
||||||
|
++counter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fill_pattern2(file::iovec_t* iov, int num_bufs)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < num_bufs; ++i)
|
||||||
|
{
|
||||||
|
unsigned char* buf = (unsigned char*)iov[i].iov_base;
|
||||||
|
memset(buf, 0xfe, iov[i].iov_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_iov(file::iovec_t* iov, int num_bufs)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < num_bufs; ++i)
|
||||||
|
{
|
||||||
|
free(iov[i].iov_base);
|
||||||
|
iov[i].iov_len = 0;
|
||||||
|
iov[i].iov_base = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_iovec_copy_bufs()
|
||||||
|
{
|
||||||
|
file::iovec_t iov1[10];
|
||||||
|
file::iovec_t iov2[10];
|
||||||
|
|
||||||
|
alloc_iov(iov1, 10);
|
||||||
|
fill_pattern(iov1, 10);
|
||||||
|
|
||||||
|
TEST_CHECK(bufs_size(iov1, 10) >= 106);
|
||||||
|
|
||||||
|
// copy exactly 106 bytes from iov1 to iov2
|
||||||
|
int num_bufs = copy_bufs(iov1, 106, iov2);
|
||||||
|
|
||||||
|
// verify that the first 100 bytes is pattern 1
|
||||||
|
// and that the remaining bytes are pattern 2
|
||||||
|
|
||||||
|
int counter = 0;
|
||||||
|
for (int i = 0; i < num_bufs; ++i)
|
||||||
|
{
|
||||||
|
unsigned char* buf = (unsigned char*)iov2[i].iov_base;
|
||||||
|
for (int k = 0; k < iov2[i].iov_len; ++k)
|
||||||
|
{
|
||||||
|
TEST_EQUAL(int(buf[k]), (counter & 0xff));
|
||||||
|
++counter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TEST_EQUAL(counter, 106);
|
||||||
|
|
||||||
|
free_iov(iov1, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_iovec_clear_bufs()
|
||||||
|
{
|
||||||
|
file::iovec_t iov[10];
|
||||||
|
alloc_iov(iov, 10);
|
||||||
|
fill_pattern(iov, 10);
|
||||||
|
|
||||||
|
clear_bufs(iov, 10);
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
{
|
||||||
|
unsigned char* buf = (unsigned char*)iov[i].iov_base;
|
||||||
|
for (int k = 0; k < iov[i].iov_len; ++k)
|
||||||
|
{
|
||||||
|
TEST_EQUAL(int(buf[k]), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free_iov(iov, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_iovec_bufs_size()
|
||||||
|
{
|
||||||
|
file::iovec_t iov[10];
|
||||||
|
|
||||||
|
for (int i = 1; i < 10; ++i)
|
||||||
|
{
|
||||||
|
alloc_iov(iov, i);
|
||||||
|
|
||||||
|
int expected_size = 0;
|
||||||
|
for (int k = 0; k < i; ++k) expected_size += i * (k + 1);
|
||||||
|
TEST_EQUAL(bufs_size(iov, i), expected_size);
|
||||||
|
|
||||||
|
free_iov(iov, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_iovec_advance_bufs()
|
||||||
|
{
|
||||||
|
file::iovec_t iov1[10];
|
||||||
|
file::iovec_t iov2[10];
|
||||||
|
alloc_iov(iov1, 10);
|
||||||
|
fill_pattern(iov1, 10);
|
||||||
|
|
||||||
|
memcpy(iov2, iov1, sizeof(iov1));
|
||||||
|
|
||||||
|
file::iovec_t* iov = iov2;
|
||||||
|
file::iovec_t* end = iov2 + 10;
|
||||||
|
|
||||||
|
// advance iov 13 bytes. Make sure what's left fits pattern 1 shifted
|
||||||
|
// 13 bytes
|
||||||
|
advance_bufs(iov, 13);
|
||||||
|
|
||||||
|
// make sure what's in
|
||||||
|
int counter = 13;
|
||||||
|
for (int i = 0; i < end - iov; ++i)
|
||||||
|
{
|
||||||
|
unsigned char* buf = (unsigned char*)iov[i].iov_base;
|
||||||
|
for (int k = 0; k < iov[i].iov_len; ++k)
|
||||||
|
{
|
||||||
|
TEST_EQUAL(int(buf[k]), (counter & 0xff));
|
||||||
|
++counter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free_iov(iov1, 10);
|
||||||
|
}
|
||||||
|
|
||||||
int test_main()
|
int test_main()
|
||||||
{
|
{
|
||||||
|
test_iovec_copy_bufs();
|
||||||
|
test_iovec_clear_bufs();
|
||||||
|
test_iovec_advance_bufs();
|
||||||
|
test_iovec_bufs_size();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
// initialize test pieces
|
// initialize test pieces
|
||||||
for (char* p = piece0, *end(piece0 + piece_size); p < end; ++p)
|
for (char* p = piece0, *end(piece0 + piece_size); p < end; ++p)
|
||||||
*p = random_byte();
|
*p = random_byte();
|
||||||
|
|
Loading…
Reference in New Issue