Merge pull request #119 from arvidn/hard_links

add simple unit test for creating hard links
This commit is contained in:
Arvid Norberg 2015-08-31 07:31:23 -04:00
commit 281c215998
3 changed files with 68 additions and 8 deletions

View File

@ -493,7 +493,7 @@ namespace libtorrent
std::string n_exist = convert_to_native(file);
std::string n_link = convert_to_native(link);
#endif
BOOL ret = CreateHardLink(n_link.c_str(), n_exist.c_str(), NULL);
BOOL ret = CreateHardLink_(n_link.c_str(), n_exist.c_str(), NULL);
if (ret)
{
ec.clear();
@ -503,11 +503,16 @@ namespace libtorrent
// something failed. Does the filesystem not support hard links?
// TODO: 3 find out what error code is reported when the filesystem
// does not support hard links.
DWORD error = GetLastError();
if (error != ERROR_NOT_SUPPORTED || error != ERROR_ACCESS_DENIED)
{
// it's possible CreateHardLink will copy the file internally too,
// if the filesystem does not support it.
ec.assign(GetLastError(), system_category());
return;
}
// it's possible CreateHardLink will copy the file internally too,
// if the filesystem does not support it.
ec.assign(GetLastError(), system_category());
return;
// fall back to making a copy
#else
@ -532,6 +537,9 @@ namespace libtorrent
ec.assign(errno, generic_category());
return;
}
// fall back to making a copy
#endif
// if we get here, we should copy the file

View File

@ -452,7 +452,7 @@ dht_settings test_settings()
}
// TODO: test obfuscated_get_peers
// TODO: 3 split this test up into smaller test cases
// TODO: 2 split this test up into smaller test cases
TORRENT_TEST(dht)
{
dht_settings sett = test_settings();

View File

@ -290,7 +290,7 @@ TORRENT_TEST(file)
#endif
if (ec)
fprintf(stderr, "open failed: [%s] %s\n", ec.category().name(), ec.message().c_str());
TEST_CHECK(!ec);
TEST_EQUAL(ec, error_code());
if (ec) fprintf(stderr, "%s\n", ec.message().c_str());
file::iovec_t b = {(void*)"test", 4};
TEST_EQUAL(f.writev(0, &b, 1, ec), 4);
@ -303,8 +303,60 @@ TORRENT_TEST(file)
TEST_EQUAL(f.readv(0, &b, 1, ec), 4);
if (ec)
fprintf(stderr, "readv failed: [%s] %s\n", ec.category().name(), ec.message().c_str());
TEST_CHECK(!ec);
TEST_EQUAL(ec, error_code());
TEST_CHECK(strcmp(test_buf, "test") == 0);
f.close();
}
TORRENT_TEST(hard_link)
{
// try to create a hard link to see what happens
// first create a regular file to then add another link to.
// create a file, write some stuff to it, create a hard link to that file,
// read that file and assert we get the same stuff we wrote to the first file
error_code ec;
file f;
TEST_CHECK(f.open("original_file", file::read_write, ec));
if (ec)
fprintf(stderr, "open failed: [%s] %s\n", ec.category().name(), ec.message().c_str());
TEST_EQUAL(ec, error_code());
file::iovec_t b = {(void*)"abcdefghijklmnopqrstuvwxyz", 26};
TEST_EQUAL(f.writev(0, &b, 1, ec), 26);
if (ec)
fprintf(stderr, "writev failed: [%s] %s\n", ec.category().name(), ec.message().c_str());
TEST_EQUAL(ec, error_code());
f.close();
hard_link("original_file", "second_link", ec);
if (ec)
fprintf(stderr, "hard_link failed: [%s] %s\n", ec.category().name(), ec.message().c_str());
TEST_EQUAL(ec, error_code());
TEST_CHECK(f.open("second_link", file::read_write, ec));
if (ec)
fprintf(stderr, "open failed: [%s] %s\n", ec.category().name(), ec.message().c_str());
TEST_EQUAL(ec, error_code());
char test_buf[27] = {0};
b.iov_base = test_buf;
b.iov_len = 27;
TEST_EQUAL(f.readv(0, &b, 1, ec), 26);
if (ec)
fprintf(stderr, "readv failed: [%s] %s\n", ec.category().name(), ec.message().c_str());
TEST_EQUAL(ec, error_code());
TEST_CHECK(strcmp(test_buf, "abcdefghijklmnopqrstuvwxyz") == 0);
f.close();
remove("original_file", ec);
if (ec)
fprintf(stderr, "remove failed: [%s] %s\n", ec.category().name(), ec.message().c_str());
remove("second_link", ec);
if (ec)
fprintf(stderr, "remove failed: [%s] %s\n", ec.category().name(), ec.message().c_str());
}