mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-10 21:41:51 +02:00
Invalid json test cases + strings validation (#1558)
* added tests for invalid json types * guid strings validation * device id validation
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
@@ -46,6 +47,59 @@ namespace
|
|||||||
|
|
||||||
namespace JSONHelpers
|
namespace JSONHelpers
|
||||||
{
|
{
|
||||||
|
bool isValidGuid(const std::wstring& str)
|
||||||
|
{
|
||||||
|
GUID id;
|
||||||
|
return SUCCEEDED_LOG(CLSIDFromString(str.c_str(), &id));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValidDeviceId(const std::wstring& str)
|
||||||
|
{
|
||||||
|
std::wstring temp;
|
||||||
|
std::vector<std::wstring> parts;
|
||||||
|
std::wstringstream wss(str);
|
||||||
|
while (std::getline(wss, temp, L'_'))
|
||||||
|
{
|
||||||
|
parts.push_back(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parts.size() != 4)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refer to ZoneWindowUtils::GenerateUniqueId parts contain:
|
||||||
|
1. monitor id [string]
|
||||||
|
2. width of device [int]
|
||||||
|
3. height of device [int]
|
||||||
|
4. virtual desktop id (GUID) [string]
|
||||||
|
*/
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//check if resolution contain only digits
|
||||||
|
for (const auto& c : parts[1])
|
||||||
|
{
|
||||||
|
std::stoi(std::wstring(&c));
|
||||||
|
}
|
||||||
|
for (const auto& c : parts[2])
|
||||||
|
{
|
||||||
|
std::stoi(std::wstring(&c));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const std::exception&)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isValidGuid(parts[3]) || parts[0].empty())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
json::JsonArray NumVecToJsonArray(const std::vector<int>& vec)
|
json::JsonArray NumVecToJsonArray(const std::vector<int>& vec)
|
||||||
{
|
{
|
||||||
json::JsonArray arr;
|
json::JsonArray arr;
|
||||||
@@ -733,10 +787,14 @@ namespace JSONHelpers
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
ZoneSetData zoneSetData;
|
ZoneSetData zoneSetData;
|
||||||
|
|
||||||
zoneSetData.uuid = zoneSet.GetNamedString(L"uuid");
|
zoneSetData.uuid = zoneSet.GetNamedString(L"uuid");
|
||||||
zoneSetData.type = TypeFromString(std::wstring{ zoneSet.GetNamedString(L"type") });
|
zoneSetData.type = TypeFromString(std::wstring{ zoneSet.GetNamedString(L"type") });
|
||||||
|
|
||||||
|
if (!isValidGuid(zoneSetData.uuid))
|
||||||
|
{
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
return zoneSetData;
|
return zoneSetData;
|
||||||
}
|
}
|
||||||
catch (const winrt::hresult_error&)
|
catch (const winrt::hresult_error&)
|
||||||
@@ -768,6 +826,11 @@ namespace JSONHelpers
|
|||||||
result.data.deviceId = zoneSet.GetNamedString(L"device-id");
|
result.data.deviceId = zoneSet.GetNamedString(L"device-id");
|
||||||
result.data.zoneSetUuid = zoneSet.GetNamedString(L"zoneset-uuid");
|
result.data.zoneSetUuid = zoneSet.GetNamedString(L"zoneset-uuid");
|
||||||
|
|
||||||
|
if (!isValidGuid(result.data.zoneSetUuid) || !isValidDeviceId(result.data.deviceId))
|
||||||
|
{
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
catch (const winrt::hresult_error&)
|
catch (const winrt::hresult_error&)
|
||||||
@@ -796,6 +859,10 @@ namespace JSONHelpers
|
|||||||
DeviceInfoJSON result;
|
DeviceInfoJSON result;
|
||||||
|
|
||||||
result.deviceId = device.GetNamedString(L"device-id");
|
result.deviceId = device.GetNamedString(L"device-id");
|
||||||
|
if (!isValidDeviceId(result.deviceId))
|
||||||
|
{
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
if (auto zoneSet = ZoneSetData::FromJson(device.GetNamedObject(L"active-zoneset")); zoneSet.has_value())
|
if (auto zoneSet = ZoneSetData::FromJson(device.GetNamedObject(L"active-zoneset")); zoneSet.has_value())
|
||||||
{
|
{
|
||||||
@@ -988,6 +1055,11 @@ namespace JSONHelpers
|
|||||||
CustomZoneSetJSON result;
|
CustomZoneSetJSON result;
|
||||||
|
|
||||||
result.uuid = customZoneSet.GetNamedString(L"uuid");
|
result.uuid = customZoneSet.GetNamedString(L"uuid");
|
||||||
|
if (!isValidGuid(result.uuid))
|
||||||
|
{
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
result.data.name = customZoneSet.GetNamedString(L"name");
|
result.data.name = customZoneSet.GetNamedString(L"name");
|
||||||
|
|
||||||
json::JsonObject infoJson = customZoneSet.GetNamedObject(L"info");
|
json::JsonObject infoJson = customZoneSet.GetNamedObject(L"info");
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ namespace JSONHelpers
|
|||||||
{
|
{
|
||||||
constexpr int MAX_ZONE_COUNT = 50;
|
constexpr int MAX_ZONE_COUNT = 50;
|
||||||
|
|
||||||
|
#if defined(UNIT_TESTS)
|
||||||
|
bool isValidGuid(const std::wstring& str);
|
||||||
|
bool isValidDeviceId(const std::wstring& str);
|
||||||
|
#endif
|
||||||
|
|
||||||
enum class ZoneSetLayoutType : int
|
enum class ZoneSetLayoutType : int
|
||||||
{
|
{
|
||||||
Blank = -1,
|
Blank = -1,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -147,3 +147,27 @@ namespace Mocks
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::wstring Helpers::GuidToString(const GUID& guid)
|
||||||
|
{
|
||||||
|
OLECHAR* guidString;
|
||||||
|
if (StringFromCLSID(guid, &guidString) == S_OK)
|
||||||
|
{
|
||||||
|
std::wstring guidStr{ guidString };
|
||||||
|
CoTaskMemFree(guidString);
|
||||||
|
return guidStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return L"";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::wstring Helpers::CreateGuidString()
|
||||||
|
{
|
||||||
|
GUID guid;
|
||||||
|
if (CoCreateGuid(&guid) == S_OK)
|
||||||
|
{
|
||||||
|
return GuidToString(guid);
|
||||||
|
}
|
||||||
|
|
||||||
|
return L"";
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,3 +43,9 @@ namespace Mocks
|
|||||||
|
|
||||||
HWND WindowCreate(HINSTANCE hInst);
|
HWND WindowCreate(HINSTANCE hInst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Helpers
|
||||||
|
{
|
||||||
|
std::wstring GuidToString(const GUID& guid);
|
||||||
|
std::wstring CreateGuidString();
|
||||||
|
}
|
||||||
@@ -52,25 +52,6 @@ namespace FancyZonesUnitTests
|
|||||||
|
|
||||||
JSONHelpers::FancyZonesData& m_fancyZonesData = JSONHelpers::FancyZonesDataInstance();
|
JSONHelpers::FancyZonesData& m_fancyZonesData = JSONHelpers::FancyZonesDataInstance();
|
||||||
|
|
||||||
std::wstring GuidString(const GUID& guid)
|
|
||||||
{
|
|
||||||
OLECHAR* guidString;
|
|
||||||
Assert::AreEqual(S_OK, StringFromCLSID(guid, &guidString));
|
|
||||||
|
|
||||||
std::wstring guidStr{ guidString };
|
|
||||||
CoTaskMemFree(guidString);
|
|
||||||
|
|
||||||
return guidStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::wstring CreateGuidString()
|
|
||||||
{
|
|
||||||
GUID guid;
|
|
||||||
Assert::AreEqual(S_OK, CoCreateGuid(&guid));
|
|
||||||
|
|
||||||
return GuidString(guid);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_METHOD_INITIALIZE(Init)
|
TEST_METHOD_INITIALIZE(Init)
|
||||||
{
|
{
|
||||||
m_hInst = (HINSTANCE)GetModuleHandleW(nullptr);
|
m_hInst = (HINSTANCE)GetModuleHandleW(nullptr);
|
||||||
@@ -79,7 +60,7 @@ namespace FancyZonesUnitTests
|
|||||||
m_monitorInfo.cbSize = sizeof(m_monitorInfo);
|
m_monitorInfo.cbSize = sizeof(m_monitorInfo);
|
||||||
Assert::AreNotEqual(0, GetMonitorInfoW(m_monitor, &m_monitorInfo));
|
Assert::AreNotEqual(0, GetMonitorInfoW(m_monitor, &m_monitorInfo));
|
||||||
|
|
||||||
m_uniqueId << L"DELA026#5&10a58c63&0&UID16777488_" << m_monitorInfo.rcMonitor.right << "_" << m_monitorInfo.rcMonitor.bottom << "_MyVirtualDesktopId";
|
m_uniqueId << L"DELA026#5&10a58c63&0&UID16777488_" << m_monitorInfo.rcMonitor.right << "_" << m_monitorInfo.rcMonitor.bottom << "_{39B25DD2-130D-4B5D-8851-4791D66B1539}";
|
||||||
|
|
||||||
Assert::IsFalse(ZoneWindowUtils::GetActiveZoneSetTmpPath().empty());
|
Assert::IsFalse(ZoneWindowUtils::GetActiveZoneSetTmpPath().empty());
|
||||||
Assert::IsFalse(ZoneWindowUtils::GetAppliedZoneSetTmpPath().empty());
|
Assert::IsFalse(ZoneWindowUtils::GetAppliedZoneSetTmpPath().empty());
|
||||||
@@ -108,7 +89,7 @@ namespace FancyZonesUnitTests
|
|||||||
Assert::IsFalse(std::filesystem::exists(activeZoneSetTempPath));
|
Assert::IsFalse(std::filesystem::exists(activeZoneSetTempPath));
|
||||||
|
|
||||||
const auto type = JSONHelpers::ZoneSetLayoutType::Columns;
|
const auto type = JSONHelpers::ZoneSetLayoutType::Columns;
|
||||||
const auto expectedZoneSet = JSONHelpers::ZoneSetData{ CreateGuidString(), type };
|
const auto expectedZoneSet = JSONHelpers::ZoneSetData{ Helpers::CreateGuidString(), type };
|
||||||
const auto data = JSONHelpers::DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
const auto data = JSONHelpers::DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
||||||
const auto deviceInfo = JSONHelpers::DeviceInfoJSON{ m_uniqueId.str(), data };
|
const auto deviceInfo = JSONHelpers::DeviceInfoJSON{ m_uniqueId.str(), data };
|
||||||
const auto json = JSONHelpers::DeviceInfoJSON::ToJson(deviceInfo);
|
const auto json = JSONHelpers::DeviceInfoJSON::ToJson(deviceInfo);
|
||||||
@@ -208,7 +189,7 @@ namespace FancyZonesUnitTests
|
|||||||
|
|
||||||
for (int type = static_cast<int>(ZoneSetLayoutType::Focus); type < static_cast<int>(ZoneSetLayoutType::Custom); type++)
|
for (int type = static_cast<int>(ZoneSetLayoutType::Focus); type < static_cast<int>(ZoneSetLayoutType::Custom); type++)
|
||||||
{
|
{
|
||||||
const auto expectedZoneSet = ZoneSetData{ CreateGuidString(), static_cast<ZoneSetLayoutType>(type) };
|
const auto expectedZoneSet = ZoneSetData{ Helpers::CreateGuidString(), static_cast<ZoneSetLayoutType>(type) };
|
||||||
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
||||||
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
||||||
const auto json = DeviceInfoJSON::ToJson(deviceInfo);
|
const auto json = DeviceInfoJSON::ToJson(deviceInfo);
|
||||||
@@ -232,7 +213,7 @@ namespace FancyZonesUnitTests
|
|||||||
const auto activeZoneSetTempPath = ZoneWindowUtils::GetActiveZoneSetTmpPath();
|
const auto activeZoneSetTempPath = ZoneWindowUtils::GetActiveZoneSetTmpPath();
|
||||||
|
|
||||||
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
|
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
|
||||||
const auto expectedZoneSet = ZoneSetData{ CreateGuidString(), type };
|
const auto expectedZoneSet = ZoneSetData{ Helpers::CreateGuidString(), type };
|
||||||
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
||||||
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
||||||
const auto json = DeviceInfoJSON::ToJson(deviceInfo);
|
const auto json = DeviceInfoJSON::ToJson(deviceInfo);
|
||||||
@@ -260,7 +241,7 @@ namespace FancyZonesUnitTests
|
|||||||
const auto appliedZoneSetTempPath = ZoneWindowUtils::GetAppliedZoneSetTmpPath();
|
const auto appliedZoneSetTempPath = ZoneWindowUtils::GetAppliedZoneSetTmpPath();
|
||||||
|
|
||||||
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
|
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
|
||||||
const auto customSetGuid = CreateGuidString();
|
const auto customSetGuid = Helpers::CreateGuidString();
|
||||||
const auto expectedZoneSet = ZoneSetData{ customSetGuid, type };
|
const auto expectedZoneSet = ZoneSetData{ customSetGuid, type };
|
||||||
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
||||||
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
||||||
@@ -297,7 +278,7 @@ namespace FancyZonesUnitTests
|
|||||||
const auto deletedZonesTempPath = ZoneWindowUtils::GetCustomZoneSetsTmpPath();
|
const auto deletedZonesTempPath = ZoneWindowUtils::GetCustomZoneSetsTmpPath();
|
||||||
|
|
||||||
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
|
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
|
||||||
const auto customSetGuid = CreateGuidString();
|
const auto customSetGuid = Helpers::CreateGuidString();
|
||||||
const auto expectedZoneSet = ZoneSetData{ customSetGuid, type };
|
const auto expectedZoneSet = ZoneSetData{ customSetGuid, type };
|
||||||
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
||||||
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
||||||
@@ -343,7 +324,7 @@ namespace FancyZonesUnitTests
|
|||||||
const auto deletedZonesTempPath = ZoneWindowUtils::GetCustomZoneSetsTmpPath();
|
const auto deletedZonesTempPath = ZoneWindowUtils::GetCustomZoneSetsTmpPath();
|
||||||
|
|
||||||
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
|
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
|
||||||
const auto customSetGuid = CreateGuidString();
|
const auto customSetGuid = Helpers::CreateGuidString();
|
||||||
const auto expectedZoneSet = ZoneSetData{ customSetGuid, type };
|
const auto expectedZoneSet = ZoneSetData{ customSetGuid, type };
|
||||||
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
|
||||||
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
const auto deviceInfo = DeviceInfoJSON{ m_uniqueId.str(), data };
|
||||||
@@ -361,7 +342,7 @@ namespace FancyZonesUnitTests
|
|||||||
//save different zone as deleted
|
//save different zone as deleted
|
||||||
json::JsonObject deletedCustomZoneSets = {};
|
json::JsonObject deletedCustomZoneSets = {};
|
||||||
json::JsonArray zonesArray{};
|
json::JsonArray zonesArray{};
|
||||||
const auto uuid = CreateGuidString();
|
const auto uuid = Helpers::CreateGuidString();
|
||||||
zonesArray.Append(json::JsonValue::CreateStringValue(uuid.substr(1, uuid.size() - 2).c_str()));
|
zonesArray.Append(json::JsonValue::CreateStringValue(uuid.substr(1, uuid.size() - 2).c_str()));
|
||||||
deletedCustomZoneSets.SetNamedValue(L"deleted-custom-zone-sets", zonesArray);
|
deletedCustomZoneSets.SetNamedValue(L"deleted-custom-zone-sets", zonesArray);
|
||||||
json::to_file(deletedZonesTempPath, deletedCustomZoneSets);
|
json::to_file(deletedZonesTempPath, deletedCustomZoneSets);
|
||||||
@@ -614,7 +595,7 @@ namespace FancyZonesUnitTests
|
|||||||
const auto zoneSetId = m_zoneWindow->ActiveZoneSet()->Id();
|
const auto zoneSetId = m_zoneWindow->ActiveZoneSet()->Id();
|
||||||
|
|
||||||
//fill app zone history map
|
//fill app zone history map
|
||||||
Assert::IsTrue(m_fancyZonesData.SetAppLastZone(window, deviceId, GuidString(zoneSetId), 0));
|
Assert::IsTrue(m_fancyZonesData.SetAppLastZone(window, deviceId, Helpers::GuidToString(zoneSetId), 0));
|
||||||
Assert::AreEqual((size_t)1, m_fancyZonesData.GetAppZoneHistoryMap().size());
|
Assert::AreEqual((size_t)1, m_fancyZonesData.GetAppZoneHistoryMap().size());
|
||||||
Assert::AreEqual(0, m_fancyZonesData.GetAppZoneHistoryMap().at(processPath).zoneIndex);
|
Assert::AreEqual(0, m_fancyZonesData.GetAppZoneHistoryMap().at(processPath).zoneIndex);
|
||||||
|
|
||||||
@@ -642,7 +623,7 @@ namespace FancyZonesUnitTests
|
|||||||
m_zoneWindow->ActiveZoneSet()->AddZone(zone);
|
m_zoneWindow->ActiveZoneSet()->AddZone(zone);
|
||||||
|
|
||||||
//fill app zone history map
|
//fill app zone history map
|
||||||
Assert::IsTrue(m_fancyZonesData.SetAppLastZone(window, deviceId, GuidString(zoneSetId), 2));
|
Assert::IsTrue(m_fancyZonesData.SetAppLastZone(window, deviceId, Helpers::GuidToString(zoneSetId), 2));
|
||||||
Assert::AreEqual((size_t)1, m_fancyZonesData.GetAppZoneHistoryMap().size());
|
Assert::AreEqual((size_t)1, m_fancyZonesData.GetAppZoneHistoryMap().size());
|
||||||
Assert::AreEqual(2, m_fancyZonesData.GetAppZoneHistoryMap().at(processPath).zoneIndex);
|
Assert::AreEqual(2, m_fancyZonesData.GetAppZoneHistoryMap().at(processPath).zoneIndex);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user