diff --git a/dev/MRTCore/mrt/Core/src/MRM.cpp b/dev/MRTCore/mrt/Core/src/MRM.cpp index c66a549185..8d9e90330a 100644 --- a/dev/MRTCore/mrt/Core/src/MRM.cpp +++ b/dev/MRTCore/mrt/Core/src/MRM.cpp @@ -16,6 +16,7 @@ #include "MRM.h" #include +#include using namespace Microsoft::Resources; @@ -980,6 +981,11 @@ STDAPI MrmGetFilePathFromName(_In_opt_ PCWSTR filename, _Outptr_ PWSTR* filePath RETURN_IF_FAILED(SizeTAdd(exeDirCount, 1, &exeDirCount)); RETURN_IF_FAILED(PathCchRemoveFileSpec(exeDir.get(), exeDirCount)); + // The ParentPathForFileName pass truncates exeDir in place to reach the parent folder, so + // preserve the original module directory here for the DefaultFallback pass, which must return + // a path under the module directory (the documented behavior). + std::wstring moduleDir(exeDir.get()); + enum SearchPass { exeDirForFileName, @@ -988,6 +994,7 @@ STDAPI MrmGetFilePathFromName(_In_opt_ PCWSTR filename, _Outptr_ PWSTR* filePath BaseDirForModulePri, exeDirForResourcesPri, exeDirForModulePri, + DefaultFallback, Final, }; SearchPass searchStart = SearchPass::exeDirForFileName; @@ -1030,7 +1037,10 @@ STDAPI MrmGetFilePathFromName(_In_opt_ PCWSTR filename, _Outptr_ PWSTR* filePath case SearchPass::ParentPathForFileName: // move to parent folder of previous search RETURN_IF_FAILED(PathCchRemoveFileSpec(searchDir, searchDirCount)); - pass = SearchPass::Final; + // If the parent search misses, skip the no-FileName passes and fall through to + // DefaultFallback so we still return a best-effort path (the documented + // always-succeed contract). The loop's increment lands pass on DefaultFallback. + pass = SearchPass(SearchPass::DefaultFallback - 1); break; // Search, given no FileName @@ -1050,7 +1060,34 @@ STDAPI MrmGetFilePathFromName(_In_opt_ PCWSTR filename, _Outptr_ PWSTR* filePath break; case SearchPass::exeDirForModulePri: searchFilename = modulePriFileName; - pass = SearchPass::Final; + // If this search misses, fall through to DefaultFallback (the next pass) so we + // still return a best-effort path (the documented always-succeed contract). + break; + case SearchPass::DefaultFallback: + // No file was found in any prior pass. Return a best-effort path even though it + // doesn't exist, matching the documented contract: the provided filename (if any) + // or resources.pri, under the base directory (if set) otherwise the module (exe) + // directory. Callers (e.g. ResourceManager) tolerate a non-existent path. + if (filename == nullptr || *filename == L'\0') + { + if (baseDir) + { + searchDir = baseDir.get(); + searchDirCount = baseDirCount; + } + else + { + searchDir = moduleDir.data(); + searchDirCount = exeDirCount; + } + searchFilename = ResourcesPriFileName; + } + else + { + searchDir = moduleDir.data(); + searchDirCount = exeDirCount; + searchFilename = filename; + } break; } @@ -1074,13 +1111,13 @@ STDAPI MrmGetFilePathFromName(_In_opt_ PCWSTR filename, _Outptr_ PWSTR* filePath PATHCCH_ALLOW_LONG_PATHS)); DWORD attributes = GetFileAttributes(outputPath.get()); - if ((attributes != INVALID_FILE_ATTRIBUTES) && !(attributes & FILE_ATTRIBUTE_DIRECTORY)) + if ((pass == SearchPass::DefaultFallback) || + ((attributes != INVALID_FILE_ATTRIBUTES) && !(attributes & FILE_ATTRIBUTE_DIRECTORY))) { - // The file exists. Done. *filePath = outputPath.release(); - return S_OK; + break; } } - return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + return S_OK; } diff --git a/dev/MRTCore/mrt/Core/unittests/MrmTests.cpp b/dev/MRTCore/mrt/Core/unittests/MrmTests.cpp index a7670fbe9a..8c495e7053 100644 --- a/dev/MRTCore/mrt/Core/unittests/MrmTests.cpp +++ b/dev/MRTCore/mrt/Core/unittests/MrmTests.cpp @@ -685,8 +685,20 @@ class BasicTest MrmFreeResource(path); VERIFY_ARE_EQUAL(MrmGetFilePathFromName(L"something.pri", &path), S_OK); - // Even if the file doesn't exist, we will still return a path. This is for those don't use PRI for resource. + // Even if the file doesn't exist, we still return a best-effort path so apps without a PRI + // file can still create a ResourceManager. The path is under the module (exe) directory. VERIFY_IS_NOT_NULL(wcsstr(path, L"something.pri")); + { + wchar_t moduleFilePath[MAX_PATH]; + VERIFY_ARE_NOT_EQUAL(0u, GetModuleFileNameW(nullptr, moduleFilePath, ARRAYSIZE(moduleFilePath))); + PWSTR lastSeparator = wcsrchr(moduleFilePath, L'\\'); + VERIFY_IS_NOT_NULL(lastSeparator); + lastSeparator[1] = L'\0'; // Trim to "\" + wchar_t expectedPath[MAX_PATH]; + VERIFY_ARE_EQUAL(0, wcscpy_s(expectedPath, ARRAYSIZE(expectedPath), moduleFilePath)); + VERIFY_ARE_EQUAL(0, wcscat_s(expectedPath, ARRAYSIZE(expectedPath), L"something.pri")); + VERIFY_ARE_EQUAL(CSTR_EQUAL, CompareStringOrdinal(path, -1, expectedPath, -1, TRUE)); + } MrmFreeResource(path); VERIFY_ARE_EQUAL(MrmGetFilePathFromName(nullptr, &path), S_OK); diff --git a/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/Helper.cpp b/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/Helper.cpp index c3fb916caa..ccb5f35a80 100644 --- a/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/Helper.cpp +++ b/dev/MRTCore/mrt/Microsoft.Windows.ApplicationModel.Resources/src/Helper.cpp @@ -87,16 +87,22 @@ HRESULT GetDefaultPriFile(winrt::hstring& filePath) bool isPackaged = AppModel::Identity::IsPackagedProcess(); hr = GetDefaultPriFileForCurentModule(isPackaged, filePath); - // Sparse-packaged apps have identity but deploy PRI files as loose files; fall back to unpackaged discovery which also searches for "[modulename].pri". - if (isPackaged && IsResourceNotFound(hr)) + // Sparse-packaged apps have identity but deploy PRI files as loose files; fall back to + // unpackaged discovery which also searches for "[modulename].pri". MrmGetFilePathFromName now + // returns S_OK with a best-effort (possibly non-existent) path, so gate the fallback on whether + // the packaged lookup actually resolved to an existing file rather than on IsResourceNotFound(hr). + if (isPackaged && (IsResourceNotFound(hr) || (SUCCEEDED(hr) && FAILED(CheckFile(filePath.c_str()))))) { - HRESULT hrFallback = GetDefaultPriFileForCurentModule(false, filePath); - if (SUCCEEDED(hrFallback)) + winrt::hstring fallbackPath; + HRESULT hrFallback = GetDefaultPriFileForCurentModule(false, fallbackPath); + // Only adopt the unpackaged result if it resolves to an existing file; otherwise keep the + // packaged best-effort path so ResourceManager still receives a path (and handles the + // not-found case gracefully). + if (SUCCEEDED(hrFallback) && SUCCEEDED(CheckFile(fallbackPath.c_str()))) { + filePath = fallbackPath; hr = hrFallback; } - // If the fallback also fails, preserve the original HRESULT (not the fallback's) - // for backward compatibility so callers checking for specific errors (e.g., ERROR_FILE_NOT_FOUND) are not broken. } return hr; diff --git a/test/BypassTests.json b/test/BypassTests.json index 1c24665e3b..5d1fd3838f 100644 --- a/test/BypassTests.json +++ b/test/BypassTests.json @@ -432,7 +432,6 @@ "release_x64_Win10_rs5_DC.Test::DynamicDependency::Test_WinRT::WinRT_RoGetActivationFactory_1", "release_x64_Win10_rs5_DC.Test::DynamicDependency::Test_WinRT::WinRT_RoGetActivationFactory_2", "release_x64_Win10_rs5_DC.Test::DynamicDependency::Test_WinRT::WinRT_RoGetActivationFactory_NotFound", - "release_x64_Win10_rs5_DC.UnitTest::BasicTest::GetFilePath", "release_x64_Win10_rs5_DC.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x64_Win10_rs5_DC.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x64_Win10_rs5_DC.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -563,7 +562,6 @@ "release_x64_Windows.10.Enterprise.LTSC.2021.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_mod", "release_x64_Windows.10.Enterprise.LTSC.2021.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_round", "release_x64_Windows.10.Enterprise.LTSC.2021.Test::DecimalValue::Tests::DecimalTest_WinRT::math", - "release_x64_Windows.10.Enterprise.LTSC.2021.UnitTest::BasicTest::GetFilePath", "release_x64_Windows.10.Enterprise.LTSC.2021.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x64_Windows.10.Enterprise.LTSC.2021.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x64_Windows.10.Enterprise.LTSC.2021.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -588,12 +586,10 @@ "release_x64_Windows.10.Enterprise.LTSC.2021.ManagedTest.ResourceContextTest.ResourceEnumWithContextTest", "release_x64_Windows.10.Enterprise.LTSC.2021.ManagedTest.ResourceContextTest.ResourceNotFoundWithContextTest", "release_x64_Windows.10.Enterprise.LTSC.2021.ManagedTest.ResourceContextTest.NoResourceFileWithContextTest", - "release_x64_Windows.10.Enterprise.LTSC.2021.MrtCoreUnpackagedTests.TestClass.DefaultResourceManager", "release_x64_Windows.10.Enterprise.LTSC.2021.MrtCoreUnpackagedTests.TestClass.ResourceLoader_GetDefaultResourceFilePathTest", "release_x64_Windows.11.Enterprise.24H2.Test::ApplicationData::Tests::ApplicationDataTests_Elevated::MachineFolderAndPath_Framework_Supported", "release_x64_Windows.11.Enterprise.24H2.PackagedTests#metadataSet0::VerifyBadgeNotificationManagerCurrent", "release_x64_Windows.11.Enterprise.24H2.PackagedTests#metadataSet1::VerifyBadgeNotificationManagerCurrent", - "release_x64_Windows.11.Enterprise.24H2.UnitTest::BasicTest::GetFilePath", "release_x64_Windows.11.Enterprise.24H2.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x64_Windows.11.Enterprise.24H2.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x64_Windows.11.Enterprise.24H2.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -618,12 +614,10 @@ "release_x64_Windows.11.Enterprise.24H2.ManagedTest.ResourceContextTest.ResourceEnumWithContextTest", "release_x64_Windows.11.Enterprise.24H2.ManagedTest.ResourceContextTest.ResourceNotFoundWithContextTest", "release_x64_Windows.11.Enterprise.24H2.ManagedTest.ResourceContextTest.NoResourceFileWithContextTest", - "release_x64_Windows.11.Enterprise.24H2.MrtCoreUnpackagedTests.TestClass.DefaultResourceManager", "release_x64_Windows.11.Enterprise.24H2.MrtCoreUnpackagedTests.TestClass.ResourceLoader_GetDefaultResourceFilePathTest", "release_x64_Windows.11.Enterprise.MultiSession.24h2.Test::ApplicationData::Tests::ApplicationDataTests_Elevated::MachineFolderAndPath_Framework_Supported", "release_x64_Windows.11.Enterprise.MultiSession.24h2.PackagedTests#metadataSet0::VerifyBadgeNotificationManagerCurrent", "release_x64_Windows.11.Enterprise.MultiSession.24h2.PackagedTests#metadataSet1::VerifyBadgeNotificationManagerCurrent", - "release_x64_Windows.11.Enterprise.MultiSession.24h2.UnitTest::BasicTest::GetFilePath", "release_x64_Windows.11.Enterprise.MultiSession.24h2.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x64_Windows.11.Enterprise.MultiSession.24h2.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x64_Windows.11.Enterprise.MultiSession.24h2.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -648,12 +642,10 @@ "release_x64_Windows.11.Enterprise.MultiSession.24h2.ManagedTest.ResourceContextTest.ResourceEnumWithContextTest", "release_x64_Windows.11.Enterprise.MultiSession.24h2.ManagedTest.ResourceContextTest.ResourceNotFoundWithContextTest", "release_x64_Windows.11.Enterprise.MultiSession.24h2.ManagedTest.ResourceContextTest.NoResourceFileWithContextTest", - "release_x64_Windows.11.Enterprise.MultiSession.24h2.MrtCoreUnpackagedTests.TestClass.DefaultResourceManager", "release_x64_Windows.11.Enterprise.MultiSession.24h2.MrtCoreUnpackagedTests.TestClass.ResourceLoader_GetDefaultResourceFilePathTest", "release_x64_Windows.Server.2025.DataCenter.Test::ApplicationData::Tests::ApplicationDataTests_Elevated::MachineFolderAndPath_Framework_Supported", "release_x64_Windows.Server.2025.DataCenter.PackagedTests#metadataSet0::VerifyBadgeNotificationManagerCurrent", "release_x64_Windows.Server.2025.DataCenter.PackagedTests#metadataSet1::VerifyBadgeNotificationManagerCurrent", - "release_x64_Windows.Server.2025.DataCenter.UnitTest::BasicTest::GetFilePath", "release_x64_Windows.Server.2025.DataCenter.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x64_Windows.Server.2025.DataCenter.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x64_Windows.Server.2025.DataCenter.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -678,7 +670,6 @@ "release_x64_Windows.Server.2025.DataCenter.ManagedTest.ResourceContextTest.ResourceEnumWithContextTest", "release_x64_Windows.Server.2025.DataCenter.ManagedTest.ResourceContextTest.ResourceNotFoundWithContextTest", "release_x64_Windows.Server.2025.DataCenter.ManagedTest.ResourceContextTest.NoResourceFileWithContextTest", - "release_x64_Windows.Server.2025.DataCenter.MrtCoreUnpackagedTests.TestClass.DefaultResourceManager", "release_x64_Windows.Server.2025.DataCenter.MrtCoreUnpackagedTests.TestClass.ResourceLoader_GetDefaultResourceFilePathTest", "release_x86_Windows.10.Enterprise.22h2.Test::ApplicationData::Tests::ApplicationDataTests::MachineFolderAndPath_Main_NotSupported", "release_x86_Windows.10.Enterprise.22h2.Test::ApplicationData::Tests::ApplicationDataTests::MachineFolderAndPath_Framework_NotSupported", @@ -790,7 +781,6 @@ "release_x86_Windows.10.Enterprise.22h2.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_mod", "release_x86_Windows.10.Enterprise.22h2.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_round", "release_x86_Windows.10.Enterprise.22h2.Test::DecimalValue::Tests::DecimalTest_WinRT::math", - "release_x86_Windows.10.Enterprise.22h2.UnitTest::BasicTest::GetFilePath", "release_x86_Windows.10.Enterprise.22h2.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x86_Windows.10.Enterprise.22h2.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x86_Windows.10.Enterprise.22h2.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -815,7 +805,6 @@ "release_x86_Windows.10.Enterprise.22h2.ManagedTest.ResourceContextTest.ResourceEnumWithContextTest", "release_x86_Windows.10.Enterprise.22h2.ManagedTest.ResourceContextTest.ResourceNotFoundWithContextTest", "release_x86_Windows.10.Enterprise.22h2.ManagedTest.ResourceContextTest.NoResourceFileWithContextTest", - "release_x86_Windows.10.Enterprise.22h2.MrtCoreUnpackagedTests.TestClass.DefaultResourceManager", "release_x86_Windows.10.Enterprise.22h2.MrtCoreUnpackagedTests.TestClass.ResourceLoader_GetDefaultResourceFilePathTest", "release_x86_Windows.10.Professional.22H2.Test::Decimal::Tests::DecimalTests::ctor", "release_x86_Windows.10.Professional.22H2.Test::Decimal::Tests::DecimalTests::ctor_assign_move", @@ -923,7 +912,6 @@ "release_x86_Windows.10.Professional.22H2.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_mod", "release_x86_Windows.10.Professional.22H2.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_round", "release_x86_Windows.10.Professional.22H2.Test::DecimalValue::Tests::DecimalTest_WinRT::math", - "release_x86_Windows.10.Professional.22H2.UnitTest::BasicTest::GetFilePath", "release_x86_Windows.10.Professional.22H2.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x86_Windows.10.Professional.22H2.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x86_Windows.10.Professional.22H2.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -948,7 +936,6 @@ "release_x86_Windows.10.Professional.22H2.ManagedTest.ResourceContextTest.ResourceEnumWithContextTest", "release_x86_Windows.10.Professional.22H2.ManagedTest.ResourceContextTest.ResourceNotFoundWithContextTest", "release_x86_Windows.10.Professional.22H2.ManagedTest.ResourceContextTest.NoResourceFileWithContextTest", - "release_x86_Windows.10.Professional.22H2.MrtCoreUnpackagedTests.TestClass.DefaultResourceManager", "release_x86_Windows.10.Professional.22H2.MrtCoreUnpackagedTests.TestClass.ResourceLoader_GetDefaultResourceFilePathTest", "release_x86_Windows.11.Professional.25H2.zh-CN.Test::ApplicationData::Tests::ApplicationDataTests::MachineFolderAndPath_Main_NotSupported", "release_x86_Windows.11.Professional.25H2.zh-CN.Test::ApplicationData::Tests::ApplicationDataTests::MachineFolderAndPath_Framework_NotSupported", @@ -1060,7 +1047,6 @@ "release_x86_Windows.11.Professional.25H2.zh-CN.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_mod", "release_x86_Windows.11.Professional.25H2.zh-CN.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_round", "release_x86_Windows.11.Professional.25H2.zh-CN.Test::DecimalValue::Tests::DecimalTest_WinRT::math", - "release_x86_Windows.11.Professional.25H2.zh-CN.UnitTest::BasicTest::GetFilePath", "release_x86_Windows.11.Professional.25H2.zh-CN.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x86_Windows.11.Professional.25H2.zh-CN.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x86_Windows.11.Professional.25H2.zh-CN.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -1085,7 +1071,6 @@ "release_x86_Windows.11.Professional.25H2.zh-CN.ManagedTest.ResourceContextTest.ResourceEnumWithContextTest", "release_x86_Windows.11.Professional.25H2.zh-CN.ManagedTest.ResourceContextTest.ResourceNotFoundWithContextTest", "release_x86_Windows.11.Professional.25H2.zh-CN.ManagedTest.ResourceContextTest.NoResourceFileWithContextTest", - "release_x86_Windows.11.Professional.25H2.zh-CN.MrtCoreUnpackagedTests.TestClass.DefaultResourceManager", "release_x86_Windows.11.Professional.25H2.zh-CN.MrtCoreUnpackagedTests.TestClass.ResourceLoader_GetDefaultResourceFilePathTest", "release_x86_Windows.11.Professional.25H2.zh-CN.PackagedTests#metadataSet0::VerifyBadgeNotificationManagerCurrent", "release_x86_Windows.11.Professional.25H2.zh-CN.PackagedTests#metadataSet1::VerifyBadgeNotificationManagerCurrent", @@ -1195,7 +1180,6 @@ "release_x86_Windows.Server.2019.DataCenter.zh-CN.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_mod", "release_x86_Windows.Server.2019.DataCenter.zh-CN.Test::DecimalValue::Tests::DecimalTest_WinRT::operator_round", "release_x86_Windows.Server.2019.DataCenter.zh-CN.Test::DecimalValue::Tests::DecimalTest_WinRT::math", - "release_x86_Windows.Server.2019.DataCenter.zh-CN.UnitTest::BasicTest::GetFilePath", "release_x86_Windows.Server.2019.DataCenter.zh-CN.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x86_Windows.Server.2019.DataCenter.zh-CN.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x86_Windows.Server.2019.DataCenter.zh-CN.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -1665,7 +1649,6 @@ "release_x64_Windows11.Enterprise.25h2.Test::ApplicationData::Tests::ApplicationDataTests_Elevated::MachineFolderAndPath_Framework_Supported", "release_x64_Windows11.Enterprise.25h2.PackagedTests#metadataSet0::VerifyBadgeNotificationManagerCurrent", "release_x64_Windows11.Enterprise.25h2.PackagedTests#metadataSet1::VerifyBadgeNotificationManagerCurrent", - "release_x64_Windows11.Enterprise.25h2.UnitTest::BasicTest::GetFilePath", "release_x64_Windows11.Enterprise.25h2.ManagedTest.ResourceLoaderTest.GetStringTest", "release_x64_Windows11.Enterprise.25h2.ManagedTest.ResourceLoaderTest.GetStringTest_NonDefaultNamespace", "release_x64_Windows11.Enterprise.25h2.ManagedTest.ResourceLoaderTest.GetStringForUriTest", @@ -1690,7 +1673,6 @@ "release_x64_Windows11.Enterprise.25h2.ManagedTest.ResourceContextTest.ResourceEnumWithContextTest", "release_x64_Windows11.Enterprise.25h2.ManagedTest.ResourceContextTest.ResourceNotFoundWithContextTest", "release_x64_Windows11.Enterprise.25h2.ManagedTest.ResourceContextTest.NoResourceFileWithContextTest", - "release_x64_Windows11.Enterprise.25h2.MrtCoreUnpackagedTests.TestClass.DefaultResourceManager", "release_x64_Windows11.Enterprise.25h2.MrtCoreUnpackagedTests.TestClass.ResourceLoader_GetDefaultResourceFilePathTest", "release_x64_Windows11.Enterprise.25h2.Test::ABForward::FunctionalTests::ApplicationData", "release_x64_Windows11.Enterprise.25h2.Test::ABForward::FunctionalTests::AppNotificationsManager",