aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src
diff options
context:
space:
mode:
Diffstat (limited to 'toolsrc/src')
-rw-r--r--toolsrc/src/tests.files.cpp80
-rw-r--r--toolsrc/src/tests.strings.cpp38
-rw-r--r--toolsrc/src/vcpkg/base/files.cpp3
-rw-r--r--toolsrc/src/vcpkg/base/strings.cpp72
4 files changed, 157 insertions, 36 deletions
diff --git a/toolsrc/src/tests.files.cpp b/toolsrc/src/tests.files.cpp
new file mode 100644
index 000000000..73c7eb5bc
--- /dev/null
+++ b/toolsrc/src/tests.files.cpp
@@ -0,0 +1,80 @@
+#include "tests.pch.h"
+
+#include <vcpkg/base/files.h>
+#include <vcpkg/base/strings.h>
+
+#include <iostream>
+#include <random>
+
+#include <windows.h>
+
+using namespace Microsoft::VisualStudio::CppUnitTestFramework;
+
+namespace UnitTest1 {
+ class FilesTest : public TestClass<FilesTest> {
+ using uid = std::uniform_int_distribution<std::uint64_t>;
+
+ std::string get_random_filename()
+ {
+ std::random_device rd;
+ return vcpkg::Strings::b64url_encode(uid{}(rd));
+ }
+
+ void create_directory_tree(
+ vcpkg::Files::Filesystem& fs,
+ std::uint64_t depth,
+ const fs::path& base)
+ {
+ std::random_device rd;
+ constexpr auto max_depth = std::uint64_t(3);
+ const auto width = depth ? uid{0, (max_depth - depth) * 3 / 2}(rd) : 5;
+
+ std::error_code ec;
+ if (width == 0) {
+ fs.write_contents(base, "", ec);
+ Assert::IsFalse(bool(ec));
+
+ return;
+ }
+
+ fs.create_directory(base, ec);
+ Assert::IsFalse(bool(ec));
+
+ for (int i = 0; i < width; ++i) {
+ create_directory_tree(fs, depth + 1, base / get_random_filename());
+ }
+ }
+
+ TEST_METHOD(remove_all) {
+ fs::path temp_dir;
+
+ {
+ wchar_t* tmp = static_cast<wchar_t*>(calloc(32'767, 2));
+
+ if (!GetEnvironmentVariableW(L"TEMP", tmp, 32'767)) {
+ Assert::Fail(L"GetEnvironmentVariable(\"TEMP\") failed");
+ }
+
+ temp_dir = tmp;
+
+ std::string dir_name = "vcpkg-tmp-dir-";
+ dir_name += get_random_filename();
+
+ temp_dir /= dir_name;
+ }
+
+ auto& fs = vcpkg::Files::get_real_filesystem();
+
+ std::cout << "temp dir is: " << temp_dir << '\n';
+
+ std::error_code ec;
+ create_directory_tree(fs, 0, temp_dir);
+
+ fs::path fp;
+ fs.remove_all(temp_dir, ec, fp);
+ Assert::IsFalse(bool(ec));
+
+ Assert::IsFalse(fs.exists(temp_dir));
+ }
+ };
+}
diff --git a/toolsrc/src/tests.strings.cpp b/toolsrc/src/tests.strings.cpp
new file mode 100644
index 000000000..14b449e86
--- /dev/null
+++ b/toolsrc/src/tests.strings.cpp
@@ -0,0 +1,38 @@
+#include "tests.pch.h"
+
+#include <vcpkg/base/strings.h>
+
+#include <cstdint>
+#include <utility>
+#include <vector>
+
+using namespace Microsoft::VisualStudio::CppUnitTestFramework;
+
+namespace UnitTest1 {
+ class StringsTest : public TestClass<StringsTest> {
+ TEST_METHOD(b64url_encode)
+ {
+ using u64 = std::uint64_t;
+
+ std::vector<std::pair<std::uint64_t, std::string>> map;
+
+ map.emplace_back(0, "AAAAAAAAAAA");
+ map.emplace_back(1, "BAAAAAAAAAA");
+
+ map.emplace_back(u64(1) << 32, "AAAAAEAAAAA");
+ map.emplace_back((u64(1) << 32) + 1, "BAAAAEAAAAA");
+
+ map.emplace_back(0xE4D0'1065'D11E'0229, "pIgHRXGEQTO");
+ map.emplace_back(0xA626'FE45'B135'07FF, "_fQNxWk_mYK");
+ map.emplace_back(0xEE36'D228'0C31'D405, "FQdMMgi024O");
+ map.emplace_back(0x1405'64E7'FE7E'A88C, "Miqf-fOZFQB");
+ map.emplace_back(0xFFFF'FFFF'FFFF'FFFF, "__________P");
+
+ std::string result;
+ for (const auto& pr : map) {
+ result = vcpkg::Strings::b64url_encode(pr.first);
+ Assert::AreEqual(result, pr.second);
+ }
+ }
+ };
+}
diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp
index a4e67a142..4e36fe990 100644
--- a/toolsrc/src/vcpkg/base/files.cpp
+++ b/toolsrc/src/vcpkg/base/files.cpp
@@ -23,7 +23,7 @@
namespace fs::detail
{
- file_status symlink_status_t::operator()(const path& p, std::error_code& ec) const noexcept
+ file_status symlink_status_t::operator()(const path& p, std::error_code&) const noexcept
{
#if defined(_WIN32)
/*
@@ -406,6 +406,7 @@ namespace vcpkg::Files
if (!info.ec)
{
info.ec = ec;
+ info.failure_point = failure_point;
}
return true;
diff --git a/toolsrc/src/vcpkg/base/strings.cpp b/toolsrc/src/vcpkg/base/strings.cpp
index 16543046e..ade4384a9 100644
--- a/toolsrc/src/vcpkg/base/strings.cpp
+++ b/toolsrc/src/vcpkg/base/strings.cpp
@@ -289,44 +289,46 @@ bool Strings::contains(StringView haystack, StringView needle)
return Strings::search(haystack, needle) != haystack.end();
}
-namespace vcpkg::Strings::detail {
-
- template <class Integral>
- std::string b64url_encode_implementation(Integral x) {
- static_assert(std::is_integral<Integral>::value, "b64url_encode must take an integer type");
- using Unsigned = std::make_unsigned_t<Integral>;
- auto value = static_cast<Unsigned>(x);
-
- // 64 values, plus the implicit \0
- constexpr static char map[0x41] =
- /* 0123456789ABCDEF */
- /*0*/ "ABCDEFGHIJKLMNOP"
- /*1*/ "QRSTUVWXYZabcdef"
- /*2*/ "ghijklmnopqrstuv"
- /*3*/ "wxyz0123456789-_"
- ;
-
- constexpr static int shift = 5;
- constexpr static auto mask = (static_cast<Unsigned>(1) << shift) - 1;
-
- std::string result;
- // reserve ceiling(number of bits / 3)
- result.resize((sizeof(value) * 8 + 2) / 3, map[0]);
-
- for (char& c: result) {
- if (value == 0) {
- break;
+namespace vcpkg::Strings
+{
+ namespace
+ {
+ template<class Integral>
+ std::string b64url_encode_implementation(Integral x)
+ {
+ static_assert(std::is_integral<Integral>::value, "b64url_encode must take an integer type");
+ using Unsigned = std::make_unsigned_t<Integral>;
+ auto value = static_cast<Unsigned>(x);
+
+ // 64 values, plus the implicit \0
+ constexpr static char map[65] =
+ /* 0123456789ABCDEF */
+ /*0*/ "ABCDEFGHIJKLMNOP"
+ /*1*/ "QRSTUVWXYZabcdef"
+ /*2*/ "ghijklmnopqrstuv"
+ /*3*/ "wxyz0123456789-_";
+
+ // log2(64)
+ constexpr static int shift = 6;
+ // 64 - 1
+ constexpr static auto mask = 63;
+
+ // ceiling(bitsize(Integral) / log2(64))
+ constexpr static auto result_size = (sizeof(value) * 8 + shift - 1) / shift;
+
+ std::string result;
+ result.reserve(result_size);
+
+ for (std::size_t i = 0; i < result_size; ++i)
+ {
+ result.push_back(map[value & mask]);
+ value >>= shift;
}
- c = map[value & mask];
- value >>= shift;
- }
- return result;
+ return result;
+ }
}
- std::string b64url_encode_t::operator()(std::uint64_t x) const noexcept{
- return b64url_encode_implementation(x);
- }
+ std::string b64url_encode(std::uint64_t x) noexcept { return b64url_encode_implementation(x); }
}
-