repertory/tests/skynet_provider_test.cpp
Scott E. Graves 3ff46723b8
Some checks failed
BlockStorage/repertory_osx/pipeline/head There was a failure building this commit
BlockStorage/repertory_windows/pipeline/head This commit looks good
BlockStorage/repertory_linux_builds/pipeline/head This commit looks good
initial commit
2022-03-05 00:30:50 -06:00

804 lines
33 KiB
C++

/*
Copyright <2018-2022> <scott.e.graves@protonmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#if defined(REPERTORY_ENABLE_SKYNET)
#include "fixtures/skynet_provider_fixture.hpp"
#include "utils/encrypting_reader.hpp"
#include "utils/encryption.hpp"
#define EXTERNAL_SKYLINK "AACoqIuN00YdDhS21dUMpMYFYGDeGmPnGoNWOkItkmzLfw"
namespace repertory {
static void populate_file_meta(const std::string &, api_meta_map &meta) {
meta[META_ACCESSED] = std::to_string(utils::get_file_time_now());
meta[META_MODIFIED] = std::to_string(utils::get_file_time_now());
meta[META_CREATION] = std::to_string(utils::get_file_time_now());
}
TEST_F(skynet_provider_test, create_directory_and_create_file) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_TRUE(provider_->is_directory("/"));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
EXPECT_TRUE(provider_->is_file("/test.txt"));
EXPECT_TRUE(provider_->is_file_writeable("/test.txt"));
}
TEST_F(skynet_provider_test, get_file) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_TRUE(provider_->is_directory("/"));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
EXPECT_TRUE(provider_->is_file("/test.txt"));
api_file apiFile{};
EXPECT_EQ(api_error::success, provider_->get_file("/test.txt", apiFile));
EXPECT_STREQ("/test.txt", apiFile.api_path.c_str());
EXPECT_STREQ("/", apiFile.api_parent.c_str());
EXPECT_EQ(utils::string::to_uint64(file_meta[META_ACCESSED]), apiFile.accessed_date);
EXPECT_EQ(utils::string::to_uint64(file_meta[META_MODIFIED]), apiFile.changed_date);
EXPECT_EQ(utils::string::to_uint64(file_meta[META_CREATION]), apiFile.created_date);
EXPECT_EQ(0, apiFile.file_size);
EXPECT_EQ(utils::string::to_uint64(file_meta[META_MODIFIED]), apiFile.modified_date);
EXPECT_TRUE(apiFile.recoverable);
EXPECT_EQ(3.0, apiFile.redundancy);
EXPECT_TRUE(utils::file::is_file(apiFile.source_path));
}
TEST_F(skynet_provider_test, get_directory_item_count) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/sub", directory_meta));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
EXPECT_EQ(2, provider_->get_directory_item_count("/"));
}
TEST_F(skynet_provider_test, get_directory_items) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/sub", directory_meta));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
directory_item_list itemList;
EXPECT_EQ(api_error::success, provider_->get_directory_items("/", itemList));
EXPECT_EQ(std::size_t(4), itemList.size());
EXPECT_STREQ("/sub", itemList[2u].api_path.c_str());
EXPECT_STREQ("/", itemList[2u].api_parent.c_str());
EXPECT_TRUE(itemList[2u].directory);
EXPECT_EQ(0u, itemList[2u].size);
// itemList[0].MetaMap;
EXPECT_STREQ("/test.txt", itemList[3u].api_path.c_str());
EXPECT_STREQ("/", itemList[3u].api_parent.c_str());
EXPECT_FALSE(itemList[3u].directory);
EXPECT_EQ(0u, itemList[3u].size);
// itemList[1].MetaMap;
}
TEST_F(skynet_provider_test, get_file_list) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/sub", directory_meta));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
populate_file_meta("/test2.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test2.txt", file_meta));
api_file_list fileList;
EXPECT_EQ(api_error::success, provider_->get_file_list(fileList));
EXPECT_EQ(std::size_t(2), fileList.size());
}
TEST_F(skynet_provider_test, get_fileSize) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
std::uint64_t file_size = 100ull;
EXPECT_EQ(api_error::success, provider_->get_file_size("/test.txt", file_size));
EXPECT_EQ(std::uint64_t(0), file_size);
}
TEST_F(skynet_provider_test, get_host_config) {
auto hc = provider_->get_host_config(false);
EXPECT_TRUE(hc.agent_string.empty());
EXPECT_TRUE(hc.api_password.empty());
EXPECT_EQ(hc.api_port, 443);
EXPECT_STREQ(DEFAULT_SKYNET_URLS[0u].c_str(), hc.host_name_or_ip.c_str());
EXPECT_STREQ("/", hc.path.c_str());
EXPECT_STREQ("https", hc.protocol.c_str());
EXPECT_STREQ(DEFAULT_SKYNET_URLS[1u].c_str(), hc.auth_url.c_str());
hc = provider_->get_host_config(true);
EXPECT_TRUE(hc.agent_string.empty());
EXPECT_TRUE(hc.api_password.empty());
EXPECT_EQ(hc.api_port, 443);
EXPECT_STREQ(DEFAULT_SKYNET_URLS[0u].c_str(), hc.host_name_or_ip.c_str());
EXPECT_STREQ("/skynet/skyfile", hc.path.c_str());
EXPECT_STREQ(DEFAULT_SKYNET_URLS[1u].c_str(), hc.auth_url.c_str());
EXPECT_STREQ("https", hc.protocol.c_str());
const auto string_list = config_->get_value_by_name("SkynetConfig.PortalList");
json list = json::parse(string_list);
list[0u]["AuthUser"] = "test_user";
list[0u]["AuthURL"] = "test_url";
list[0u]["AuthPassword"] = "test_pwd";
config_->set_value_by_name("SkynetConfig.PortalList", list.dump());
provider_->update_portal_list();
hc = provider_->get_host_config(false);
EXPECT_TRUE(hc.agent_string.empty());
EXPECT_TRUE(hc.api_password.empty());
EXPECT_EQ(hc.api_port, 443);
EXPECT_STREQ(DEFAULT_SKYNET_URLS[0u].c_str(), hc.host_name_or_ip.c_str());
EXPECT_STREQ("/", hc.path.c_str());
EXPECT_STREQ("https", hc.protocol.c_str());
EXPECT_STREQ("test_user", hc.auth_user.c_str());
EXPECT_STREQ("test_url", hc.auth_url.c_str());
EXPECT_STREQ("test_pwd", hc.auth_password.c_str());
hc = provider_->get_host_config(true);
EXPECT_TRUE(hc.agent_string.empty());
EXPECT_TRUE(hc.api_password.empty());
EXPECT_EQ(hc.api_port, 443);
EXPECT_STREQ(DEFAULT_SKYNET_URLS[0u].c_str(), hc.host_name_or_ip.c_str());
EXPECT_STREQ("/skynet/skyfile", hc.path.c_str());
EXPECT_STREQ("https", hc.protocol.c_str());
EXPECT_STREQ("test_user", hc.auth_user.c_str());
EXPECT_STREQ("test_url", hc.auth_url.c_str());
EXPECT_STREQ("test_pwd", hc.auth_password.c_str());
}
TEST_F(skynet_provider_test, remove_directory) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/sub", directory_meta));
EXPECT_TRUE(provider_->is_directory("/sub"));
EXPECT_EQ(api_error::success, provider_->remove_directory("/sub"));
EXPECT_FALSE(provider_->is_directory("/sub"));
}
TEST_F(skynet_provider_test, recreate_directory_after_remove_directory) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/sub", directory_meta));
EXPECT_TRUE(provider_->is_directory("/sub"));
EXPECT_EQ(api_error::success, provider_->remove_directory("/sub"));
EXPECT_FALSE(provider_->is_directory("/sub"));
EXPECT_EQ(api_error::success, provider_->create_directory("/sub", directory_meta));
EXPECT_TRUE(provider_->is_directory("/sub"));
}
TEST_F(skynet_provider_test, remove_directory_fails_if_sub_directories_exist) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/sub", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/sub/sub2", directory_meta));
EXPECT_TRUE(provider_->is_directory("/sub/sub2"));
EXPECT_EQ(api_error::directory_not_empty, provider_->remove_directory("/sub"));
EXPECT_TRUE(provider_->is_directory("/sub"));
EXPECT_TRUE(provider_->is_directory("/sub/sub2"));
}
TEST_F(skynet_provider_test, remove_directory_fails_if_files_exist) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/sub", directory_meta));
EXPECT_TRUE(provider_->is_directory("/sub"));
api_meta_map file_meta{};
populate_file_meta("/sub/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/sub/test.txt", file_meta));
EXPECT_EQ(api_error::directory_not_empty, provider_->remove_directory("/sub"));
EXPECT_TRUE(provider_->is_directory("/sub"));
EXPECT_TRUE(provider_->is_file("/sub/test.txt"));
}
TEST_F(skynet_provider_test, remove_directory_fails_for_root_directory) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::access_denied, provider_->remove_directory("/"));
EXPECT_TRUE(provider_->is_directory("/"));
}
TEST_F(skynet_provider_test, remove_file) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_TRUE(provider_->is_directory("/"));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
EXPECT_TRUE(provider_->is_file("/test.txt"));
EXPECT_EQ(api_error::success, provider_->remove_file("/test.txt"));
EXPECT_FALSE(provider_->is_file("/test.txt"));
}
TEST_F(skynet_provider_test, recreate_file_after_remove_file) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_TRUE(provider_->is_directory("/"));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
EXPECT_TRUE(provider_->is_file("/test.txt"));
EXPECT_EQ(api_error::success, provider_->remove_file("/test.txt"));
EXPECT_FALSE(provider_->is_file("/test.txt"));
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
EXPECT_TRUE(provider_->is_file("/test.txt"));
}
TEST_F(skynet_provider_test, rename_file) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
EXPECT_EQ(api_error::success, provider_->get_item_meta("/test.txt", file_meta));
EXPECT_EQ(api_error::success, provider_->rename_file("/test.txt", "/test2.txt"));
EXPECT_TRUE(provider_->is_file("/test2.txt"));
EXPECT_FALSE(provider_->is_file("/test.txt"));
api_meta_map fileMeta2{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/test2.txt", fileMeta2));
EXPECT_EQ(file_meta.size(), fileMeta2.size());
for (const auto &kv : file_meta) {
EXPECT_STREQ(file_meta[kv.first].c_str(), fileMeta2[kv.first].c_str());
}
}
TEST_F(skynet_provider_test, upload_file_and_read_file_bytes) {
config_->set_value_by_name("SkynetConfig.EncryptionToken", "");
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
filesystem_item fsi{};
EXPECT_EQ(api_error::success, provider_->get_filesystem_item("/test.txt", false, fsi));
EXPECT_TRUE(fsi.encryption_token.empty());
EXPECT_FALSE(fsi.is_encrypted());
json j = {{"test", "test"}, {"test2", "test"}};
EXPECT_TRUE(utils::file::write_json_file(fsi.source_path, j));
EXPECT_EQ(api_error::success,
provider_->upload_file(fsi.api_path, fsi.source_path, fsi.encryption_token));
while (provider_->is_processing(fsi.api_path)) {
std::this_thread::sleep_for(1ms);
}
std::string id;
EXPECT_EQ(api_error::success, provider_->get_item_meta(fsi.api_path, META_ID, id));
json skynet_info = json::parse(id);
std::cout << skynet_info.dump(2) << std::endl;
EXPECT_NE(0u, skynet_info["skylink"].size());
std::uint64_t file_size = 0;
utils::file::get_file_size(fsi.source_path, file_size);
std::vector<char> data;
auto stop_requested = false;
EXPECT_EQ(api_error::success,
provider_->read_file_bytes("/test.txt", static_cast<std::size_t>(file_size), 0, data,
stop_requested));
EXPECT_EQ(file_size, std::uint64_t(data.size()));
EXPECT_STREQ(j.dump().c_str(), json::parse(std::string(&data[0], data.size())).dump().c_str());
http_ranges ranges = {{0, 0}};
http_headers headers;
json error;
EXPECT_EQ(api_error::success,
curl_comm_->get_range_and_headers(
provider_->get_host_config(false), "/" + skynet_info["skylink"].get<std::string>(),
0u, {{"format", "concat"}}, "", data, ranges, error, headers, stop_requested));
for (const auto &header : headers) {
std::cout << header.first << ":" << header.second << std::endl;
}
json meta_data;
EXPECT_EQ(api_error::success,
provider_->get_skynet_metadata(skynet_info["skylink"].get<std::string>(), meta_data));
EXPECT_STREQ(meta_data["filename"].get<std::string>().c_str(), "test.txt");
}
TEST_F(skynet_provider_test, upload_encrypted_file_and_read_file_bytes) {
config_->set_value_by_name("SkynetConfig.EncryptionToken", "TestToken");
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
filesystem_item fsi{};
EXPECT_EQ(api_error::success, provider_->get_filesystem_item("/test.txt", false, fsi));
EXPECT_STREQ("TestToken", fsi.encryption_token.c_str());
EXPECT_TRUE(fsi.is_encrypted());
const auto file_size = 2u * utils::encryption::encrypting_reader::get_data_chunk_size() + 3u;
auto source_file = create_random_file(fsi.source_path, file_size);
EXPECT_EQ(api_error::success,
provider_->upload_file(fsi.api_path, fsi.source_path, fsi.encryption_token));
while (provider_->is_processing(fsi.api_path)) {
std::this_thread::sleep_for(1ms);
}
std::string id;
EXPECT_EQ(api_error::success, provider_->get_item_meta(fsi.api_path, META_ID, id));
json skynet_info = json::parse(id);
std::cout << skynet_info.dump(2) << std::endl;
EXPECT_NE(0u, skynet_info["skylink"].size());
auto stop_requested = false;
const auto size = file_size / 3u;
const auto size_remain = file_size % 3u;
for (std::uint8_t i = 0u; i < 3u; i++) {
const auto read_size = size + (i == 2u ? size_remain : 0u);
std::vector<char> data;
EXPECT_EQ(api_error::success,
provider_->read_file_bytes("/test.txt", read_size, i * size, data, stop_requested));
std::size_t bytes_read{};
std::vector<char> b(read_size);
EXPECT_TRUE(source_file->read_bytes(&b[0u], b.size(), i * size, bytes_read));
EXPECT_EQ(b.size(), read_size);
EXPECT_EQ(0, std::memcmp(&data[0u], &b[0u], data.size()));
}
source_file->close();
http_ranges ranges = {{0, 0}};
http_headers headers;
json error;
auto err = api_error::error;
for (std::size_t j = 0u; (err != api_error::success) && (j < config_->get_retry_read_count());
j++) {
std::vector<char> data;
err = curl_comm_->get_range_and_headers(
provider_->get_host_config(false), "/" + skynet_info["skylink"].get<std::string>(), 0u,
{{"format", "concat"}}, "", data, ranges, error, headers, stop_requested);
}
EXPECT_EQ(api_error::success, err);
for (const auto &header : headers) {
std::cout << header.first << ":" << header.second << std::endl;
}
json meta_data;
EXPECT_EQ(api_error::success,
provider_->get_skynet_metadata(skynet_info["skylink"].get<std::string>(), meta_data));
const auto encrypted_file_name = meta_data["filename"].get<std::string>();
std::vector<char> buffer;
EXPECT_TRUE(utils::from_hex_string(encrypted_file_name, buffer));
std::string file_name;
decrypt_and_verify(buffer, fsi.encryption_token, file_name);
EXPECT_STREQ("test.txt", file_name.c_str());
config_->set_value_by_name("SkynetConfig.EncryptionToken", "");
}
TEST_F(skynet_provider_test, upload_tiny_encrypted_file_and_read_file_bytes) {
config_->set_value_by_name("SkynetConfig.EncryptionToken", "TestToken");
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
api_meta_map file_meta{};
populate_file_meta("/test.txt", file_meta);
EXPECT_EQ(api_error::success, provider_->create_file("/test.txt", file_meta));
filesystem_item fsi{};
EXPECT_EQ(api_error::success, provider_->get_filesystem_item("/test.txt", false, fsi));
EXPECT_STREQ("TestToken", fsi.encryption_token.c_str());
EXPECT_TRUE(fsi.is_encrypted());
json j = {{"test", "test"}, {"test2", "test"}};
EXPECT_TRUE(utils::file::write_json_file(fsi.source_path, j));
EXPECT_EQ(api_error::success,
provider_->upload_file(fsi.api_path, fsi.source_path, fsi.encryption_token));
while (provider_->is_processing(fsi.api_path)) {
std::this_thread::sleep_for(1ms);
}
std::string id;
EXPECT_EQ(api_error::success, provider_->get_item_meta(fsi.api_path, META_ID, id));
json skynet_info = json::parse(id);
std::cout << skynet_info.dump(2) << std::endl;
EXPECT_NE(0u, skynet_info["skylink"].size());
std::uint64_t file_size = 0;
utils::file::get_file_size(fsi.source_path, file_size);
std::vector<char> data;
auto stop_requested = false;
EXPECT_EQ(api_error::success,
provider_->read_file_bytes("/test.txt", static_cast<std::size_t>(file_size), 0, data,
stop_requested));
EXPECT_EQ(file_size, std::uint64_t(data.size()));
const auto str = std::string(&data[0u], data.size());
EXPECT_STREQ(j.dump().c_str(), json::parse(str).dump().c_str());
http_ranges ranges = {{0, 0}};
http_headers headers;
json error;
auto apiError = api_error::error;
for (std::size_t i = 0; (apiError != api_error::success) && (i < config_->get_retry_read_count());
i++) {
apiError = curl_comm_->get_range_and_headers(
provider_->get_host_config(false), "/" + skynet_info["skylink"].get<std::string>(), 0u,
{{"format", "concat"}}, "", data, ranges, error, headers, stop_requested);
}
EXPECT_EQ(api_error::success, apiError);
for (const auto &header : headers) {
std::cout << header.first << ":" << header.second << std::endl;
}
json meta_data;
EXPECT_EQ(api_error::success,
provider_->get_skynet_metadata(skynet_info["skylink"].get<std::string>(), meta_data));
const auto encrypted_file_name = meta_data["filename"].get<std::string>();
std::vector<char> buffer;
EXPECT_TRUE(utils::from_hex_string(encrypted_file_name, buffer));
std::string file_name;
decrypt_and_verify(buffer, fsi.encryption_token, file_name);
EXPECT_STREQ("test.txt", file_name.c_str());
config_->set_value_by_name("SkynetConfig.EncryptionToken", "");
}
TEST_F(skynet_provider_test, import_and_export) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
skylink_import sl{"", "", "AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA", ""};
EXPECT_EQ(api_error::success, provider_->import_skylink(sl));
EXPECT_TRUE(provider_->is_file("/repertory_test_import.txt"));
std::uint64_t file_size = 0u;
EXPECT_EQ(api_error::success, provider_->get_file_size("/repertory_test_import.txt", file_size));
EXPECT_EQ(std::uint64_t(3u), file_size);
api_meta_map meta;
EXPECT_EQ(api_error::success, provider_->get_item_meta("/repertory_test_import.txt", meta));
const auto id = json::parse(meta[META_ID]);
EXPECT_STREQ("AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA",
id["skylink"].get<std::string>().c_str());
const auto test_success = [](json &result) {
EXPECT_EQ(std::size_t(1u), result["success"].size());
auto i = skylink_import::from_json(result["success"][0u]);
EXPECT_STREQ("/", i.directory.c_str());
EXPECT_STREQ("repertory_test_import.txt", i.file_name.c_str());
EXPECT_STREQ("AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA", i.skylink.c_str());
EXPECT_STREQ("", i.token.c_str());
};
{
auto export_with_failure =
provider_->export_list({"/repertory_test_import.txt", "/repertory_test_import2.txt"});
std::cout << export_with_failure.dump(2) << std::endl;
EXPECT_EQ(std::size_t(1), export_with_failure["failed"].size());
EXPECT_STREQ("/repertory_test_import2.txt",
export_with_failure["failed"][0u].get<std::string>().c_str());
test_success(export_with_failure);
}
{
auto export_all = provider_->export_all();
std::cout << export_all.dump(2) << std::endl;
EXPECT_TRUE(export_all["failed"].empty());
test_success(export_all);
}
provider_->remove_file("/repertory_test_import.txt");
}
TEST_F(skynet_provider_test, import_and_export_with_different_directory) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
skylink_import sl{"/test/sub", "", "AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA", ""};
EXPECT_EQ(api_error::success, provider_->import_skylink(sl));
EXPECT_TRUE(provider_->is_directory("/test"));
EXPECT_TRUE(provider_->is_directory("/test/sub"));
EXPECT_TRUE(provider_->is_file("/test/sub/repertory_test_import.txt"));
std::uint64_t file_size = 0;
EXPECT_EQ(api_error::success,
provider_->get_file_size("/test/sub/repertory_test_import.txt", file_size));
EXPECT_EQ(std::uint64_t(3), file_size);
api_meta_map meta;
EXPECT_EQ(api_error::success,
provider_->get_item_meta("/test/sub/repertory_test_import.txt", meta));
const auto id = json::parse(meta[META_ID]);
EXPECT_STREQ("AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA",
id["skylink"].get<std::string>().c_str());
const auto test_success = [](json &result) {
EXPECT_EQ(std::size_t(1), result["success"].size());
auto i = skylink_import::from_json(result["success"][0u]);
EXPECT_STREQ("/test/sub", i.directory.c_str());
EXPECT_STREQ("repertory_test_import.txt", i.file_name.c_str());
EXPECT_STREQ("AACeCiD6WQG6DzDcCdIu3cFPSxMUMoQPx46NYSyijNMKUA", i.skylink.c_str());
EXPECT_STREQ("", i.token.c_str());
};
{
auto export_with_failure = provider_->export_list(
{"/test/sub/repertory_test_import.txt", "/test/sub/repertory_test_import2.txt"});
std::cout << export_with_failure.dump(2) << std::endl;
EXPECT_EQ(std::size_t(1), export_with_failure["failed"].size());
EXPECT_STREQ("/test/sub/repertory_test_import2.txt",
export_with_failure["failed"][0u].get<std::string>().c_str());
test_success(export_with_failure);
}
{
auto export_all = provider_->export_all();
std::cout << export_all.dump(2) << std::endl;
EXPECT_TRUE(export_all["failed"].empty());
test_success(export_all);
}
provider_->remove_file("/test/sub/repertory_test_import.txt");
}
TEST_F(skynet_provider_test, import_directory) {
const auto expected_json_data = json::parse(
R"({ "filename": "skynet_test", "length": 36, "subfiles": { "sub_dir/test_03": { "contenttype": "application/octet-stream", "filename": "sub_dir/test_03", "len": 9, "offset": 18 }, "sub_dir/test_04": { "contenttype": "application/octet-stream", "filename": "sub_dir/test_04", "len": 9, "offset": 27 }, "test_01": { "contenttype": "application/octet-stream", "filename": "test_01", "len": 9 }, "test_02": { "contenttype": "application/octet-stream", "filename": "test_02", "len": 9, "offset": 9 } }, "tryfiles": [ "index.html" ] })");
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
skylink_import sl{"", "", EXTERNAL_SKYLINK, ""};
EXPECT_EQ(api_error::success, provider_->import_skylink(sl));
for (const auto &subFile : expected_json_data["subfiles"]) {
const auto api_path = utils::path::create_api_path(
utils::path::combine("/", {subFile["filename"].get<std::string>()}));
EXPECT_TRUE(provider_->is_file(api_path));
std::uint64_t file_size = 0;
EXPECT_EQ(api_error::success, provider_->get_file_size(api_path, file_size));
EXPECT_EQ(subFile["len"].get<std::uint64_t>(), file_size);
api_meta_map meta;
EXPECT_EQ(api_error::success, provider_->get_item_meta(api_path, meta));
const auto id = json::parse(meta[META_ID]);
const auto skylink = sl.skylink + api_path;
EXPECT_STREQ(skylink.c_str(), id["skylink"].get<std::string>().c_str());
}
}
TEST_F(skynet_provider_test, rename_file_fails_on_skylinks_with_directory_paths) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/test_rename2", {}));
EXPECT_EQ(api_error::success, provider_->create_directory("/test_rename2/static", {}));
EXPECT_EQ(api_error::success, provider_->create_directory("/test_rename2/static/css", {}));
skylink_import sl{"/test_rename", "", EXTERNAL_SKYLINK, ""};
EXPECT_EQ(api_error::success, provider_->import_skylink(sl));
if (not ::testing::Test::HasFailure()) {
EXPECT_EQ(api_error::access_denied,
provider_->rename_file("/test_rename/test_01", "/test_rename/test_01_"));
EXPECT_EQ(api_error::access_denied, provider_->rename_file("/test_rename/sub_dir/test_03",
"/test_rename/sub_dir/test_03_"));
EXPECT_EQ(api_error::access_denied,
provider_->rename_file("/test_rename/test_01", "/test_rename2/test_01_"));
EXPECT_EQ(api_error::access_denied, provider_->rename_file("/test_rename/sub_dir/test_03",
"/test_rename2/sub_dir/test_03_"));
EXPECT_EQ(api_error::success, provider_->create_directory("/test_rename/a", {}));
EXPECT_EQ(api_error::success, provider_->create_directory("/test_rename/sub_dir/b", {}));
EXPECT_EQ(api_error::access_denied,
provider_->rename_file("/test_rename/test_01", "/test_rename/a/test_01_"));
EXPECT_EQ(api_error::access_denied, provider_->rename_file("/test_rename/sub_dir/test_03",
"/test_rename/static/b/test_03_"));
}
}
TEST_F(skynet_provider_test, rename_file_succeeds_with_logical_directory_paths) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
EXPECT_EQ(api_error::success, provider_->create_directory("/test_rename2", {}));
EXPECT_EQ(api_error::success, provider_->create_directory("/test_rename2/sub_dir", {}));
skylink_import sl{"/test_rename", "", EXTERNAL_SKYLINK, ""};
EXPECT_EQ(api_error::success, provider_->import_skylink(sl));
if (not ::testing::Test::HasFailure()) {
EXPECT_EQ(api_error::success,
provider_->rename_file("/test_rename/test_01", "/test_rename2/test_01"));
EXPECT_EQ(api_error::success, provider_->rename_file("/test_rename/sub_dir/test_03",
"/test_rename2/sub_dir/test_03"));
}
}
TEST_F(skynet_provider_test, export_with_nested_directory_paths) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
skylink_import sl{"/test_export/nested", "", EXTERNAL_SKYLINK, ""};
EXPECT_EQ(api_error::success, provider_->import_skylink(sl));
if (not ::testing::Test::HasFailure()) {
const auto json_data = provider_->export_all();
for (const auto &e : json_data["success"]) {
EXPECT_STREQ("/test_export/nested", e["directory"].get<std::string>().c_str());
}
}
}
TEST_F(skynet_provider_test, export_with_nested_directory_paths_in_root) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
skylink_import sl{"/", "", EXTERNAL_SKYLINK, ""};
EXPECT_EQ(api_error::success, provider_->import_skylink(sl));
if (not ::testing::Test::HasFailure()) {
const auto json_data = provider_->export_all();
for (const auto &e : json_data["success"]) {
EXPECT_STREQ("/", e["directory"].get<std::string>().c_str());
}
}
}
TEST_F(skynet_provider_test, is_file_writeable_is_false_for_nested_skylinks) {
api_meta_map directory_meta{};
EXPECT_EQ(api_error::success, provider_->get_item_meta("/", directory_meta));
skylink_import sl{"/", "", EXTERNAL_SKYLINK, ""};
EXPECT_EQ(api_error::success, provider_->import_skylink(sl));
if (not ::testing::Test::HasFailure()) {
api_file_list list{};
provider_->get_file_list(list);
for (const auto &file : list) {
EXPECT_FALSE(provider_->is_file_writeable(file.api_path));
}
}
}
#ifdef REPERTORY_ENABLE_SKYNET_PREMIUM_TESTS
TEST_F(skynet_provider_test, authenticated_upload) {
app_config config(provider_type::skynet, "../..");
auto sk = config.get_skynet_config();
EXPECT_FALSE(sk.portal_list[0u].auth_user.empty());
sk.portal_list[0u].path = "/skynet/skyfile";
curl_comm comm(config);
const auto source_file = __FILE__;
const auto file_name = utils::path::strip_to_file_name(source_file);
auto id = utils::create_uuid_string();
utils::string::replace(id, "-", "");
json data, error;
auto sr = false;
EXPECT_EQ(api_error::success,
comm.post_multipart_file(sk.portal_list.at(0), "", file_name, source_file, "repertory",
data, error, sr));
std::cout << data.dump(2) << std::endl;
std::cout << error.dump(2) << std::endl;
}
TEST_F(skynet_provider_test, authenticated_upload_access_denied_with_invalid_username) {
app_config config(provider_type::skynet, "../..");
auto sk = config.get_skynet_config();
sk.portal_list[0u].auth_user = "cowaoeutnhsaoetuh@aosetuh.com";
sk.portal_list[0u].path = "/skynet/skyfile";
curl_comm comm(config);
const auto source_file = __FILE__;
const auto file_name = utils::path::strip_to_file_name(source_file);
auto id = utils::create_uuid_string();
utils::string::replace(id, "-", "");
json data, error;
auto sr = false;
EXPECT_EQ(api_error::access_denied,
comm.post_multipart_file(sk.portal_list.at(0), "", file_name, source_file, "repertory",
data, error, sr));
std::cout << data.dump(2) << std::endl;
std::cout << error.dump(2) << std::endl;
}
TEST_F(skynet_provider_test, authenticated_upload_access_denied_with_invalid_password) {
app_config config(provider_type::skynet, "../..");
auto sk = config.get_skynet_config();
EXPECT_FALSE(sk.portal_list[0u].auth_user.empty());
sk.portal_list[0u].auth_password = "1";
sk.portal_list[0u].path = "/skynet/skyfile";
curl_comm comm(config);
const auto source_file = __FILE__;
const auto file_name = utils::path::strip_to_file_name(source_file);
auto id = utils::create_uuid_string();
utils::string::replace(id, "-", "");
json data, error;
auto sr = false;
EXPECT_EQ(api_error::access_denied,
comm.post_multipart_file(sk.portal_list.at(0), "", file_name, source_file, "repertory",
data, error, sr));
std::cout << data.dump(2) << std::endl;
std::cout << error.dump(2) << std::endl;
}
#endif // REPERTORY_ENABLE_SKYNET_PREMIUM_TESTS
} // namespace repertory
// TODO Test import without encryption token when global encryption token is set
// TODO Test encrypted file import
// TODO Test encrypted directory import
#endif // REPERTORY_ENABLE_SKYNET