diff --git a/CodeCoverage.runsettings b/CodeCoverage.runsettings
new file mode 100644
index 0000000..22cd9cd
--- /dev/null
+++ b/CodeCoverage.runsettings
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+ True
+
+
+
+
+ .*\\desktop\.ranger\.core\\.*
+
+
+
+
+ True
+
+
+
+ False
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/desktop.ranger.core/desktop.ranger.core.vcxproj b/desktop.ranger.core/desktop.ranger.core.vcxproj
index 9722642..b69d1f1 100644
--- a/desktop.ranger.core/desktop.ranger.core.vcxproj
+++ b/desktop.ranger.core/desktop.ranger.core.vcxproj
@@ -85,6 +85,7 @@
+ ProgramDatabase
diff --git a/desktop.ranger.core/desktop_name_generator.cpp b/desktop.ranger.core/desktop_name_generator.cpp
index 35b6dc4..a2c0ed4 100644
--- a/desktop.ranger.core/desktop_name_generator.cpp
+++ b/desktop.ranger.core/desktop_name_generator.cpp
@@ -1,10 +1,10 @@
#include "desktop_name_generator.h"
-#include
#include
+#include
#include
-namespace DR
+namespace DesktopRanger::DesktopName
{
namespace
{
@@ -19,7 +19,7 @@ namespace DR
return kDesktopNameAlphabet.find(character) != std::wstring_view::npos;
}
- std::wstring GenerateDesktopName(std::mt19937 &generator, std::size_t length)
+ std::wstring Generate(std::mt19937 &generator, std::size_t length)
{
std::uniform_int_distribution Distribution(
0, kDesktopNameAlphabet.size() - 1);
@@ -34,10 +34,10 @@ namespace DR
return Result;
}
- std::wstring GenerateDesktopName()
+ std::wstring Generate()
{
thread_local std::mt19937 Generator{ std::random_device{}() };
- return GenerateDesktopName(Generator);
+ return Generate(Generator);
}
-} // namespace DR
\ No newline at end of file
+} // namespace DesktopRanger::DesktopName
\ No newline at end of file
diff --git a/desktop.ranger.core/desktop_name_generator.h b/desktop.ranger.core/desktop_name_generator.h
index 82ef033..38f9deb 100644
--- a/desktop.ranger.core/desktop_name_generator.h
+++ b/desktop.ranger.core/desktop_name_generator.h
@@ -4,16 +4,15 @@
#include
#include
-namespace DR
+namespace DesktopRanger::DesktopName
{
+ inline constexpr auto kDesktopNameLength = 255;
- inline constexpr std::size_t kDesktopNameLength = 255;
+ std::wstring Generate();
- std::wstring GenerateDesktopName();
-
- std::wstring GenerateDesktopName(std::mt19937 &generator,
- std::size_t length = kDesktopNameLength);
+ std::wstring Generate(std::mt19937 &generator,
+ std::size_t length = kDesktopNameLength);
bool IsValidDesktopNameCharacter(wchar_t character) noexcept;
-} // namespace DR
\ No newline at end of file
+} // namespace DesktopRanger::DesktopName
\ No newline at end of file
diff --git a/desktop.ranger.tests/desktop.ranger.tests.vcxproj b/desktop.ranger.tests/desktop.ranger.tests.vcxproj
index 3f46ddf..9d417e3 100644
--- a/desktop.ranger.tests/desktop.ranger.tests.vcxproj
+++ b/desktop.ranger.tests/desktop.ranger.tests.vcxproj
@@ -45,10 +45,12 @@
EnableFastChecks
MultiThreadedDebugDLL
Level3
+ ProgramDatabase
true
Console
+ true
@@ -68,6 +70,7 @@
Console
true
true
+ false
diff --git a/desktop.ranger.tests/desktop_name_generator_test.cpp b/desktop.ranger.tests/desktop_name_generator_test.cpp
index b2e8cbb..638b6e5 100644
--- a/desktop.ranger.tests/desktop_name_generator_test.cpp
+++ b/desktop.ranger.tests/desktop_name_generator_test.cpp
@@ -7,14 +7,14 @@
#include "desktop_name_generator.h"
-namespace DR::Tests
+namespace DesktopRanger::DesktopName::Tests
{
TEST(DesktopNameGenerator, GeneratesDefaultLengthName)
{
std::mt19937 generator{ 12345 };
- const std::wstring name = GenerateDesktopName(generator);
+ const std::wstring name = Generate(generator);
EXPECT_EQ(name.size(), kDesktopNameLength);
}
@@ -23,7 +23,7 @@ namespace DR::Tests
{
std::mt19937 generator{ 12345 };
- const std::wstring name = GenerateDesktopName(generator, 32);
+ const std::wstring name = Generate(generator, 32);
EXPECT_EQ(name.size(), 32U);
}
@@ -32,7 +32,7 @@ namespace DR::Tests
{
std::mt19937 generator{ 12345 };
- const std::wstring name = GenerateDesktopName(generator, 0);
+ const std::wstring name = Generate(generator, 0);
EXPECT_TRUE(name.empty());
}
@@ -41,7 +41,7 @@ namespace DR::Tests
{
std::mt19937 generator{ 12345 };
- const std::wstring name = GenerateDesktopName(generator, 4096);
+ const std::wstring name = Generate(generator, 4096);
const bool allCharactersAreValid =
std::ranges::all_of(name, IsValidDesktopNameCharacter);
@@ -53,7 +53,7 @@ namespace DR::Tests
{
std::mt19937 generator{ 12345 };
- const std::wstring name = GenerateDesktopName(generator);
+ const std::wstring name = Generate(generator);
EXPECT_EQ(name.find(L'\0'), std::wstring::npos);
}
@@ -63,9 +63,9 @@ namespace DR::Tests
std::mt19937 firstGenerator{ 12345 };
std::mt19937 secondGenerator{ 12345 };
- const std::wstring firstName = GenerateDesktopName(firstGenerator);
+ const std::wstring firstName = Generate(firstGenerator);
- const std::wstring secondName = GenerateDesktopName(secondGenerator);
+ const std::wstring secondName = Generate(secondGenerator);
EXPECT_EQ(firstName, secondName);
}
@@ -74,9 +74,9 @@ namespace DR::Tests
{
std::mt19937 generator{ 12345 };
- const std::wstring firstName = GenerateDesktopName(generator);
+ const std::wstring firstName = Generate(generator);
- const std::wstring secondName = GenerateDesktopName(generator);
+ const std::wstring secondName = Generate(generator);
EXPECT_NE(firstName, secondName);
}
@@ -90,10 +90,24 @@ namespace DR::Tests
names.reserve(sampleSize);
for (std::size_t index = 0; index < sampleSize; ++index) {
- names.insert(GenerateDesktopName(generator));
+ names.insert(Generate(generator));
}
EXPECT_EQ(names.size(), sampleSize);
}
-} // namespace DR::Tests
\ No newline at end of file
+ TEST(DesktopNameGenerator, RejectsDisallowedCharacters)
+ {
+ EXPECT_FALSE(DesktopRanger::DesktopName::IsValidDesktopNameCharacter(L'/'));
+ EXPECT_FALSE(DesktopRanger::DesktopName::IsValidDesktopNameCharacter(L'\\'));
+ EXPECT_FALSE(DesktopRanger::DesktopName::IsValidDesktopNameCharacter(L'\0'));
+ }
+
+ TEST(DesktopNameGenerator, AcceptsAllowedCharacters)
+ {
+ EXPECT_TRUE(DesktopRanger::DesktopName::IsValidDesktopNameCharacter(L'a'));
+ EXPECT_TRUE(DesktopRanger::DesktopName::IsValidDesktopNameCharacter(L'7'));
+ EXPECT_TRUE(DesktopRanger::DesktopName::IsValidDesktopNameCharacter(L'_'));
+ }
+
+} // namespace DesktopRanger::DesktopName::Tests
\ No newline at end of file
diff --git a/desktop.ranger/advanced_secure_desktop.cpp b/desktop.ranger/advanced_secure_desktop.cpp
index 4047dc1..ec6f5bb 100644
--- a/desktop.ranger/advanced_secure_desktop.cpp
+++ b/desktop.ranger/advanced_secure_desktop.cpp
@@ -43,25 +43,7 @@ namespace AdvancedSecureDesktop
std::wstring GetRandomDesktopName()
{
- return DR::GenerateDesktopName();
-
- // static constexpr wchar_t alphabet[] = L"abcdefghijklmnopqrstuvwxyz" // 26
- // "0123456789" // 10
- // "_-.,;:@#$%&'()[]{}+=~`!^"; // 25
- //
- // static constexpr auto alphabetSize =
- // std::size(alphabet) - 1; // without null terminator
- //
- // static thread_local std::mt19937 generate(std::random_device{}());
- //
- // static constexpr auto length = 255;
- // std::wstring result(length, L'\0');
- //
- // for (wchar_t &c : result) {
- // c = alphabet[generate() % alphabetSize];
- // }
- //
- // return result;
+ return DesktopRanger::DesktopName::Generate();
}
bool CreateNewDesktop(IN std::wstring DesktopName, OUT HDESK &DefaultDesktopHandle,