Files
OpenVulkano/tests/IO/Archive/ArchiveWriter.cpp
Vladyslav Baranovskyi 372d63b5d1 Tests for ArchiveWriter
2024-10-14 12:59:26 +03:00

180 lines
5.6 KiB
C++

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#include <catch2/catch_all.hpp>
#include <fstream>
#include <filesystem>
#include <string>
#include "IO/Archive/ArchiveReader.hpp"
#include "IO/Archive/ArchiveWriter.hpp"
#include "IO/AppFolders.hpp"
#include "IO/FileDescription.hpp"
using namespace OpenVulkano;
TEST_CASE("AddFile from buffer", "[ArchiveWriter]")
{
auto tempDir = AppFolders::GetAppTempDir();
auto archivePath = tempDir / "test_archive_from_buffer.zip";
{
ArchiveWriter writer(archivePath.string().c_str());
std::string buffer = "Hello";
FileDescription desc;
desc.type = std::filesystem::file_type::regular;
desc.path = "test.txt";
desc.size = buffer.size();
desc.permissions = (std::filesystem::perms) 0644;
REQUIRE(writer.AddFile(desc, buffer.c_str()) == true);
}
ArchiveReader reader(archivePath.string().c_str());
REQUIRE(reader.IsOpen());
REQUIRE(reader.HasNext() == true);
auto [fileDesc, fileData] = reader.GetNextFileAsVector().value();
REQUIRE(fileDesc.path == "test.txt");
REQUIRE(std::string(fileData.begin(), fileData.end()) == "Hello");
}
TEST_CASE("AddFile from multiple buffers", "[ArchiveWriter]")
{
auto tempDir = AppFolders::GetAppTempDir();
auto archivePath = tempDir / "test_archive_from_buffers.zip";
{
ArchiveWriter writer(archivePath.string().c_str());
FileDescription desc;
desc.type = std::filesystem::file_type::regular;
desc.path = "test.txt";
desc.size = 10;
desc.permissions = (std::filesystem::perms) 0644;
const char* buffer1 = "Hello";
const char* buffer2 = "World";
std::vector<std::pair<const void*, size_t>> buffers = { { buffer1, std::strlen(buffer1) },
{ buffer2, std::strlen(buffer2) } };
REQUIRE(writer.AddFile(desc, buffers) == true);
}
ArchiveReader reader(archivePath.string().c_str());
REQUIRE(reader.IsOpen());
REQUIRE(reader.HasNext() == true);
auto [fileDesc, fileData] = reader.GetNextFileAsVector().value();
REQUIRE(fileDesc.path == "test.txt");
REQUIRE(std::string(fileData.begin(), fileData.end()) == "HelloWorld");
}
TEST_CASE("AddFile from file", "[ArchiveWriter]")
{
auto tempDir = AppFolders::GetAppTempDir();
auto testFilePath = tempDir / "test.txt";
auto archivePath = tempDir / "test_archive_from_file.zip";
std::ofstream testFile(testFilePath);
testFile << "Hello from file";
testFile.close();
{
ArchiveWriter writer(archivePath.string().c_str());
REQUIRE(writer.AddFile(testFilePath.string().c_str(), "test.txt") == true);
}
ArchiveReader reader(archivePath.string().c_str());
REQUIRE(reader.IsOpen());
REQUIRE(reader.HasNext() == true);
auto [fileDesc, fileData] = reader.GetNextFileAsVector().value();
REQUIRE(fileDesc.path == "test.txt");
REQUIRE(std::string(fileData.begin(), fileData.end()) == "Hello from file");
}
TEST_CASE("AddFileStream", "[ArchiveWriter]")
{
auto tempDir = AppFolders::GetAppTempDir();
auto archivePath = tempDir / "test_archive_stream.zip";
{
ArchiveWriter writer(archivePath.string().c_str());
std::string buffer = "Streamed data.";
FileDescription desc;
desc.type = std::filesystem::file_type::regular;
desc.path = "stream.txt";
desc.size = buffer.size();
desc.permissions = (std::filesystem::perms) 0644;
ArchiveOStream stream = writer.AddFileStream(desc);
stream << buffer;
stream.Close();
}
ArchiveReader reader(archivePath.string().c_str());
REQUIRE(reader.IsOpen());
REQUIRE(reader.HasNext() == true);
auto [fileDesc, fileData] = reader.GetNextFileAsVector().value();
REQUIRE(fileDesc.path == "stream.txt");
REQUIRE(std::string(fileData.begin(), fileData.end()) == "Streamed data.");
}
TEST_CASE("Compression settings", "[ArchiveWriter]")
{
auto tempDir = AppFolders::GetAppTempDir();
auto archivePath = tempDir / "test_archive_compression.zip";
{
ArchiveConfiguration config(ArchiveType::ZIP, CompressionType::GZIP, 9);
ArchiveWriter writer(archivePath.string().c_str(), config);
std::string buffer = "Hello";
FileDescription desc;
desc.type = std::filesystem::file_type::regular;
desc.path = "compressed.txt";
desc.size = buffer.size();
desc.permissions = (std::filesystem::perms) 0644;
writer.SetShouldCompressFunction([](const FileDescription&) { return true; });
REQUIRE(writer.AddFile(desc, buffer.c_str()) == true);
}
ArchiveReader reader(archivePath.string().c_str());
REQUIRE(reader.IsOpen());
REQUIRE(reader.HasNext() == true);
auto [fileDesc, fileData] = reader.GetNextFileAsVector().value();
REQUIRE(fileDesc.path == "compressed.txt");
REQUIRE(std::string(fileData.begin(), fileData.end()) == "Hello");
}
TEST_CASE("Uncompressed settings", "[ArchiveWriter]")
{
auto tempDir = AppFolders::GetAppTempDir();
auto archivePath = tempDir / "test_archive_uncompressed.zip";
{
ArchiveConfiguration config(ArchiveType::ZIP, CompressionType::NONE, 0);
ArchiveWriter writer(archivePath.string().c_str(), config);
std::string buffer = "Hello";
FileDescription desc;
desc.type = std::filesystem::file_type::regular;
desc.path = "uncompressed.txt";
desc.size = buffer.size();
desc.permissions = (std::filesystem::perms) 0644;
writer.SetShouldCompressFunction([](const FileDescription&) { return false; });
REQUIRE(writer.AddFile(desc, buffer.c_str()) == true);
}
ArchiveReader reader(archivePath.string().c_str());
REQUIRE(reader.IsOpen());
REQUIRE(reader.HasNext() == true);
auto [fileDesc, fileData] = reader.GetNextFileAsVector().value();
REQUIRE(fileDesc.path == "uncompressed.txt");
REQUIRE(std::string(fileData.begin(), fileData.end()) == "Hello");
}