diff --git a/Build/Microsoft.Xbox.Services.142.GDK.C/Microsoft.Xbox.Services.142.GDK.C.vcxproj b/Build/Microsoft.Xbox.Services.142.GDK.C/Microsoft.Xbox.Services.142.GDK.C.vcxproj index 6da46426..1e3c666f 100644 --- a/Build/Microsoft.Xbox.Services.142.GDK.C/Microsoft.Xbox.Services.142.GDK.C.vcxproj +++ b/Build/Microsoft.Xbox.Services.142.GDK.C/Microsoft.Xbox.Services.142.GDK.C.vcxproj @@ -41,7 +41,6 @@ - /permissive- /Zc:twoPhase- %(AdditionalOptions) Use Level4 true @@ -50,7 +49,7 @@ pch.h false false - /permissive- /Zc:twoPhase- %(AdditionalOptions) + /permissive- /Zc:twoPhase- /ZH:SHA_256 %(AdditionalOptions) Fast false ProgramDatabase @@ -326,4 +325,4 @@ - + \ No newline at end of file diff --git a/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestAll.runsettings b/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestAll.runsettings index 01b6652f..c02c6e31 100644 --- a/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestAll.runsettings +++ b/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestAll.runsettings @@ -2,5 +2,6 @@ x64 + 1 \ No newline at end of file diff --git a/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestCodeCoverage.runsettings b/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestCodeCoverage.runsettings index c3e46ad0..51b2aed5 100644 --- a/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestCodeCoverage.runsettings +++ b/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestCodeCoverage.runsettings @@ -2,6 +2,7 @@ x64 + 1 diff --git a/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestMultiplayerManager.runsettings b/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestMultiplayerManager.runsettings index bc543943..dc904e4c 100644 --- a/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestMultiplayerManager.runsettings +++ b/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestMultiplayerManager.runsettings @@ -1,7 +1,8 @@ - x86 + x64 + 1 diff --git a/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestSocialManager.runsettings b/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestSocialManager.runsettings index cff08bea..2f4b71f6 100644 --- a/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestSocialManager.runsettings +++ b/Build/Microsoft.Xbox.Services.UnitTest.141.TE/TestSocialManager.runsettings @@ -1,7 +1,8 @@ - x86 + x64 + 1 diff --git a/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestAll.runsettings b/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestAll.runsettings index 01b6652f..c02c6e31 100644 --- a/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestAll.runsettings +++ b/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestAll.runsettings @@ -2,5 +2,6 @@ x64 + 1 \ No newline at end of file diff --git a/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestCodeCoverage.runsettings b/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestCodeCoverage.runsettings index 48c46da0..9ef454a9 100644 --- a/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestCodeCoverage.runsettings +++ b/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestCodeCoverage.runsettings @@ -2,6 +2,7 @@ x64 + 1 diff --git a/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestMultiplayerManager.runsettings b/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestMultiplayerManager.runsettings index bc543943..dc904e4c 100644 --- a/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestMultiplayerManager.runsettings +++ b/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestMultiplayerManager.runsettings @@ -1,7 +1,8 @@ - x86 + x64 + 1 diff --git a/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestSocialManager.runsettings b/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestSocialManager.runsettings index cff08bea..2f4b71f6 100644 --- a/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestSocialManager.runsettings +++ b/Build/Microsoft.Xbox.Services.UnitTest.142.TE/TestSocialManager.runsettings @@ -1,7 +1,8 @@ - x86 + x64 + 1 diff --git a/External/Xal/External/libHttpClient b/External/Xal/External/libHttpClient index 312552b1..91cda2ef 160000 --- a/External/Xal/External/libHttpClient +++ b/External/Xal/External/libHttpClient @@ -1 +1 @@ -Subproject commit 312552b182c99b05a81630fb19c71671830ebab6 +Subproject commit 91cda2eff5504cb1fa131c41ff9796a073e640b5 diff --git a/External/Xal/Source/Xal/Include/Xal/xal_internal_telemetry.h b/External/Xal/Source/Xal/Include/Xal/xal_internal_telemetry.h index 13ab3774..9a2c4218 100644 --- a/External/Xal/Source/Xal/Include/Xal/xal_internal_telemetry.h +++ b/External/Xal/Source/Xal/Include/Xal/xal_internal_telemetry.h @@ -20,43 +20,31 @@ extern "C" /// Controls if the event is to be uploaded immediately or can be batched. /// /// -/// This is a copy of cll::Latency and should be kept in sync with it. +/// This is a copy of MAE::EventLatency and should be kept in sync with it. /// typedef enum XalTelemetryLatency { - XalTelemetryLatency_Unspecified = 0, + XalTelemetryLatency_Unspecified = -1, + XalTelemetryLatency_Off = 0, XalTelemetryLatency_Normal = 0x0100, - XalTelemetryLatency_Realtime = 0x0200, + XalTelemetryLatency_CostDeferred = 0x0200, + XalTelemetryLatency_Realtime = 0x0300, + XalTelemetryLatency_Max = 0x0400, } XalTelemetryLatency; /// -/// Controls the priority of keeping the event in case cll needs to evict some. +/// Controls the priority of keeping the event in case 1DS needs to evict some. /// /// -/// This is a copy of cll::Persistence and should be kept in sync with it. +/// This is a copy of MAE::EventPersistence and should be kept in sync with it. /// typedef enum XalTelemetryPersistence { - XalTelemetryPersistence_Unspecified = 0, - XalTelemetryPersistence_Normal = 0x01, - XalTelemetryPersistence_Critical = 0x02, + XalTelemetryPersistence_Normal = 0x00, + XalTelemetryPersistence_Critical = 0x01, + XalTelemetryPersistence_DoNotStoreOnDisk = 0x02, } XalTelemetryPersistence; -/// -/// Controls the sensitivity of the event. -/// -/// -/// This is a copy of cll::Sensitivity and should be kept in sync with it. -/// -typedef enum XalTelemetrySensitivity -{ - XalTelemetrySensitivityUnspecified = 0x000001, - XalTelemetrySensitivity_None = 0x000000, - XalTelemetrySensitivity_Mark = 0x080000, - XalTelemetrySensitivity_Hash = 0x100000, - XalTelemetrySensitivity_Drop = 0x200000, -} XalTelemetrySensitivity; - /// /// Controls the sampling rate of the event. /// @@ -112,10 +100,9 @@ typedef struct XalTelemetryTicket /// be properly formatted JSON. /// The number of tickets to send with the event. /// Information about the tickets to send. -/// The cll latency for this event. -/// The cll persistence for this event. -/// The cll sensitivity for this event. -/// The cll sampleRate for this event. +/// The 1DS latency for this event. +/// The 1DS persistence for this event. +/// The 1DS sampleRate for this event. STDAPI XalTelemetryWriteEvent( _In_ XalUserHandle user, _In_z_ char const* iKey, @@ -125,7 +112,6 @@ STDAPI XalTelemetryWriteEvent( _In_reads_(ticketCount) XalTelemetryTicket* tickets, _In_ XalTelemetryLatency latency, _In_ XalTelemetryPersistence persistence, - _In_ XalTelemetrySensitivity sensitivity, _In_ XalTelemetrySampleRate sampleRate ) noexcept; diff --git a/External/Xal/Source/Xal/Include/Xal/xal_platform.h b/External/Xal/Source/Xal/Include/Xal/xal_platform.h index 60609858..ca925a09 100644 --- a/External/Xal/Source/Xal/Include/Xal/xal_platform.h +++ b/External/Xal/Source/Xal/Include/Xal/xal_platform.h @@ -81,6 +81,15 @@ STDAPI XalPlatformWebSetEventHandler( _In_ XalPlatformWebShowUrlEventHandler2* handler ) noexcept; +/// +/// Clears the show url event handler. +/// +/// Result code for this API operation. +/// +/// Must be called before XalInitialize or after XalCleanupAsync completes. +/// +STDAPI XalPlatformWebClearEventHandler() noexcept; + /// /// Completes a show url operation. /// @@ -119,6 +128,15 @@ STDAPI XalPlatformStorageSetEventHandlers( _In_ XalPlatformStorageEventHandlers2* handlers ) noexcept; +/// +/// Clears the storage event handlers. +/// +/// Result code for this API operation. +/// +/// Must be called before XalInitialize or after XalCleanupAsync completes. +/// +STDAPI XalPlatformStorageClearEventHandlers() noexcept; + /// /// Completes write to storage operation. /// @@ -193,6 +211,15 @@ STDAPI XalPlatformRemoteConnectSetEventHandlers( _In_ XalPlatformRemoteConnectEventHandlers2* handlers ) noexcept; +/// +/// Clears the remote connect event handlers. +/// +/// Result code for this API operation. +/// +/// Must be called before XalInitialize or after XalCleanupAsync completes. +/// +STDAPI XalPlatformRemoteConnectClearEventHandlers() noexcept; + /// /// Signal to Xal that the remote connect prompt has been dismissed by the user. /// diff --git a/External/Xal/Source/Xal/Include/Xal/xal_types.h b/External/Xal/Source/Xal/Include/Xal/xal_types.h index d457a37b..c409e132 100644 --- a/External/Xal/Source/Xal/Include/Xal/xal_types.h +++ b/External/Xal/Source/Xal/Include/Xal/xal_types.h @@ -64,6 +64,10 @@ extern "C" #define E_XAL_FAILEDTORESOLVE MAKE_E_HC(0x5112L) // 0x89235112 #define E_XAL_NOACCOUNTPROVIDER MAKE_E_HC(0x5113L) // 0x89235113 #define E_XAL_MISMATCHEDTITLEANDCLIENTIDS MAKE_E_HC(0x5114L) // 0x89235114 +#define E_XAL_INVALIDAPPCONFIGURATION MAKE_E_HC(0x5115L) // 0x89235115 +#define E_XAL_MALFORMEDCLIENTID MAKE_E_HC(0x5116L) // 0x89235116 +#define E_XAL_MISSINGCLIENTID MAKE_E_HC(0x5117L) // 0x89235117 +#define E_XAL_MISSINGTITLEID MAKE_E_HC(0x5118L) // 0x89235118 // E_XAL_INTERNAL_* values should never be returned to callers of XAL. #define E_XAL_INTERNAL_SWITCHUSER MAKE_E_HC(0x5171L) // 0x89235171 @@ -84,15 +88,25 @@ extern "C" #undef E_XAL_NOTOKENREQUIRED #undef E_XAL_NODEFAULTUSER #undef E_XAL_FAILEDTORESOLVE - -#define E_XAL_USERSETFULL E_GAMEUSER_MAX_USERS_ADDED // 0x89245100 -#define E_XAL_USERSIGNEDOUT E_GAMEUSER_SIGNED_OUT // 0x89245101 -#define E_XAL_UIREQUIRED E_GAMEUSER_RESOLVE_USER_ISSUE_REQUIRED // 0x89245102 -#define E_XAL_DEFERRALNOTAVAILABLE E_GAMEUSER_DEFERRAL_NOT_AVAILABLE // 0x89245103 -#define E_XAL_USERNOTFOUND E_GAMEUSER_USER_NOT_FOUND // 0x89245104 -#define E_XAL_NOTOKENREQUIRED E_GAMEUSER_NO_TOKEN_REQUIRED // 0x89245105 -#define E_XAL_NODEFAULTUSER E_GAMEUSER_NO_DEFAULT_USER // 0x89245106 -#define E_XAL_FAILEDTORESOLVE E_GAMEUSER_FAILED_TO_RESOLVE // 0x89245107 +#undef E_XAL_MISMATCHEDTITLEANDCLIENTIDS +#undef E_XAL_INVALIDAPPCONFIGURATION +#undef E_XAL_MALFORMEDCLIENTID +#undef E_XAL_MISSINGCLIENTID +#undef E_XAL_MISSINGTITLEID + +#define E_XAL_USERSETFULL E_GAMEUSER_MAX_USERS_ADDED // 0x89245100 +#define E_XAL_USERSIGNEDOUT E_GAMEUSER_SIGNED_OUT // 0x89245101 +#define E_XAL_UIREQUIRED E_GAMEUSER_RESOLVE_USER_ISSUE_REQUIRED // 0x89245102 +#define E_XAL_DEFERRALNOTAVAILABLE E_GAMEUSER_DEFERRAL_NOT_AVAILABLE // 0x89245103 +#define E_XAL_USERNOTFOUND E_GAMEUSER_USER_NOT_FOUND // 0x89245104 +#define E_XAL_NOTOKENREQUIRED E_GAMEUSER_NO_TOKEN_REQUIRED // 0x89245105 +#define E_XAL_NODEFAULTUSER E_GAMEUSER_NO_DEFAULT_USER // 0x89245106 +#define E_XAL_FAILEDTORESOLVE E_GAMEUSER_FAILED_TO_RESOLVE // 0x89245107 +#define E_XAL_MISSINGTITLEID E_GAMEUSER_NO_TITLE_ID // 0x89245108 +#define E_XAL_INVALIDAPPCONFIGURATION E_GAMEUSER_INVALID_APP_CONFIGURATION // 0x89245112 +#define E_XAL_MALFORMEDCLIENTID E_GAMEUSER_MALFORMED_MSAAPPID // 0x89245113 +#define E_XAL_MISMATCHEDTITLEANDCLIENTIDS E_GAMEUSER_INCONSISTENT_MSAAPPID_AND_TITLEID // 0x89245114 +#define E_XAL_MISSINGCLIENTID E_GAMEUSER_NO_MSAAPPID // 0x89245115 #endif //------------------------------------------------------------------------------ @@ -154,7 +168,9 @@ typedef enum XalPrivilege XalPrivilege_SocialNetworkSharing = 220, /// Access user generated content in game XalPrivilege_Ugc = 247, - /// Use real time voice and text communication + /// Use real time voice and text communication with users in their friends list + XalPrivilege_CommsFriendsOnly = 251, + /// Use real time voice and text communication with all users XalPrivilege_Comms = 252, /// Join multiplayer sessions XalPrivilege_Multiplayer = 254, diff --git a/Include/xsapi-c/multiplayer_manager_c.h b/Include/xsapi-c/multiplayer_manager_c.h index b19ab9dc..fbf33938 100644 --- a/Include/xsapi-c/multiplayer_manager_c.h +++ b/Include/xsapi-c/multiplayer_manager_c.h @@ -280,6 +280,11 @@ enum class XblMultiplayerEventType : uint32_t /// /// Indicates that the invite API operation has been completed. /// + /// + /// On Xbox, receiving this event does not necessarily mean an invite has been sent successfully. + /// You will receive this event as long as the game invite UI flow was successfully invoked, + /// even if the user cancelled the UI flow without sending an invite, or the invite failed to submit to the service for various reasons. + /// InviteSent, /// diff --git a/Source/Services/Achievements/Manager/achievements_manager_api.cpp b/Source/Services/Achievements/Manager/achievements_manager_api.cpp index a0fba776..02915537 100644 --- a/Source/Services/Achievements/Manager/achievements_manager_api.cpp +++ b/Source/Services/Achievements/Manager/achievements_manager_api.cpp @@ -131,6 +131,7 @@ STDAPI XblAchievementsManagerDoWork( _Outptr_result_maybenull_ const XblAchievementsManagerEvent** achievementsEvents, _Out_ size_t* achievementsEventsCount ) XBL_NOEXCEPT +try { INIT_OUT_PTR_PARAM(achievementsEvents); @@ -149,12 +150,14 @@ STDAPI XblAchievementsManagerDoWork( } ); } +CATCH_RETURN() STDAPI XblAchievementsManagerGetAchievement( _In_ uint64_t xboxUserId, _In_ const char* achievementId, _Outptr_result_maybenull_ XblAchievementsManagerResultHandle* achievementResult ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(achievementId == nullptr || achievementResult == nullptr); RETURN_HR_INVALIDARGUMENT_IF_EMPTY_STRING(achievementId); @@ -176,6 +179,7 @@ STDAPI XblAchievementsManagerGetAchievement( } ); } +CATCH_RETURN() STDAPI XblAchievementsManagerGetAchievements( _In_ uint64_t xboxUserId, @@ -183,6 +187,7 @@ STDAPI XblAchievementsManagerGetAchievements( _In_ XblAchievementsManagerSortOrder sortOrder, _Outptr_result_maybenull_ XblAchievementsManagerResultHandle* achievementsResult ) XBL_NOEXCEPT +try { INIT_OUT_PTR_PARAM(achievementsResult); @@ -229,6 +234,7 @@ STDAPI XblAchievementsManagerGetAchievements( } ); } +CATCH_RETURN() STDAPI XblAchievementsManagerGetAchievementsByState( _In_ uint64_t xboxUserId, @@ -237,6 +243,7 @@ STDAPI XblAchievementsManagerGetAchievementsByState( _In_ XblAchievementProgressState achievementState, _Outptr_result_maybenull_ XblAchievementsManagerResultHandle* achievementsResult ) XBL_NOEXCEPT +try { INIT_OUT_PTR_PARAM(achievementsResult); @@ -291,12 +298,14 @@ STDAPI XblAchievementsManagerGetAchievementsByState( } ); } +CATCH_RETURN() STDAPI XblAchievementsManagerUpdateAchievement( _In_ uint64_t xboxUserId, _In_ const char* achievementId, _In_ uint8_t currentProgress ) XBL_NOEXCEPT +try { return ApiImpl([&](AchievementsManager& achievementsManager) { @@ -314,4 +323,5 @@ STDAPI XblAchievementsManagerUpdateAchievement( return S_OK; } ); -} \ No newline at end of file +} +CATCH_RETURN() diff --git a/Source/Services/Achievements/achievements_api.cpp b/Source/Services/Achievements/achievements_api.cpp index 090ec3ed..2731a59e 100644 --- a/Source/Services/Achievements/achievements_api.cpp +++ b/Source/Services/Achievements/achievements_api.cpp @@ -186,9 +186,11 @@ STDAPI XblAchievementsResultGetNextResult( _In_ XAsyncBlock* async, _Out_ XblAchievementsResultHandle* result ) XBL_NOEXCEPT +try { return XAsyncGetResult(async, nullptr, sizeof(XblAchievementsResultHandle), result, nullptr); } +CATCH_RETURN() STDAPI XblAchievementsUpdateAchievementAsyncInternal( _In_ XblContextHandle xboxLiveContextHandle, diff --git a/Source/Services/Common/xbox_live_context_api.cpp b/Source/Services/Common/xbox_live_context_api.cpp index 944a473f..aa5aec6a 100644 --- a/Source/Services/Common/xbox_live_context_api.cpp +++ b/Source/Services/Common/xbox_live_context_api.cpp @@ -88,6 +88,7 @@ CATCH_RETURN() void XblSetApiType( _In_ XblApiType apiType ) XBL_NOEXCEPT +try { auto state = GlobalState::Get(); if (state) @@ -95,3 +96,4 @@ void XblSetApiType( state->ApiType = apiType; } } +CATCH_RETURN_WITH(;) \ No newline at end of file diff --git a/Source/Services/Common/xbox_live_context_settings.cpp b/Source/Services/Common/xbox_live_context_settings.cpp index e8c695b7..24da48d2 100644 --- a/Source/Services/Common/xbox_live_context_settings.cpp +++ b/Source/Services/Common/xbox_live_context_settings.cpp @@ -95,21 +95,25 @@ STDAPI XblContextSettingsGetLongHttpTimeout( _In_ XblContextHandle context, _Out_ uint32_t* timeoutInSeconds ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(context == nullptr || timeoutInSeconds == nullptr); *timeoutInSeconds = context->Settings()->LongHttpTimeout(); return S_OK; } +CATCH_RETURN() STDAPI XblContextSettingsSetLongHttpTimeout( _In_ XblContextHandle context, _In_ uint32_t timeoutInSeconds ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(context == nullptr); context->Settings()->SetLongHttpTimeout(timeoutInSeconds); return S_OK; } +CATCH_RETURN() STDAPI XblContextSettingsGetHttpRetryDelay( _In_ XblContextHandle context, @@ -188,39 +192,47 @@ STDAPI XblContextSettingsGetUseCoreDispatcherForEventRouting( _In_ XblContextHandle context, _Out_ bool* useDispatcher ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(context == nullptr || useDispatcher == nullptr); *useDispatcher = context->Settings()->UseCoreDispatcherForEventRouting(); return S_OK; } +CATCH_RETURN() STDAPI XblContextSettingsSetUseCoreDispatcherForEventRouting( _In_ XblContextHandle context, _In_ bool useDispatcher ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(context == nullptr); context->Settings()->SetUseCoreDispatcherForEventRouting(useDispatcher); return S_OK; } +CATCH_RETURN() #endif STDAPI XblContextSettingsGetUseCrossPlatformQosServers( _In_ XblContextHandle context, _Out_ bool* value ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(context == nullptr || value == nullptr); *value = context->Settings()->UseCrossplatformQosServers(); return S_OK; } +CATCH_RETURN() STDAPI XblContextSettingsSetUseCrossPlatformQosServers( _In_ XblContextHandle context, _In_ bool value ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(context); context->Settings()->SetUseCrossplatformQosServers(value); return S_OK; -} \ No newline at end of file +} +CATCH_RETURN() diff --git a/Source/Services/Common/xbox_live_global_api.cpp b/Source/Services/Common/xbox_live_global_api.cpp index 36064adc..b1e48651 100644 --- a/Source/Services/Common/xbox_live_global_api.cpp +++ b/Source/Services/Common/xbox_live_global_api.cpp @@ -15,6 +15,7 @@ STDAPI XblMemSetFunctions( _In_opt_ XblMemAllocFunction memAllocFunc, _In_opt_ XblMemFreeFunction memFreeFunc ) XBL_NOEXCEPT +try { if (GlobalState::Get()) { @@ -47,11 +48,13 @@ STDAPI XblMemSetFunctions( return S_OK; } +CATCH_RETURN() STDAPI XblMemGetFunctions( _Out_ XblMemAllocFunction* memAllocFunc, _Out_ XblMemFreeFunction* memFreeFunc ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(memAllocFunc == nullptr || memFreeFunc == nullptr); @@ -59,6 +62,7 @@ STDAPI XblMemGetFunctions( *memFreeFunc = g_pMemFreeHook; return S_OK; } +CATCH_RETURN() STDAPI XblInitialize( _In_ const XblInitArgs* args @@ -112,16 +116,17 @@ CATCH_RETURN(); STDAPI_(XblErrorCondition) XblGetErrorCondition( - _In_ HRESULT hr + _In_ HRESULT inHr ) XBL_NOEXCEPT +try { - if (SUCCEEDED(hr)) + if (SUCCEEDED(inHr)) { return XblErrorCondition::NoError; } - else if (HRESULT_FACILITY(hr) == FACILITY_HTTP) + else if (HRESULT_FACILITY(inHr) == FACILITY_HTTP) { - switch (hr) + switch (inHr) { case HTTP_E_STATUS_NOT_MODIFIED: return XblErrorCondition::Http304NotModified; @@ -139,18 +144,18 @@ XblGetErrorCondition( return XblErrorCondition::HttpGeneric; } } - else if (HRESULT_FACILITY(hr) == FACILITY_INTERNET) + else if (HRESULT_FACILITY(inHr) == FACILITY_INTERNET) { return XblErrorCondition::Network; } - else if ((hr >= (unsigned)xbl_error_code::AM_E_XASD_UNEXPECTED && hr <= (unsigned)xbl_error_code::AM_E_XTITLE_TIMEOUT) || - (hr >= (unsigned)xbl_error_code::XO_E_DEVMODE_NOT_AUTHORIZED && hr <= (unsigned)xbl_error_code::XO_E_CONTENT_NOT_AUTHORIZED)) + else if ((inHr >= (unsigned)xbl_error_code::AM_E_XASD_UNEXPECTED && inHr <= (unsigned)xbl_error_code::AM_E_XTITLE_TIMEOUT) || + (inHr >= (unsigned)xbl_error_code::XO_E_DEVMODE_NOT_AUTHORIZED && inHr <= (unsigned)xbl_error_code::XO_E_CONTENT_NOT_AUTHORIZED)) { return XblErrorCondition::Auth; } else { - switch (hr) + switch (inHr) { case ONL_E_ACTION_REQUIRED: case E_XBL_AUTH_UNKNOWN_ERROR: @@ -166,6 +171,7 @@ XblGetErrorCondition( } } } +CATCH_RETURN_WITH(XblErrorCondition::GenericError) STDAPI_(void) XblDisableAssertsForXboxLiveThrottlingInDevSandboxes( _In_ XblConfigSetting setting @@ -215,6 +221,7 @@ STDAPI_(XblFunctionContext) XblAddServiceCallRoutedHandler( _In_ XblCallRoutedHandler handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { auto state{ GlobalState::Get() }; if (state && handler) @@ -226,10 +233,12 @@ STDAPI_(XblFunctionContext) XblAddServiceCallRoutedHandler( return XblFunctionContext{ 0 }; } } +CATCH_RETURN() STDAPI_(void) XblRemoveServiceCallRoutedHandler( _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { auto state{ GlobalState::Get() }; if (state) @@ -237,4 +246,5 @@ STDAPI_(void) XblRemoveServiceCallRoutedHandler( state->RemoveServiceCallRoutedHandler(token); } } +CATCH_RETURN_WITH(;) diff --git a/Source/Services/Events/events_service_api.cpp b/Source/Services/Events/events_service_api.cpp index 0919dd80..2adf4c03 100644 --- a/Source/Services/Events/events_service_api.cpp +++ b/Source/Services/Events/events_service_api.cpp @@ -13,27 +13,33 @@ STDAPI XblEventsWriteInGameEvent( _In_opt_z_ const char* dimensions, _In_opt_z_ const char* measurements ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xboxLiveContext == nullptr || eventName == nullptr); VERIFY_XBL_INITIALIZED(); return xboxLiveContext->EventsService()->WriteInGameEvent(eventName, dimensions, measurements); } +CATCH_RETURN() #if XSAPI_INTERNAL_EVENTS_SERVICE STDAPI XblEventsSetStorageAllotment( uint64_t storageAllotmentInBytes ) XBL_NOEXCEPT +try { return events::EventQueue::SetStorageAllotment(storageAllotmentInBytes); } +CATCH_RETURN() STDAPI XblEventsSetMaxFileSize( uint64_t maxFileSizeInByes ) XBL_NOEXCEPT +try { return events::EventQueue::SetMaxFileSize(maxFileSizeInByes); } +CATCH_RETURN() #endif // !XSAPI_ETW_EVENTS_SERVICE \ No newline at end of file diff --git a/Source/Services/Leaderboard/leaderboard_service.cpp b/Source/Services/Leaderboard/leaderboard_service.cpp index 4f7f84f3..a816b6fb 100644 --- a/Source/Services/Leaderboard/leaderboard_service.cpp +++ b/Source/Services/Leaderboard/leaderboard_service.cpp @@ -430,6 +430,7 @@ STDAPI XblLeaderboardGetLeaderboardAsync( _In_ XblLeaderboardQuery leaderboardQuery, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { VERIFY_XBL_INITIALIZED(); RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); @@ -533,14 +534,17 @@ STDAPI XblLeaderboardGetLeaderboardAsync( ); } } +CATCH_RETURN() STDAPI XblLeaderboardGetLeaderboardResultSize( _In_ XAsyncBlock* async, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(async, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblLeaderboardGetLeaderboardResult( _In_ XAsyncBlock* async, @@ -549,6 +553,7 @@ STDAPI XblLeaderboardGetLeaderboardResult( _Outptr_ XblLeaderboardResult** ptrToBuffer, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(ptrToBuffer); auto hr = XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed); @@ -558,6 +563,7 @@ STDAPI XblLeaderboardGetLeaderboardResult( } return hr; } +CATCH_RETURN() STDAPI XblLeaderboardResultGetNextAsync( _In_ XblContextHandle xboxLiveContext, @@ -565,6 +571,7 @@ STDAPI XblLeaderboardResultGetNextAsync( _In_ uint32_t maxItems, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); RETURN_HR_IF(leaderboardResult->nextQuery.continuationToken == nullptr, E_BOUNDS); @@ -576,14 +583,17 @@ STDAPI XblLeaderboardResultGetNextAsync( async ); } +CATCH_RETURN() STDAPI XblLeaderboardResultGetNextResultSize( _In_ XAsyncBlock* async, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(async, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblLeaderboardResultGetNextResult( _In_ XAsyncBlock* async, @@ -592,6 +602,7 @@ STDAPI XblLeaderboardResultGetNextResult( _Outptr_ XblLeaderboardResult** ptrToBuffer, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(ptrToBuffer); VERIFY_XBL_INITIALIZED(); @@ -603,3 +614,4 @@ STDAPI XblLeaderboardResultGetNextResult( } return hr; } +CATCH_RETURN() diff --git a/Source/Services/Matchmaking/matchmaking_service.cpp b/Source/Services/Matchmaking/matchmaking_service.cpp index 5b7284ab..5a09dd83 100644 --- a/Source/Services/Matchmaking/matchmaking_service.cpp +++ b/Source/Services/Matchmaking/matchmaking_service.cpp @@ -581,6 +581,7 @@ STDAPI XblMatchmakingCreateMatchTicketAsync( _In_ const char* ticketAttributesJson, _In_ XAsyncBlock* asyncBlock ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); RETURN_HR_INVALIDARGUMENT_IF_NULL(matchmakingServiceConfigurationId); @@ -598,6 +599,7 @@ STDAPI XblMatchmakingCreateMatchTicketAsync( JsonDocument().Parse(ticketAttributesJson), asyncBlock); } +CATCH_RETURN() /// /// Get the result for an XblMatchmakingCreateMatchTicketAsync call. @@ -611,10 +613,12 @@ STDAPI XblMatchmakingCreateMatchTicketResult( _In_ XAsyncBlock* asyncBlock, _Out_ XblCreateMatchTicketResponse* resultPtr ) XBL_NOEXCEPT +try { auto hr = XAsyncGetResult(asyncBlock, nullptr, sizeof(XblCreateMatchTicketResponse), resultPtr, nullptr); return hr; } +CATCH_RETURN() /// /// Deletes a the match ticket on the server. @@ -633,6 +637,7 @@ STDAPI XblMatchmakingDeleteMatchTicketAsync( _In_ const char* ticketId, _In_ XAsyncBlock* asyncBlock ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); RETURN_HR_INVALIDARGUMENT_IF_NULL(serviceConfiguration); @@ -647,6 +652,7 @@ STDAPI XblMatchmakingDeleteMatchTicketAsync( ticketId, asyncBlock); } +CATCH_RETURN() /// /// Retrieves the properties of a match ticket from the server. @@ -667,6 +673,7 @@ STDAPI XblMatchmakingGetMatchTicketDetailsAsync( _In_ const char* ticketId, _In_ XAsyncBlock* asyncBlock ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); RETURN_HR_INVALIDARGUMENT_IF_NULL(serviceConfiguration); @@ -682,6 +689,7 @@ STDAPI XblMatchmakingGetMatchTicketDetailsAsync( asyncBlock); } +CATCH_RETURN() /// /// Get the result size for an XblMatchmakingGetMatchTicketDetailsAsync call. @@ -692,9 +700,11 @@ STDAPI XblMatchmakingGetMatchTicketDetailsResultSize( _In_ XAsyncBlock* asyncBlock, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(asyncBlock, resultSizeInBytes); } +CATCH_RETURN() /// /// Get the result for an XblMatchmakingGetMatchTicketDetailsAsync call. @@ -711,6 +721,7 @@ STDAPI XblMatchmakingGetMatchTicketDetailsResult( _Outptr_ XblMatchTicketDetailsResponse** ptrToBuffer, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(ptrToBuffer); auto hr = XAsyncGetResult(asyncBlock, nullptr, bufferSize, buffer, bufferUsed); @@ -720,6 +731,7 @@ STDAPI XblMatchmakingGetMatchTicketDetailsResult( } return hr; } +CATCH_RETURN() /// /// Gets statistics about a hopper such as how many players are in it. @@ -737,6 +749,7 @@ STDAPI XblMatchmakingGetHopperStatisticsAsync( _In_ const char* hopperName, _In_ XAsyncBlock* asyncBlock ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); RETURN_HR_INVALIDARGUMENT_IF_NULL(serviceConfiguration); @@ -750,6 +763,7 @@ STDAPI XblMatchmakingGetHopperStatisticsAsync( asyncBlock ); } +CATCH_RETURN() /// /// Get the result size for an XblMatchmakingGetHopperStatisticsAsync call. @@ -760,9 +774,11 @@ STDAPI XblMatchmakingGetHopperStatisticsResultSize( _In_ XAsyncBlock* asyncBlock, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(asyncBlock, resultSizeInBytes); } +CATCH_RETURN() /// /// Get the result for an XblMatchmakingGetHopperStatisticsAsync call. @@ -779,6 +795,7 @@ STDAPI XblMatchmakingGetHopperStatisticsResult( _Outptr_ XblHopperStatisticsResponse** ptrToBuffer, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(ptrToBuffer); auto hr = XAsyncGetResult(asyncBlock, nullptr, bufferSize, buffer, bufferUsed); @@ -788,3 +805,4 @@ STDAPI XblMatchmakingGetHopperStatisticsResult( } return hr; } +CATCH_RETURN() diff --git a/Source/Services/Multiplayer/Manager/multiplayer_event_args.cpp b/Source/Services/Multiplayer/Manager/multiplayer_event_args.cpp index 20d51d72..68bc7ae0 100644 --- a/Source/Services/Multiplayer/Manager/multiplayer_event_args.cpp +++ b/Source/Services/Multiplayer/Manager/multiplayer_event_args.cpp @@ -12,6 +12,7 @@ STDAPI XblMultiplayerEventArgsXuid( _In_ XblMultiplayerEventArgsHandle argsHandle, _Out_ uint64_t* xuid ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(argsHandle == nullptr || xuid == nullptr); VERIFY_XBL_INITIALIZED(); @@ -38,11 +39,13 @@ STDAPI XblMultiplayerEventArgsXuid( } return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerEventArgsMembersCount( _In_ XblMultiplayerEventArgsHandle argsHandle, _Out_ size_t* memberCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(argsHandle == nullptr || memberCount == nullptr); @@ -63,12 +66,14 @@ STDAPI XblMultiplayerEventArgsMembersCount( } return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerEventArgsMembers( _In_ XblMultiplayerEventArgsHandle argsHandle, _In_ size_t membersCount, _Out_writes_(membersCount) XblMultiplayerManagerMember* members ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(argsHandle == nullptr || members == nullptr); @@ -96,11 +101,13 @@ STDAPI XblMultiplayerEventArgsMembers( } return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerEventArgsMember( _In_ XblMultiplayerEventArgsHandle argsHandle, _Out_ XblMultiplayerManagerMember* member ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(argsHandle == nullptr || member == nullptr); @@ -135,11 +142,13 @@ STDAPI XblMultiplayerEventArgsMember( } return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerEventArgsPropertiesJson( _In_ XblMultiplayerEventArgsHandle argsHandle, _Out_ const char** properties ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(argsHandle == nullptr || properties == nullptr); @@ -160,12 +169,14 @@ STDAPI XblMultiplayerEventArgsPropertiesJson( } return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerEventArgsFindMatchCompleted( _In_ XblMultiplayerEventArgsHandle argsHandle, _Out_opt_ XblMultiplayerMatchStatus* matchStatus, _Out_opt_ XblMultiplayerMeasurementFailure* initializationFailureCause ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(argsHandle); auto args = dynamic_cast(argsHandle); @@ -181,34 +192,40 @@ STDAPI XblMultiplayerEventArgsFindMatchCompleted( } return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerEventArgsTournamentRegistrationStateChanged( _In_ XblMultiplayerEventArgsHandle argsHandle, _Out_opt_ XblTournamentRegistrationState* registrationState, _Out_opt_ XblTournamentRegistrationReason* registrationReason ) XBL_NOEXCEPT +try { UNREFERENCED_PARAMETER(argsHandle); UNREFERENCED_PARAMETER(registrationState); UNREFERENCED_PARAMETER(registrationReason); return E_NOTIMPL; } +CATCH_RETURN() STDAPI XblMultiplayerEventArgsTournamentGameSessionReady( _In_ XblMultiplayerEventArgsHandle argsHandle, _Out_ time_t* startTime ) XBL_NOEXCEPT +try { UNREFERENCED_PARAMETER(argsHandle); UNREFERENCED_PARAMETER(startTime); return E_NOTIMPL; } +CATCH_RETURN() STDAPI XblMultiplayerEventArgsPerformQoSMeasurements( _In_ XblMultiplayerEventArgsHandle argsHandle, _Out_ XblMultiplayerPerformQoSMeasurementsArgs* performQoSMeasurementsArgs ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(argsHandle == nullptr || performQoSMeasurementsArgs == nullptr); auto args = dynamic_cast(argsHandle); @@ -218,4 +235,5 @@ STDAPI XblMultiplayerEventArgsPerformQoSMeasurements( performQoSMeasurementsArgs->remoteClients = args->remoteClients.data(); return S_OK; -} \ No newline at end of file +} +CATCH_RETURN() diff --git a/Source/Services/Multiplayer/Manager/multiplayer_manager_api.cpp b/Source/Services/Multiplayer/Manager/multiplayer_manager_api.cpp index ea6e0a93..5f7cdb44 100644 --- a/Source/Services/Multiplayer/Manager/multiplayer_manager_api.cpp +++ b/Source/Services/Multiplayer/Manager/multiplayer_manager_api.cpp @@ -38,6 +38,7 @@ STDAPI XblMultiplayerManagerInitialize( _In_z_ const char* lobbySessionTemplateName, _In_opt_ XTaskQueueHandle asyncQueue ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -47,11 +48,13 @@ STDAPI XblMultiplayerManagerInitialize( return S_OK; }, false); // doesn't require init } +CATCH_RETURN() STDAPI XblMultiplayerManagerDoWork( _Deref_out_opt_ const XblMultiplayerEvent** multiplayerEvents, _Out_ size_t* multiplayerEventsCount ) XBL_NOEXCEPT +try { INIT_OUT_PTR_PARAM(multiplayerEvents); @@ -73,11 +76,13 @@ STDAPI XblMultiplayerManagerDoWork( return S_OK; }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerJoinLobby( _In_z_ const char* handleId, _In_ XblUserHandle user ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -85,10 +90,12 @@ STDAPI XblMultiplayerManagerJoinLobby( return mpm.JoinLobby(handleId, user); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerJoinGameFromLobby( _In_z_ const char* sessionTemplateName ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -96,6 +103,7 @@ STDAPI XblMultiplayerManagerJoinGameFromLobby( return mpm.JoinGameFromLobby(sessionTemplateName); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerJoinGame( _In_z_ const char* sessionName, @@ -103,6 +111,7 @@ STDAPI XblMultiplayerManagerJoinGame( _In_opt_ const uint64_t* xuids, _In_ size_t xuidsCount ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -115,20 +124,24 @@ STDAPI XblMultiplayerManagerJoinGame( ); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLeaveGame() XBL_NOEXCEPT +try { return ApiImpl([](MultiplayerManager& mpm) { return mpm.LeaveGame(); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerFindMatch( _In_z_ const char* hopperName, _In_opt_z_ const char* attributesJson, _In_ uint32_t timeoutInSeconds ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -152,8 +165,10 @@ STDAPI XblMultiplayerManagerFindMatch( ); }); } +CATCH_RETURN() STDAPI_(void) XblMultiplayerManagerCancelMatch() XBL_NOEXCEPT +try { ApiImpl([](MultiplayerManager& mpm) { @@ -161,34 +176,42 @@ STDAPI_(void) XblMultiplayerManagerCancelMatch() XBL_NOEXCEPT return S_OK; }); } +CATCH_RETURN_WITH(;) STDAPI_(XblMultiplayerMatchStatus) XblMultiplayerManagerMatchStatus() XBL_NOEXCEPT +try { return ApiImpl(XblMultiplayerMatchStatus::None, [](MultiplayerManager& mpm) { return mpm.MatchStatus(); }); } +CATCH_RETURN_WITH(XblMultiplayerMatchStatus::None) STDAPI_(uint32_t) XblMultiplayerManagerEstimatedMatchWaitTime() XBL_NOEXCEPT +try { return ApiImpl(0, [](MultiplayerManager& mpm) { return static_cast(mpm.EstimatedMatchWaitTime().count()); }); } +CATCH_RETURN_WITH(0) STDAPI_(bool) XblMultiplayerManagerAutoFillMembersDuringMatchmaking() XBL_NOEXCEPT +try { return ApiImpl(false, [](MultiplayerManager& mpm) { return mpm.AutoFillMembersDuringMatchmaking(); }); } +CATCH_RETURN_WITH(false) STDAPI_(void) XblMultiplayerManagerSetAutoFillMembersDuringMatchmaking( _In_ bool autoFillMembers ) XBL_NOEXCEPT +try { ApiImpl([&](MultiplayerManager& mpm) { @@ -196,10 +219,12 @@ STDAPI_(void) XblMultiplayerManagerSetAutoFillMembersDuringMatchmaking( return S_OK; }); } +CATCH_RETURN_WITH(;) STDAPI XblMultiplayerManagerSetQosMeasurements( _In_z_ const char* measurementsJson ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -217,29 +242,35 @@ STDAPI XblMultiplayerManagerSetQosMeasurements( return S_OK; }); } +CATCH_RETURN() STDAPI_(XblMultiplayerJoinability) XblMultiplayerManagerJoinability() XBL_NOEXCEPT +try { return ApiImpl(XblMultiplayerJoinability::None, [](MultiplayerManager& mpm) { return mpm.Joinability(); }); } +CATCH_RETURN_WITH(XblMultiplayerJoinability::None) STDAPI XblMultiplayerManagerSetJoinability( _In_ XblMultiplayerJoinability joinability, _In_opt_ void* context ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { return mpm.SetJoinability(joinability, reinterpret_cast(context)); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionCorrelationId( _Out_ XblGuid* correlationId ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -248,10 +279,12 @@ STDAPI XblMultiplayerManagerLobbySessionCorrelationId( return S_OK; }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionSessionReference( _Out_ XblMultiplayerSessionReference* sessionReference ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -260,19 +293,23 @@ STDAPI XblMultiplayerManagerLobbySessionSessionReference( return S_OK; }); } +CATCH_RETURN() STDAPI_(size_t) XblMultiplayerManagerLobbySessionLocalMembersCount() XBL_NOEXCEPT +try { return ApiImpl(0, [](MultiplayerManager& mpm) { return mpm.LobbySession()->LocalMembers().size(); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionLocalMembers( _In_ size_t localMembersCount, _Out_writes_(localMembersCount) XblMultiplayerManagerMember* localMembers ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -289,19 +326,23 @@ STDAPI XblMultiplayerManagerLobbySessionLocalMembers( return S_OK; }); } +CATCH_RETURN() STDAPI_(size_t) XblMultiplayerManagerLobbySessionMembersCount() XBL_NOEXCEPT +try { return ApiImpl(0, [](MultiplayerManager& mpm) { return mpm.LobbySession()->Members().size(); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionMembers( _In_ size_t membersCount, _Out_writes_(membersCount) XblMultiplayerManagerMember* members ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -314,10 +355,12 @@ STDAPI XblMultiplayerManagerLobbySessionMembers( return S_OK; }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionHost( _Out_ XblMultiplayerManagerMember* hostMember ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -332,8 +375,10 @@ STDAPI XblMultiplayerManagerLobbySessionHost( } }); } +CATCH_RETURN() STDAPI_(const char*) XblMultiplayerManagerLobbySessionPropertiesJson() XBL_NOEXCEPT +try { return ApiImpl(nullptr, [](MultiplayerManager& mpm)-> const char* { @@ -346,42 +391,51 @@ STDAPI_(const char*) XblMultiplayerManagerLobbySessionPropertiesJson() XBL_NOEXC }); } +CATCH_RETURN_WITH(nullptr) STDAPI_(const XblMultiplayerSessionConstants*) XblMultiplayerManagerLobbySessionConstants() XBL_NOEXCEPT +try { return ApiImpl(nullptr, [](MultiplayerManager& mpm) { return &mpm.LobbySession()->SessionConstants(); }); } +CATCH_RETURN_WITH(nullptr) XBL_WARNING_PUSH XBL_WARNING_DISABLE_DEPRECATED STDAPI_(const XblTournamentTeamResult*) XblMultiplayerManagerLobbySessionLastTournamentTeamResult() XBL_NOEXCEPT +try { return nullptr; } +CATCH_RETURN_WITH(nullptr) XBL_WARNING_POP STDAPI XblMultiplayerManagerLobbySessionAddLocalUser( _In_ XblUserHandle user ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { return mpm.LobbySession()->AddLocalUser(user); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionRemoveLocalUser( _In_ XblUserHandle user ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { return mpm.LobbySession()->RemoveLocalUser(user); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionSetLocalMemberProperties( _In_ XblUserHandle user, @@ -389,6 +443,7 @@ STDAPI XblMultiplayerManagerLobbySessionSetLocalMemberProperties( _In_z_ const char* valueJson, _In_opt_ void* context ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -410,12 +465,14 @@ STDAPI XblMultiplayerManagerLobbySessionSetLocalMemberProperties( ); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionDeleteLocalMemberProperties( _In_ XblUserHandle user, _In_z_ const char* name, _In_opt_ void* context ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -427,12 +484,14 @@ STDAPI XblMultiplayerManagerLobbySessionDeleteLocalMemberProperties( ); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress( _In_ XblUserHandle user, _In_z_ const char* connectionAddress, _In_opt_ void* context ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -444,22 +503,26 @@ STDAPI XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress( ); }); } +CATCH_RETURN() STDAPI_(bool) XblMultiplayerManagerLobbySessionIsHost( _In_ uint64_t xuid ) XBL_NOEXCEPT +try { return ApiImpl(false, [&](MultiplayerManager& mpm) { return mpm.LobbySession()->IsHost(xuid); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionSetProperties( _In_z_ const char* name, _In_z_ const char* valueJson, _In_opt_ void* context ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -480,12 +543,14 @@ STDAPI XblMultiplayerManagerLobbySessionSetProperties( ); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionSetSynchronizedProperties( _In_z_ const char* name, _In_z_ const char* valueJson, _In_opt_ void* context ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -506,11 +571,13 @@ STDAPI XblMultiplayerManagerLobbySessionSetSynchronizedProperties( ); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerLobbySessionSetSynchronizedHost( _In_ const char* deviceToken, _In_opt_ void* context ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -521,6 +588,7 @@ STDAPI XblMultiplayerManagerLobbySessionSetSynchronizedHost( ); }); } +CATCH_RETURN() #if HC_PLATFORM_IS_MICROSOFT STDAPI XblMultiplayerManagerLobbySessionInviteFriends( @@ -528,6 +596,7 @@ STDAPI XblMultiplayerManagerLobbySessionInviteFriends( _In_opt_z_ const char* contextStringId, _In_opt_z_ const char* customActivationContext ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -538,6 +607,7 @@ STDAPI XblMultiplayerManagerLobbySessionInviteFriends( ); }); } +CATCH_RETURN() #endif STDAPI XblMultiplayerManagerLobbySessionInviteUsers( @@ -547,6 +617,7 @@ STDAPI XblMultiplayerManagerLobbySessionInviteUsers( _In_opt_z_ const char* contextStringId, _In_opt_z_ const char* customActivationContext ) XBL_NOEXCEPT +try { return ApiImpl([&](MultiplayerManager& mpm) { @@ -558,6 +629,7 @@ STDAPI XblMultiplayerManagerLobbySessionInviteUsers( ); }); } +CATCH_RETURN() NAMESPACE_MICROSOFT_XBOX_SERVICES_MULTIPLAYER_MANAGER_CPP_BEGIN @@ -609,41 +681,50 @@ typedef std::shared_ptr GameSessionPtr; NAMESPACE_MICROSOFT_XBOX_SERVICES_MULTIPLAYER_MANAGER_CPP_END STDAPI_(bool) XblMultiplayerManagerGameSessionActive() XBL_NOEXCEPT +try { return ApiImpl(false, [](MultiplayerManager& mpm) { return mpm.GameSession() != nullptr; }); } +CATCH_RETURN() STDAPI_(const char*) XblMultiplayerManagerGameSessionCorrelationId() XBL_NOEXCEPT +try { return GameSessionApiImpl(nullptr, [](GameSessionPtr gameSession) { return gameSession->CorrelationId().data(); }); } +CATCH_RETURN_WITH(nullptr) STDAPI_(const XblMultiplayerSessionReference*) XblMultiplayerManagerGameSessionSessionReference() XBL_NOEXCEPT +try { return GameSessionApiImpl(nullptr, [](GameSessionPtr gameSession) { return &gameSession->SessionReference(); }); } +CATCH_RETURN_WITH(nullptr) STDAPI_(size_t) XblMultiplayerManagerGameSessionMembersCount() XBL_NOEXCEPT +try { return GameSessionApiImpl(0, [](GameSessionPtr gameSession) { return gameSession->Members().size(); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerGameSessionMembers( _In_ size_t membersCount, _Out_writes_(membersCount) XblMultiplayerManagerMember* members ) XBL_NOEXCEPT +try { return GameSessionApiImpl([&](GameSessionPtr gameSession) { @@ -660,10 +741,12 @@ STDAPI XblMultiplayerManagerGameSessionMembers( return S_OK; }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerGameSessionHost( _Out_ XblMultiplayerManagerMember* hostMember ) XBL_NOEXCEPT +try { return GameSessionApiImpl([&](GameSessionPtr gameSession) { @@ -678,38 +761,46 @@ STDAPI XblMultiplayerManagerGameSessionHost( } }); } +CATCH_RETURN() STDAPI_(const char*) XblMultiplayerManagerGameSessionPropertiesJson() XBL_NOEXCEPT +try { return GameSessionApiImpl(nullptr, [](GameSessionPtr gameSession) { return gameSession->Properties().data(); }); } +CATCH_RETURN_WITH(nullptr) STDAPI_(const XblMultiplayerSessionConstants*) XblMultiplayerManagerGameSessionConstants() XBL_NOEXCEPT +try { return GameSessionApiImpl(nullptr, [](GameSessionPtr gameSession) { return &gameSession->SessionConstants(); }); } +CATCH_RETURN_WITH(nullptr) STDAPI_(bool) XblMultiplayerManagerGameSessionIsHost( _In_ uint64_t xuid ) XBL_NOEXCEPT +try { return GameSessionApiImpl(false, [&](GameSessionPtr gameSession) { return gameSession->IsHost(xuid); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerGameSessionSetProperties( _In_z_ const char* name, _In_z_ const char* valueJson, _In_opt_ void* context ) XBL_NOEXCEPT +try { return GameSessionApiImpl([&](GameSessionPtr gameSession) { @@ -730,12 +821,14 @@ STDAPI XblMultiplayerManagerGameSessionSetProperties( ); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerGameSessionSetSynchronizedProperties( _In_z_ const char* name, _In_z_ const char* valueJson, _In_opt_ void* context ) XBL_NOEXCEPT +try { return GameSessionApiImpl([&](GameSessionPtr gameSession) { @@ -756,11 +849,13 @@ STDAPI XblMultiplayerManagerGameSessionSetSynchronizedProperties( ); }); } +CATCH_RETURN() STDAPI XblMultiplayerManagerGameSessionSetSynchronizedHost( _In_ const char* deviceToken, _In_opt_ void* context ) XBL_NOEXCEPT +try { return GameSessionApiImpl([&](GameSessionPtr gameSession) { @@ -769,4 +864,5 @@ STDAPI XblMultiplayerManagerGameSessionSetSynchronizedHost( return gameSession->SetSynchronizedHost(deviceToken, reinterpret_cast(context)); }); } +CATCH_RETURN() diff --git a/Source/Services/Multiplayer/Manager/multiplayer_member.cpp b/Source/Services/Multiplayer/Manager/multiplayer_member.cpp index c300d33c..2c2f30f1 100644 --- a/Source/Services/Multiplayer/Manager/multiplayer_member.cpp +++ b/Source/Services/Multiplayer/Manager/multiplayer_member.cpp @@ -11,6 +11,7 @@ STDAPI_(bool) XblMultiplayerManagerMemberAreMembersOnSameDevice( _In_ const XblMultiplayerManagerMember* first, _In_ const XblMultiplayerManagerMember* second ) XBL_NOEXCEPT +try { if (first != nullptr && second != nullptr) { @@ -18,6 +19,7 @@ STDAPI_(bool) XblMultiplayerManagerMemberAreMembersOnSameDevice( } return false; } +CATCH_RETURN() NAMESPACE_MICROSOFT_XBOX_SERVICES_MULTIPLAYER_MANAGER_CPP_BEGIN diff --git a/Source/Services/Multiplayer/multiplayer_api.cpp b/Source/Services/Multiplayer/multiplayer_api.cpp index 37c90b28..ac52898f 100644 --- a/Source/Services/Multiplayer/multiplayer_api.cpp +++ b/Source/Services/Multiplayer/multiplayer_api.cpp @@ -13,6 +13,7 @@ STDAPI XblMultiplayerSearchHandleDuplicateHandle( _In_ XblMultiplayerSearchHandle handle, _Out_ XblMultiplayerSearchHandle* duplicatedHandle ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || duplicatedHandle == nullptr); @@ -21,42 +22,50 @@ STDAPI XblMultiplayerSearchHandleDuplicateHandle( return S_OK; } +CATCH_RETURN() STDAPI_(void) XblMultiplayerSearchHandleCloseHandle( _In_ XblMultiplayerSearchHandle handle ) XBL_NOEXCEPT +try { if (handle) { handle->DecRef(); } } +CATCH_RETURN_WITH(;) STDAPI XblMultiplayerSearchHandleGetSessionReference( _In_ XblMultiplayerSearchHandle handle, _Out_ XblMultiplayerSessionReference* sessionRef ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || sessionRef == nullptr); *sessionRef = handle->SessionReference(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetId( _In_ XblMultiplayerSearchHandle handle, _Out_ const char** id ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || id == nullptr); *id = handle->HandleId().data(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetSessionOwnerXuids( _In_ XblMultiplayerSearchHandle handle, _Out_ const uint64_t** xuids, _Out_ size_t* xuidsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || xuids == nullptr || xuidsCount == nullptr); @@ -64,12 +73,14 @@ STDAPI XblMultiplayerSearchHandleGetSessionOwnerXuids( *xuidsCount = handle->SessionOwnerXuids().size(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetTags( _In_ XblMultiplayerSearchHandle handle, _Out_ const XblMultiplayerSessionTag** tags, _Out_ size_t* tagsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || tags == nullptr || tagsCount == nullptr); @@ -77,12 +88,14 @@ STDAPI XblMultiplayerSearchHandleGetTags( *tagsCount = handle->Tags().size(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetStringAttributes( _In_ XblMultiplayerSearchHandle handle, _Out_ const XblMultiplayerSessionStringAttribute** attributes, _Out_ size_t* attributesCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || attributes == nullptr || attributesCount == nullptr); @@ -90,12 +103,14 @@ STDAPI XblMultiplayerSearchHandleGetStringAttributes( *attributesCount = handle->StringAttributes().size(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetNumberAttributes( _In_ XblMultiplayerSearchHandle handle, _Out_ const XblMultiplayerSessionNumberAttribute** attributes, _Out_ size_t* attributesCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || attributes == nullptr || attributesCount == nullptr); @@ -103,42 +118,50 @@ STDAPI XblMultiplayerSearchHandleGetNumberAttributes( *attributesCount = handle->NumberAttributes().size(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetVisibility( _In_ XblMultiplayerSearchHandle handle, _Out_ XblMultiplayerSessionVisibility* visibility ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || visibility == nullptr); *visibility = handle->Visibility(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetJoinRestriction( _In_ XblMultiplayerSearchHandle handle, _Out_ XblMultiplayerSessionRestriction* joinRestriction ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || joinRestriction == nullptr); *joinRestriction = handle->JoinRestriction(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetSessionClosed( _In_ XblMultiplayerSearchHandle handle, _Out_ bool* closed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || closed == nullptr); *closed = handle->Closed(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetMemberCounts( _In_ XblMultiplayerSearchHandle handle, _Out_opt_ size_t* maxMembers, _Out_opt_ size_t* currentMembers ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr); @@ -152,21 +175,25 @@ STDAPI XblMultiplayerSearchHandleGetMemberCounts( } return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetCreationTime( _In_ XblMultiplayerSearchHandle handle, _Out_ time_t* creationTime ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || creationTime == nullptr); *creationTime = utils::time_t_from_datetime(handle->HandleCreationTime()); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSearchHandleGetCustomSessionPropertiesJson( _In_ XblMultiplayerSearchHandle handle, _Out_ const char** customPropertiesJson ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(handle == nullptr || customPropertiesJson == nullptr); auto& customPropertiesString{ handle->CustomSessionPropertiesJson() }; @@ -180,6 +207,7 @@ STDAPI XblMultiplayerSearchHandleGetCustomSessionPropertiesJson( } return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerCreateSearchHandleAsync( _In_ XblContextHandle xblContext, @@ -192,6 +220,7 @@ STDAPI XblMultiplayerCreateSearchHandleAsync( _In_ size_t stringAttributesCount, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContext == nullptr || sessionRef == nullptr || async == nullptr); RETURN_HR_INVALIDARGUMENT_IF(tagsCount > 0 && tags == nullptr); @@ -282,11 +311,13 @@ STDAPI XblMultiplayerCreateSearchHandleAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerCreateSearchHandleResult( _In_ XAsyncBlock* async, _Out_opt_ XblMultiplayerSearchHandle* handle ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(async); @@ -305,12 +336,14 @@ STDAPI XblMultiplayerCreateSearchHandleResult( } return hr; } +CATCH_RETURN() STDAPI XblMultiplayerDeleteSearchHandleAsync( _In_ XblContextHandle xblContext, _In_ const char* handleId, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContext == nullptr || handleId == nullptr || async == nullptr); @@ -332,6 +365,7 @@ STDAPI XblMultiplayerDeleteSearchHandleAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerGetSearchHandlesAsync( _In_ XblContextHandle xblContext, @@ -343,6 +377,7 @@ STDAPI XblMultiplayerGetSearchHandlesAsync( _In_opt_z_ const char* socialGroup, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContext == nullptr || scid == nullptr || sessionTemplateName == nullptr || async == nullptr); @@ -408,11 +443,13 @@ STDAPI XblMultiplayerGetSearchHandlesAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerGetSearchHandlesResultCount( _In_ XAsyncBlock* async, _Out_ size_t* searchHandleCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(async == nullptr || searchHandleCount == nullptr); @@ -425,17 +462,20 @@ STDAPI XblMultiplayerGetSearchHandlesResultCount( } return hr; } +CATCH_RETURN() STDAPI XblMultiplayerGetSearchHandlesResult( _In_ XAsyncBlock* async, _Out_writes_(searchHandlesCount) XblMultiplayerSearchHandle* searchHandles, _In_ size_t searchHandlesCount ) XBL_NOEXCEPT +try { RETURN_HR_IF(searchHandlesCount == 0, S_OK); RETURN_HR_INVALIDARGUMENT_IF(async == nullptr || searchHandles == nullptr); return XAsyncGetResult(async, nullptr, searchHandlesCount * sizeof(XblMultiplayerSearchHandle), searchHandles, nullptr); } +CATCH_RETURN() STDAPI XblMultiplayerSetTransferHandleAsync( _In_ XblContextHandle xblContextHandle, @@ -443,6 +483,7 @@ STDAPI XblMultiplayerSetTransferHandleAsync( _In_ XblMultiplayerSessionReference originSessionReference, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(async); @@ -490,11 +531,14 @@ STDAPI XblMultiplayerSetTransferHandleAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerSetTransferHandleResult( _In_ XAsyncBlock* async, _Out_ XblMultiplayerSessionHandleId* handleId ) XBL_NOEXCEPT +try { return XAsyncGetResult(async, nullptr, sizeof(XblMultiplayerSessionHandleId), handleId, nullptr); -} \ No newline at end of file +} +CATCH_RETURN() diff --git a/Source/Services/Multiplayer/multiplayer_internal.h b/Source/Services/Multiplayer/multiplayer_internal.h index 1aaf9ae9..95f92709 100644 --- a/Source/Services/Multiplayer/multiplayer_internal.h +++ b/Source/Services/Multiplayer/multiplayer_internal.h @@ -113,8 +113,8 @@ class MultiplayerSessionMember xsapi_internal_string m_teamId; xsapi_internal_string m_initialTeam; - xsapi_internal_vector m_groups; // TODO these never get deserialized - xsapi_internal_vector m_encounters; // TODO these never get deserialized + xsapi_internal_vector m_groups; + xsapi_internal_vector m_encounters; xsapi_internal_vector m_membersInGroupIds; XblMultiplayerSessionChangeTypes m_subscribedChangeTypes{ XblMultiplayerSessionChangeTypes::None }; diff --git a/Source/Services/Multiplayer/multiplayer_service.cpp b/Source/Services/Multiplayer/multiplayer_service.cpp index 6791bd1d..2ad72387 100644 --- a/Source/Services/Multiplayer/multiplayer_service.cpp +++ b/Source/Services/Multiplayer/multiplayer_service.cpp @@ -1372,6 +1372,7 @@ STDAPI MultiplayerWriteSessionHelper( _In_opt_ const char* handleIdArg, _Inout_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || multiplayerSession == nullptr || async == nullptr); @@ -1450,6 +1451,7 @@ STDAPI MultiplayerWriteSessionHelper( } }); } +CATCH_RETURN() STDAPI XblMultiplayerWriteSessionAsync( _In_ XblContextHandle xblContext, @@ -1457,6 +1459,7 @@ STDAPI XblMultiplayerWriteSessionAsync( _In_ XblMultiplayerSessionWriteMode writeMode, _Inout_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(multiplayerSession); @@ -1468,11 +1471,13 @@ STDAPI XblMultiplayerWriteSessionAsync( return MultiplayerWriteSessionHelper(xblContext, multiplayerSession, writeMode, nullptr, async); } +CATCH_RETURN() STDAPI XblMultiplayerWriteSessionResult( _Inout_ XAsyncBlock* async, _Out_ XblMultiplayerSessionHandle* handle ) XBL_NOEXCEPT +try { XblMultiplayerSessionHandle handleCopy = nullptr; auto hr = XAsyncGetResult(async, nullptr, sizeof(XblMultiplayerSessionHandle), &handleCopy, nullptr); @@ -1486,6 +1491,7 @@ STDAPI XblMultiplayerWriteSessionResult( } return hr; } +CATCH_RETURN() STDAPI XblMultiplayerWriteSessionByHandleAsync( _In_ XblContextHandle xblContext, @@ -1494,19 +1500,23 @@ STDAPI XblMultiplayerWriteSessionByHandleAsync( _In_ const char* handleId, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(handleId); return MultiplayerWriteSessionHelper(xblContext, multiplayerSession, writeMode, handleId, async); } +CATCH_RETURN() STDAPI XblMultiplayerWriteSessionByHandleResult( _Inout_ XAsyncBlock* async, _Out_ XblMultiplayerSessionHandle* handle ) XBL_NOEXCEPT +try { return XblMultiplayerWriteSessionResult(async, handle); } +CATCH_RETURN() STDAPI MultiplayerGetSessionHelper( _In_ XblContextHandle xblContextHandle, @@ -1514,6 +1524,7 @@ STDAPI MultiplayerGetSessionHelper( _In_opt_ const char* handleIdArg, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || async == nullptr); @@ -1574,48 +1585,58 @@ STDAPI MultiplayerGetSessionHelper( } }); } +CATCH_RETURN() STDAPI XblMultiplayerGetSessionAsync( _In_ XblContextHandle xblContext, _In_ const XblMultiplayerSessionReference* sessionReference, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(sessionReference); return MultiplayerGetSessionHelper(xblContext, sessionReference, nullptr, async); } +CATCH_RETURN() STDAPI XblMultiplayerGetSessionResult( _In_ XAsyncBlock* async, _Out_ XblMultiplayerSessionHandle* handle ) XBL_NOEXCEPT +try { return XAsyncGetResult(async, nullptr, sizeof(XblMultiplayerSessionHandle), handle, nullptr); } +CATCH_RETURN() STDAPI XblMultiplayerGetSessionByHandleAsync( _In_ XblContextHandle xblContext, _In_ const char* handleId, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(handleId); return MultiplayerGetSessionHelper(xblContext, nullptr, handleId, async); } +CATCH_RETURN() STDAPI XblMultiplayerGetSessionByHandleResult( _In_ XAsyncBlock* async, _Out_ XblMultiplayerSessionHandle* handle ) XBL_NOEXCEPT +try { return XAsyncGetResult(async, nullptr, sizeof(XblMultiplayerSessionHandle), handle, nullptr); } +CATCH_RETURN() STDAPI XblMultiplayerQuerySessionsAsync( _In_ XblContextHandle xblContextHandle, _In_ const XblMultiplayerSessionQuery* sessionQuery, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || sessionQuery == nullptr || async == nullptr); RETURN_HR_INVALIDARGUMENT_IF_EMPTY_STRING(sessionQuery->Scid); @@ -1665,11 +1686,13 @@ STDAPI XblMultiplayerQuerySessionsAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerQuerySessionsResultCount( _In_ XAsyncBlock* async, _Out_ size_t* sessionCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(async == nullptr || sessionCount == nullptr); @@ -1678,22 +1701,26 @@ STDAPI XblMultiplayerQuerySessionsResultCount( *sessionCount = sizeInBytes / sizeof(XblMultiplayerSessionQueryResult); return hr; } +CATCH_RETURN() STDAPI XblMultiplayerQuerySessionsResult( _In_ XAsyncBlock* async, _In_ size_t sessionCount, _Out_writes_(sessionCount) XblMultiplayerSessionQueryResult* sessions ) XBL_NOEXCEPT +try { RETURN_HR_IF(sessionCount == 0, S_OK); return XAsyncGetResult(async, nullptr, sessionCount * sizeof(XblMultiplayerSessionQueryResult), sessions, nullptr); } +CATCH_RETURN() STDAPI XblMultiplayerSetActivityAsync( _In_ XblContextHandle xblContextHandle, _In_ const XblMultiplayerSessionReference* sessionReferenceArg, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || sessionReferenceArg == nullptr || async == nullptr); @@ -1718,12 +1745,14 @@ STDAPI XblMultiplayerSetActivityAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerClearActivityAsync( _In_ XblContextHandle xblContextHandle, _In_z_ const char* scidArg, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || scidArg == nullptr || async == nullptr); @@ -1748,6 +1777,7 @@ STDAPI XblMultiplayerClearActivityAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerSendInvitesAsync( _In_ XblContextHandle xblContextHandle, @@ -1759,6 +1789,7 @@ STDAPI XblMultiplayerSendInvitesAsync( _In_opt_z_ const char* customActivationContext, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || sessionReference == nullptr || xuids == nullptr || xuidsCount == 0 || async == nullptr); @@ -1817,16 +1848,19 @@ STDAPI XblMultiplayerSendInvitesAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerSendInvitesResult( _In_ XAsyncBlock* async, _In_ size_t handlesCount, _Out_writes_(handlesCount) XblMultiplayerInviteHandle* handles ) XBL_NOEXCEPT +try { RETURN_HR_IF(handlesCount == 0, S_OK); return XAsyncGetResult(async, nullptr, sizeof(XblMultiplayerInviteHandle) * handlesCount, handles, nullptr); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesForSocialGroupAsync( _In_ XblContextHandle xblContextHandle, @@ -1835,6 +1869,7 @@ STDAPI XblMultiplayerGetActivitiesForSocialGroupAsync( _In_ const char* socialGroupArg, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || scidArg == nullptr || socialGroupOwnerXuid == 0 || socialGroupArg == nullptr || async == nullptr); @@ -1887,6 +1922,7 @@ STDAPI XblMultiplayerGetActivitiesForSocialGroupAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesWithPropertiesForSocialGroupAsync( _In_ XblContextHandle xblContextHandle, @@ -1895,6 +1931,7 @@ STDAPI XblMultiplayerGetActivitiesWithPropertiesForSocialGroupAsync( _In_ const char* socialGroupArg, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || scidArg == nullptr || socialGroupOwnerXuid == 0 || socialGroupArg == nullptr || async == nullptr); @@ -1966,11 +2003,13 @@ STDAPI XblMultiplayerGetActivitiesWithPropertiesForSocialGroupAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesForSocialGroupResultCount( _In_ XAsyncBlock* async, _Out_ size_t* activityCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(activityCount); @@ -1979,26 +2018,31 @@ STDAPI XblMultiplayerGetActivitiesForSocialGroupResultCount( *activityCount = sizeInBytes / sizeof(XblMultiplayerActivityDetails); return hr; } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesForSocialGroupResult( _In_ XAsyncBlock* async, _In_ size_t activityCount, _Out_writes_(activityCount) XblMultiplayerActivityDetails* activities ) XBL_NOEXCEPT +try { RETURN_HR_IF(activityCount == 0, S_OK); return XAsyncGetResult(async, nullptr, activityCount * sizeof(XblMultiplayerActivityDetails), activities, nullptr); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesWithPropertiesForSocialGroupResultSize( _In_ XAsyncBlock* async, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(resultSizeInBytes); return XAsyncGetResultSize(async, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesWithPropertiesForSocialGroupResult( _In_ XAsyncBlock* async, @@ -2008,6 +2052,7 @@ STDAPI XblMultiplayerGetActivitiesWithPropertiesForSocialGroupResult( _Out_ size_t* ptrToBufferCount, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(buffer == nullptr || ptrToBuffer == nullptr || ptrToBufferCount == nullptr); @@ -2037,6 +2082,7 @@ STDAPI XblMultiplayerGetActivitiesWithPropertiesForSocialGroupResult( return hr; } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesForUsersAsync( _In_ XblContextHandle xblContextHandle, @@ -2045,6 +2091,7 @@ STDAPI XblMultiplayerGetActivitiesForUsersAsync( _In_ size_t xuidsCount, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || scidArg == nullptr || xuidsArg == nullptr || xuidsCount == 0 || async == nullptr); @@ -2095,6 +2142,7 @@ STDAPI XblMultiplayerGetActivitiesForUsersAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesWithPropertiesForUsersAsync( _In_ XblContextHandle xblContextHandle, @@ -2103,6 +2151,7 @@ STDAPI XblMultiplayerGetActivitiesWithPropertiesForUsersAsync( _In_ size_t xuidsCount, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || scidArg == nullptr || xuidsArg == nullptr || xuidsCount == 0 || async == nullptr); @@ -2172,31 +2221,38 @@ STDAPI XblMultiplayerGetActivitiesWithPropertiesForUsersAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesForUsersResultCount( _In_ XAsyncBlock* async, _Out_ size_t* activityCount ) XBL_NOEXCEPT +try { return XblMultiplayerGetActivitiesForSocialGroupResultCount(async, activityCount); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesForUsersResult( _In_ XAsyncBlock* async, _In_ size_t activityCount, _Out_writes_(activityCount) XblMultiplayerActivityDetails* activities ) XBL_NOEXCEPT +try { return XAsyncGetResult(async, nullptr, activityCount * sizeof(XblMultiplayerActivityDetails), activities, nullptr); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesWithPropertiesForUsersResultSize( _In_ XAsyncBlock* async, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XblMultiplayerGetActivitiesWithPropertiesForSocialGroupResultSize(async, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblMultiplayerGetActivitiesWithPropertiesForUsersResult( _In_ XAsyncBlock* async, @@ -2206,14 +2262,17 @@ STDAPI XblMultiplayerGetActivitiesWithPropertiesForUsersResult( _Out_ size_t* ptrToBufferCount, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { return XblMultiplayerGetActivitiesWithPropertiesForSocialGroupResult(async, bufferSize, buffer, ptrToBuffer, ptrToBufferCount, bufferUsed); } +CATCH_RETURN() STDAPI XblMultiplayerSetSubscriptionsEnabled( _In_ XblContextHandle xblContext, _In_ bool subscriptionsEnabled ) XBL_NOEXCEPT +try { if (subscriptionsEnabled) { @@ -2224,19 +2283,23 @@ STDAPI XblMultiplayerSetSubscriptionsEnabled( return xblContext->MultiplayerService()->DisableMultiplayerSubscriptions(); } } +CATCH_RETURN() STDAPI_(bool) XblMultiplayerSubscriptionsEnabled( _In_ XblContextHandle xblContext ) XBL_NOEXCEPT +try { return xblContext->MultiplayerService()->SubscriptionsEnabled(); } +CATCH_RETURN() STDAPI_(XblFunctionContext) XblMultiplayerAddSessionChangedHandler( _In_ XblContextHandle xblContext, _In_ XblMultiplayerSessionChangedHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { return xblContext->MultiplayerService()->AddMultiplayerSessionChangedHandler( [ @@ -2255,20 +2318,25 @@ STDAPI_(XblFunctionContext) XblMultiplayerAddSessionChangedHandler( } }); } +CATCH_RETURN() STDAPI_(void) XblMultiplayerRemoveSessionChangedHandler( _In_ XblContextHandle xblContext, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { xblContext->MultiplayerService()->RemoveMultiplayerSessionChangedHandler(token); } +CATCH_RETURN_WITH(;) + STDAPI_(XblFunctionContext) XblMultiplayerAddSubscriptionLostHandler( _In_ XblContextHandle xblContext, _In_ XblMultiplayerSessionSubscriptionLostHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { return xblContext->MultiplayerService()->AddMultiplayerSubscriptionLostHandler( [ @@ -2286,20 +2354,24 @@ STDAPI_(XblFunctionContext) XblMultiplayerAddSubscriptionLostHandler( } }); } +CATCH_RETURN() STDAPI_(void) XblMultiplayerRemoveSubscriptionLostHandler( _In_ XblContextHandle xblContext, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { xblContext->MultiplayerService()->RemoveMultiplayerSubscriptionLostHandler(token); } +CATCH_RETURN_WITH(;) STDAPI_(XblFunctionContext) XblMultiplayerAddConnectionIdChangedHandler( _In_ XblContextHandle xblContext, _In_ XblMultiplayerConnectionIdChangedHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { return xblContext->MultiplayerService()->AddMultiplayerConnectionIdChangedHandler( [ @@ -2318,11 +2390,14 @@ STDAPI_(XblFunctionContext) XblMultiplayerAddConnectionIdChangedHandler( } }); } +CATCH_RETURN() STDAPI_(void) XblMultiplayerRemoveConnectionIdChangedHandler( _In_ XblContextHandle xblContext, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { xblContext->MultiplayerService()->RemoveMultiplayerConnectionIdChangedHandler(token); -} \ No newline at end of file +} +CATCH_RETURN_WITH(;) diff --git a/Source/Services/Multiplayer/multiplayer_session.cpp b/Source/Services/Multiplayer/multiplayer_session.cpp index d1a43bbd..c417b6e3 100644 --- a/Source/Services/Multiplayer/multiplayer_session.cpp +++ b/Source/Services/Multiplayer/multiplayer_session.cpp @@ -2476,16 +2476,19 @@ STDAPI_(XblMultiplayerSessionHandle) XblMultiplayerSessionCreateHandle( _In_opt_ const XblMultiplayerSessionReference* sessionReference, _In_opt_ const XblMultiplayerSessionInitArgs* initArgs ) XBL_NOEXCEPT +try { auto session = MakeShared(xuid, sessionReference, initArgs); session->AddRef(); return session.get(); } +CATCH_RETURN_WITH(nullptr) STDAPI XblMultiplayerSessionDuplicateHandle( _In_ XblMultiplayerSessionHandle session, _Out_ XblMultiplayerSessionHandle* duplicatedHandle ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(session == nullptr || duplicatedHandle == nullptr); @@ -2494,28 +2497,34 @@ STDAPI XblMultiplayerSessionDuplicateHandle( return S_OK; } +CATCH_RETURN() STDAPI_(void) XblMultiplayerSessionCloseHandle( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session) { session->DecRef(); } } +CATCH_RETURN_WITH(;) STDAPI_(XblTournamentArbitrationStatus) XblMultiplayerSessionArbitrationStatus( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { UNREFERENCED_PARAMETER(session); return XblTournamentArbitrationStatus::Incomplete; } +CATCH_RETURN_WITH(XblTournamentArbitrationStatus::Incomplete) STDAPI_(time_t) XblMultiplayerSessionTimeOfSession( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2524,10 +2533,12 @@ STDAPI_(time_t) XblMultiplayerSessionTimeOfSession( return session->TimeOfSession(); } +CATCH_RETURN() STDAPI_(const XblMultiplayerSessionInitializationInfo*) XblMultiplayerSessionGetInitializationInfo( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2536,10 +2547,12 @@ STDAPI_(const XblMultiplayerSessionInitializationInfo*) XblMultiplayerSessionGet return &session->InitializationInfo(); } +CATCH_RETURN_WITH(nullptr) STDAPI_(XblMultiplayerSessionChangeTypes) XblMultiplayerSessionSubscribedChangeTypes( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2552,12 +2565,14 @@ STDAPI_(XblMultiplayerSessionChangeTypes) XblMultiplayerSessionSubscribedChangeT } return MultiplayerSessionMember::Get(session->CurrentUserUnsafe())->SubscribedChangeTypes(); } +CATCH_RETURN_WITH(XblMultiplayerSessionChangeTypes::None) STDAPI XblMultiplayerSessionHostCandidates( _In_ XblMultiplayerSessionHandle session, _Out_ const XblDeviceToken** deviceTokens, _Out_ size_t* deviceTokensCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(deviceTokens == nullptr || deviceTokensCount == nullptr); RETURN_HR_INVALIDARGUMENT_IF_NULL(session); @@ -2566,10 +2581,12 @@ STDAPI XblMultiplayerSessionHostCandidates( *deviceTokensCount = session->HostCandidates().size(); return S_OK; } +CATCH_RETURN() STDAPI_(const XblMultiplayerSessionReference*) XblMultiplayerSessionSessionReference( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2578,10 +2595,12 @@ STDAPI_(const XblMultiplayerSessionReference*) XblMultiplayerSessionSessionRefer return &session->SessionReference(); } +CATCH_RETURN_WITH(nullptr) STDAPI_(const XblMultiplayerSessionConstants*) XblMultiplayerSessionSessionConstants( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2590,11 +2609,13 @@ STDAPI_(const XblMultiplayerSessionConstants*) XblMultiplayerSessionSessionConst return &session->SessionConstantsUnsafe(); } +CATCH_RETURN_WITH(nullptr) STDAPI_(void) XblMultiplayerSessionConstantsSetMaxMembersInSession( _In_ XblMultiplayerSessionHandle session, uint32_t maxMembersInSession ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2603,11 +2624,13 @@ STDAPI_(void) XblMultiplayerSessionConstantsSetMaxMembersInSession( session->SetMaxMembersInSession(maxMembersInSession); } +CATCH_RETURN_WITH(;) STDAPI_(void) XblMultiplayerSessionConstantsSetVisibility( _In_ XblMultiplayerSessionHandle session, _In_ XblMultiplayerSessionVisibility visibility ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2616,6 +2639,7 @@ STDAPI_(void) XblMultiplayerSessionConstantsSetVisibility( session->SetVisibility(visibility); } +CATCH_RETURN_WITH(;) STDAPI XblMultiplayerSessionConstantsSetTimeouts( _In_ XblMultiplayerSessionHandle session, @@ -2624,16 +2648,19 @@ STDAPI XblMultiplayerSessionConstantsSetTimeouts( _In_ uint64_t memberReadyTimeout, _In_ uint64_t sessionEmptyTimeout ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetTimeouts(memberReservedTimeout, memberInactiveTimeout, memberReadyTimeout, sessionEmptyTimeout); } +CATCH_RETURN() STDAPI XblMultiplayerSessionConstantsSetArbitrationTimeouts( _In_ XblMultiplayerSessionHandle session, _In_ uint64_t arbitrationTimeout, _In_ uint64_t forfeitTimeout ) XBL_NOEXCEPT +try { UNREFERENCED_PARAMETER(session); UNREFERENCED_PARAMETER(arbitrationTimeout); @@ -2641,6 +2668,7 @@ STDAPI XblMultiplayerSessionConstantsSetArbitrationTimeouts( return E_NOTIMPL; } +CATCH_RETURN() STDAPI XblMultiplayerSessionConstantsSetQosConnectivityMetrics( _In_ XblMultiplayerSessionHandle session, @@ -2649,68 +2677,83 @@ STDAPI XblMultiplayerSessionConstantsSetQosConnectivityMetrics( _In_ bool enableBandwidthUpMetric, _In_ bool enableCustomMetric ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetQosConnectivityMetrics(enableLatencyMetric, enableBandwidthDownMetric, enableBandwidthUpMetric, enableCustomMetric); } +CATCH_RETURN() STDAPI XblMultiplayerSessionConstantsSetMemberInitialization( _In_ XblMultiplayerSessionHandle session, _In_ XblMultiplayerMemberInitialization memberInitialization ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetMemberInitialization(std::move(memberInitialization)); } +CATCH_RETURN() STDAPI XblMultiplayerSessionConstantsSetPeerToPeerRequirements( _In_ XblMultiplayerSessionHandle session, _In_ XblMultiplayerPeerToPeerRequirements requirements ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetPeerToPeerRequirements(std::move(requirements)); } +CATCH_RETURN() STDAPI XblMultiplayerSessionConstantsSetPeerToHostRequirements( _In_ XblMultiplayerSessionHandle session, _In_ XblMultiplayerPeerToHostRequirements requirements ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetPeerToHostRequirements(std::move(requirements)); } +CATCH_RETURN() STDAPI XblMultiplayerSessionConstantsSetMeasurementServerAddressesJson( _In_ XblMultiplayerSessionHandle session, _In_ const char* measurementServerAddressesJson ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(session == nullptr || measurementServerAddressesJson == nullptr); return session->SetMeasurementServerAddresses(measurementServerAddressesJson); } +CATCH_RETURN() STDAPI XblMultiplayerSessionConstantsSetCapabilities( _In_ XblMultiplayerSessionHandle session, _In_ XblMultiplayerSessionCapabilities capabilities ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetSessionCapabilities(std::move(capabilities)); } +CATCH_RETURN() STDAPI XblMultiplayerSessionConstantsSetCloudComputePackageJson( _In_ XblMultiplayerSessionHandle session, _In_ const char* sessionCloudComputePackageConstantsJson ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetCloudComputePackageJson(sessionCloudComputePackageConstantsJson); } +CATCH_RETURN() STDAPI_(const XblMultiplayerSessionProperties*) XblMultiplayerSessionSessionProperties( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2719,21 +2762,25 @@ STDAPI_(const XblMultiplayerSessionProperties*) XblMultiplayerSessionSessionProp return &session->SessionPropertiesUnsafe(); } +CATCH_RETURN_WITH(nullptr) STDAPI XblMultiplayerSessionPropertiesSetKeywords( _In_ XblMultiplayerSessionHandle session, _In_ const char** keywords, _In_ size_t keywordsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetKeywords(keywords, keywordsCount); } +CATCH_RETURN() STDAPI_(void) XblMultiplayerSessionPropertiesSetJoinRestriction( _In_ XblMultiplayerSessionHandle session, _In_ XblMultiplayerSessionRestriction joinRestriction ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2742,11 +2789,13 @@ STDAPI_(void) XblMultiplayerSessionPropertiesSetJoinRestriction( session->SetJoinRestriction(joinRestriction); } +CATCH_RETURN_WITH(;) STDAPI_(void) XblMultiplayerSessionPropertiesSetReadRestriction( _In_ XblMultiplayerSessionHandle session, _In_ XblMultiplayerSessionRestriction readRestriction ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2755,22 +2804,26 @@ STDAPI_(void) XblMultiplayerSessionPropertiesSetReadRestriction( session->SetReadRestriction(readRestriction); } +CATCH_RETURN_WITH(;) STDAPI XblMultiplayerSessionPropertiesSetTurnCollection( _In_ XblMultiplayerSessionHandle session, _In_ const uint32_t* turnCollectionMemberIds, _In_ size_t turnCollectionMemberIdsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetTurnCollection(xsapi_internal_vector(turnCollectionMemberIds, turnCollectionMemberIds + turnCollectionMemberIdsCount)); } +CATCH_RETURN() STDAPI XblMultiplayerSessionRoleTypes( _In_ XblMultiplayerSessionHandle session, _Out_ const XblMultiplayerRoleType** roleTypes, _Out_ size_t* roleTypesCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF(roleTypes == nullptr || roleTypesCount == nullptr); @@ -2779,6 +2832,7 @@ STDAPI XblMultiplayerSessionRoleTypes( *roleTypesCount = session->RoleTypesUnsafe().Values().size(); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSessionGetRoleByName( _In_ XblMultiplayerSessionHandle session, @@ -2786,12 +2840,14 @@ STDAPI XblMultiplayerSessionGetRoleByName( _In_z_ const char* roleName, _Out_ const XblMultiplayerRole** role ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF(roleTypeName == nullptr || roleName == nullptr || role == nullptr); *role = session->RoleTypesUnsafe().GetRole(roleTypeName, roleName); return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSessionSetMutableRoleSettings( _In_ XblMultiplayerSessionHandle session, @@ -2800,17 +2856,20 @@ STDAPI XblMultiplayerSessionSetMutableRoleSettings( _In_opt_ uint32_t* maxMemberCount, _In_opt_ uint32_t* targetMemberCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF(roleTypeName == nullptr || roleName == nullptr); return session->SetMutableRoleSettings(roleTypeName, roleName, maxMemberCount, targetMemberCount); } +CATCH_RETURN() STDAPI XblMultiplayerSessionMembers( _In_ XblMultiplayerSessionHandle session, _Out_ const XblMultiplayerSessionMember** members, _Out_ size_t* membersCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF(members == nullptr || membersCount == nullptr); @@ -2819,11 +2878,13 @@ STDAPI XblMultiplayerSessionMembers( *membersCount = session->MembersUnsafe().size(); return S_OK; } +CATCH_RETURN() STDAPI_(const XblMultiplayerSessionMember*) XblMultiplayerSessionGetMember( _In_ XblMultiplayerSessionHandle session, _In_ uint32_t memberId ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2841,10 +2902,12 @@ STDAPI_(const XblMultiplayerSessionMember*) XblMultiplayerSessionGetMember( } return nullptr; } +CATCH_RETURN_WITH(nullptr) STDAPI_(const XblMultiplayerMatchmakingServer*) XblMultiplayerSessionMatchmakingServer( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2853,16 +2916,19 @@ STDAPI_(const XblMultiplayerMatchmakingServer*) XblMultiplayerSessionMatchmaking return session->MatchmakingServer().get(); } +CATCH_RETURN_WITH(nullptr) XBL_WARNING_PUSH XBL_WARNING_DISABLE_DEPRECATED STDAPI_(const XblMultiplayerTournamentsServer*) XblMultiplayerSessionTournamentsServer( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { UNREFERENCED_PARAMETER(session); return nullptr; } +CATCH_RETURN_WITH(nullptr) XBL_WARNING_POP XBL_WARNING_PUSH @@ -2870,15 +2936,18 @@ XBL_WARNING_DISABLE_DEPRECATED STDAPI_(const XblMultiplayerArbitrationServer*) XblMultiplayerSessionArbitrationServer( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { UNREFERENCED_PARAMETER(session); return nullptr; } +CATCH_RETURN_WITH(nullptr) XBL_WARNING_POP STDAPI_(uint32_t) XblMultiplayerSessionMembersAccepted( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2887,10 +2956,12 @@ STDAPI_(uint32_t) XblMultiplayerSessionMembersAccepted( return session->MembersAccepted(); } +CATCH_RETURN() STDAPI_(const char*) XblMultiplayerSessionRawServersJson( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2899,19 +2970,23 @@ STDAPI_(const char*) XblMultiplayerSessionRawServersJson( return session->RawServersJsonUnsafe().data(); } +CATCH_RETURN_WITH(nullptr) STDAPI XblMultiplayerSessionSetRawServersJson( _In_ XblMultiplayerSessionHandle session, _In_z_ const char* rawServersJson ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetServersJson(rawServersJson); } +CATCH_RETURN() STDAPI_(const char*) XblMultiplayerSessionEtag( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2920,10 +2995,12 @@ STDAPI_(const char*) XblMultiplayerSessionEtag( return session->ETagUnsafe().data(); } +CATCH_RETURN_WITH(nullptr) STDAPI_(const XblMultiplayerSessionMember*) XblMultiplayerSessionCurrentUser( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2932,10 +3009,12 @@ STDAPI_(const XblMultiplayerSessionMember*) XblMultiplayerSessionCurrentUser( return session->CurrentUserUnsafe(); } +CATCH_RETURN_WITH(nullptr) STDAPI_(const XblMultiplayerSessionInfo*) XblMultiplayerSessionGetInfo( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2944,10 +3023,12 @@ STDAPI_(const XblMultiplayerSessionInfo*) XblMultiplayerSessionGetInfo( return &session->SessionInfo(); } +CATCH_RETURN_WITH(nullptr) STDAPI_(XblWriteSessionStatus) XblMultiplayerSessionWriteStatus( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2959,6 +3040,7 @@ STDAPI_(XblWriteSessionStatus) XblMultiplayerSessionWriteStatus( return session->WriteStatus(); } } +CATCH_RETURN_WITH(XblWriteSessionStatus::Unknown) STDAPI XblMultiplayerSessionAddMemberReservation( _In_ XblMultiplayerSessionHandle session, @@ -2966,10 +3048,12 @@ STDAPI XblMultiplayerSessionAddMemberReservation( _In_opt_z_ const char* memberCustomConstantsJson, _In_ bool initializeRequested ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->AddMemberReservation(xuid, memberCustomConstantsJson, initializeRequested); } +CATCH_RETURN() STDAPI XblMultiplayerSessionJoin( _In_ XblMultiplayerSessionHandle session, @@ -2977,15 +3061,18 @@ STDAPI XblMultiplayerSessionJoin( _In_ bool initializeRequested, _In_ bool joinWithActiveStatus ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->Join(memberCustomConstantsJson, initializeRequested, joinWithActiveStatus); } +CATCH_RETURN() STDAPI_(void) XblMultiplayerSessionSetInitializationSucceeded( _In_ XblMultiplayerSessionHandle session, _In_ bool initializationSucceeded ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -2994,11 +3081,13 @@ STDAPI_(void) XblMultiplayerSessionSetInitializationSucceeded( session->SetInitializationStatus(initializationSucceeded); } +CATCH_RETURN_WITH(;) STDAPI_(void) XblMultiplayerSessionSetHostDeviceToken( _In_ XblMultiplayerSessionHandle session, _In_ XblDeviceToken hostDeviceToken ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -3007,11 +3096,13 @@ STDAPI_(void) XblMultiplayerSessionSetHostDeviceToken( session->SetHostDeviceToken(hostDeviceToken); } +CATCH_RETURN_WITH(;) STDAPI_(void) XblMultiplayerSessionSetMatchmakingServerConnectionPath( _In_ XblMultiplayerSessionHandle session, _In_z_ const char* serverConnectionPath ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -3020,11 +3111,13 @@ STDAPI_(void) XblMultiplayerSessionSetMatchmakingServerConnectionPath( return session->SetMatchmakingServerConnectionPath(serverConnectionPath); } +CATCH_RETURN_WITH(;) STDAPI_(void) XblMultiplayerSessionSetClosed( _In_ XblMultiplayerSessionHandle session, _In_ bool closed ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -3033,11 +3126,13 @@ STDAPI_(void) XblMultiplayerSessionSetClosed( session->SetClosed(closed); } +CATCH_RETURN_WITH(;) STDAPI_(void) XblMultiplayerSessionSetLocked( _In_ XblMultiplayerSessionHandle session, _In_ bool locked ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -3046,11 +3141,13 @@ STDAPI_(void) XblMultiplayerSessionSetLocked( session->SetLocked(locked); } +CATCH_RETURN_WITH(;) STDAPI_(void) XblMultiplayerSessionSetAllocateCloudCompute( _In_ XblMultiplayerSessionHandle session, _In_ bool allocateCloudCompute ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -3059,11 +3156,13 @@ STDAPI_(void) XblMultiplayerSessionSetAllocateCloudCompute( session->SetAllocateCloudCompute(allocateCloudCompute); } +CATCH_RETURN_WITH(;) STDAPI_(void) XblMultiplayerSessionSetMatchmakingResubmit( _In_ XblMultiplayerSessionHandle session, _In_ bool matchResubmit ) XBL_NOEXCEPT +try { if (session == nullptr) { @@ -3072,57 +3171,69 @@ STDAPI_(void) XblMultiplayerSessionSetMatchmakingResubmit( session->SetMatchmakingResubmit(matchResubmit); } +CATCH_RETURN_WITH(;) STDAPI XblMultiplayerSessionSetServerConnectionStringCandidates( _In_ XblMultiplayerSessionHandle session, _In_reads_(serverConnectionStringCandidatesCount) const char** serverConnectionStringCandidates, _In_ size_t serverConnectionStringCandidatesCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetServerConnectionStringCandidates(serverConnectionStringCandidates, serverConnectionStringCandidatesCount); } +CATCH_RETURN() STDAPI XblMultiplayerSessionSetSessionChangeSubscription( _In_ XblMultiplayerSessionHandle session, _In_ XblMultiplayerSessionChangeTypes changeTypes ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetSessionChangeSubscription(changeTypes); } +CATCH_RETURN() STDAPI XblMultiplayerSessionLeave( _In_ XblMultiplayerSessionHandle session ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->Leave(); } +CATCH_RETURN() STDAPI XblMultiplayerSessionCurrentUserSetStatus( _In_ XblMultiplayerSessionHandle session, _In_ XblMultiplayerSessionMemberStatus status ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetCurrentUserStatus(status); } +CATCH_RETURN() STDAPI XblMultiplayerSessionCurrentUserSetSecureDeviceAddressBase64( _In_ XblMultiplayerSessionHandle session, _In_ const char* value ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); return session->SetCurrentUserSecureDeviceAddressBase64(value); } +CATCH_RETURN() #if HC_PLATFORM != HC_PLATFORM_XDK && HC_PLATFORM != HC_PLATFORM_UWP STDAPI XblFormatSecureDeviceAddress( _In_ const char* deviceId, _Inout_ XblFormattedSecureDeviceAddress* address ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(address); RETURN_HR_INVALIDARGUMENT_IF_NULL(deviceId); @@ -3132,6 +3243,7 @@ STDAPI XblFormatSecureDeviceAddress( utils::strcpy(address->value, sizeof(address->value), sda.c_str()); return S_OK; } +CATCH_RETURN() #endif STDAPI XblMultiplayerSessionCurrentUserSetRoles( @@ -3139,70 +3251,83 @@ STDAPI XblMultiplayerSessionCurrentUserSetRoles( _In_ const XblMultiplayerSessionMemberRole* roles, _In_ size_t rolesCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF_NULL(roles); return session->SetCurrentUserRoleInfo(xsapi_internal_vector(roles, roles + rolesCount)); } +CATCH_RETURN() STDAPI XblMultiplayerSessionCurrentUserSetMembersInGroup( _In_ XblMultiplayerSessionHandle session, _In_reads_(memberIdsCount) uint32_t* memberIds, _In_ size_t memberIdsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF_NULL(memberIds); return session->SetCurrentUserMembersInGroup(xsapi_internal_vector(memberIds, memberIds + memberIdsCount)); } +CATCH_RETURN() STDAPI XblMultiplayerSessionCurrentUserSetGroups( _In_ XblMultiplayerSessionHandle session, _In_reads_(groupsCount) const char** groups, _In_ size_t groupsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF_NULL(groups); return session->SetCurrentUserGroups(groups, groupsCount); } +CATCH_RETURN() STDAPI XblMultiplayerSessionCurrentUserSetEncounters( _In_ XblMultiplayerSessionHandle session, _In_reads_(encountersCount) const char** encounters, _In_ size_t encountersCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF_NULL(encounters); return session->SetCurrentUserEncounters(encounters, encountersCount); } +CATCH_RETURN() STDAPI XblMultiplayerSessionCurrentUserSetQosMeasurements( _In_ XblMultiplayerSessionHandle session, _In_z_ const char* measurements ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF_NULL(measurements); return session->SetCurrentUserQosMeasurementsJson(measurements); } +CATCH_RETURN() STDAPI XblMultiplayerSessionCurrentUserSetServerQosMeasurements( _In_ XblMultiplayerSessionHandle session, _In_z_ const char* measurements ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF_NULL(measurements); return session->SetCurrentUserServerMeasurementsJson(measurements); } +CATCH_RETURN() STDAPI XblMultiplayerSessionCurrentUserSetCustomPropertyJson( _In_ XblMultiplayerSessionHandle session, _In_z_ const char* name, _In_z_ const char* valueJson ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF(name == nullptr || valueJson == nullptr); @@ -3215,31 +3340,37 @@ STDAPI XblMultiplayerSessionCurrentUserSetCustomPropertyJson( } return hr; } +CATCH_RETURN() STDAPI XblMultiplayerSessionCurrentUserDeleteCustomPropertyJson( _In_ XblMultiplayerSessionHandle session, _In_z_ const char* name ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF_NULL(name); return session->DeleteCurrentUserMemberCustomPropertyJson(name); } +CATCH_RETURN() STDAPI XblMultiplayerSessionSetMatchmakingTargetSessionConstantsJson( _In_ XblMultiplayerSessionHandle session, _In_ const char* matchmakingTargetSessionConstantsJson ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(session == nullptr || matchmakingTargetSessionConstantsJson == nullptr); return session->SetMatchmakingTargetSessionConstantsJson(matchmakingTargetSessionConstantsJson); } +CATCH_RETURN() STDAPI XblMultiplayerSessionSetCustomPropertyJson( _In_ XblMultiplayerSessionHandle session, _In_z_ const char* name, _In_z_ const char* valueJson ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF(name == nullptr || valueJson == nullptr); @@ -3252,21 +3383,25 @@ STDAPI XblMultiplayerSessionSetCustomPropertyJson( } return hr; } +CATCH_RETURN() STDAPI XblMultiplayerSessionDeleteCustomPropertyJson( _In_ XblMultiplayerSessionHandle session, _In_z_ const char* name ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(session); RETURN_HR_INVALIDARGUMENT_IF_NULL(name); return session->DeleteSessionCustomPropertyJson(name); } +CATCH_RETURN() STDAPI_(XblMultiplayerSessionChangeTypes) XblMultiplayerSessionCompare( _In_ XblMultiplayerSessionHandle currentSessionHandle, _In_ XblMultiplayerSessionHandle oldSessionHandle ) XBL_NOEXCEPT +try { if (currentSessionHandle == nullptr || oldSessionHandle == nullptr) { @@ -3274,3 +3409,4 @@ STDAPI_(XblMultiplayerSessionChangeTypes) XblMultiplayerSessionCompare( } return currentSessionHandle->CompareMultiplayerSessions(oldSessionHandle->shared_from_this()); } +CATCH_RETURN_WITH(XblMultiplayerSessionChangeTypes::None) diff --git a/Source/Services/Multiplayer/multiplayer_session_member.cpp b/Source/Services/Multiplayer/multiplayer_session_member.cpp index ca0964a9..2182c414 100644 --- a/Source/Services/Multiplayer/multiplayer_session_member.cpp +++ b/Source/Services/Multiplayer/multiplayer_session_member.cpp @@ -438,6 +438,16 @@ Result MultiplayerSessionMember::Deserialize( RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonVector(JsonUtils::JsonStringExtractor, propertiesSystemSubscriptionJson, "changeTypes", changeTypes, false)); returnResultInternal->m_subscribedChangeTypes = Serializers::MultiplayerSessionChangeTypesFromStringVector(changeTypes); } + + if (propertiesSystemJson.IsObject() && propertiesSystemJson.HasMember("groups")) + { + RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonVector(JsonUtils::JsonUtf8Extractor, propertiesSystemJson, "groups", returnResultInternal->m_groups, false)); + } + + if (propertiesSystemJson.IsObject() && propertiesSystemJson.HasMember("encounters")) + { + RETURN_HR_IF_FAILED(JsonUtils::ExtractJsonVector(JsonUtils::JsonUtf8Extractor, propertiesSystemJson, "encounters", returnResultInternal->m_encounters, false)); + } } else { @@ -456,6 +466,10 @@ Result MultiplayerSessionMember::Deserialize( returnResult.QosMeasurementsJson = returnResultInternal->m_qosMeasurementsJson.data(); returnResult.MembersInGroupIds = returnResultInternal->m_membersInGroupIds.data(); returnResult.MembersInGroupCount = static_cast(returnResultInternal->m_membersInGroupIds.size()); + returnResult.Groups = returnResultInternal->m_groups.data(); + returnResult.GroupsCount = static_cast(returnResultInternal->m_groups.size()); + returnResult.Encounters = returnResultInternal->m_encounters.data(); + returnResult.EncountersCount = static_cast(returnResultInternal->m_encounters.size()); returnResult.CustomPropertiesJson = returnResultInternal->m_customPropertiesString.data(); if (active) diff --git a/Source/Services/Multiplayer/multiplayer_session_reference.cpp b/Source/Services/Multiplayer/multiplayer_session_reference.cpp index 05ec047b..931a25a9 100644 --- a/Source/Services/Multiplayer/multiplayer_session_reference.cpp +++ b/Source/Services/Multiplayer/multiplayer_session_reference.cpp @@ -13,6 +13,7 @@ STDAPI XblMultiplayerSessionReferenceParseFromUriPath( _In_ const char* path, _Out_ XblMultiplayerSessionReference* ref ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(ref); @@ -32,11 +33,13 @@ STDAPI XblMultiplayerSessionReferenceParseFromUriPath( return S_OK; } +CATCH_RETURN() STDAPI XblMultiplayerSessionReferenceToUriPath( _In_ const XblMultiplayerSessionReference* sessionReference, _Out_ XblMultiplayerSessionReferenceUri* sessionReferenceUri ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(sessionReference == nullptr || sessionReferenceUri == nullptr); @@ -53,6 +56,7 @@ STDAPI XblMultiplayerSessionReferenceToUriPath( return S_OK; } +CATCH_RETURN() /// /// Checks whether an XblMultiplayerSessionReference is well formed. It is considered well formed if none of the @@ -61,6 +65,7 @@ STDAPI XblMultiplayerSessionReferenceToUriPath( STDAPI_(bool) XblMultiplayerSessionReferenceIsValid( _In_ const XblMultiplayerSessionReference* sessionReference ) XBL_NOEXCEPT +try { if (sessionReference == nullptr) { @@ -68,6 +73,7 @@ STDAPI_(bool) XblMultiplayerSessionReferenceIsValid( } return sessionReference->Scid[0] != 0 && sessionReference->SessionTemplateName[0] != 0 && sessionReference->SessionName[0] != 0; } +CATCH_RETURN() /// /// Creates an XblMultiplayerSessionReference from a scid, session template name, and session name. @@ -77,6 +83,7 @@ STDAPI_(XblMultiplayerSessionReference) XblMultiplayerSessionReferenceCreate( _In_z_ const char* sessionTemplateName, _In_z_ const char* sessionName ) XBL_NOEXCEPT +try { XblMultiplayerSessionReference out{}; if (scid != nullptr) @@ -93,6 +100,7 @@ STDAPI_(XblMultiplayerSessionReference) XblMultiplayerSessionReferenceCreate( } return out; } +CATCH_RETURN_WITH({}) NAMESPACE_MICROSOFT_XBOX_SERVICES_MULTIPLAYER_CPP_BEGIN diff --git a/Source/Services/MultiplayerActivity/multiplayer_activity_api.cpp b/Source/Services/MultiplayerActivity/multiplayer_activity_api.cpp index 6d47df35..81ab1786 100644 --- a/Source/Services/MultiplayerActivity/multiplayer_activity_api.cpp +++ b/Source/Services/MultiplayerActivity/multiplayer_activity_api.cpp @@ -19,15 +19,18 @@ STDAPI XblMultiplayerActivityUpdateRecentPlayers( _In_reads_(updatesCount) const XblMultiplayerActivityRecentPlayerUpdate* updates, _In_ size_t updatesCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr); return xblContextHandle->MultiplayerActivityService()->UpdateRecentPlayers(updates, updatesCount); } +CATCH_RETURN() STDAPI XblMultiplayerActivityFlushRecentPlayersAsync( _In_ XblContextHandle xblContextHandle, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr); @@ -51,6 +54,7 @@ STDAPI XblMultiplayerActivityFlushRecentPlayersAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerActivitySetActivityAsync( _In_ XblContextHandle xblContextHandle, @@ -58,6 +62,7 @@ STDAPI XblMultiplayerActivitySetActivityAsync( _In_ bool allowCrossPlatformJoin, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || activityInfo == nullptr || activityInfo->connectionString == nullptr); @@ -83,6 +88,7 @@ STDAPI XblMultiplayerActivitySetActivityAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerActivityGetActivityAsync( _In_ XblContextHandle xblContextHandle, @@ -90,6 +96,7 @@ STDAPI XblMultiplayerActivityGetActivityAsync( _In_ size_t xuidsCount, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || xuidsPtr == nullptr || xuidsCount == 0); @@ -190,14 +197,17 @@ STDAPI XblMultiplayerActivityGetActivityAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerActivityGetActivityResultSize( _In_ XAsyncBlock* async, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(async, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblMultiplayerActivityGetActivityResult( _In_ XAsyncBlock* async, @@ -207,6 +217,7 @@ STDAPI XblMultiplayerActivityGetActivityResult( _Out_ size_t* resultCount, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(results == nullptr || resultCount == nullptr); @@ -219,11 +230,13 @@ STDAPI XblMultiplayerActivityGetActivityResult( } return hr; } +CATCH_RETURN() STDAPI XblMultiplayerActivityDeleteActivityAsync( _In_ XblContextHandle xblContextHandle, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xblContextHandle); @@ -247,6 +260,7 @@ STDAPI XblMultiplayerActivityDeleteActivityAsync( } }); } +CATCH_RETURN() STDAPI XblMultiplayerActivitySendInvitesAsync( _In_ XblContextHandle xblContextHandle, @@ -256,6 +270,7 @@ STDAPI XblMultiplayerActivitySendInvitesAsync( _In_opt_z_ const char* _connectionString, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || xuidsPtr == nullptr || xuidsCount == 0); @@ -282,6 +297,7 @@ STDAPI XblMultiplayerActivitySendInvitesAsync( } }); } +CATCH_RETURN() #if (HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM_IS_EXTERNAL) && !XSAPI_UNIT_TESTS STDAPI_(XblFunctionContext) XblMultiplayerActivityAddInviteHandler( @@ -289,6 +305,7 @@ STDAPI_(XblFunctionContext) XblMultiplayerActivityAddInviteHandler( _In_ XblMultiplayerActivityInviteHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { if (xblContext == nullptr || handler == nullptr) { @@ -313,15 +330,18 @@ STDAPI_(XblFunctionContext) XblMultiplayerActivityAddInviteHandler( } }); } +CATCH_RETURN() STDAPI XblMultiplayerActivityRemoveInviteHandler( _In_ XblContextHandle xblContext, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xblContext); auto rtaNotificationService = std::dynamic_pointer_cast(xblContext->NotificationService()); rtaNotificationService->RemoveNotificationHandler(token); return S_OK; } +CATCH_RETURN() #endif diff --git a/Source/Services/MultiplayerActivity/multiplayer_activity_internal.h b/Source/Services/MultiplayerActivity/multiplayer_activity_internal.h index 2e3cc5d8..b1c6176c 100644 --- a/Source/Services/MultiplayerActivity/multiplayer_activity_internal.h +++ b/Source/Services/MultiplayerActivity/multiplayer_activity_internal.h @@ -79,6 +79,7 @@ class MultiplayerActivityService : public std::enable_shared_from_this m_pendingRecentPlayerUpdates{}; bool m_recentPlayersUpdateScheduled{ false }; + static uint64_t GetSequenceNumber(); void ScheduleRecentPlayersUpdate() noexcept; static XblMultiplayerActivityPlatform GetLocalPlatform() noexcept; diff --git a/Source/Services/MultiplayerActivity/multiplayer_activity_service.cpp b/Source/Services/MultiplayerActivity/multiplayer_activity_service.cpp index 13253a3d..0c7540a7 100644 --- a/Source/Services/MultiplayerActivity/multiplayer_activity_service.cpp +++ b/Source/Services/MultiplayerActivity/multiplayer_activity_service.cpp @@ -206,6 +206,22 @@ HRESULT MultiplayerActivityService::FlushRecentPlayers( return S_OK; } +uint64_t MultiplayerActivityService::GetSequenceNumber() +{ + uint64_t dateTime = xbox::services::datetime::utc_now().to_interval(); // eg. 131472330440000000 + const uint64_t dateTimeFromJan1st2015 = 130645440000000000; + if (dateTime < dateTimeFromJan1st2015) + { + return static_cast(time(nullptr)); // Clock is wrong and is not yet sync'd with internet time so just revert to old logic + } + else + { + uint64_t dateTimeSince2015 = dateTime - dateTimeFromJan1st2015; // eg. 826888900000000 + uint64_t dateTimeTrimmed = dateTimeSince2015 >> 16; // divide by 2^16 to get it to sub second range. eg. 12617323303 + return dateTimeTrimmed; + } +} + HRESULT MultiplayerActivityService::SetActivity( _In_ const ActivityInfo& info, _In_ bool allowCrossPlatformJoin, @@ -218,7 +234,7 @@ HRESULT MultiplayerActivityService::SetActivity( JsonDocument requestBody{ rapidjson::kObjectType }; auto& a{ requestBody.GetAllocator() }; - requestBody.AddMember("sequenceNumber", static_cast(time(nullptr)), a); + requestBody.AddMember("sequenceNumber", GetSequenceNumber(), a); requestBody.AddMember("connectionString", JsonValue{ info.connectionString.data(), a }, a); requestBody.AddMember("joinRestriction", JsonValue{ EnumName(info.joinRestriction).data(), a }, a); if (info.maxPlayers) @@ -320,7 +336,7 @@ HRESULT MultiplayerActivityService::DeleteActivity( JsonDocument requestBody{ rapidjson::kObjectType }; auto& a{ requestBody.GetAllocator() }; - requestBody.AddMember("sequenceNumber", static_cast(time(nullptr)), a); + requestBody.AddMember("sequenceNumber", GetSequenceNumber(), a); Result userResult = m_user.Copy(); RETURN_HR_IF_FAILED(userResult.Hresult()); diff --git a/Source/Services/Notification/notification_api.cpp b/Source/Services/Notification/notification_api.cpp index a7d37a37..e8c57d55 100644 --- a/Source/Services/Notification/notification_api.cpp +++ b/Source/Services/Notification/notification_api.cpp @@ -15,6 +15,7 @@ STDAPI XblNotificationSubscribeToNotificationsAsync( _In_ XAsyncBlock* asyncBlock, _In_ const char* registrationToken ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(registrationToken == nullptr || strlen(registrationToken) <= 1); RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); @@ -54,6 +55,7 @@ STDAPI XblNotificationSubscribeToNotificationsAsync( } }); } +CATCH_RETURN() /// /// Unsubscribes title from push notifications. @@ -62,6 +64,7 @@ STDAPI XblNotificationUnsubscribeFromNotificationsAsync( _In_ XblContextHandle xboxLiveContext, _In_ XAsyncBlock* asyncBlock ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); RETURN_HR_INVALIDARGUMENT_IF_NULL(asyncBlock); @@ -98,11 +101,15 @@ STDAPI XblNotificationUnsubscribeFromNotificationsAsync( } }); } +CATCH_RETURN() + #elif HC_PLATFORM == HC_PLATFORM_UWP + STDAPI XblNotificationSubscribeToNotificationsAsync( _In_ XblContextHandle xboxLiveContext, _In_ XAsyncBlock* asyncBlock ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); RETURN_HR_INVALIDARGUMENT_IF_NULL(asyncBlock); @@ -138,6 +145,7 @@ STDAPI XblNotificationSubscribeToNotificationsAsync( } }); } +CATCH_RETURN() /// /// Ubsubscribes title from push notifications. @@ -146,6 +154,7 @@ STDAPI XblNotificationUnsubscribeFromNotificationsAsync( _In_ XblContextHandle xboxLiveContext, _In_ XAsyncBlock* asyncBlock ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); RETURN_HR_INVALIDARGUMENT_IF_NULL(asyncBlock); @@ -182,11 +191,15 @@ STDAPI XblNotificationUnsubscribeFromNotificationsAsync( } }); } +CATCH_RETURN() + #elif HC_PLATFORM == HC_PLATFORM_WIN32 || HC_PLATFORM_IS_EXTERNAL + STDAPI XblGameInviteRegisterForEventAsync( _In_ XblContextHandle xboxLiveContext, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); RETURN_HR_INVALIDARGUMENT_IF_NULL(async); @@ -215,11 +228,13 @@ STDAPI XblGameInviteRegisterForEventAsync( } }); } +CATCH_RETURN() STDAPI XblGameInviteRegisterForEventResult( _In_ XAsyncBlock* async, _Out_ XblRealTimeActivitySubscriptionHandle* handle ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(async); RETURN_HR_INVALIDARGUMENT_IF_NULL(handle); @@ -238,12 +253,14 @@ STDAPI XblGameInviteRegisterForEventResult( return hr; } +CATCH_RETURN() STDAPI XblGameInviteUnregisterForEventAsync( _In_ XblContextHandle xblContextHandle, _In_ XblRealTimeActivitySubscriptionHandle subscriptionHandle, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || subscriptionHandle == nullptr); @@ -266,12 +283,14 @@ STDAPI XblGameInviteUnregisterForEventAsync( } }); } +CATCH_RETURN() STDAPI_(XblFunctionContext) XblGameInviteAddNotificationHandler( _In_ XblContextHandle xblContextHandle, _In_ XblGameInviteHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { // TODO really should be returning HRESULT E_INVALIDARG here if (xblContextHandle == nullptr || handler == nullptr) @@ -297,11 +316,13 @@ STDAPI_(XblFunctionContext) XblGameInviteAddNotificationHandler( } }); } +CATCH_RETURN() STDAPI_(void) XblGameInviteRemoveNotificationHandler( _In_ XblContextHandle xblContextHandle, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { if (xblContextHandle) { @@ -309,13 +330,14 @@ STDAPI_(void) XblGameInviteRemoveNotificationHandler( rtaNotificationService->RemoveNotificationHandler(token); } } - +CATCH_RETURN_WITH(;) STDAPI_(XblFunctionContext) XblAchievementUnlockAddNotificationHandler( _In_ XblContextHandle xblContextHandle, _In_ XblAchievementUnlockHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { // TODO really should be returning HRESULT E_INVALIDARG here if (xblContextHandle == nullptr || handler == nullptr) @@ -338,16 +360,17 @@ STDAPI_(XblFunctionContext) XblAchievementUnlockAddNotificationHandler( } }); } - +CATCH_RETURN() STDAPI_(void) XblAchievementUnlockRemoveNotificationHandler( _In_ XblContextHandle xblContextHandle, _In_ XblFunctionContext functionContext ) XBL_NOEXCEPT +try { auto rtaNotificationService = std::dynamic_pointer_cast(xblContextHandle->NotificationService()); rtaNotificationService->RemoveNotificationHandler(functionContext); } - +CATCH_RETURN_WITH(;) #endif diff --git a/Source/Services/Presence/presence_api.cpp b/Source/Services/Presence/presence_api.cpp index 9b35bae6..d08be219 100644 --- a/Source/Services/Presence/presence_api.cpp +++ b/Source/Services/Presence/presence_api.cpp @@ -14,27 +14,32 @@ STDAPI XblPresenceRecordGetXuid( _In_ XblPresenceRecordHandle record, _Out_ uint64_t* xuid ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(record == nullptr || xuid == nullptr); *xuid = record->Xuid(); return S_OK; } +CATCH_RETURN() STDAPI XblPresenceRecordGetUserState( _In_ XblPresenceRecordHandle record, _Out_ XblPresenceUserState* userState ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(record == nullptr || userState == nullptr); *userState = record->UserState(); return S_OK; } +CATCH_RETURN() STDAPI XblPresenceRecordGetDeviceRecords( _In_ XblPresenceRecordHandle record, _Out_ const XblPresenceDeviceRecord** deviceRecords, _Out_ size_t* deviceRecordsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(record == nullptr || deviceRecords == nullptr || deviceRecordsCount == nullptr); @@ -42,11 +47,13 @@ STDAPI XblPresenceRecordGetDeviceRecords( *deviceRecordsCount = record->DeviceRecords().size(); return S_OK; } +CATCH_RETURN() STDAPI XblPresenceRecordDuplicateHandle( _In_ XblPresenceRecordHandle record, _Out_ XblPresenceRecordHandle* duplicatedHandle ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(record == nullptr || duplicatedHandle == nullptr); @@ -55,16 +62,19 @@ STDAPI XblPresenceRecordDuplicateHandle( return S_OK; } +CATCH_RETURN() STDAPI_(void) XblPresenceRecordCloseHandle( _In_ XblPresenceRecordHandle record ) XBL_NOEXCEPT +try { if (record) { record->DecRef(); } } +CATCH_RETURN_WITH(;) STDAPI XblPresenceSetPresenceAsync( _In_ XblContextHandle xblContextHandle, @@ -72,6 +82,7 @@ STDAPI XblPresenceSetPresenceAsync( _In_opt_ XblPresenceRichPresenceIds* richPresenceIds, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || async == nullptr); VERIFY_XBL_INITIALIZED(); @@ -100,12 +111,14 @@ STDAPI XblPresenceSetPresenceAsync( } // end switch }); } +CATCH_RETURN() STDAPI XblPresenceGetPresenceAsync( _In_ XblContextHandle xblContextHandle, _In_ uint64_t xuid, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || async == nullptr); VERIFY_XBL_INITIALIZED(); @@ -154,20 +167,24 @@ STDAPI XblPresenceGetPresenceAsync( } // end switch }); } +CATCH_RETURN() STDAPI XblPresenceGetPresenceResult( _In_ XAsyncBlock* async, _Out_ XblPresenceRecordHandle* presenceRecordHandle ) XBL_NOEXCEPT +try { return XAsyncGetResult(async, nullptr, sizeof(XblPresenceRecordHandle), presenceRecordHandle, nullptr); } +CATCH_RETURN() STDAPI GetBatchPresenceProvider( _In_ XblContextHandle xblContextHandle, _In_ UserBatchRequest&& request, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { return RunAsync(async, __FUNCTION__, [ @@ -216,6 +233,7 @@ STDAPI GetBatchPresenceProvider( } // end switch }); } +CATCH_RETURN() STDAPI XblPresenceGetPresenceForMultipleUsersAsync( _In_ XblContextHandle xblContextHandle, @@ -224,6 +242,7 @@ STDAPI XblPresenceGetPresenceForMultipleUsersAsync( _In_opt_ XblPresenceQueryFilters* filters, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || xuids == nullptr || async == nullptr); VERIFY_XBL_INITIALIZED(); @@ -234,11 +253,13 @@ STDAPI XblPresenceGetPresenceForMultipleUsersAsync( async ); } +CATCH_RETURN() STDAPI XblPresenceGetPresenceForMultipleUsersResultCount( _In_ XAsyncBlock* async, _Out_ size_t* resultCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(resultCount); @@ -251,18 +272,21 @@ STDAPI XblPresenceGetPresenceForMultipleUsersResultCount( } return hr; } +CATCH_RETURN() STDAPI XblPresenceGetPresenceForMultipleUsersResult( _In_ XAsyncBlock* async, _Out_writes_(presenceRecordHandlesCount) XblPresenceRecordHandle* presenceRecordHandles, _In_ size_t presenceRecordHandlesCount ) XBL_NOEXCEPT +try { RETURN_HR_IF(presenceRecordHandlesCount == 0, S_OK); RETURN_HR_INVALIDARGUMENT_IF(presenceRecordHandles == nullptr); return XAsyncGetResult(async, nullptr, sizeof(XblPresenceRecordHandle) * presenceRecordHandlesCount, presenceRecordHandles, nullptr); } +CATCH_RETURN() STDAPI XblPresenceGetPresenceForSocialGroupAsync( _In_ XblContextHandle xblContextHandle, @@ -271,6 +295,7 @@ STDAPI XblPresenceGetPresenceForSocialGroupAsync( _In_opt_ XblPresenceQueryFilters* filters, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || socialGroupName == nullptr || async == nullptr); VERIFY_XBL_INITIALIZED(); @@ -281,23 +306,28 @@ STDAPI XblPresenceGetPresenceForSocialGroupAsync( async ); } +CATCH_RETURN() STDAPI XblPresenceGetPresenceForSocialGroupResultCount( _In_ XAsyncBlock* async, _Out_ size_t* resultCount ) XBL_NOEXCEPT +try { return XblPresenceGetPresenceForMultipleUsersResultCount(async, resultCount); } +CATCH_RETURN() STDAPI XblPresenceGetPresenceForSocialGroupResult( _In_ XAsyncBlock* async, _Out_ XblPresenceRecordHandle* presenceRecordHandles, _In_ size_t presenceRecordHandlesCount ) XBL_NOEXCEPT +try { return XblPresenceGetPresenceForMultipleUsersResult(async, presenceRecordHandles, presenceRecordHandlesCount); } +CATCH_RETURN() namespace xbox { namespace services { @@ -364,6 +394,7 @@ STDAPI XblPresenceSubscribeToDevicePresenceChange( _In_ uint64_t xuid, _Out_ XblRealTimeActivitySubscriptionHandle* subscriptionHandle ) XBL_NOEXCEPT +try { INIT_OUT_PTR_PARAM(subscriptionHandle); RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || subscriptionHandle == nullptr); @@ -371,17 +402,20 @@ STDAPI XblPresenceSubscribeToDevicePresenceChange( *subscriptionHandle = Make(xblContextHandle->PresenceService(), xuid); return S_OK; } +CATCH_RETURN() STDAPI XblPresenceUnsubscribeFromDevicePresenceChange( _In_ XblContextHandle xblContextHandle, _In_ XblRealTimeActivitySubscriptionHandle subscriptionHandle ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || subscriptionHandle == nullptr); Delete(subscriptionHandle); return S_OK; } +CATCH_RETURN() STDAPI XblPresenceSubscribeToTitlePresenceChange( _In_ XblContextHandle xblContextHandle, @@ -389,6 +423,7 @@ STDAPI XblPresenceSubscribeToTitlePresenceChange( _In_ uint32_t titleId, _Out_ XblRealTimeActivitySubscriptionHandle* subscriptionHandle ) XBL_NOEXCEPT +try { INIT_OUT_PTR_PARAM(subscriptionHandle); RETURN_HR_INVALIDARGUMENT_IF(xblContextHandle == nullptr || subscriptionHandle == nullptr); @@ -396,23 +431,27 @@ STDAPI XblPresenceSubscribeToTitlePresenceChange( *subscriptionHandle = Make(xblContextHandle->PresenceService(), xuid, titleId); return S_OK; } +CATCH_RETURN() STDAPI XblPresenceUnsubscribeFromTitlePresenceChange( _In_ XblContextHandle xblContext, _In_ XblRealTimeActivitySubscriptionHandle subscriptionHandle ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContext == nullptr || subscriptionHandle == nullptr); Delete(subscriptionHandle); return S_OK; } +CATCH_RETURN() STDAPI_(XblFunctionContext) XblPresenceAddDevicePresenceChangedHandler( _In_ XblContextHandle xblContext, _In_ XblPresenceDevicePresenceChangedHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { if (xblContext == nullptr || handler == nullptr) { @@ -436,22 +475,26 @@ STDAPI_(XblFunctionContext) XblPresenceAddDevicePresenceChangedHandler( } }); } +CATCH_RETURN() STDAPI XblPresenceRemoveDevicePresenceChangedHandler( _In_ XblContextHandle xblContext, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xblContext); xblContext->PresenceService()->RemoveDevicePresenceChangedHandler(token); return S_OK; } +CATCH_RETURN() STDAPI_(XblFunctionContext) XblPresenceAddTitlePresenceChangedHandler( _In_ XblContextHandle xblContext, _In_ XblPresenceTitlePresenceChangedHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { if (xblContext == nullptr || handler == nullptr) { @@ -475,16 +518,19 @@ STDAPI_(XblFunctionContext) XblPresenceAddTitlePresenceChangedHandler( } }); } +CATCH_RETURN() STDAPI XblPresenceRemoveTitlePresenceChangedHandler( _In_ XblContextHandle xblContext, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xblContext); xblContext->PresenceService()->RemoveTitlePresenceChangedHandler(token); return S_OK; } +CATCH_RETURN() STDAPI XblPresenceTrackUsers( _In_ XblContextHandle xblContext, @@ -503,27 +549,33 @@ STDAPI XblPresenceStopTrackingUsers( _In_ const uint64_t* xuids, _In_ size_t xuidsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContext == nullptr || xuids == nullptr); return xblContext->PresenceService()->StopTrackingUsers(Vector(xuids, xuids + xuidsCount)); } +CATCH_RETURN() STDAPI XblPresenceTrackAdditionalTitles( _In_ XblContextHandle xblContext, _In_ const uint32_t* titleIds, _In_ size_t titleIdsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContext == nullptr || titleIds == nullptr); return xblContext->PresenceService()->TrackAdditionalTitles(Vector(titleIds, titleIds + titleIdsCount)); } +CATCH_RETURN() STDAPI XblPresenceStopTrackingAdditionalTitles( _In_ XblContextHandle xblContext, _In_ const uint32_t* titleIds, _In_ size_t titleIdsCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xblContext == nullptr || titleIds == nullptr); return xblContext->PresenceService()->StopTrackingAdditionalTitles(Vector(titleIds, titleIds + titleIdsCount)); -} \ No newline at end of file +} +CATCH_RETURN() \ No newline at end of file diff --git a/Source/Services/Presence/presence_service.cpp b/Source/Services/Presence/presence_service.cpp index 0f4573b4..a1cabaca 100644 --- a/Source/Services/Presence/presence_service.cpp +++ b/Source/Services/Presence/presence_service.cpp @@ -61,10 +61,11 @@ XblFunctionContext PresenceService::AddTitlePresenceChangedHandler( { for (auto& xuidPair : m_trackedXuids) { - for (auto& titlePair : xuidPair.second.titlePresenceChangedSubscriptions) + for (auto& titlePair : m_trackedTitles) { - titlePair.second = MakeShared(xuidPair.first, titlePair.first, shared_from_this()); - m_rtaManager->AddSubscription(m_user, titlePair.second); + auto sub{ MakeShared(xuidPair.first, titlePair.first, shared_from_this()) }; + xuidPair.second.titlePresenceChangedSubscriptions[titlePair.first] = sub; + m_rtaManager->AddSubscription(m_user, sub); } } } diff --git a/Source/Services/Presence/title_presence_change_subscription.cpp b/Source/Services/Presence/title_presence_change_subscription.cpp index 60bafeed..dab5585b 100644 --- a/Source/Services/Presence/title_presence_change_subscription.cpp +++ b/Source/Services/Presence/title_presence_change_subscription.cpp @@ -55,7 +55,10 @@ void TitlePresenceChangeSubscription::OnEvent( auto presenceService{ m_presenceService.lock() }; if (presenceService && data.IsString()) { - presenceService->HandleTitlePresenceChanged(m_xuid, m_titleId, EnumValue(data.GetString())); + //data is formatted as "state:titleId" + xsapi_internal_string state = data.GetString(); + state = state.substr(0, state.find(':')); + presenceService->HandleTitlePresenceChanged(m_xuid, m_titleId, EnumValue(state.c_str())); } } diff --git a/Source/Services/Privacy/privacy_api.cpp b/Source/Services/Privacy/privacy_api.cpp index c91d4d5e..ea4386dd 100644 --- a/Source/Services/Privacy/privacy_api.cpp +++ b/Source/Services/Privacy/privacy_api.cpp @@ -12,6 +12,7 @@ STDAPI XblPrivacyGetAvoidListAsync( _In_ XblContextHandle xblContextHandle, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xblContextHandle); @@ -56,11 +57,13 @@ STDAPI XblPrivacyGetAvoidListAsync( } }); } +CATCH_RETURN() STDAPI XblPrivacyGetAvoidListResultCount( _In_ XAsyncBlock* async, _Out_ size_t* xuidCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(async == nullptr || xuidCount == nullptr); @@ -70,21 +73,25 @@ STDAPI XblPrivacyGetAvoidListResultCount( return S_OK; } +CATCH_RETURN() STDAPI XblPrivacyGetAvoidListResult( _In_ XAsyncBlock* async, _In_ size_t xuidCount, _Out_writes_(xuidCount) uint64_t* xuids ) XBL_NOEXCEPT +try { RETURN_HR_IF(xuidCount == 0, S_OK); return XAsyncGetResult(async, nullptr, xuidCount * sizeof(uint64_t), xuids, nullptr); } +CATCH_RETURN() HRESULT CopyPermissionCheckResult( const PermissionCheckResult& result, void* buffer ) noexcept +try { auto resultPtr = static_cast(buffer); auto reasonsPtr = reinterpret_cast(resultPtr + 1); @@ -102,6 +109,7 @@ HRESULT CopyPermissionCheckResult( return S_OK; } +CATCH_RETURN() STDAPI XblPrivacyCheckPermissionAsync( _In_ XblContextHandle xblContextHandle, @@ -109,6 +117,7 @@ STDAPI XblPrivacyCheckPermissionAsync( _In_ uint64_t targetXuid, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xblContextHandle); @@ -153,14 +162,17 @@ STDAPI XblPrivacyCheckPermissionAsync( } }); } +CATCH_RETURN() STDAPI XblPrivacyCheckPermissionResultSize( _In_ XAsyncBlock* async, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(async, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblPrivacyCheckPermissionResult( _In_ XAsyncBlock* async, @@ -169,6 +181,7 @@ STDAPI XblPrivacyCheckPermissionResult( _Outptr_ XblPermissionCheckResult** result, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(result); auto hr = XAsyncGetResult(async, nullptr, bufferSize, buffer, bufferUsed); @@ -178,6 +191,7 @@ STDAPI XblPrivacyCheckPermissionResult( } return hr; } +CATCH_RETURN() STDAPI XblPrivacyCheckPermissionForAnonymousUserAsync( _In_ XblContextHandle xblContextHandle, @@ -185,6 +199,7 @@ STDAPI XblPrivacyCheckPermissionForAnonymousUserAsync( _In_ XblAnonymousUserType userType, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xblContextHandle); @@ -229,14 +244,17 @@ STDAPI XblPrivacyCheckPermissionForAnonymousUserAsync( } }); } +CATCH_RETURN() STDAPI XblPrivacyCheckPermissionForAnonymousUserResultSize( _In_ XAsyncBlock* async, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(async, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblPrivacyCheckPermissionForAnonymousUserResult( _In_ XAsyncBlock* async, @@ -245,9 +263,11 @@ STDAPI XblPrivacyCheckPermissionForAnonymousUserResult( _Outptr_ XblPermissionCheckResult** result, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { return XblPrivacyCheckPermissionResult(async, bufferSize, buffer, result, bufferUsed); } +CATCH_RETURN() STDAPI XblPrivacyBatchCheckPermissionAsync( _In_ XblContextHandle xblContextHandle, @@ -259,6 +279,7 @@ STDAPI XblPrivacyBatchCheckPermissionAsync( _In_ size_t userTypesCount, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xblContextHandle); RETURN_HR_INVALIDARGUMENT_IF(permissionsToCheck == nullptr || permissionsCount == 0); @@ -333,14 +354,17 @@ STDAPI XblPrivacyBatchCheckPermissionAsync( } }); } +CATCH_RETURN() STDAPI XblPrivacyBatchCheckPermissionResultSize( _In_ XAsyncBlock* async, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(async, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblPrivacyBatchCheckPermissionResult( _In_ XAsyncBlock* async, @@ -350,6 +374,7 @@ STDAPI XblPrivacyBatchCheckPermissionResult( _Out_ size_t* resultsCount, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(results == nullptr || resultsCount == nullptr); @@ -378,11 +403,13 @@ STDAPI XblPrivacyBatchCheckPermissionResult( } return hr; } +CATCH_RETURN() STDAPI XblPrivacyGetMuteListAsync( _In_ XblContextHandle xblContextHandle, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(xblContextHandle); @@ -427,11 +454,13 @@ STDAPI XblPrivacyGetMuteListAsync( } }); } +CATCH_RETURN() STDAPI XblPrivacyGetMuteListResultCount( _In_ XAsyncBlock* async, _Out_ size_t* xuidCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(async == nullptr || xuidCount == nullptr); @@ -441,13 +470,16 @@ STDAPI XblPrivacyGetMuteListResultCount( return S_OK; } +CATCH_RETURN() STDAPI XblPrivacyGetMuteListResult( _In_ XAsyncBlock* async, _In_ size_t xuidCount, _Out_writes_(xuidCount) uint64_t* xuids ) XBL_NOEXCEPT +try { RETURN_HR_IF(xuidCount == 0, S_OK); return XAsyncGetResult(async, nullptr, xuidCount * sizeof(uint64_t), xuids, nullptr); -} \ No newline at end of file +} +CATCH_RETURN() \ No newline at end of file diff --git a/Source/Services/RealTimeActivityManager/real_time_activity_api.cpp b/Source/Services/RealTimeActivityManager/real_time_activity_api.cpp index 4644c1e0..9cd6d624 100644 --- a/Source/Services/RealTimeActivityManager/real_time_activity_api.cpp +++ b/Source/Services/RealTimeActivityManager/real_time_activity_api.cpp @@ -12,25 +12,30 @@ STDAPI XblRealTimeActivitySubscriptionGetState( _In_ XblRealTimeActivitySubscriptionHandle subscriptionHandle, _Out_ XblRealTimeActivitySubscriptionState* state ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(subscriptionHandle == nullptr || state == nullptr); *state = subscriptionHandle->state; return S_OK; } +CATCH_RETURN() STDAPI XblRealTimeActivitySubscriptionGetId( _In_ XblRealTimeActivitySubscriptionHandle subscriptionHandle, _Out_ uint32_t* id ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(subscriptionHandle == nullptr || id == nullptr); *id = subscriptionHandle->id; return S_OK; } +CATCH_RETURN() STDAPI XblRealTimeActivityActivate( _In_ XblContextHandle xboxLiveContext ) XBL_NOEXCEPT +try { LOGS_DEBUG << __FUNCTION__; if (auto state{ GlobalState::Get() }) @@ -39,10 +44,12 @@ STDAPI XblRealTimeActivityActivate( } return S_OK; } +CATCH_RETURN() STDAPI XblRealTimeActivityDeactivate( _In_ XblContextHandle xboxLiveContext ) XBL_NOEXCEPT +try { LOGS_DEBUG << __FUNCTION__; if (auto state{ GlobalState::Get() }) @@ -51,12 +58,14 @@ STDAPI XblRealTimeActivityDeactivate( } return S_OK; } +CATCH_RETURN() STDAPI_(XblFunctionContext) XblRealTimeActivityAddConnectionStateChangeHandler( _In_ XblContextHandle xboxLiveContext, _In_ XblRealTimeActivityConnectionStateChangeHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { LOGS_DEBUG << __FUNCTION__; RETURN_HR_INVALIDARGUMENT_IF(xboxLiveContext == nullptr || handler == nullptr); @@ -85,11 +94,13 @@ STDAPI_(XblFunctionContext) XblRealTimeActivityAddConnectionStateChangeHandler( return E_XBL_NOT_INITIALIZED; } } +CATCH_RETURN() STDAPI XblRealTimeActivityRemoveConnectionStateChangeHandler( _In_ XblContextHandle xboxLiveContext, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { LOGS_DEBUG << __FUNCTION__; RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); @@ -104,12 +115,14 @@ STDAPI XblRealTimeActivityRemoveConnectionStateChangeHandler( return E_XBL_NOT_INITIALIZED; } } +CATCH_RETURN() STDAPI_(XblFunctionContext) XblRealTimeActivityAddSubscriptionErrorHandler( _In_ XblContextHandle xboxLiveContext, _In_ XblRealTimeActivitySubscriptionErrorHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { LOGS_DEBUG << __FUNCTION__ << ": DEPRECATED, No action taken by XSAPI."; UNREFERENCED_PARAMETER(xboxLiveContext); @@ -117,23 +130,27 @@ STDAPI_(XblFunctionContext) XblRealTimeActivityAddSubscriptionErrorHandler( UNREFERENCED_PARAMETER(context); return S_OK; } +CATCH_RETURN() STDAPI XblRealTimeActivityRemoveSubscriptionErrorHandler( _In_ XblContextHandle xboxLiveContext, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { LOGS_DEBUG << __FUNCTION__ << ": DEPRECATED, No action taken by XSAPI."; UNREFERENCED_PARAMETER(xboxLiveContext); UNREFERENCED_PARAMETER(token); return S_OK; } +CATCH_RETURN() STDAPI_(XblFunctionContext) XblRealTimeActivityAddResyncHandler( _In_ XblContextHandle xboxLiveContext, _In_ XblRealTimeActivityResyncHandler* handler, _In_opt_ void* context ) XBL_NOEXCEPT +try { LOGS_DEBUG << __FUNCTION__; RETURN_HR_INVALIDARGUMENT_IF(xboxLiveContext == nullptr || handler == nullptr); @@ -161,11 +178,13 @@ STDAPI_(XblFunctionContext) XblRealTimeActivityAddResyncHandler( return E_XBL_NOT_INITIALIZED; } } +CATCH_RETURN() STDAPI XblRealTimeActivityRemoveResyncHandler( _In_ XblContextHandle xboxLiveContext, _In_ XblFunctionContext token ) XBL_NOEXCEPT +try { LOGS_DEBUG << __FUNCTION__; RETURN_HR_INVALIDARGUMENT_IF_NULL(xboxLiveContext); @@ -180,3 +199,4 @@ STDAPI XblRealTimeActivityRemoveResyncHandler( return E_XBL_NOT_INITIALIZED; } } +CATCH_RETURN() diff --git a/Source/Services/RealTimeActivityManager/real_time_activity_connection.cpp b/Source/Services/RealTimeActivityManager/real_time_activity_connection.cpp index 3977b40a..c57c41f4 100644 --- a/Source/Services/RealTimeActivityManager/real_time_activity_connection.cpp +++ b/Source/Services/RealTimeActivityManager/real_time_activity_connection.cpp @@ -10,9 +10,12 @@ NAMESPACE_MICROSOFT_XBOX_SERVICES_RTA_CPP_BEGIN constexpr char s_rtaUri[]{ "wss://rta.xboxlive.com/connect" }; constexpr char s_rtaSubprotocol[]{ "rta.xboxlive.com.V2" }; -struct Subscription::State +struct ServiceSubscription { - State(uint32_t _clientId) noexcept : clientId{ _clientId } {} + ServiceSubscription(String _uri, uint32_t _clientId) noexcept : uri{ std::move(_uri) }, clientId { _clientId } {} + + // Resource uri for the subscription + String const uri; // Client ID is assigned by XSAPI and used to identify subscriptions. // Used as the unique SEQUENCE_N during RTA Sub/Unsub handshakes. @@ -22,7 +25,7 @@ struct Subscription::State uint32_t serviceId{ 0 }; // Current status with respect to RTA service - enum class ServiceStatus : uint32_t + enum class Status : uint32_t { // RTA service has no knowledge of this subscription Inactive, @@ -38,9 +41,13 @@ struct Subscription::State PendingUnsubscribe, // We've sent unsubscribe message to RTA service but has not yet received the handshake response Unsubscribing - } serviceStatus{ ServiceStatus::Inactive }; + } status{ Status::Inactive }; uint32_t subscribeAttempt{ 0 }; + + Set> clientSubscriptions; + List>> subscribeAsyncContexts; + List>> unsubscribeAsyncContexts; }; // RTA message types and error codes define by service here http://xboxwiki/wiki/Real_Time_Activity @@ -131,17 +138,15 @@ void Connection::Cleanup() } List>> pendingAsyncContexts; - for (auto& pair : m_subscribeAsyncContexts) - { - pendingAsyncContexts.emplace_back(std::move(pair.second)); - } - for (auto& pair : m_unsubscribeAsyncContexts) + for (auto& subPair : m_subsByClientId) { - pendingAsyncContexts.emplace_back(std::move(pair.second)); + auto& sub{ subPair.second }; + pendingAsyncContexts.insert(pendingAsyncContexts.end(), sub->subscribeAsyncContexts.begin(), sub->subscribeAsyncContexts.end()); + sub->subscribeAsyncContexts.clear(); + pendingAsyncContexts.insert(pendingAsyncContexts.end(), sub->unsubscribeAsyncContexts.begin(), sub->unsubscribeAsyncContexts.end()); + sub->unsubscribeAsyncContexts.clear(); } - m_subscribeAsyncContexts.clear(); - m_unsubscribeAsyncContexts.clear(); lock.unlock(); m_queue.Terminate( @@ -163,57 +168,80 @@ HRESULT Connection::AddSubscription( assert(sub); std::unique_lock lock{ m_lock }; - if (!sub->m_state) + std::shared_ptr serviceSub{ nullptr }; + auto serviceSubIter = m_subsByUri.find(sub->ResourceUri()); + if (serviceSubIter != m_subsByUri.end()) { - // Initialize subscription state - sub->m_state = MakeShared(m_nextSubId++); + serviceSub = serviceSubIter->second; + } + else + { + serviceSub = MakeShared(sub->ResourceUri(), m_nextSubId++); + assert(m_subsByClientId.find(serviceSub->clientId) == m_subsByClientId.end()); + m_subsByClientId[serviceSub->clientId] = serviceSub; + m_subsByUri[serviceSub->uri] = serviceSub; } - m_subs[sub->m_state->clientId] = sub; + serviceSub->clientSubscriptions.emplace(sub); - LOGS_DEBUG << __FUNCTION__ << ": [" << sub->m_state->clientId << "] Uri=" << sub->m_resourceUri; + LOGS_DEBUG << __FUNCTION__ << ": [" << serviceSub->clientId << "] Uri=" << serviceSub->uri << ", ServiceStatus=" << EnumName(serviceSub->status); - switch (sub->m_state->serviceStatus) + switch (serviceSub->status) { - case Subscription::State::ServiceStatus::Inactive: + case ServiceSubscription::Status::Inactive: { - m_subscribeAsyncContexts[sub->m_state->clientId] = std::move(async); + serviceSub->subscribeAsyncContexts.push_back(std::move(async)); // If our connection is active, immediately register with RTA service if (m_state == XblRealTimeActivityConnectionState::Connected) { - return SendSubscribeMessage(sub, std::move(lock)); + return SendSubscribeMessage(serviceSub, std::move(lock)); } return S_OK; } - case Subscription::State::ServiceStatus::PendingUnsubscribe: + case ServiceSubscription::Status::PendingUnsubscribe: { - // Client previously removed subscription while we were subscribing. - // Reset the state to subscribing and collapse the existing & new async contexts - sub->m_state->serviceStatus = Subscription::State::ServiceStatus::Subscribing; + // Client previously removed subscription while we were subscribing. Reset the state to subscribing and complete unsubscribe + // operations with E_ABORT + + serviceSub->status = ServiceSubscription::Status::Subscribing; + serviceSub->subscribeAsyncContexts.push_back(std::move(async)); - auto asyncIter{ m_subscribeAsyncContexts.find(sub->m_state->clientId) }; - assert(asyncIter != m_subscribeAsyncContexts.end()); - asyncIter->second = AsyncContext>::Collapse({ std::move(asyncIter->second), async }); + List>> unsubscribeAsyncContexts{ std::move(serviceSub->unsubscribeAsyncContexts) }; + + lock.unlock(); + + for (auto& asyncContext : unsubscribeAsyncContexts) + { + asyncContext.Complete(E_ABORT); + } return S_OK; } - case Subscription::State::ServiceStatus::Unsubscribing: + case ServiceSubscription::Status::Unsubscribing: { // Wait for unsubscribe to finish before resubscribing - sub->m_state->serviceStatus = Subscription::State::ServiceStatus::PendingSubscribe; - m_subscribeAsyncContexts[sub->m_state->clientId] = std::move(async); + serviceSub->status = ServiceSubscription::Status::PendingSubscribe; + serviceSub->subscribeAsyncContexts.push_back(std::move(async)); + return S_OK; + } + case ServiceSubscription::Status::Active: + { + // Subscription is already active, trivially complete + lock.unlock(); + async.Complete(S_OK); + return S_OK; + } + case ServiceSubscription::Status::PendingSubscribe: + case ServiceSubscription::Status::Subscribing: + { + serviceSub->subscribeAsyncContexts.push_back(std::move(async)); return S_OK; } - case Subscription::State::ServiceStatus::Active: - case Subscription::State::ServiceStatus::PendingSubscribe: - case Subscription::State::ServiceStatus::Subscribing: default: { - // These are all technically ok, but they indicate the subscription was added multiple - // times, which likely indicates a bug in a dependent service assert(false); - return S_OK; + return E_UNEXPECTED; } } } @@ -226,58 +254,87 @@ HRESULT Connection::RemoveSubscription( assert(sub); std::unique_lock lock{ m_lock }; - auto iter{ m_subs.find(sub->m_state->clientId) }; - assert(iter != m_subs.end()); - (void)(iter); // suppress unused warning + std::shared_ptr serviceSub{ nullptr }; + auto serviceSubIter = m_subsByUri.find(sub->ResourceUri()); + if (serviceSubIter != m_subsByUri.end()) + { + serviceSub = serviceSubIter->second; + } + else + { + return S_OK; + } + + serviceSub->clientSubscriptions.erase(sub); - LOGS_DEBUG << __FUNCTION__ << ": [" << sub->m_state->clientId << "] Uri=" << sub->m_resourceUri << ", ServiceStatus=" << EnumName(sub->m_state->serviceStatus); + LOGS_DEBUG << __FUNCTION__ << ": [" << serviceSub->clientId << "] Uri=" << serviceSub->uri << ", ServiceStatus=" << EnumName(serviceSub->status); - switch (sub->m_state->serviceStatus) + if (!serviceSub->clientSubscriptions.empty()) { - case Subscription::State::ServiceStatus::Inactive: + // Service subscription still needed by other clients. Complete asyncContext but don't unsubscribe from service + lock.unlock(); + + async.Complete(S_OK); + return S_OK; + } + + switch (serviceSub->status) { - // RTA service has no knowledge of inactive subs. Just remove from our local - // state and complete the AsyncContext. - m_subs.erase(sub->m_state->clientId); + case ServiceSubscription::Status::Inactive: + { + // RTA service has no knowledge of inactive subs. Just remove from our local state and complete the AsyncContext. + assert(serviceSub->serviceId == 0); + m_subsByClientId.erase(serviceSub->clientId); + m_subsByUri.erase(serviceSub->uri); lock.unlock(); async.Complete(S_OK); return S_OK; } - case Subscription::State::ServiceStatus::Active: + case ServiceSubscription::Status::Active: { // Unregister subscription from RTA service - m_unsubscribeAsyncContexts[sub->m_state->clientId] = std::move(async); - return SendUnsubscribeMessage(sub, std::move(lock)); + serviceSub->unsubscribeAsyncContexts.push_back(std::move(async)); + return SendUnsubscribeMessage(serviceSub, std::move(lock)); } - case Subscription::State::ServiceStatus::PendingSubscribe: + case ServiceSubscription::Status::PendingSubscribe: { - // Client previously added the subscription while we were unsubscribing. - // Reset the state to unsubscribe and collapse the existing & new async contexts - sub->m_state->serviceStatus = Subscription::State::ServiceStatus::Unsubscribing; + // Client previously added the subscription while we were unsubscribing. Reset the state to unsubscribe and complete + // subscribe operations with E_ABORT + + serviceSub->status = ServiceSubscription::Status::Unsubscribing; + serviceSub->unsubscribeAsyncContexts.push_back(std::move(async)); + List>> subscribeAsyncContexts{ std::move(serviceSub->subscribeAsyncContexts) }; + + lock.unlock(); - auto asyncIter{ m_unsubscribeAsyncContexts.find(sub->m_state->clientId) }; - assert(asyncIter != m_unsubscribeAsyncContexts.end()); - asyncIter->second = AsyncContext>::Collapse({ std::move(asyncIter->second), async }); + for (auto& asyncContext : subscribeAsyncContexts) + { + asyncContext.Complete(E_ABORT); + } return S_OK; } - case Subscription::State::ServiceStatus::Subscribing: + case ServiceSubscription::Status::Subscribing: { // We are in the process of subscribing. RTA protocol doesn't allow us to unsubscribe // until subscription is complete, so just mark the subscription as pending unsubscribe. // After the subscription completes, we will unsubscribe and complete the AsyncContext. - m_unsubscribeAsyncContexts[sub->m_state->clientId] = std::move(async); - sub->m_state->serviceStatus = Subscription::State::ServiceStatus::PendingUnsubscribe; + serviceSub->status = ServiceSubscription::Status::PendingUnsubscribe; + serviceSub->unsubscribeAsyncContexts.push_back(std::move(async)); + + return S_OK; + } + case ServiceSubscription::Status::PendingUnsubscribe: + case ServiceSubscription::Status::Unsubscribing: + { + serviceSub->unsubscribeAsyncContexts.push_back(std::move(async)); + return S_OK; } - case Subscription::State::ServiceStatus::PendingUnsubscribe: - case Subscription::State::ServiceStatus::Unsubscribing: default: { - // These are all technically ok, but they indicate the subscription was removed multiple - // times, which likely indicates a bug in a dependent service assert(false); return E_UNEXPECTED; } @@ -287,34 +344,34 @@ HRESULT Connection::RemoveSubscription( size_t Connection::SubscriptionCount() const noexcept { std::unique_lock lock{ m_lock }; - return m_subs.size(); + return m_subsByClientId.size(); } -JsonDocument Connection::AssembleSubscribeMessage(std::shared_ptr sub) const noexcept +JsonDocument Connection::AssembleSubscribeMessage(std::shared_ptr sub) const noexcept { // Payload format [, , “”] - sub->m_state->serviceStatus = Subscription::State::ServiceStatus::Subscribing; + sub->status = ServiceSubscription::Status::Subscribing; JsonDocument request{ rapidjson::kArrayType }; auto& a{ request.GetAllocator() }; request.PushBack(static_cast(MessageType::Subscribe), a); - request.PushBack(sub->m_state->clientId, a); - request.PushBack(JsonValue{ sub->m_resourceUri.data(), a }, a); + request.PushBack(sub->clientId, a); + request.PushBack(JsonValue{ sub->uri.data(), a }, a); return request; } HRESULT Connection::SendSubscribeMessage( - std::shared_ptr sub, + std::shared_ptr sub, std::unique_lock&& lock ) const noexcept { JsonDocument request = AssembleSubscribeMessage(sub); lock.unlock(); - + return SendAssembledMessage(request); } @@ -327,20 +384,20 @@ HRESULT Connection::SendAssembledMessage(_In_ const JsonValue& request) const no } HRESULT Connection::SendUnsubscribeMessage( - std::shared_ptr sub, + std::shared_ptr sub, std::unique_lock&& lock ) const noexcept { // Payload format [, , ] - sub->m_state->serviceStatus = Subscription::State::ServiceStatus::Unsubscribing; + sub->status = ServiceSubscription::Status::Unsubscribing; JsonDocument request{ rapidjson::kArrayType }; auto& a{ request.GetAllocator() }; request.PushBack(static_cast(MessageType::Unsubscribe), a); - request.PushBack(sub->m_state->clientId, a); - request.PushBack(sub->m_state->serviceId, a); + request.PushBack(sub->clientId, a); + request.PushBack(sub->serviceId, a); lock.unlock(); @@ -359,46 +416,39 @@ void Connection::SubscribeResponseHandler(_In_ const JsonValue& message) noexcep auto clientId = message[1].GetUint(); auto errorCode = static_cast(message[2].GetUint()); - auto subIter{ m_subs.find(clientId) }; - if (subIter == m_subs.end()) + auto subIter{ m_subsByClientId.find(clientId) }; + if (subIter == m_subsByClientId.end()) { // Ignore unexpected message + assert(false); LOGS_DEBUG << "__FUNCTION__" << ": [" << clientId << "] Ignoring unexpected message"; return; } - auto sub{ subIter->second }; + auto serviceSub{ subIter->second }; switch (errorCode) { case ErrorCode::Success: { - sub->m_state->serviceId = message[3].GetInt(); + serviceSub->serviceId = message[3].GetInt(); const auto& data = message[4]; - if (m_activeSubs.find(sub->m_state->serviceId) == m_activeSubs.end()) - { - m_activeSubs[sub->m_state->serviceId] = { { sub->m_state->clientId, sub } }; - } - else - { - m_activeSubs[sub->m_state->serviceId][sub->m_state->clientId] = sub; - } - - AsyncContext> asyncContext{ std::move(m_subscribeAsyncContexts[sub->m_state->clientId]) }; - m_subscribeAsyncContexts.erase(sub->m_state->clientId); + m_subsByServiceId[serviceSub->serviceId] = serviceSub; + List>> subscribeAsyncContexts{ std::move(serviceSub->subscribeAsyncContexts) }; + List> clientSubs{ serviceSub->clientSubscriptions.begin(), serviceSub->clientSubscriptions.end() }; - switch (sub->m_state->serviceStatus) + switch (serviceSub->status) { - case Subscription::State::ServiceStatus::Subscribing: + case ServiceSubscription::Status::Subscribing: { - sub->m_state->serviceStatus = Subscription::State::ServiceStatus::Active; + serviceSub->status = ServiceSubscription::Status::Active; break; } - case Subscription::State::ServiceStatus::PendingUnsubscribe: + case ServiceSubscription::Status::PendingUnsubscribe: { // Client has removed the subscription while subscribe handshake was happening, // so immediately begin unsubscribing. - SendUnsubscribeMessage(sub, std::move(lock)); + SendUnsubscribeMessage(serviceSub, std::move(lock)); break; } default: @@ -414,8 +464,14 @@ void Connection::SubscribeResponseHandler(_In_ const JsonValue& message) noexcep lock.unlock(); } - asyncContext.Complete(ConvertRTAErrorCode(errorCode)); - sub->OnSubscribe(data); + for (auto& asyncContext : subscribeAsyncContexts) + { + asyncContext.Complete(ConvertRTAErrorCode(errorCode)); + } + for (auto& clientSub : clientSubs) + { + clientSub->OnSubscribe(data); + } return; } @@ -430,19 +486,26 @@ void Connection::SubscribeResponseHandler(_In_ const JsonValue& message) noexcep case ErrorCode::Throttled: case ErrorCode::ServiceUnavailable: { - auto serviceStatus{ sub->m_state->serviceStatus }; - sub->m_state->serviceStatus = Subscription::State::ServiceStatus::Inactive; + auto serviceStatus{ serviceSub->status }; + serviceSub->status = ServiceSubscription::Status::Inactive; switch (serviceStatus) { - case Subscription::State::ServiceStatus::Subscribing: + case ServiceSubscription::Status::Subscribing: { - uint64_t backoff = __min(std::pow(sub->m_state->subscribeAttempt++, 2), 60) * 1000; - m_queue.RunWork([sub, weakThis = std::weak_ptr{ shared_from_this() }] + uint64_t backoff = __min(std::pow(serviceSub->subscribeAttempt++, 2), 60) * 1000; + m_queue.RunWork([weakSub = std::weak_ptr{ serviceSub }, weakThis = std::weak_ptr{ shared_from_this() }] { - if (auto sharedThis{ weakThis.lock() }) + auto sharedThis{ weakThis.lock() }; + if (sharedThis) { - sharedThis->AddSubscription(sub, AsyncContext>{ sharedThis->m_queue }); + std::unique_lock lock{ sharedThis->m_lock }; + + auto serviceSub{ weakSub.lock() }; + if (serviceSub && serviceSub->status == ServiceSubscription::Status::Inactive) + { + sharedThis->SendSubscribeMessage(serviceSub, std::move(lock)); + } } }, backoff @@ -450,16 +513,29 @@ void Connection::SubscribeResponseHandler(_In_ const JsonValue& message) noexcep return; } - case Subscription::State::ServiceStatus::PendingUnsubscribe: + case ServiceSubscription::Status::PendingUnsubscribe: { - // Don't retry subscription in this case because client has already removed it. - AsyncContext> asyncContext{ std::move(m_subscribeAsyncContexts[sub->m_state->clientId]) }; - m_subscribeAsyncContexts.erase(sub->m_state->clientId); - m_subs.erase(sub->m_state->clientId); + m_subsByClientId.erase(serviceSub->clientId); + m_subsByUri.erase(serviceSub->uri); + + // Complete subscribe operations with error, but don't retry since the client has since removed the subscription + List>> subscribeAsyncContexts{ std::move(serviceSub->subscribeAsyncContexts) }; + + // Unsubscribe operations are also trivially done at this point + List>> unsubscribeAsyncContexts{ std::move(serviceSub->unsubscribeAsyncContexts) }; lock.unlock(); - asyncContext.Complete(ConvertRTAErrorCode(errorCode)); + for (auto& asyncContext : subscribeAsyncContexts) + { + asyncContext.Complete(ConvertRTAErrorCode(errorCode)); + } + + for (auto& asyncContext : unsubscribeAsyncContexts) + { + asyncContext.Complete(S_OK); + } + return; } default: @@ -492,35 +568,36 @@ void Connection::UnsubscribeResponseHandler(_In_ const JsonValue& message) noexc LOGS_ERROR << __FUNCTION__ << ": Failed with error code [" << static_cast(errorCode) << "]"; } - auto subIter{ m_subs.find(clientId) }; - if (subIter == m_subs.end()) + auto subIter{ m_subsByClientId.find(clientId) }; + if (subIter == m_subsByClientId.end()) { // Ignore unexpected message LOGS_DEBUG << "__FUNCTION__" << ": [" << clientId << "] Ignoring unexpected message"; return; } - auto sub{ subIter->second }; - m_activeSubs[sub->m_state->serviceId].erase(clientId); + auto serviceSub{ subIter->second }; + m_subsByServiceId.erase(serviceSub->serviceId); + serviceSub->serviceId = 0; - LOGS_DEBUG << __FUNCTION__ << ": [" << sub->m_state->clientId <<"] ServiceStatus=" << EnumName(sub->m_state->serviceStatus); + LOGS_DEBUG << __FUNCTION__ << ": [" << serviceSub->clientId <<"] ServiceStatus=" << EnumName(serviceSub->status); - AsyncContext> asyncContext{ std::move(m_unsubscribeAsyncContexts[clientId]) }; - m_unsubscribeAsyncContexts.erase(clientId); + List>> unsubscribeAsyncContexts{ std::move(serviceSub->unsubscribeAsyncContexts) }; - switch (sub->m_state->serviceStatus) + switch (serviceSub->status) { - case Subscription::State::ServiceStatus::Unsubscribing: + case ServiceSubscription::Status::Unsubscribing: { // We can now remove the subscription from our state entirely - sub->m_state->serviceStatus = Subscription::State::ServiceStatus::Inactive; - m_subs.erase(subIter); + m_subsByClientId.erase(serviceSub->clientId); + m_subsByUri.erase(serviceSub->uri); + serviceSub->status = ServiceSubscription::Status::Inactive; break; } - case Subscription::State::ServiceStatus::PendingSubscribe: + case ServiceSubscription::Status::PendingSubscribe: { // Client has re-added the subscription while unsubscibe handshake was happening, // so immediately begin subscribing. - SendSubscribeMessage(sub, std::move(lock)); + SendSubscribeMessage(serviceSub, std::move(lock)); break; } default: @@ -535,7 +612,10 @@ void Connection::UnsubscribeResponseHandler(_In_ const JsonValue& message) noexc lock.unlock(); } - asyncContext.Complete(ConvertRTAErrorCode(errorCode)); + for (auto& asyncContext : unsubscribeAsyncContexts) + { + asyncContext.Complete(ConvertRTAErrorCode(errorCode)); + } } void Connection::EventHandler(_In_ const JsonValue& message) const noexcept @@ -547,15 +627,15 @@ void Connection::EventHandler(_In_ const JsonValue& message) const noexcept auto serviceId = message[1].GetInt(); const auto& data = message[2]; - auto subIter{ m_activeSubs.find(serviceId) }; - assert(subIter != m_activeSubs.end()); - auto subs = subIter->second; + auto subIter{ m_subsByServiceId.find(serviceId) }; + assert(subIter != m_subsByServiceId.end()); + auto serviceSub = subIter->second; lock.unlock(); - for (auto& subPair : subs) + for (auto& clientSub : serviceSub->clientSubscriptions) { - subPair.second->OnEvent(data); + clientSub->OnEvent(data); } } @@ -571,12 +651,12 @@ void Connection::ConnectCompleteHandler(WebsocketResult result) noexcept m_connectTime = std::chrono::system_clock::now(); m_connectAttempt = 0; - assert(m_activeSubs.empty()); + assert(m_subsByServiceId.empty()); List subMessages{}; - for (auto& pair : m_subs) + for (auto& pair : m_subsByClientId) { - assert(pair.second->m_state->serviceStatus == Subscription::State::ServiceStatus::Inactive); + assert(pair.second->status == ServiceSubscription::Status::Inactive); subMessages.push_back(AssembleSubscribeMessage(pair.second)); } @@ -637,7 +717,7 @@ void Connection::ScheduleConnect() noexcept { std::unique_lock lock{ m_lock }; - LOGS_DEBUG << "RTA::Connection Initializing WebSocket and attempting connect. Subcount=" << m_subs.size(); + LOGS_DEBUG << "RTA::Connection Initializing WebSocket and attempting connect. Subcount=" << m_subsByClientId.size(); auto hr = InitializeWebsocket(); if (FAILED(hr)) @@ -669,46 +749,47 @@ void Connection::DisconnectHandler(WebSocketCloseStatus status) noexcept std::unique_lock lock{ m_lock }; // All subs are inactive if we are disconnected - m_activeSubs.clear(); + m_subsByServiceId.clear(); // Update state of our subs - for (auto subsIter = m_subs.begin(); subsIter != m_subs.end();) + for (auto subsIter = m_subsByClientId.begin(); subsIter != m_subsByClientId.end();) { - auto subState{ subsIter->second->m_state }; - switch (subState->serviceStatus) + auto serviceSub{ subsIter->second }; + switch (serviceSub->status) { - case Subscription::State::ServiceStatus::Inactive: - case Subscription::State::ServiceStatus::Active: - case Subscription::State::ServiceStatus::Subscribing: + case ServiceSubscription::Status::Inactive: + case ServiceSubscription::Status::Active: + case ServiceSubscription::Status::Subscribing: { ++subsIter; break; } - case Subscription::State::ServiceStatus::PendingSubscribe: + case ServiceSubscription::Status::PendingSubscribe: { // Complete the Unsubscribe AsyncContext, but since the client re-added the subscription, // don't remove it from our state - unsubscribeAsyncContexts.emplace_back(std::move(m_unsubscribeAsyncContexts[subState->clientId])); - m_unsubscribeAsyncContexts.erase(subState->clientId); + unsubscribeAsyncContexts.insert(unsubscribeAsyncContexts.end(), serviceSub->unsubscribeAsyncContexts.begin(), serviceSub->unsubscribeAsyncContexts.end()); + serviceSub->unsubscribeAsyncContexts.clear(); ++subsIter; break; } // For subscriptions which removed by clients, complete the relevant AsyncContexts and erase the // subscription from our state - case Subscription::State::ServiceStatus::PendingUnsubscribe: + case ServiceSubscription::Status::PendingUnsubscribe: { - subscribeAsyncContexts.emplace_back(std::move(m_subscribeAsyncContexts[subState->clientId])); - m_subscribeAsyncContexts.erase(subState->clientId); + subscribeAsyncContexts.insert(subscribeAsyncContexts.end(), serviceSub->subscribeAsyncContexts.begin(), serviceSub->subscribeAsyncContexts.end()); + serviceSub->subscribeAsyncContexts.clear(); // Intentional fallthrough } - case Subscription::State::ServiceStatus::Unsubscribing: + case ServiceSubscription::Status::Unsubscribing: { - unsubscribeAsyncContexts.emplace_back(std::move(m_unsubscribeAsyncContexts[subState->clientId])); - m_unsubscribeAsyncContexts.erase(subState->clientId); + unsubscribeAsyncContexts.insert(unsubscribeAsyncContexts.end(), serviceSub->unsubscribeAsyncContexts.begin(), serviceSub->unsubscribeAsyncContexts.end()); + serviceSub->unsubscribeAsyncContexts.clear(); - subsIter = m_subs.erase(subsIter); + m_subsByUri.erase(serviceSub->uri); + subsIter = m_subsByClientId.erase(subsIter); break; } default: @@ -718,9 +799,9 @@ void Connection::DisconnectHandler(WebSocketCloseStatus status) noexcept } } - subState->serviceId = 0; - subState->subscribeAttempt = 0; - subState->serviceStatus = Subscription::State::ServiceStatus::Inactive; + serviceSub->serviceId = 0; + serviceSub->subscribeAttempt = 0; + serviceSub->status = ServiceSubscription::Status::Inactive; } m_state = XblRealTimeActivityConnectionState::Disconnected; diff --git a/Source/Services/RealTimeActivityManager/real_time_activity_connection.h b/Source/Services/RealTimeActivityManager/real_time_activity_connection.h index f1f91405..58127544 100644 --- a/Source/Services/RealTimeActivityManager/real_time_activity_connection.h +++ b/Source/Services/RealTimeActivityManager/real_time_activity_connection.h @@ -6,8 +6,11 @@ #include "xsapi-c/real_time_activity_c.h" #include "real_time_activity_manager.h" #include "web_socket.h" + NAMESPACE_MICROSOFT_XBOX_SERVICES_RTA_CPP_BEGIN +struct ServiceSubscription; + class Connection : public std::enable_shared_from_this { public: @@ -49,16 +52,18 @@ class Connection : public std::enable_shared_from_this ResyncHandler resyncHandler ) noexcept; - JsonDocument AssembleSubscribeMessage(std::shared_ptr sub) const noexcept; + JsonDocument AssembleSubscribeMessage( + std::shared_ptr sub + ) const noexcept; // RTA protocol implementation HRESULT SendSubscribeMessage( - std::shared_ptr subscription, + std::shared_ptr subscription, std::unique_lock&& lock ) const noexcept; HRESULT SendUnsubscribeMessage( - std::shared_ptr subscription, + std::shared_ptr subscription, std::unique_lock&& lock ) const noexcept; @@ -84,10 +89,9 @@ class Connection : public std::enable_shared_from_this const ConnectionStateChangedHandler m_stateChangedHandler; const real_time_activity::ResyncHandler m_resyncHandler; - Map> m_subs; - Map>> m_subscribeAsyncContexts; - Map>> m_unsubscribeAsyncContexts; - Map>> m_activeSubs; + Map> m_subsByUri; // needed to add/remove client subscription + Map> m_subsByClientId; // needed for subscribe/unsubscribe handshake + Map> m_subsByServiceId; // needed to handle subscription events uint32_t m_nextSubId{ 1 }; diff --git a/Source/Services/RealTimeActivityManager/real_time_activity_subscription.h b/Source/Services/RealTimeActivityManager/real_time_activity_subscription.h index a900062a..ba0c0b7c 100644 --- a/Source/Services/RealTimeActivityManager/real_time_activity_subscription.h +++ b/Source/Services/RealTimeActivityManager/real_time_activity_subscription.h @@ -25,7 +25,11 @@ class Subscription Subscription() noexcept = default; virtual ~Subscription() noexcept = default; -protected: + String const& ResourceUri() const + { + return m_resourceUri; + } + virtual void OnSubscribe(const JsonValue& data) noexcept { UNREFERENCED_PARAMETER(data); @@ -34,14 +38,8 @@ class Subscription }; virtual void OnEvent(const JsonValue& event) noexcept = 0; +protected: String m_resourceUri; - -private: - // Subscription state maintained by Connection - struct State; - std::shared_ptr m_state; - - friend class Connection; }; NAMESPACE_MICROSOFT_XBOX_SERVICES_RTA_CPP_END \ No newline at end of file diff --git a/Source/Services/Social/profile_api.cpp b/Source/Services/Social/profile_api.cpp index 7ccac97f..66f09353 100644 --- a/Source/Services/Social/profile_api.cpp +++ b/Source/Services/Social/profile_api.cpp @@ -146,6 +146,7 @@ STDAPI XblProfileGetUserProfilesResultCount( _In_ XAsyncBlock* async, _Out_ size_t* profileCount ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(async == nullptr || profileCount == nullptr); @@ -158,20 +159,24 @@ STDAPI XblProfileGetUserProfilesResultCount( } return hr; } +CATCH_RETURN() STDAPI XblProfileGetUserProfileResult( _In_ XAsyncBlock* async, _Out_ XblUserProfile* profile ) XBL_NOEXCEPT +try { return XAsyncGetResult(async, nullptr, sizeof(XblUserProfile), profile, nullptr); } +CATCH_RETURN() STDAPI XblProfileGetUserProfilesResult( _In_ XAsyncBlock* async, _In_ size_t profilesCount, _Out_writes_(profilesCount) XblUserProfile* profiles ) XBL_NOEXCEPT +try { RETURN_HR_IF(profilesCount == 0, S_OK); RETURN_HR_INVALIDARGUMENT_IF_NULL(async); @@ -186,20 +191,25 @@ STDAPI XblProfileGetUserProfilesResult( hr = XAsyncGetResult(async, nullptr, profilesCount * sizeof(XblUserProfile), profiles, nullptr); return hr; } +CATCH_RETURN() STDAPI XblProfileGetUserProfilesForSocialGroupResultCount( _In_ XAsyncBlock* async, _Out_ size_t* profileCount ) XBL_NOEXCEPT +try { return XblProfileGetUserProfilesResultCount(async, profileCount); } +CATCH_RETURN() STDAPI XblProfileGetUserProfilesForSocialGroupResult( _In_ XAsyncBlock* async, _In_ size_t profilesCount, _Out_writes_(profilesCount) XblUserProfile* profiles ) XBL_NOEXCEPT +try { return XblProfileGetUserProfilesResult(async, profilesCount, profiles); } +CATCH_RETURN() diff --git a/Source/Services/StringVerify/string_service.cpp b/Source/Services/StringVerify/string_service.cpp index 1517d41f..061721a5 100644 --- a/Source/Services/StringVerify/string_service.cpp +++ b/Source/Services/StringVerify/string_service.cpp @@ -77,19 +77,23 @@ STDAPI XblStringVerifyStringAsync( _In_ const char* stringToVerify, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(xboxLiveContextHandle == nullptr || stringToVerify == nullptr || async == nullptr); return XblStringVerifyStringsAsync(xboxLiveContextHandle, &stringToVerify, 1, async); } +CATCH_RETURN() STDAPI XblStringVerifyStringResultSize( _In_ XAsyncBlock* asyncBlock, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(asyncBlock, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblStringVerifyStringResult( _In_ XAsyncBlock* asyncBlock, @@ -98,6 +102,7 @@ STDAPI XblStringVerifyStringResult( _Outptr_ XblVerifyStringResult** ptrToBuffer, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(ptrToBuffer); auto hr = XAsyncGetResult(asyncBlock, nullptr, bufferSize, buffer, bufferUsed); @@ -107,6 +112,7 @@ STDAPI XblStringVerifyStringResult( } return hr; } +CATCH_RETURN() STDAPI XblStringVerifyStringsAsync( _In_ XblContextHandle xboxLiveContextHandle, @@ -114,6 +120,7 @@ STDAPI XblStringVerifyStringsAsync( _In_ const uint64_t stringsCount, _In_ XAsyncBlock* async ) XBL_NOEXCEPT +try { xsapi_internal_vector strings; for (uint32_t i = 0; i < stringsCount; i++) { @@ -214,14 +221,17 @@ STDAPI XblStringVerifyStringsAsync( } }); } +CATCH_RETURN() STDAPI XblStringVerifyStringsResultSize( _In_ XAsyncBlock* asyncBlock, _Out_ size_t* resultSizeInBytes ) XBL_NOEXCEPT +try { return XAsyncGetResultSize(asyncBlock, resultSizeInBytes); } +CATCH_RETURN() STDAPI XblStringVerifyStringsResult( _In_ XAsyncBlock* asyncBlock, @@ -231,6 +241,7 @@ STDAPI XblStringVerifyStringsResult( _Out_ size_t* stringsCount, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(ptrToBuffer); @@ -249,3 +260,4 @@ STDAPI XblStringVerifyStringsResult( } return hr; } +CATCH_RETURN() diff --git a/Source/Shared/build_version.h b/Source/Shared/build_version.h index dcb5e927..3483f55b 100644 --- a/Source/Shared/build_version.h +++ b/Source/Shared/build_version.h @@ -9,4 +9,4 @@ //********************************************************* #pragma once -#define XBOX_SERVICES_API_VERSION_STRING "2021.10.20210928.0" +#define XBOX_SERVICES_API_VERSION_STRING "2022.03.20220517.1" diff --git a/Source/Shared/fault_injection.cpp b/Source/Shared/fault_injection.cpp index 6bbb4c71..64c2ac5d 100644 --- a/Source/Shared/fault_injection.cpp +++ b/Source/Shared/fault_injection.cpp @@ -8,6 +8,7 @@ static fault_injection g_faultInjection; // not hanging this off of global state #endif STDAPI_(void) XblEnableFaultInjection(_In_ uint64_t featureId) XBL_NOEXCEPT +try { #if _DEBUG // fault injection only enabled on debug bits so as not to impact retail titles g_faultInjection.m_enabledFeatureMask |= featureId; @@ -15,8 +16,10 @@ STDAPI_(void) XblEnableFaultInjection(_In_ uint64_t featureId) XBL_NOEXCEPT UNREFERENCED_PARAMETER(featureId); #endif } +CATCH_RETURN_WITH(;) -STDAPI_(uint64_t) XblGetFaultCounter() +STDAPI_(uint64_t) XblGetFaultCounter() XBL_NOEXCEPT +try { #if _DEBUG // testing feature only enabled on debug bits so as not to impact retail titles return g_faultInjection.m_failTotalCounter; @@ -24,8 +27,10 @@ STDAPI_(uint64_t) XblGetFaultCounter() return 0; #endif } +CATCH_RETURN_WITH(0) -STDAPI_(void) XblSetFaultInjectOptions(int64_t failFreq, uint64_t freqChangeSpeed, int64_t freqChangeAmount) +STDAPI_(void) XblSetFaultInjectOptions(int64_t failFreq, uint64_t freqChangeSpeed, int64_t freqChangeAmount) XBL_NOEXCEPT +try { #if _DEBUG // testing feature only enabled on debug bits so as not to impact retail titles g_faultInjection.m_failFreq = failFreq; @@ -37,8 +42,10 @@ STDAPI_(void) XblSetFaultInjectOptions(int64_t failFreq, uint64_t freqChangeSpee UNREFERENCED_PARAMETER(freqChangeAmount); #endif } +CATCH_RETURN_WITH(;) -STDAPI_(bool) XblShouldFaultInject(_In_ uint64_t featureId) +STDAPI_(bool) XblShouldFaultInject(_In_ uint64_t featureId) XBL_NOEXCEPT +try { #if _DEBUG // testing feature only enabled on debug bits so as not to impact retail titles if ((g_faultInjection.m_enabledFeatureMask & featureId) == featureId) @@ -63,4 +70,5 @@ STDAPI_(bool) XblShouldFaultInject(_In_ uint64_t featureId) return false; } +CATCH_RETURN() diff --git a/Source/Shared/fault_injection.h b/Source/Shared/fault_injection.h index 81459c42..8b271ed3 100644 --- a/Source/Shared/fault_injection.h +++ b/Source/Shared/fault_injection.h @@ -8,9 +8,9 @@ extern "C" { STDAPI_(void) XblEnableFaultInjection(_In_ uint64_t featureId) XBL_NOEXCEPT; -STDAPI_(bool) XblShouldFaultInject(_In_ uint64_t featureId); -STDAPI_(uint64_t) XblGetFaultCounter(); -STDAPI_(void) XblSetFaultInjectOptions(int64_t failFreq, uint64_t freqChangeSpeed, int64_t freqChangeAmount); +STDAPI_(bool) XblShouldFaultInject(_In_ uint64_t featureId) XBL_NOEXCEPT; +STDAPI_(uint64_t) XblGetFaultCounter() XBL_NOEXCEPT; +STDAPI_(void) XblSetFaultInjectOptions(int64_t failFreq, uint64_t freqChangeSpeed, int64_t freqChangeAmount) XBL_NOEXCEPT; } NAMESPACE_MICROSOFT_XBOX_SERVICES_CPP_BEGIN diff --git a/Source/Shared/http_call_api.cpp b/Source/Shared/http_call_api.cpp index 2137b669..336dbc0b 100644 --- a/Source/Shared/http_call_api.cpp +++ b/Source/Shared/http_call_api.cpp @@ -16,6 +16,7 @@ STDAPI XblHttpCallCreate( _In_z_ const char* url, _Out_ XblHttpCallHandle* call ) XBL_NOEXCEPT +try { VERIFY_XBL_INITIALIZED(); @@ -31,12 +32,14 @@ STDAPI XblHttpCallCreate( } return hr; } +CATCH_RETURN() STDAPI XblHttpCallPerformAsync( _In_ XblHttpCallHandle call, _In_ XblHttpCallResponseBodyType type, _Inout_ XAsyncBlock* asyncBlock ) XBL_NOEXCEPT +try { UNREFERENCED_PARAMETER(type); RETURN_HR_INVALIDARGUMENT_IF_NULL(call); @@ -72,11 +75,13 @@ STDAPI XblHttpCallPerformAsync( } }); } +CATCH_RETURN() STDAPI XblHttpCallDuplicateHandle( _In_ XblHttpCallHandle call, _Out_ XblHttpCallHandle* duplicatedHandle ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF(call == nullptr || duplicatedHandle == nullptr); call->AddRef(); @@ -84,10 +89,12 @@ STDAPI XblHttpCallDuplicateHandle( return S_OK; } +CATCH_RETURN() STDAPI_(void) XblHttpCallCloseHandle( _In_ XblHttpCallHandle call ) XBL_NOEXCEPT +try { if (call) { @@ -95,27 +102,32 @@ STDAPI_(void) XblHttpCallCloseHandle( } return; } +CATCH_RETURN_WITH(;) STDAPI XblHttpCallSetTracing( _In_ XblHttpCallHandle call, _In_ bool traceCall ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->SetTracing(traceCall); } +CATCH_RETURN() STDAPI XblHttpCallGetRequestUrl( _In_ XblHttpCallHandle call, _Out_ const char** url ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); RETURN_HR_INVALIDARGUMENT_IF_NULL(url); return call->GetRequestUrl(url); } +CATCH_RETURN() // HttpCallRequest Set APIs STDAPI XblHttpCallRequestSetRequestBodyBytes( @@ -123,19 +135,23 @@ STDAPI XblHttpCallRequestSetRequestBodyBytes( _In_reads_bytes_(requestBodySize) const uint8_t* requestBodyBytes, _In_ uint32_t requestBodySize ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->SetRequestBody(requestBodyBytes, requestBodySize); } +CATCH_RETURN() STDAPI XblHttpCallRequestSetRequestBodyString( _In_ XblHttpCallHandle call, _In_z_ const char* requestBodyString ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->SetRequestBody(requestBodyString); } +CATCH_RETURN() STDAPI XblHttpCallRequestSetHeader( _In_ XblHttpCallHandle call, @@ -143,6 +159,7 @@ STDAPI XblHttpCallRequestSetHeader( _In_z_ const char* headerValue, _In_ bool allowTracing ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); RETURN_HR_INVALIDARGUMENT_IF_NULL(headerName); @@ -152,21 +169,25 @@ STDAPI XblHttpCallRequestSetHeader( return call->SetHeader(headerNameString, headerValueString, allowTracing); } +CATCH_RETURN() STDAPI XblHttpCallRequestSetRetryAllowed( _In_ XblHttpCallHandle call, _In_ bool retryAllowed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->SetRetryAllowed(retryAllowed); } +CATCH_RETURN() STDAPI XblHttpCallRequestSetRetryCacheId( _In_ XblHttpCallHandle call, _In_ uint32_t retryAfterCacheId ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); @@ -178,36 +199,43 @@ STDAPI XblHttpCallRequestSetRetryCacheId( return call->SetRetryCacheId(retryAfterCacheId); } +CATCH_RETURN() STDAPI XblHttpCallRequestSetLongHttpCall( _In_ XblHttpCallHandle call, _In_ bool longHttpCall ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); call->SetLongHttpCall(longHttpCall); return S_OK; } +CATCH_RETURN() // HttpCallResponse Get APIs STDAPI XblHttpCallGetResponseString( _In_ XblHttpCallHandle call, _Out_ const char** responseString ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->GetResponseString(responseString); } +CATCH_RETURN() STDAPI XblHttpCallGetResponseBodyBytesSize( _In_ XblHttpCallHandle call, _Out_ size_t* bufferSize ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->GetResponseBodyBytesSize(bufferSize); } +CATCH_RETURN() STDAPI XblHttpCallGetResponseBodyBytes( _In_ XblHttpCallHandle call, @@ -215,15 +243,18 @@ STDAPI XblHttpCallGetResponseBodyBytes( _Out_writes_bytes_to_(bufferSize, *bufferUsed) uint8_t* buffer, _Out_opt_ size_t* bufferUsed ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->GetResponseBodyBytes(bufferSize, buffer, bufferUsed); } +CATCH_RETURN() STDAPI XblHttpCallGetStatusCode( _In_ XblHttpCallHandle call, _Out_ uint32_t* statusCode ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); RETURN_HR_INVALIDARGUMENT_IF_NULL(statusCode); @@ -231,44 +262,53 @@ STDAPI XblHttpCallGetStatusCode( *statusCode = call->HttpStatus(); return S_OK; } +CATCH_RETURN() STDAPI XblHttpCallGetNetworkErrorCode( _In_ XblHttpCallHandle call, _Out_ HRESULT* networkErrorCode, _Out_ uint32_t* platformNetworkErrorCode ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->GetNetworkErrorCode(networkErrorCode, platformNetworkErrorCode); } +CATCH_RETURN() STDAPI XblHttpCallGetPlatformNetworkErrorMessage( _In_ XblHttpCallHandle call, _Out_ const char** platformNetworkErrorMessage ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->GetPlatformNetworkErrorMessage(platformNetworkErrorMessage); } +CATCH_RETURN() STDAPI XblHttpCallGetHeader( _In_ XblHttpCallHandle call, _In_z_ const char* headerName, _Out_ const char** headerValue ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->ResponseGetHeader(headerName, headerValue); } +CATCH_RETURN() STDAPI XblHttpCallGetNumHeaders( _In_ XblHttpCallHandle call, _Out_ uint32_t* numHeaders ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->ResponseGetNumHeaders(numHeaders); } +CATCH_RETURN() STDAPI XblHttpCallGetHeaderAtIndex( _In_ XblHttpCallHandle call, @@ -276,7 +316,9 @@ STDAPI XblHttpCallGetHeaderAtIndex( _Out_ const char** headerName, _Out_ const char** headerValue ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(call); return call->ResponseGetHeaderAtIndex(headerIndex, headerName, headerValue); } +CATCH_RETURN() diff --git a/Source/Shared/user.cpp b/Source/Shared/user.cpp index 61d6525d..c7d04767 100644 --- a/Source/Shared/user.cpp +++ b/Source/Shared/user.cpp @@ -323,15 +323,21 @@ HRESULT User::GetTokenAndSignature( async->Complete(Result{ payload, hr }); - Delete(asyncBlock); Delete(async); + Delete(asyncBlock); }; - return XalUserGetTokenAndSignatureSilentlyAsync( + HRESULT hr = XalUserGetTokenAndSignatureSilentlyAsync( m_handle, &tokenAndSigArgs, - asyncBlock - ); + asyncBlock); + if (FAILED(hr)) + { + auto asyncPtr{ static_cast>*>(asyncBlock->context) }; + Delete(asyncPtr); + Delete(asyncBlock); + } + return hr; } XalUserHandle User::Handle() const noexcept diff --git a/Source/System/platform_api.cpp b/Source/System/platform_api.cpp index 663fb124..ff63f4f5 100644 --- a/Source/System/platform_api.cpp +++ b/Source/System/platform_api.cpp @@ -10,12 +10,14 @@ STDAPI XblLocalStorageWriteComplete( _In_ XblClientOperationResult result, _In_ size_t dataSize ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(operation); auto writeOp{ static_cast(operation) }; return writeOp->Complete({ dataSize, XblClientOperation::HresultFromResult(result) }); } +CATCH_RETURN() STDAPI XblLocalStorageReadComplete( _In_ XblClientOperationHandle operation, @@ -23,6 +25,7 @@ STDAPI XblLocalStorageReadComplete( _In_ size_t dataSize, _In_reads_bytes_opt_(dataSize) void const* data ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(operation); RETURN_HR_INVALIDARGUMENT_IF(dataSize && !data); @@ -34,17 +37,20 @@ STDAPI XblLocalStorageReadComplete( return readOp->Complete(Result>{ std::move(dataVector), XblClientOperation::HresultFromResult(result) }); } +CATCH_RETURN() STDAPI XblLocalStorageClearComplete( _In_ XblClientOperationHandle operation, _In_ XblClientOperationResult result ) XBL_NOEXCEPT +try { RETURN_HR_INVALIDARGUMENT_IF_NULL(operation); auto clearOp{ static_cast(operation) }; return clearOp->Complete(XblClientOperation::HresultFromResult(result)); } +CATCH_RETURN() STDAPI XblLocalStorageSetHandlers( _In_opt_ XTaskQueueHandle queue, @@ -53,6 +59,7 @@ STDAPI XblLocalStorageSetHandlers( _In_ XblLocalStorageClearHandler clearHandler, _In_opt_ void* context ) XBL_NOEXCEPT +try { if (GlobalState::Get()) { @@ -75,4 +82,5 @@ STDAPI XblLocalStorageSetHandlers( } return S_OK; -} \ No newline at end of file +} +CATCH_RETURN() diff --git a/Tests/ApiExplorer/APIExplorer.Shared.vcxitems b/Tests/ApiExplorer/APIExplorer.Shared.vcxitems index 33260ae5..68dc6507 100644 --- a/Tests/ApiExplorer/APIExplorer.Shared.vcxitems +++ b/Tests/ApiExplorer/APIExplorer.Shared.vcxitems @@ -413,6 +413,9 @@ true + + true + true diff --git a/Tests/ApiExplorer/APIExplorer.Shared.vcxitems.filters b/Tests/ApiExplorer/APIExplorer.Shared.vcxitems.filters index 24de96f6..157b5f6d 100644 --- a/Tests/ApiExplorer/APIExplorer.Shared.vcxitems.filters +++ b/Tests/ApiExplorer/APIExplorer.Shared.vcxitems.filters @@ -819,5 +819,8 @@ Tests\libHttp + + Tests\notification + \ No newline at end of file diff --git a/Tests/ApiExplorer/APIs/apis_xal.cpp b/Tests/ApiExplorer/APIs/apis_xal.cpp index 8653a046..e79d869a 100644 --- a/Tests/ApiExplorer/APIs/apis_xal.cpp +++ b/Tests/ApiExplorer/APIs/apis_xal.cpp @@ -368,8 +368,8 @@ int XalUserGetId_Lua(lua_State *L) HRESULT hr = XalUserGetId(Data()->xalUser, &xboxUserId); // CODE SNIPPET END - LogToScreen("XalUserGetId: hr=%s xboxUserId=%ul", ConvertHR(hr).c_str(), xboxUserId); - LogToFile("XalUserGetId: hr=%s xboxUserId=%ul", ConvertHR(hr).c_str(), xboxUserId); + LogToScreen("XalUserGetId: hr=%s xboxUserId=%llu", ConvertHR(hr).c_str(), xboxUserId); + LogToFile("XalUserGetId: hr=%s xboxUserId=%llu", ConvertHR(hr).c_str(), xboxUserId); Data()->xboxUserId = xboxUserId; return LuaReturnHR(L, hr); } diff --git a/Tests/ApiExplorer/Tests/notification/multiple_notification_subscriptions.lua b/Tests/ApiExplorer/Tests/notification/multiple_notification_subscriptions.lua new file mode 100644 index 00000000..885184ad --- /dev/null +++ b/Tests/ApiExplorer/Tests/notification/multiple_notification_subscriptions.lua @@ -0,0 +1,21 @@ +test = require 'u-test' +common = require 'common' + +function TestGameInviteNotifications_Handler() + StartSocialManagerDoWorkLoop() + XblSocialManagerAddLocalUser() +end + +function OnXblSocialManagerDoWork_LocalUserAddedEvent() + print("OnXblSocialManagerDoWork_LocalUserAddedEvent") + Sleep(5000) + XblSocialManagerRemoveLocalUser() + StopSocialManagerDoWorkLoop() + --print("stopping test") + --test.stopTest(); +end + +test.skip = true; +test.TestMultipleNotificationSubscriptions = function() + common.init(TestGameInviteNotifications_Handler) +end \ No newline at end of file diff --git a/Tests/UnitTests/Mocks/http_mock.cpp b/Tests/UnitTests/Mocks/http_mock.cpp index 0bf94945..0618a756 100644 --- a/Tests/UnitTests/Mocks/http_mock.cpp +++ b/Tests/UnitTests/Mocks/http_mock.cpp @@ -6,6 +6,13 @@ NAMESPACE_MICROSOFT_XBOX_SERVICES_SYSTEM_CPP_BEGIN +struct HttpMockContext +{ + std::weak_ptr pWeakThis; +}; + +std::vector< std::shared_ptr > g_httpMockContextList; + HttpMock::HttpMock( _In_ const xsapi_internal_string& method, _In_ const xsapi_internal_string& url, @@ -108,6 +115,13 @@ void HttpMock::SetMockMatchedCallback(MockMatchedCallback mockMatched) noexcept { m_matchedCallback = std::move(mockMatched); + // m_sharedFromThis will be destroyed when HttpMock is destroyed. + // pass a weak version of it via context and check if its still around inside callback + // g_httpMockContextList will be cleaned up during shutdown + auto contextBlock = std::make_shared(); + g_httpMockContextList.push_back(contextBlock); + contextBlock->pWeakThis = shared_from_this(); + HCMockSetMockMatchedCallback(m_handle, [](HCMockCallHandle matchedMock, const char* method, @@ -120,10 +134,14 @@ void HttpMock::SetMockMatchedCallback(MockMatchedCallback mockMatched) noexcept UNREFERENCED_PARAMETER(matchedMock); UNREFERENCED_PARAMETER(method); - auto thisPtr{ static_cast(context) }; - thisPtr->m_matchedCallback(thisPtr, url, xsapi_internal_string{ requestBodyBytes, requestBodyBytes + requestBodySize }); + HttpMockContext* contextBlockPtr{ static_cast(context) }; + std::shared_ptr sharedFromThis{ contextBlockPtr->pWeakThis.lock() }; + if (sharedFromThis != nullptr) + { + sharedFromThis->m_matchedCallback(sharedFromThis.get(), url, xsapi_internal_string{ requestBodyBytes, requestBodyBytes + requestBodySize }); + } }, - this + contextBlock.get() ); } diff --git a/Tests/UnitTests/Mocks/http_mock.h b/Tests/UnitTests/Mocks/http_mock.h index dc4376d4..15d04efc 100644 --- a/Tests/UnitTests/Mocks/http_mock.h +++ b/Tests/UnitTests/Mocks/http_mock.h @@ -14,7 +14,7 @@ NAMESPACE_MICROSOFT_XBOX_SERVICES_SYSTEM_CPP_BEGIN typedef Callback MockMatchedCallback; // RAII wrapper around HCMockCallHandle -class HttpMock +class HttpMock : public std::enable_shared_from_this { public: HttpMock( diff --git a/Tests/UnitTests/Tests/Services/AchievementsManagerTests.cpp b/Tests/UnitTests/Tests/Services/AchievementsManagerTests.cpp index 1d6f51b6..0b87faaa 100644 --- a/Tests/UnitTests/Tests/Services/AchievementsManagerTests.cpp +++ b/Tests/UnitTests/Tests/Services/AchievementsManagerTests.cpp @@ -1754,22 +1754,22 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) } } - void SetupRtaResponseForUser(uint64_t xuid, String method, String progressPayload, Vector& mocks) + void SetupRtaResponseForUser(uint64_t xuid, String method, String progressPayload, Vector>& mocks) { Stringstream uri; uri << "https://achievements.xboxlive.com/users/xuid("; uri << xuid; uri << ")/achievements"; - HttpMock mock(method.c_str(), uri.str()); + std::shared_ptr mock = std::make_shared(method.c_str(), uri.str()); mocks.emplace_back(std::move(mock)); - mocks.back().SetResponseBody(progressPayload.c_str()); + mocks.back()->SetResponseBody(progressPayload.c_str()); } - void SetUpUpdateAchievementRtaResponse(uint64_t xuid, String progressPayload, bool willUnlock, Vector& mocks) + void SetUpUpdateAchievementRtaResponse(uint64_t xuid, String progressPayload, bool willUnlock, Vector>& mocks) { SetupRtaResponseForUser(xuid, "POST", progressPayload, mocks); - mocks.back().SetMockMatchedCallback( + mocks.back()->SetMockMatchedCallback( [ progressPayload, xuid, @@ -1791,7 +1791,7 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) bool UpdateAchievementHelper(uint64_t xuid, String achievementId, uint8_t progress, bool setUpMocks = true, bool willUnlock = false, String progressPayload = rtaAchievementProgressChangedPayload) { - Vector mocks; + Vector> mocks; if (setUpMocks) { SetUpUpdateAchievementRtaResponse(xuid, progressPayload, willUnlock, mocks); @@ -1883,6 +1883,7 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(AddLocalUser_InitializesWithLocalAchievementsCached_Success) { + TEST_LOG(L"Test starting: AddLocalUser_InitializesWithLocalAchievementsCached_Success"); AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -1895,6 +1896,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(AddLocalUser_SingleUserMultiplePages_InitializesAfterAllPagesCached) { + TEST_LOG(L"Test starting: AddLocalUser_SingleUserMultiplePages_InitializesAfterAllPagesCached"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -1906,6 +1909,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(AddLocalUser_MultipleUser_InitializesWithLocalAchievementsCached_Success) { + TEST_LOG(L"Test starting: AddLocalUser_MultipleUser_InitializesWithLocalAchievementsCached_Success"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -1923,6 +1928,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(RemoveLocalUser_SingleUser_ExpectUserRemoved) { + TEST_LOG(L"Test starting: RemoveLocalUser_SingleUser_ExpectUserRemoved"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -1945,6 +1952,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(RemoveLocalUser_MultipleUsers_ExpectCorrectUserRemoved) { + TEST_LOG(L"Test starting: RemoveLocalUser_MultipleUsers_ExpectCorrectUserRemoved"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -1975,6 +1984,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(RemoveLocalUser_UserNotInList_ExpectError) { + TEST_LOG(L"Test starting: RemoveLocalUser_UserNotInList_ExpectError"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -1992,6 +2003,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(IsLocalUserInitialized_UserNotInList_ExpectInvalidArg) { + TEST_LOG(L"Test starting: IsLocalUserInitialized_UserNotInList_ExpectInvalidArg"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2005,6 +2018,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(IsLocalUserInitialized_UserNotInitialized_ExpectEFail) { + TEST_LOG(L"Test starting: IsLocalUserInitialized_UserNotInitialized_ExpectEFail"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2019,6 +2034,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(IsLocalUserInitialized_UserInitialized_ExpectSuccess) { + TEST_LOG(L"Test starting: IsLocalUserInitialized_UserInitialized_ExpectSuccess"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2032,6 +2049,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementForUser_SingleUser_Success) { + TEST_LOG(L"Test starting: GetAchievementForUser_SingleUser_Success"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2063,6 +2082,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementForUser_DuplicateHandleOneDuplicate_SuccessfulDataDeletedAfterBothClosed) { + TEST_LOG(L"Test starting: GetAchievementForUser_DuplicateHandleOneDuplicate_SuccessfulDataDeletedAfterBothClosed"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2120,6 +2141,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementForUser_SingleUser_ExpectAchievementNonExistent) { + TEST_LOG(L"Test starting: GetAchievementForUser_SingleUser_ExpectAchievementNonExistent"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2142,6 +2165,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementForUser_SingleUser_ExpectFailureInvalidArgs) { + TEST_LOG(L"Test starting: GetAchievementForUser_SingleUser_ExpectFailureInvalidArgs"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2203,6 +2228,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementForUser_UserDoesNotExist_ExpectFailure) { + TEST_LOG(L"Test starting: GetAchievementForUser_UserDoesNotExist_ExpectFailure"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2223,6 +2250,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementForUser_UserNotInitialized_ExpectFailure) { + TEST_LOG(L"Test starting: GetAchievementForUser_UserNotInitialized_ExpectFailure"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2250,6 +2279,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementForUser_MultipleUsers_Success) { + TEST_LOG(L"Test starting: GetAchievementForUser_MultipleUsers_Success"); + AMTestEnvironment env{}; Map, const char*> responseMap; @@ -2331,6 +2362,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementsForUser_DefaultOptions_AllAchievementsReturned) { + TEST_LOG(L"Test starting: GetAchievementsForUser_DefaultOptions_AllAchievementsReturned"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2374,6 +2407,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementsForUser_SortFieldSpecifiedDefaultOrder_ExpectInvalidArg) { + TEST_LOG(L"Test starting: GetAchievementsForUser_SortFieldSpecifiedDefaultOrder_ExpectInvalidArg"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2397,6 +2432,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementsForUser_SortByUnlockTimeAscending_ExpectSortedAchievements) { + TEST_LOG(L"Test starting: GetAchievementsForUser_SortByUnlockTimeAscending_ExpectSortedAchievements"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2422,6 +2459,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementsForUserByState_UnlockedSortFieldSpecifiedDefaultOrder_ExpectInvalidArg) { + TEST_LOG(L"Test starting: GetAchievementsForUserByState_UnlockedSortFieldSpecifiedDefaultOrder_ExpectInvalidArg"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2446,6 +2485,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementsForUserByState_UnlockedOnlyDefaultSort_ExpectTwoResults) { + TEST_LOG(L"Test starting: GetAchievementsForUserByState_UnlockedOnlyDefaultSort_ExpectTwoResults"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2481,6 +2522,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementsForUserByState_UnlockedOnlySortUnlockTimeAscending_ExpectTwoResults) { + TEST_LOG(L"Test starting: GetAchievementsForUserByState_UnlockedOnlySortUnlockTimeAscending_ExpectTwoResults"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2516,6 +2559,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(GetAchievementsForUserByState_UnlockedOnlySortUnlockTimeDescending_ExpectTwoResults) { + TEST_LOG(L"Test starting: GetAchievementsForUserByState_UnlockedOnlySortUnlockTimeDescending_ExpectTwoResults"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2551,6 +2596,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_HigherProgressValue_ExpectProgressNotification) { + TEST_LOG(L"Test starting: UpdateAchievement_HigherProgressValue_ExpectProgressNotification"); + AMTestEnvironment env{}; constexpr uint8_t newProgress = 20; constexpr uint64_t xuid = 1234; @@ -2595,6 +2642,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_ExpectFailureInvalidArgs) { + TEST_LOG(L"Test starting: UpdateAchievement_ExpectFailureInvalidArgs"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2612,6 +2661,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_UserDoesNotExist_ExpectFailureInvalidArgs) { + TEST_LOG(L"Test starting: UpdateAchievement_UserDoesNotExist_ExpectFailureInvalidArgs"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2629,6 +2680,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_UserNotInitialized_ExpectFailure) { + TEST_LOG(L"Test starting: UpdateAchievement_UserNotInitialized_ExpectFailure"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2655,6 +2708,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_AchievementDoesNotExist_ExpectFailureInvalidArgs) { + TEST_LOG(L"Test starting: UpdateAchievement_AchievementDoesNotExist_ExpectFailureInvalidArgs"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2674,6 +2729,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_Is2013AchievementMultipleRequirements_ExpectFailure) { + TEST_LOG(L"Test starting: UpdateAchievement_Is2013AchievementMultipleRequirements_ExpectFailure"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2693,6 +2750,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_Is2013AchievementSingleRequirements_ExpectFailure) { + TEST_LOG(L"Test starting: UpdateAchievement_Is2013AchievementSingleRequirements_ExpectFailure"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2711,6 +2770,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_LowerProgressValue_ExpectFailure) { + TEST_LOG(L"Test starting: UpdateAchievement_LowerProgressValue_ExpectFailure"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; constexpr uint8_t updateProgress = 10; @@ -2733,6 +2794,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_SameProgressValue_ExpectFailure) { + TEST_LOG(L"Test starting: UpdateAchievement_SameProgressValue_ExpectFailure"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2752,6 +2815,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UpdateAchievement_AchievementAlreadyUnlocked_ExpectFailure) { + TEST_LOG(L"Test starting: UpdateAchievement_AchievementAlreadyUnlocked_ExpectFailure"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2771,11 +2836,17 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(UnlockAchievement_CompleteProgressWithDeducedUnlockNotification_ExpectProgressAndUnlockNotifications) { + TEST_LOG(L"Test starting: UnlockAchievement_CompleteProgressWithDeducedUnlockNotification_ExpectProgressAndUnlockNotifications"); + UpdateAchievementSuccessHelper(); } DEFINE_TEST_CASE(UnlockAchievement_MultipleUsersBothInProgressCompleteOne_ExpectBothNotifications) { + TEST_LOG(L"Test starting: UnlockAchievement_MultipleUsersBothInProgressCompleteOne_ExpectBothNotifications"); + + DEFINE_TEST_CASE_PROPERTIES_FOCUS(); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2789,19 +2860,34 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) // add local users AddMultipleLocalUsersHelper(responseMap); - - Vector mocks; - SetUpUpdateAchievementRtaResponse(xuid, rtaAchievementProgressChangedCompletePayload, true, mocks); - SetUpUpdateAchievementRtaResponse(2345, rtaAchievementProgressChangedCompletePayload, true, mocks); - bool completedBeforeTimeout = UpdateAchievementHelper(2345, achievementId2017InProgress, 100, false, true); - VERIFY_SUCCEEDED(completedBeforeTimeout); - XblAchievementsManagerResultHandle resultHandle; const XblAchievement* achievement; uint64_t size; HRESULT hr; + VERIFY_SUCCEEDED(hr = XblAchievementsManagerGetAchievement( + xuid, + achievementId2017InProgress, + &resultHandle + )); + VERIFY_SUCCEEDED(XblAchievementsManagerResultGetAchievements( + resultHandle, + &achievement, + &size + )); + VERIFY_IS_TRUE(achievement->progressState == XblAchievementProgressState::InProgress); + VERIFY_IS_TRUE( + utils::internal_string_to_uint32(achievement->progression.requirements[0].currentProgressValue) + == achievementInProgressStartProgress + ); + + Vector> mocks; + SetUpUpdateAchievementRtaResponse(2345, rtaAchievementProgressChangedCompletePayload, true, mocks); + + bool completedBeforeTimeout = UpdateAchievementHelper(2345, achievementId2017InProgress, 100, false, true); + VERIFY_SUCCEEDED(completedBeforeTimeout); + // make sure user 1234 doesn't show any changes from the event. VERIFY_SUCCEEDED(hr = XblAchievementsManagerGetAchievement( xuid, @@ -2850,6 +2936,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(AchievementsManagerResync_SingleUserNoAchievementsChanged_GeneratesNoEvents) { + TEST_LOG(L"Test starting: AchievementsManagerResync_SingleUserNoAchievementsChanged_GeneratesNoEvents"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2871,6 +2959,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(AchievementsManagerResync_SingleUserOneAchievementChanged_SuccessfullyUpdatedAndGeneratesEvent) { + TEST_LOG(L"Test starting: AchievementsManagerResync_SingleUserOneAchievementChanged_SuccessfullyUpdatedAndGeneratesEvent"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2908,6 +2998,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(AchievementsManagerResync_MultipleUsersOneAchievementChanged_SuccessfullyUpdatedAndGeneratesEventPerUser) { + TEST_LOG(L"Test starting: AchievementsManagerResync_MultipleUsersOneAchievementChanged_SuccessfullyUpdatedAndGeneratesEventPerUser"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -2922,7 +3014,7 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) // add local users AddMultipleLocalUsersHelper(responseMap); - Vector mocks; + Vector> mocks; SetupRtaResponseForUser(xuid, "GET", firstUserResyncFinishedResponse, mocks); SetupRtaResponseForUser(2345, "GET", secondUserGetAchievementsResponse, mocks); @@ -3026,6 +3118,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) /*DEFINE_TEST_CASE(AchievementsManagerResync_SingleUserOneUpdateAlreadyReceivedDifferentValues_SuccessfullyUpdatedOnlyGeneratesOneEvent) { + TEST_LOG(L"Test starting: AchievementsManagerResync_SingleUserOneUpdateAlreadyReceivedDifferentValues_SuccessfullyUpdatedOnlyGeneratesOneEvent"); + // want to see what happens when one achievement is larger than another... could // generate two events, but without guarantee that value can be cast to an int, // cant really assume it will be larager to allow us to be able to discard it. @@ -3033,6 +3127,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(AchievementsManagerResync_SingleUserOneUpdateAlreadyReceivedSameValues_SuccessfullyUpdatedOnlyGeneratesOneEvent) { + TEST_LOG(L"Test starting: AchievementsManagerResync_SingleUserOneUpdateAlreadyReceivedSameValues_SuccessfullyUpdatedOnlyGeneratesOneEvent"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; @@ -3069,6 +3165,8 @@ DEFINE_TEST_CLASS(AchievementsManagerTests) DEFINE_TEST_CASE(RtaConnectionDropped_OneAchievementChanged_StateResyncedCorrectly) { + TEST_LOG(L"Test starting: RtaConnectionDropped_OneAchievementChanged_StateResyncedCorrectly"); + AMTestEnvironment env{}; constexpr uint64_t xuid = 1234; diff --git a/Tests/UnitTests/Tests/Services/AchievementsTests.cpp b/Tests/UnitTests/Tests/Services/AchievementsTests.cpp index 7ef39156..f099a2eb 100644 --- a/Tests/UnitTests/Tests/Services/AchievementsTests.cpp +++ b/Tests/UnitTests/Tests/Services/AchievementsTests.cpp @@ -211,14 +211,16 @@ DEFINE_TEST_CLASS(AchievementsTests) DEFINE_TEST_CASE(TestXblAchievementsUpdateAchievementAsync) { + TEST_LOG(L"Test starting: TestXblAchievementsUpdateAchievementAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); xsapi_internal_stringstream url; url << "https://achievements.xboxlive.com/users/xuid(" << xboxLiveContext->Xuid() << ")/achievements/mockscid/update"; - HttpMock mock("POST", url.str(), 304 ); + auto mock = std::make_shared("POST", url.str(), 304 ); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback([&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) + mock->SetMockMatchedCallback([&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); UNREFERENCED_PARAMETER(requestUrl); @@ -243,6 +245,8 @@ DEFINE_TEST_CLASS(AchievementsTests) DEFINE_TEST_CASE(TestGetAchievement) { + TEST_LOG(L"Test starting: TestGetAchievement"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); JsonDocument responseJson; @@ -266,6 +270,8 @@ DEFINE_TEST_CLASS(AchievementsTests) DEFINE_TEST_CASE(TestGetAchievementBadData) { + TEST_LOG(L"Test starting: TestGetAchievementBadData"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); JsonDocument responseJson; @@ -287,6 +293,8 @@ DEFINE_TEST_CLASS(AchievementsTests) DEFINE_TEST_CASE(TestGetAchievements) { + TEST_LOG(L"Test starting: TestGetAchievements"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); JsonDocument responseJson; @@ -294,9 +302,9 @@ DEFINE_TEST_CLASS(AchievementsTests) xsapi_internal_stringstream url; url << "https://achievements.xboxlive.com/users/xuid(" << xboxLiveContext->Xuid() << ")/achievements?titleId=1234&maxItems=100"; - HttpMock mock("GET", url.str(), 200, responseJson); + auto mock = std::make_shared("GET", url.str(), 200, responseJson); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback([&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) + mock->SetMockMatchedCallback([&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); UNREFERENCED_PARAMETER(requestUrl); @@ -328,6 +336,8 @@ DEFINE_TEST_CLASS(AchievementsTests) DEFINE_TEST_CASE(TestGetAchievementsEmptyResult) { + TEST_LOG(L"Test starting: TestGetAchievementsEmptyResult"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); JsonDocument responseJson; @@ -335,9 +345,9 @@ DEFINE_TEST_CLASS(AchievementsTests) xsapi_internal_stringstream url; url << "https://achievements.xboxlive.com/users/xuid(" << xboxLiveContext->Xuid() << ")/achievements?titleId=1234&maxItems=100"; - HttpMock mock("GET", url.str(), 200, responseJson); + auto mock = std::make_shared("GET", url.str(), 200, responseJson); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback([&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) + mock->SetMockMatchedCallback([&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); UNREFERENCED_PARAMETER(requestUrl); @@ -370,6 +380,8 @@ DEFINE_TEST_CLASS(AchievementsTests) DEFINE_TEST_CASE(TestGetAchievementsInvalidArgs) { + TEST_LOG(L"Test starting: TestGetAchievementsInvalidArgs"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); JsonDocument responseJson; @@ -406,6 +418,8 @@ DEFINE_TEST_CLASS(AchievementsTests) DEFINE_TEST_CASE(TestGetAchievementInvalidArgs) { + TEST_LOG(L"Test starting: TestGetAchievementInvalidArgs"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); JsonDocument responseJson; @@ -448,6 +462,8 @@ DEFINE_TEST_CLASS(AchievementsTests) DEFINE_TEST_CASE(TestUpdateAchievementInvalidArgs) { + TEST_LOG(L"Test starting: TestUpdateAchievementInvalidArgs"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); JsonDocument responseJson; @@ -486,6 +502,7 @@ DEFINE_TEST_CLASS(AchievementsTests) DEFINE_TEST_CASE(TestRTAAchievementProgressChange) { + TEST_LOG(L"Test starting: TestRTAAchievementProgressChange"); TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto& mockRtaService{ MockRealTimeActivityService::Instance() }; diff --git a/Tests/UnitTests/Tests/Services/ErrorTests.cpp b/Tests/UnitTests/Tests/Services/ErrorTests.cpp index 453c2bc7..763c1ba4 100644 --- a/Tests/UnitTests/Tests/Services/ErrorTests.cpp +++ b/Tests/UnitTests/Tests/Services/ErrorTests.cpp @@ -13,6 +13,8 @@ DEFINE_TEST_CLASS(ErrorTests) DEFINE_TEST_CASE(TestHttpErrors) { + TEST_LOG(L"Test starting: TestHttpErrors"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); diff --git a/Tests/UnitTests/Tests/Services/LeaderboardTests.cpp b/Tests/UnitTests/Tests/Services/LeaderboardTests.cpp index ff75a4d0..d4606a5a 100644 --- a/Tests/UnitTests/Tests/Services/LeaderboardTests.cpp +++ b/Tests/UnitTests/Tests/Services/LeaderboardTests.cpp @@ -260,6 +260,8 @@ DEFINE_TEST_CLASS(LeaderboardTests) DEFINE_TEST_CASE(TestGetLeaderboardAsync) { + TEST_LOG(L"Test starting: TestGetLeaderboardAsync"); + TestEnvironment env{}; const char* token = "6"; @@ -337,6 +339,8 @@ DEFINE_TEST_CLASS(LeaderboardTests) DEFINE_TEST_CASE(TestGetLeaderboardWithLargeBufferAsync) { + TEST_LOG(L"Test starting: TestGetLeaderboardWithLargeBufferAsync"); + TestEnvironment env{}; const char* token = "6"; @@ -417,6 +421,8 @@ DEFINE_TEST_CLASS(LeaderboardTests) DEFINE_TEST_CASE(TestGetLeaderboardWitSkipToRankAsync) { + TEST_LOG(L"Test starting: TestGetLeaderboardWitSkipToRankAsync"); + TestEnvironment env{}; const int rank{ 100 }; @@ -448,6 +454,8 @@ DEFINE_TEST_CLASS(LeaderboardTests) DEFINE_TEST_CASE(TestGetLearderboardSkipToUserAsync) { + TEST_LOG(L"Test starting: TestGetLearderboardSkipToUserAsync"); + TestEnvironment env{}; const uint64_t user{ 2533274896500838 }; @@ -479,6 +487,8 @@ DEFINE_TEST_CLASS(LeaderboardTests) DEFINE_TEST_CASE(TestGetLeaderboardForSocialGroupAsync) { + TEST_LOG(L"Test starting: TestGetLeaderboardForSocialGroupAsync"); + TestEnvironment env{}; const uint32_t maxItems{ 20 }; @@ -526,6 +536,8 @@ DEFINE_TEST_CLASS(LeaderboardTests) DEFINE_TEST_CASE(TestGetLeaderboardForSocialGroupWithSortAsync) { + TEST_LOG(L"Test starting: TestGetLeaderboardForSocialGroupWithSortAsync"); + TestEnvironment env{}; const uint32_t maxItems{ 20 }; @@ -547,6 +559,8 @@ DEFINE_TEST_CLASS(LeaderboardTests) DEFINE_TEST_CASE(TestGetLeaderboardForSocialGroupWithSkipToRankAsync) { + TEST_LOG(L"Test starting: TestGetLeaderboardForSocialGroupWithSkipToRankAsync"); + TestEnvironment env{}; const uint32_t rank{ 2 }; @@ -592,6 +606,8 @@ DEFINE_TEST_CLASS(LeaderboardTests) DEFINE_TEST_CASE(TestGetLeaderboardForSocialGroupWithSkipToUserAsync) { + TEST_LOG(L"Test starting: TestGetLeaderboardForSocialGroupWithSkipToUserAsync"); + TestEnvironment env{}; const uint64_t user{ 2533274896500838 }; @@ -642,6 +658,8 @@ DEFINE_TEST_CLASS(LeaderboardTests) DEFINE_TEST_CASE(TestGetLeaderboardAsyncInvalidArgs) { + TEST_LOG(L"Test starting: TestGetLeaderboardAsyncInvalidArgs"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); diff --git a/Tests/UnitTests/Tests/Services/MatchmakingTests.cpp b/Tests/UnitTests/Tests/Services/MatchmakingTests.cpp index 1fed276b..0b3b2453 100644 --- a/Tests/UnitTests/Tests/Services/MatchmakingTests.cpp +++ b/Tests/UnitTests/Tests/Services/MatchmakingTests.cpp @@ -95,6 +95,8 @@ DEFINE_TEST_CLASS(MatchmakingTests) DEFINE_TEST_CASE(TestCreateMatchTicketAsync) { + TEST_LOG(L"Test starting: TestCreateMatchTicketAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -112,11 +114,11 @@ DEFINE_TEST_CLASS(MatchmakingTests) JsonDocument expectedResponse; expectedResponse.Parse(R"({"ticketId":"0584338f-a2ff-4eb9-b167-c0e8ddecae72", "waitTime":60 })"); - HttpMock mock{ "POST", matchmakingUri }; - mock.SetResponseBody(expectedResponse); + auto mock = std::make_shared( "POST", matchmakingUri ); + mock->SetResponseBody(expectedResponse); bool requestWellFormed { true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string body) { UNREFERENCED_PARAMETER(mock); @@ -153,6 +155,8 @@ DEFINE_TEST_CLASS(MatchmakingTests) DEFINE_TEST_CASE(TestCreateMatchTicketAsync_EmptyResult) { + TEST_LOG(L"Test starting: TestCreateMatchTicketAsync_EmptyResult"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -168,11 +172,11 @@ DEFINE_TEST_CLASS(MatchmakingTests) xsapi_internal_string matchmakingUri = "https://smartmatch.xboxlive.com/serviceconfigs/07617C5B-3423-4505-B6C6-10A16E1E5DDB/hoppers/DeathMatch"; - HttpMock mock{ "POST", matchmakingUri }; - mock.SetResponseBody(expectedResponse); + auto mock = std::make_shared( "POST", matchmakingUri ); + mock->SetResponseBody(expectedResponse); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string body) { UNREFERENCED_PARAMETER(mock); @@ -199,6 +203,8 @@ DEFINE_TEST_CLASS(MatchmakingTests) DEFINE_TEST_CASE(TestDeleteMatchTicketAsync) { + TEST_LOG(L"Test starting: TestDeleteMatchTicketAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -220,6 +226,8 @@ DEFINE_TEST_CLASS(MatchmakingTests) DEFINE_TEST_CASE(TestGetMatchTicketAsync) { + TEST_LOG(L"Test starting: TestGetMatchTicketAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -254,6 +262,8 @@ DEFINE_TEST_CLASS(MatchmakingTests) DEFINE_TEST_CASE(TestGetMatchTicketWithLargeBufferAsync) { + TEST_LOG(L"Test starting: TestGetMatchTicketWithLargeBufferAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -290,6 +300,8 @@ DEFINE_TEST_CLASS(MatchmakingTests) DEFINE_TEST_CASE(TestGetStatsForHopperAsync) { + TEST_LOG(L"Test starting: TestGetStatsForHopperAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -327,6 +339,8 @@ DEFINE_TEST_CLASS(MatchmakingTests) DEFINE_TEST_CASE(TestGetStatsForHopperWithLargeBufferAsync) { + TEST_LOG(L"Test starting: TestGetStatsForHopperWithLargeBufferAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -366,6 +380,8 @@ DEFINE_TEST_CLASS(MatchmakingTests) DEFINE_TEST_CASE(TestInvalidArgument) { + TEST_LOG(L"Test starting: TestInvalidArgument"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); diff --git a/Tests/UnitTests/Tests/Services/MultiplayerActivityTests.cpp b/Tests/UnitTests/Tests/Services/MultiplayerActivityTests.cpp index e2365021..786c132d 100644 --- a/Tests/UnitTests/Tests/Services/MultiplayerActivityTests.cpp +++ b/Tests/UnitTests/Tests/Services/MultiplayerActivityTests.cpp @@ -58,6 +58,8 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) DEFINE_TEST_CASE(TestUpdateRecentPlayers) { + TEST_LOG(L"Test starting: TestUpdateRecentPlayers"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -67,8 +69,8 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) bool requestWellFormed{ true }; const XblMultiplayerActivityRecentPlayerUpdate updates[] = { {1}, {2}, {3} }; - HttpMock mock{ "POST", url.str(), 204 }; - mock.SetMockMatchedCallback( + auto mock = std::make_shared( "POST", url.str(), 204 ); + mock->SetMockMatchedCallback( [&](HttpMock* /*mock*/, xsapi_internal_string /*uri*/, xsapi_internal_string body) { rapidjson::Document d; @@ -95,6 +97,8 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) DEFINE_TEST_CASE(TestUpdateRecentPlayersNoFlush) { + TEST_LOG(L"Test starting: TestUpdateRecentPlayersNoFlush"); + auto env = std::make_unique(); auto xboxLiveContext = env->CreateMockXboxLiveContext(); @@ -106,8 +110,8 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) size_t httpRequestCount{ 0 }; - HttpMock mock{ "POST", url.str(), 204 }; - mock.SetMockMatchedCallback( + auto mock = std::make_shared( "POST", url.str(), 204 ); + mock->SetMockMatchedCallback( [&](HttpMock* /*mock*/, xsapi_internal_string /*uri*/, xsapi_internal_string body) { httpRequestCount++; @@ -169,6 +173,8 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) DEFINE_TEST_CASE(TestSetActivity) { + TEST_LOG(L"Test starting: TestSetActivity"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -181,10 +187,10 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) Stringstream url; url << "https://multiplayeractivity.xboxlive.com/titles/" << MOCK_TITLEID << "/users/" << xboxLiveContext->Xuid() << "/activities"; - HttpMock mock{ "PUT", url.str(), 204 }; + auto mock = std::make_shared( "PUT", url.str(), 204 ); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* /*mock*/, xsapi_internal_string /*uri*/, xsapi_internal_string body) { JsonDocument d; @@ -263,15 +269,17 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) DEFINE_TEST_CASE(TestGetActivities) { + TEST_LOG(L"Test starting: TestGetActivities"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock{ "POST", "https://multiplayeractivity.xboxlive.com" }; - mock.SetResponseBody(getActivityResponse); + auto mock = std::make_shared( "POST", "https://multiplayeractivity.xboxlive.com" ); + mock->SetResponseBody(getActivityResponse); uint64_t xuids[] = { 1, 2 }; bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* /*mock*/, xsapi_internal_string /*uri*/, xsapi_internal_string body) { JsonDocument b; @@ -311,15 +319,17 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) DEFINE_TEST_CASE(TestGetActivitiesWithLargeBuffer) { + TEST_LOG(L"Test starting: TestGetActivitiesWithLargeBuffer"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock{ "POST", "https://multiplayeractivity.xboxlive.com" }; - mock.SetResponseBody(getActivityResponse); + auto mock = std::make_shared( "POST", "https://multiplayeractivity.xboxlive.com" ); + mock->SetResponseBody(getActivityResponse); uint64_t xuids[] = { 1, 2 }; bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* /*mock*/, xsapi_internal_string /*uri*/, xsapi_internal_string body) { JsonDocument b; @@ -362,6 +372,8 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) DEFINE_TEST_CASE(TestDeleteActivity) { + TEST_LOG(L"Test starting: TestDeleteActivity"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -376,6 +388,8 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) DEFINE_TEST_CASE(TestSendInvites) { + TEST_LOG(L"Test starting: TestSendInvites"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -393,10 +407,10 @@ DEFINE_TEST_CLASS(MultiplayerActivityTests) Stringstream url; url << "https://multiplayeractivity.xboxlive.com/titles/" << MOCK_TITLEID << "/invites"; - HttpMock mock{ "POST", url.str(), 204 }; + auto mock = std::make_shared( "POST", url.str(), 204 ); bool requestWellFormed{ false }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* /*mock*/, xsapi_internal_string /*url*/, xsapi_internal_string body) { requestWellFormed = VerifyJson(expectedRequestBody, body.data()); diff --git a/Tests/UnitTests/Tests/Services/MultiplayerManagerTests.cpp b/Tests/UnitTests/Tests/Services/MultiplayerManagerTests.cpp index ca038a2f..09f7d872 100644 --- a/Tests/UnitTests/Tests/Services/MultiplayerManagerTests.cpp +++ b/Tests/UnitTests/Tests/Services/MultiplayerManagerTests.cpp @@ -3536,6 +3536,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestAddLocalUser) { + TEST_LOG(L"Test starting: TestAddLocalUser"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -3544,6 +3546,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestRemoveLocalUser) { + TEST_LOG(L"Test starting: TestRemoveLocalUser"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -3552,6 +3556,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestReAddAfterRemovingLocalUser) { + TEST_LOG(L"Test starting: TestReAddAfterRemovingLocalUser"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -3561,6 +3567,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestDeleteLocalMemberProperties) { + TEST_LOG(L"Test starting: TestDeleteLocalMemberProperties"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -3607,6 +3615,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestSetSynchronizedLobbyProperties) { + TEST_LOG(L"Test starting: TestSetSynchronizedLobbyProperties"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); AddLocalUserHelperWithSyncUpdate(xboxLiveContext.get()); @@ -3666,6 +3676,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestSetSynchronizedGameProperties) { + TEST_LOG(L"Test starting: TestSetSynchronizedGameProperties"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); JoinGameHelper(xboxLiveContext.get()); @@ -3725,6 +3737,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestLeaveGame) { + TEST_LOG(L"Test starting: TestLeaveGame"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); JoinGameHelper(xboxLiveContext.get()); @@ -3778,6 +3792,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestInviteUsers) { + TEST_LOG(L"Test starting: TestInviteUsers"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); AddLocalUserHelperWithSyncUpdate(xboxLiveContext.get()); @@ -3886,6 +3902,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) */ DEFINE_TEST_CASE(TestJoinLobbyWithValidHandleId) { + TEST_LOG(L"Test starting: TestJoinLobbyWithValidHandleId"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -3894,6 +3912,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinLobbyWithValidHandleIdWithEventArgs) { + TEST_LOG(L"Test starting: TestJoinLobbyWithValidHandleIdWithEventArgs"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -3902,6 +3922,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinLobbyWithInvalidArgs_1) { + TEST_LOG(L"Test starting: TestJoinLobbyWithInvalidArgs_1"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -3910,6 +3932,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinLobbyWithInvalidArgs_2) { + TEST_LOG(L"Test starting: TestJoinLobbyWithInvalidArgs_2"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -3918,6 +3942,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinLobbyWithInvalidHandleId) { + TEST_LOG(L"Test starting: TestJoinLobbyWithInvalidHandleId"); + MPMTestEnvironment env{}; XTaskQueueHandle queue{}; @@ -3959,6 +3985,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinLobbyWithValidTransferHandle) { + TEST_LOG(L"Test starting: TestJoinLobbyWithValidTransferHandle"); + MPMTestEnvironment env{}; XTaskQueueHandle queue{}; @@ -4009,6 +4037,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinLobbyWithInvalidTransferHandle) { + TEST_LOG(L"Test starting: TestJoinLobbyWithInvalidTransferHandle"); + MPMTestEnvironment env{}; XTaskQueueHandle queue{}; @@ -4123,6 +4153,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinGameFromLobbyWithTransferHandle) { + TEST_LOG(L"Test starting: TestJoinGameFromLobbyWithTransferHandle"); + MPMTestEnvironment env{}; XTaskQueueHandle queue{}; @@ -4166,6 +4198,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinGameFromLobbyWithTransferHandleMultipleUsers) { + TEST_LOG(L"Test starting: TestJoinGameFromLobbyWithTransferHandleMultipleUsers"); + MPMTestEnvironment env{}; auto xboxLiveContext1 = env.CreateMockXboxLiveContext(1234); auto xboxLiveContext2 = env.CreateMockXboxLiveContext(2345); @@ -4181,6 +4215,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinGameFromLobbyFailedToJoin) { + TEST_LOG(L"Test starting: TestJoinGameFromLobbyFailedToJoin"); + MPMTestEnvironment env{}; XTaskQueueHandle queue{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -4248,6 +4284,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinGameFromLobbyNoHandleCreateNewGame) { + TEST_LOG(L"Test starting: TestJoinGameFromLobbyNoHandleCreateNewGame"); + MPMTestEnvironment env{}; XTaskQueueHandle queue{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -4306,6 +4344,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinGameFromLobbyNoHandleFailedToCreateNewGame) { + TEST_LOG(L"Test starting: TestJoinGameFromLobbyNoHandleFailedToCreateNewGame"); + MPMTestEnvironment env{}; XTaskQueueHandle queue{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -4475,6 +4515,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinGame) { + TEST_LOG(L"Test starting: TestJoinGame"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -4483,6 +4525,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinGameWithXuids) { + TEST_LOG(L"Test starting: TestJoinGameWithXuids"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -4683,36 +4727,50 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestLeaveMultiplayer_1) { + TEST_LOG(L"Test starting: TestLeaveMultiplayer_1"); + TestLeaveMultiplayerHelper(CallingPatternType::Sync); } DEFINE_TEST_CASE(TestLeaveMultiplayer_2) { + TEST_LOG(L"Test starting: TestLeaveMultiplayer_2"); + TestLeaveMultiplayerHelper(CallingPatternType::Async); } DEFINE_TEST_CASE(TestLeaveMultiplayer_3) { + TEST_LOG(L"Test starting: TestLeaveMultiplayer_3"); + TestLeaveMultiplayerHelper(CallingPatternType::Combination); } DEFINE_TEST_CASE(TestLeaveMultiplayer_4) { + TEST_LOG(L"Test starting: TestLeaveMultiplayer_4"); + TestLeaveMultiplayerHelper(CallingPatternType::ReverseSync); } DEFINE_TEST_CASE(TestLeaveMultiplayer_5) { + TEST_LOG(L"Test starting: TestLeaveMultiplayer_5"); + TestLeaveMultiplayerHelper(CallingPatternType::ReverseAsync); } DEFINE_TEST_CASE(TestLeaveMultiplayer_6) { + TEST_LOG(L"Test starting: TestLeaveMultiplayer_6"); + TestLeaveMultiplayerHelper(CallingPatternType::ReverseCombination); } DEFINE_TEST_CASE(TestMultipleLocalUsers_1) { + TEST_LOG(L"Test starting: TestMultipleLocalUsers_1"); + MPMTestEnvironment env{}; auto xboxLiveContext1 = env.CreateMockXboxLiveContext(1234); auto xboxLiveContext2 = env.CreateMockXboxLiveContext(2345); @@ -4759,6 +4817,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) // Add multiple users while removing a user (on diff threads) DEFINE_TEST_CASE(TestMultipleLocalUsers_2) { + TEST_LOG(L"Test starting: TestMultipleLocalUsers_2"); + MPMTestEnvironment env{}; auto xboxLiveContext1 = env.CreateMockXboxLiveContext(1234); auto xboxLiveContext2 = env.CreateMockXboxLiveContext(2345); @@ -4818,6 +4878,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) // Constantly add/remove users DEFINE_TEST_CASE(TestMultipleLocalUsers_3) { + TEST_LOG(L"Test starting: TestMultipleLocalUsers_3"); + MPMTestEnvironment env{}; auto xboxLiveContext1 = env.CreateMockXboxLiveContext(1234); auto xboxLiveContext2 = env.CreateMockXboxLiveContext(2345); @@ -4978,36 +5040,50 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestJoinGameWhileRemovingLocalUser_1) { + TEST_LOG(L"Test starting: TestJoinGameWhileRemovingLocalUser_1"); + TestJoinGameWhileRemovingLocalUserHelper(CallingPatternType::Sync); } DEFINE_TEST_CASE(TestJoinGameWhileRemovingLocalUser_2) { + TEST_LOG(L"Test starting: TestJoinGameWhileRemovingLocalUser_2"); + TestJoinGameWhileRemovingLocalUserHelper(CallingPatternType::Async); } DEFINE_TEST_CASE(TestJoinGameWhileRemovingLocalUser_3) { + TEST_LOG(L"Test starting: TestJoinGameWhileRemovingLocalUser_3"); + TestJoinGameWhileRemovingLocalUserHelper(CallingPatternType::Combination); } DEFINE_TEST_CASE(TestJoinGameWhileRemovingLocalUser_4) { + TEST_LOG(L"Test starting: TestJoinGameWhileRemovingLocalUser_4"); + TestJoinGameWhileRemovingLocalUserHelper(CallingPatternType::ReverseSync); } DEFINE_TEST_CASE(TestJoinGameWhileRemovingLocalUser_5) { + TEST_LOG(L"Test starting: TestJoinGameWhileRemovingLocalUser_5"); + TestJoinGameWhileRemovingLocalUserHelper(CallingPatternType::ReverseAsync); } DEFINE_TEST_CASE(TestJoinGameWhileRemovingLocalUser_6) { + TEST_LOG(L"Test starting: TestJoinGameWhileRemovingLocalUser_6"); + TestJoinGameWhileRemovingLocalUserHelper(CallingPatternType::ReverseCombination); } DEFINE_TEST_CASE(TestSubscriptionsLostEvent) { + TEST_LOG(L"Test starting: TestSubscriptionsLostEvent"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); AddLocalUserHelperWithSyncUpdate(xboxLiveContext.get()); @@ -5104,6 +5180,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestBackToBackSessionWriteLogic_1) { + TEST_LOG(L"Test starting: TestBackToBackSessionWriteLogic_1"); + std::vector responses { defaultLobbySessionResponse, // change #1 @@ -5116,6 +5194,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestBackToBackSessionWriteLogic_2) { + TEST_LOG(L"Test starting: TestBackToBackSessionWriteLogic_2"); + std::vector responses { lobbyWithCompletedTransferHandleResponse, // change #3 @@ -5133,11 +5213,11 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) AddLocalUserHelper(xboxLiveContext.get()); uint32_t mockCount{ 0 }; - HttpMock mock(GET, defaultMpsdUri); - mock.SetResponseBody(getResponses[0]); - mock.SetResponseHttpStatus(getStatuses[0]); - mock.SetResponseHeaders(defaultLobbyHttpResponseHeaders); - mock.SetMockMatchedCallback([getResponses, getStatuses, &mockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto mock = std::make_shared(GET, defaultMpsdUri); + mock->SetResponseBody(getResponses[0]); + mock->SetResponseHttpStatus(getStatuses[0]); + mock->SetResponseHeaders(defaultLobbyHttpResponseHeaders); + mock->SetMockMatchedCallback([getResponses, getStatuses, &mockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (mockCount < getResponses.size()) { @@ -5175,6 +5255,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestMultipleTaps_1) { + TEST_LOG(L"Test starting: TestMultipleTaps_1"); + // Set up initial http responses std::vector getResponses { @@ -5191,6 +5273,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestMultipleTaps_2) { + TEST_LOG(L"Test starting: TestMultipleTaps_2"); + std::vector getResponses { lobbyWithPendingTransferHandleResponse, // change #2 @@ -5271,6 +5355,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestWriteSessionWithTaps_1) { + TEST_LOG(L"Test starting: TestWriteSessionWithTaps_1"); + // Set up initial http responses std::vector writeResponses { @@ -5304,10 +5390,10 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) AddLocalUserHelper(xboxLiveContext.get()); uint32_t mockCount{ 0 }; - HttpMock mock(POST, defaultMpsdUri, 201); - mock.SetResponseBody(writeResponses[0]); - mock.SetResponseHeaders(defaultLobbyHttpResponseHeaders); - mock.SetMockMatchedCallback([writeResponses, &mockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto mock = std::make_shared(POST, defaultMpsdUri, 201); + mock->SetResponseBody(writeResponses[0]); + mock->SetResponseHeaders(defaultLobbyHttpResponseHeaders); + mock->SetMockMatchedCallback([writeResponses, &mockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (mockCount < writeResponses.size()) { @@ -5373,7 +5459,7 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) sessionEvent.Wait(); XAsyncBlock async{}; - mock.SetResponseBody(getResponse); + mock->SetResponseBody(getResponse); RunAsync(&async, __FUNCTION__, [maxChangeNumberForTap, &sessionEvent, session, sessionWriter](XAsyncOp op, const XAsyncProviderData* data) { @@ -5412,6 +5498,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestWriteSessionWithTaps_2) { + TEST_LOG(L"Test starting: TestWriteSessionWithTaps_2"); + std::vector writeResponses { sessionChangeNum6, // change #6 @@ -5427,6 +5515,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestWriteSessionWithTaps_3) { + TEST_LOG(L"Test starting: TestWriteSessionWithTaps_3"); + std::vector writeResponses { sessionChangeNum6, // change #6 @@ -5443,6 +5533,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) // multiplayer_session_writer: DEFINE_TEST_CASE(TestSessionWriterLeaveRemoteSession) { + TEST_LOG(L"Test starting: TestSessionWriterLeaveRemoteSession"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); JoinGameHelper(xboxLiveContext.get()); @@ -5483,6 +5575,8 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestTransferHandleState) { + TEST_LOG(L"Test starting: TestTransferHandleState"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); JoinGameHelper(xboxLiveContext.get()); @@ -5732,16 +5826,22 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestLeaveRemoteSession) { + TEST_LOG(L"Test starting: TestLeaveRemoteSession"); + LeaveRemoteSession(); } DEFINE_TEST_CASE(TestRemoveStaleUsersFromRemoteSession) { + TEST_LOG(L"Test starting: TestRemoveStaleUsersFromRemoteSession"); + RemoveStaleUsersFromRemoteSession(gameSessionResponseDiffXuid, gameSessionResponseDiffXuidJson().GetObject()); } DEFINE_TEST_CASE(TestErrorHandling) { + TEST_LOG(L"Test starting: TestErrorHandling"); + MPMTestEnvironment env{}; XTaskQueueHandle queue{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); @@ -5913,10 +6013,10 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) } uint32_t lobbyMockCount{ 0 }; - HttpMock lobbyMock(GET, defaultMpsdUri, 200); - lobbyMock.SetResponseBody(lobbyResponses[0]); - lobbyMock.SetResponseHeaders(defaultLobbyHttpResponseHeaders); - lobbyMock.SetMockMatchedCallback([lobbyResponses, &lobbyMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto lobbyMock = std::make_shared(GET, defaultMpsdUri, 200); + lobbyMock->SetResponseBody(lobbyResponses[0]); + lobbyMock->SetResponseHeaders(defaultLobbyHttpResponseHeaders); + lobbyMock->SetMockMatchedCallback([lobbyResponses, &lobbyMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (lobbyMockCount < lobbyResponses.size()) { @@ -5926,10 +6026,10 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) }); uint32_t gameMockCount{ 0 }; - HttpMock gameMock(GET, defaultGameUri, 200); - gameMock.SetResponseBody(gameResponses[0]); - gameMock.SetResponseHeaders(defaultGameHttpResponseHeaders); - gameMock.SetMockMatchedCallback([gameResponses, &gameMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto gameMock = std::make_shared(GET, defaultGameUri, 200); + gameMock->SetResponseBody(gameResponses[0]); + gameMock->SetResponseHeaders(defaultGameHttpResponseHeaders); + gameMock->SetMockMatchedCallback([gameResponses, &gameMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (gameMockCount < gameResponses.size()) { @@ -6093,10 +6193,10 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) } uint32_t lobbyMockCount{ 0 }; - HttpMock lobbyMock(GET, defaultMpsdUri, 200); - lobbyMock.SetResponseBody(lobbyResponses[0]); - lobbyMock.SetResponseHeaders(defaultLobbyHttpResponseHeaders); - lobbyMock.SetMockMatchedCallback([lobbyResponses, &lobbyMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto lobbyMock = std::make_shared(GET, defaultMpsdUri, 200); + lobbyMock->SetResponseBody(lobbyResponses[0]); + lobbyMock->SetResponseHeaders(defaultLobbyHttpResponseHeaders); + lobbyMock->SetMockMatchedCallback([lobbyResponses, &lobbyMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (lobbyMockCount < lobbyResponses.size()) { @@ -6106,10 +6206,10 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) }); uint32_t gameMockCount{ 0 }; - HttpMock gameMock(GET, defaultGameUri, 200); - gameMock.SetResponseBody(gameResponses[0]); - gameMock.SetResponseHeaders(defaultGameHttpResponseHeaders); - gameMock.SetMockMatchedCallback([gameResponses, &gameMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto gameMock = std::make_shared(GET, defaultGameUri, 200); + gameMock->SetResponseBody(gameResponses[0]); + gameMock->SetResponseHeaders(defaultGameHttpResponseHeaders); + gameMock->SetMockMatchedCallback([gameResponses, &gameMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (gameMockCount < gameResponses.size()) { @@ -6251,31 +6351,43 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestFindMatchNoQoSCompleted) { + TEST_LOG(L"Test starting: TestFindMatchNoQoSCompleted"); + FindMatchNoQoSHelper(MatchCallingPatternType::Completed); } DEFINE_TEST_CASE(TestFindMatchNoQoSRemoteClientFailedToJoin) { + TEST_LOG(L"Test starting: TestFindMatchNoQoSRemoteClientFailedToJoin"); + FindMatchNoQoSHelper(MatchCallingPatternType::RemoteClientFailedToJoin); } DEFINE_TEST_CASE(TestFindMatchNoQoSExpiredByNextTimer) { + TEST_LOG(L"Test starting: TestFindMatchNoQoSExpiredByNextTimer"); + FindMatchNoQoSHelper(MatchCallingPatternType::ExpiredByNextTimer); } DEFINE_TEST_CASE(TestFindMatchNoQoSExpiredByService) { + TEST_LOG(L"Test starting: TestFindMatchNoQoSExpiredByService"); + FindMatchNoQoSHelper(MatchCallingPatternType::ExpiredByService); } DEFINE_TEST_CASE(TestFindMatchWithQoSCompleted) { + TEST_LOG(L"Test starting: TestFindMatchWithQoSCompleted"); + FindMatchWithQoSHelper(MatchCallingPatternType::Completed); } DEFINE_TEST_CASE(TestFindMatchWithQoSRemoteClientFailedToUploadQoS) { + TEST_LOG(L"Test starting: TestFindMatchWithQoSRemoteClientFailedToUploadQoS"); + FindMatchWithQoSHelper(MatchCallingPatternType::RemoteClientFailedToUploadQoS); } @@ -6300,9 +6412,9 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) }; uint32_t lobbyMockCount{ 0 }; - HttpMock lobbyMock(GET, defaultMpsdUri, 200); - lobbyMock.SetResponseHeaders(defaultLobbyHttpResponseHeaders); - lobbyMock.SetMockMatchedCallback([lobbyResponses, &lobbyMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto lobbyMock = std::make_shared(GET, defaultMpsdUri, 200); + lobbyMock->SetResponseHeaders(defaultLobbyHttpResponseHeaders); + lobbyMock->SetMockMatchedCallback([lobbyResponses, &lobbyMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (lobbyMockCount < lobbyResponses.size()) { @@ -6312,9 +6424,9 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) }); uint32_t gameMockCount{ 0 }; - HttpMock gameMock(GET, defaultGameUri, 200); - gameMock.SetResponseHeaders(defaultGameHttpResponseHeaders); - gameMock.SetMockMatchedCallback([gameResponses, &gameMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto gameMock = std::make_shared(GET, defaultGameUri, 200); + gameMock->SetResponseHeaders(defaultGameHttpResponseHeaders); + gameMock->SetMockMatchedCallback([gameResponses, &gameMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (gameMockCount < gameResponses.size()) { @@ -6409,11 +6521,15 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestFindMatchNoQoSRemoteClientJoiningMatchSession) { + TEST_LOG(L"Test starting: TestFindMatchNoQoSRemoteClientJoiningMatchSession"); + FindMatchNoQoSRemoteClientJoiningMatchSessionHelper(); } DEFINE_TEST_CASE(TestFindMatchNoQoSInvalidArg) { + TEST_LOG(L"Test starting: TestFindMatchNoQoSInvalidArg"); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); AddLocalUserHelper(xboxLiveContext.get()); @@ -6449,10 +6565,10 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) } uint32_t lobbyMockCount{ 0 }; - HttpMock lobbyMock(GET, defaultMpsdUri, 200); - lobbyMock.SetResponseBody(lobbyResponses[0]); - lobbyMock.SetResponseHeaders(defaultLobbyHttpResponseHeaders); - lobbyMock.SetMockMatchedCallback([lobbyResponses, &lobbyMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto lobbyMock = std::make_shared(GET, defaultMpsdUri, 200); + lobbyMock->SetResponseBody(lobbyResponses[0]); + lobbyMock->SetResponseHeaders(defaultLobbyHttpResponseHeaders); + lobbyMock->SetMockMatchedCallback([lobbyResponses, &lobbyMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (lobbyMockCount < lobbyResponses.size()) { @@ -6462,10 +6578,10 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) }); uint32_t gameMockCount{ 0 }; - HttpMock gameMock(GET, defaultGameUri, 200); - gameMock.SetResponseBody(gameResponses[0]); - gameMock.SetResponseHeaders(defaultGameHttpResponseHeaders); - gameMock.SetMockMatchedCallback([gameResponses, &gameMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) + auto gameMock = std::make_shared(GET, defaultGameUri, 200); + gameMock->SetResponseBody(gameResponses[0]); + gameMock->SetResponseHeaders(defaultGameHttpResponseHeaders); + gameMock->SetMockMatchedCallback([gameResponses, &gameMockCount](class HttpMock* matchedMock, xsapi_internal_string actualRequestUrl, xsapi_internal_string requestBody) { if (gameMockCount < gameResponses.size()) { @@ -6552,28 +6668,36 @@ DEFINE_TEST_CLASS(MultiplayerManagerTests) DEFINE_TEST_CASE(TestCancelMatch) { + TEST_LOG(L"Test starting: TestCancelMatch"); + CancelMatchHelper(MatchCallingPatternType::Canceled); } DEFINE_TEST_CASE(TestCancelMatchByService) { + TEST_LOG(L"Test starting: TestCancelMatchByService"); + CancelMatchHelper(MatchCallingPatternType::CanceledByService); } DEFINE_TEST_CASE(TestRtaResync) { + TEST_LOG(L"Test starting: TestRtaResync"); + + DEFINE_TEST_CASE_PROPERTIES_FOCUS(); + MPMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(1234); AddLocalUserHelper(xboxLiveContext.get()); - HttpMock mock("GET", defaultMpsdUri, 201); - mock.SetResponseBody(defaultLobbySessionResponse); - mock.SetResponseHeaders(defaultLobbyHttpResponseHeaders); + auto mock = std::make_shared("GET", defaultMpsdUri, 201); + mock->SetResponseBody(defaultLobbySessionResponse); + mock->SetResponseHeaders(defaultLobbyHttpResponseHeaders); // Wait for MPM to refresh the lobby Event e; - mock.SetMockMatchedCallback([&](HttpMock*, xsapi_internal_string, xsapi_internal_string) + mock->SetMockMatchedCallback([&](HttpMock*, xsapi_internal_string, xsapi_internal_string) { e.Set(); }); diff --git a/Tests/UnitTests/Tests/Services/MultiplayerTests.cpp b/Tests/UnitTests/Tests/Services/MultiplayerTests.cpp index 8e3d2625..9e41d5cd 100644 --- a/Tests/UnitTests/Tests/Services/MultiplayerTests.cpp +++ b/Tests/UnitTests/Tests/Services/MultiplayerTests.cpp @@ -101,9 +101,10 @@ DEFINE_TEST_CLASS(MultiplayerTests) class MPTestEnv : public TestEnvironment { public: - MPTestEnv() noexcept : m_baseMock{ "", "" } + MPTestEnv() noexcept { - m_baseMock.SetMockMatchedCallback( + m_baseMock = std::make_shared("", ""); + m_baseMock->SetMockMatchedCallback( [](HttpMock* /*mock*/, xsapi_internal_string uri, xsapi_internal_string /*body*/) { LOGS_DEBUG << "Unmocked HttpCall, uri=" << uri; @@ -121,7 +122,7 @@ DEFINE_TEST_CLASS(MultiplayerTests) } private: - HttpMock m_baseMock; + std::shared_ptr m_baseMock; std::shared_ptr m_xboxLiveContext; }; @@ -230,11 +231,11 @@ DEFINE_TEST_CLASS(MultiplayerTests) mockUri << "/sessionTemplates/" << sessionReference->SessionTemplateName; mockUri << "/sessions/" << sessionReference->SessionName; - HttpMock mock{ "PUT", mockUri.str() }; - mock.SetResponseBody(responseBody); + auto mock = std::make_shared( "PUT", mockUri.str() ); + mock->SetResponseBody(responseBody); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* /*mock*/, xsapi_internal_string /*uri*/, xsapi_internal_string body) { requestWellFormed &= VerifyJson(expectedRequestBody, body.data()); @@ -802,11 +803,11 @@ DEFINE_TEST_CLASS(MultiplayerTests) const JsonValue& responseJson = testJson["searchHandleJson"] ) noexcept { - HttpMock mock{ "POST", MPSD_URI "/handles" }; - mock.SetResponseBody(responseJson); + auto mock = std::make_shared( "POST", MPSD_URI "/handles" ); + mock->SetResponseBody(responseJson); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -851,11 +852,11 @@ DEFINE_TEST_CLASS(MultiplayerTests) { const auto& responseBody{ testJson["searchHandlesResponseJson"] }; - HttpMock mock{ "POST", MPSD_URI "/handles/query" }; - mock.SetResponseBody(responseBody); + auto mock = std::make_shared( "POST", MPSD_URI "/handles/query" ); + mock->SetResponseBody(responseBody); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string body) { UNREFERENCED_PARAMETER(mock); @@ -1041,11 +1042,11 @@ DEFINE_TEST_CLASS(MultiplayerTests) const JsonValue& responseJson = testJson["defaultQuerySessionsResponse"] ) noexcept { - HttpMock mock{ "", "https://sessiondirectory.xboxlive.com" }; - mock.SetResponseBody(responseJson); + auto mock = std::make_shared( "", "https://sessiondirectory.xboxlive.com" ); + mock->SetResponseBody(responseJson); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string body) { UNREFERENCED_PARAMETER(mock); @@ -1163,24 +1164,32 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestGetSessionAsync) { + TEST_LOG(L"Test starting: TestGetSessionAsync"); + MPTestEnv testEnv{}; MultiplayerSession::Get(testEnv.XboxLiveContext()); } DEFINE_TEST_CASE(TestGetSessionWithHandleAsync) { + TEST_LOG(L"Test starting: TestGetSessionWithHandleAsync"); + MPTestEnv testEnv{}; MultiplayerSession::Get(testEnv.XboxLiveContext(), "testHandle"); } DEFINE_TEST_CASE(TestGetLargeSessionAsync) { + TEST_LOG(L"Test starting: TestGetLargeSessionAsync"); + MPTestEnv testEnv{}; MultiplayerSession::Get(testEnv.XboxLiveContext(), defaultSessionReference, testJson["largeSessionDocument"]); } DEFINE_TEST_CASE(TestQuerySessions) { + TEST_LOG(L"Test starting: TestQuerySessions"); + MPTestEnv env{}; std::vector xuidFilters{ 1 }; @@ -1244,6 +1253,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteNewSession) { + TEST_LOG(L"Test starting: TestWriteNewSession"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1298,6 +1309,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestEmptyWrite) { + TEST_LOG(L"Test starting: TestEmptyWrite"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1307,6 +1320,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionCapabilities) { + TEST_LOG(L"Test starting: TestWriteSessionCapabilities"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1332,6 +1347,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithServersJson) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithServersJson"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1349,6 +1366,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetSessionCustomPropertyJson) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetSessionCustomPropertyJson"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1375,6 +1394,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetMatchmakingProperties) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetMatchmakingProperties"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1390,6 +1411,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithAddMemberReservation) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithAddMemberReservation"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1401,6 +1424,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithDeleteSessionCustomPropertyJson) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithDeleteSessionCustomPropertyJson"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1419,6 +1444,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithJoin1) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithJoin1"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1429,6 +1456,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithJoin2) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithJoin2"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1439,6 +1468,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithJoin3) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithJoin3"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1449,6 +1480,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithLeave) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithLeave"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1458,6 +1491,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetCurrentUserInactive) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetCurrentUserInactive"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1469,6 +1504,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetCurrentUserActive) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetCurrentUserActive"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1480,6 +1517,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetCurrentUserSecureDeviceAddressBase64) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetCurrentUserSecureDeviceAddressBase64"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1491,6 +1530,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestXblFormatSecureDeviceAddress) { + TEST_LOG(L"Test starting: TestXblFormatSecureDeviceAddress"); + String deviceId; XblFormattedSecureDeviceAddress address{}; @@ -1510,6 +1551,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetCurrentUserMemberCustomPropertyJson) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetCurrentUserMemberCustomPropertyJson"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1537,6 +1580,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithDeleteCurrentUserMemberCustomPropertyJson) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithDeleteCurrentUserMemberCustomPropertyJson"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1557,6 +1602,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithTurnCollection) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithTurnCollection"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1572,6 +1619,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithKeywords) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithKeywords"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1587,6 +1636,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithJoinRestriction) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithJoinRestriction"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1601,6 +1652,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithReadRestriction) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithReadRestriction"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1615,6 +1668,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetTimeouts) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetTimeouts"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1631,6 +1686,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetQualityOfServiceConnectivityMetrics) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetQualityOfServiceConnectivityMetrics"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1647,6 +1704,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestGetCloudComputePackageJson) { + TEST_LOG(L"Test starting: TestGetCloudComputePackageJson"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1661,6 +1720,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetMemberInitialization) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetMemberInitialization"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1687,6 +1748,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetPeerToPeerRequirements) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetPeerToPeerRequirements"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1702,6 +1765,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetPeerToHostRequirements) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetPeerToHostRequirements"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1719,6 +1784,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetInitializationStatus) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetInitializationStatus"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1730,6 +1797,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetHostDeviceToken) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetHostDeviceToken"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1746,6 +1815,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetMatchmakingServerConnectionPath) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetMatchmakingServerConnectionPath"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1759,6 +1830,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetMatchmakingResubmit) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetMatchmakingResubmit"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1771,6 +1844,8 @@ DEFINE_TEST_CLASS(MultiplayerTests) DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetServerConnectionStringCandidates) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetServerConnectionStringCandidates"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1788,6 +1863,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetCurrentUserMembersInGroup) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetCurrentUserMembersInGroup"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -1808,6 +1885,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestWriteSessionAsyncWithClosed) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithClosed"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1834,6 +1913,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetCurrentUserQualityOfServiceMeasurements) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetCurrentUserQualityOfServiceMeasurements"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1848,6 +1929,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetCurrentUserQualityOfServiceServerMeasurementsJson) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetCurrentUserQualityOfServiceServerMeasurementsJson"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1862,6 +1945,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestWriteSessionAsyncWithSetMutableRoleSettings) { + TEST_LOG(L"Test starting: TestWriteSessionAsyncWithSetMutableRoleSettings"); + MPTestEnv env{}; auto session = MultiplayerSession::Get(env.XboxLiveContext()); @@ -1894,11 +1979,13 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestSetActivityAsync) { + TEST_LOG(L"Test starting: TestSetActivityAsync"); + MPTestEnv env{}; - HttpMock mock{ "POST", MPSD_URI "/handles" }; + auto mock = std::make_shared( "POST", MPSD_URI "/handles" ); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock*, xsapi_internal_string, xsapi_internal_string body) { requestWellFormed &= VerifyJson(testJson["activityJson"], body.data()); @@ -1919,6 +2006,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestClearActivityAsync) { + TEST_LOG(L"Test starting: TestClearActivityAsync"); + MPTestEnv env{}; // XblMultiplayerClearActivityAsync results in 2 service calls; first to query the activity, and then to clear it. Set up @@ -1935,14 +2024,16 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestSetTransferHandleAsync) { + TEST_LOG(L"Test starting: TestSetTransferHandleAsync"); + MPTestEnv env{}; const auto& responseBody{ testJson["transferHandleResponseJson"] }; - HttpMock mock{ "POST", MPSD_URI "/handles" }; - mock.SetResponseBody(responseBody); + auto mock = std::make_shared( "POST", MPSD_URI "/handles" ); + mock->SetResponseBody(responseBody); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock*, xsapi_internal_string, xsapi_internal_string body) { requestWellFormed &= VerifyJson(testJson["transferHandleJson"], body.data()); @@ -1974,6 +2065,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestGetSearchHandlesAsync_1) { + TEST_LOG(L"Test starting: TestGetSearchHandlesAsync_1"); + MPTestEnv env{}; MultiplayerSearchDetails::Query( @@ -1988,6 +2081,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestGetSearchHandlesAsync_2) { + TEST_LOG(L"Test starting: TestGetSearchHandlesAsync_2"); + MPTestEnv env{}; MultiplayerSearchDetails::Query( @@ -2004,6 +2099,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestSetSearchHandleAsync) { + TEST_LOG(L"Test starting: TestSetSearchHandleAsync"); + MPTestEnv env{}; XblMultiplayerSessionReference sessionRef @@ -2028,6 +2125,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestClearSearchHandleAsync) { + TEST_LOG(L"Test starting: TestClearSearchHandleAsync"); + MPTestEnv env{}; HttpMock mock{"DELETE", MPSD_URI "/handles/TestHandleId" }; @@ -2039,11 +2138,13 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestSendInvitesAsync) { + TEST_LOG(L"Test starting: TestSendInvitesAsync"); + MPTestEnv env{}; std::vector xuids{ 1111, 2222 }; - HttpMock mock{ "POST", MPSD_URI "/handles" }; + auto mock = std::make_shared( "POST", MPSD_URI "/handles" ); // Inviting multiple Xuids results in multiple Http calls. Make sure the expected number of calls go out size_t requestCount{ 0 }; @@ -2057,7 +2158,7 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); expectedRequestBodyJson.Parse(inviteRequestJson.c_str()); responseBodyJson.Parse(inviteResponseJson.c_str()); - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string body) { UNREFERENCED_PARAMETER(uri); @@ -2114,11 +2215,11 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); void VerifyGetActivitiesForUsers(MPTestEnv& env, bool withProperties) { - HttpMock mock{ "POST", MPSD_URI "/handles" }; - mock.SetResponseBody(testJson["activitiesForUserResponseJson"]); + auto mock = std::make_shared( "POST", MPSD_URI "/handles" ); + mock->SetResponseBody(testJson["activitiesForUserResponseJson"]); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback([&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string body) + mock->SetMockMatchedCallback([&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string body) { UNREFERENCED_PARAMETER(mock); UNREFERENCED_PARAMETER(uri); @@ -2188,11 +2289,11 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); void VerifyGetActivitiesForSocialGroup(MPTestEnv& env, bool withProperties) { - HttpMock mock{ "POST", MPSD_URI "/handles" }; - mock.SetResponseBody(testJson["activitiesForSocialGroupResponseJson"]); + auto mock = std::make_shared( "POST", MPSD_URI "/handles" ); + mock->SetResponseBody(testJson["activitiesForSocialGroupResponseJson"]); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback([&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string body) + mock->SetMockMatchedCallback([&](HttpMock* mock, xsapi_internal_string uri, xsapi_internal_string body) { UNREFERENCED_PARAMETER(mock); UNREFERENCED_PARAMETER(uri); @@ -2240,6 +2341,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestGetActivitiesForUsersAsync) { + TEST_LOG(L"Test starting: TestGetActivitiesForUsersAsync"); + MPTestEnv env{}; VerifyGetActivitiesForUsers(env, false); @@ -2248,6 +2351,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestGetActivitiesForSocialGroupAsync) { + TEST_LOG(L"Test starting: TestGetActivitiesForSocialGroupAsync"); + MPTestEnv env{}; VerifyGetActivitiesForSocialGroup(env, false); @@ -2256,6 +2361,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestCompareMultiplayerSessions) { + TEST_LOG(L"Test starting: TestCompareMultiplayerSessions"); + MPTestEnv env{}; { @@ -2374,6 +2481,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestRTAMultiplayer) { + TEST_LOG(L"Test starting: TestRTAMultiplayer"); + MPTestEnv env{}; auto& mockRtaService{ MockRealTimeActivityService::Instance() }; @@ -2439,6 +2548,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestRTADisableMultiplayerSubscriptions) { + TEST_LOG(L"Test starting: TestRTADisableMultiplayerSubscriptions"); + MPTestEnv env{}; // Auto confirm subscriptions @@ -2465,6 +2576,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestMultiplayerSubscribeChangeTypes) { + TEST_LOG(L"Test starting: TestMultiplayerSubscribeChangeTypes"); + MPTestEnv env{}; auto session = MultiplayerSession::Create(env.XboxLiveContext()); @@ -2487,11 +2600,11 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); VERIFY_SUCCEEDED(XblMultiplayerSessionSetSessionChangeSubscription(session.Handle(), changeTypes)); VERIFY_IS_TRUE(XblMultiplayerSessionSubscribedChangeTypes(session.Handle()) == changeTypes); - HttpMock mock{ "PUT", MPSD_URI }; - mock.SetResponseBody(defaultSessionJson); + auto mock = std::make_shared( "PUT", MPSD_URI ); + mock->SetResponseBody(defaultSessionJson); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* /*mock*/, xsapi_internal_string /*uri*/, xsapi_internal_string body) { // Skip verification of the subId since its a random GUID @@ -2525,6 +2638,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(Test204Response) { + TEST_LOG(L"Test starting: Test204Response"); + MPTestEnv env{}; HttpMock mock{ "", MPSD_URI, 204 }; @@ -2565,6 +2680,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestMultiplayerInvalidArgs) { + TEST_LOG(L"Test starting: TestMultiplayerInvalidArgs"); + #pragma warning(push) #pragma warning(disable : 6387) MPTestEnv env{}; @@ -2723,6 +2840,8 @@ session.Write(testJson["serverConnectionStringCandidatesJson"]); DEFINE_TEST_CASE(TestTournamentsDeprecated) { + TEST_LOG(L"Test starting: TestTournamentsDeprecated"); + XBL_WARNING_PUSH; XBL_WARNING_DISABLE_DEPRECATED; XblTournamentReference xbltourref{}; diff --git a/Tests/UnitTests/Tests/Services/PeoplehubTests.cpp b/Tests/UnitTests/Tests/Services/PeoplehubTests.cpp index bf3fa620..a2c3a31c 100644 --- a/Tests/UnitTests/Tests/Services/PeoplehubTests.cpp +++ b/Tests/UnitTests/Tests/Services/PeoplehubTests.cpp @@ -319,6 +319,8 @@ DEFINE_TEST_CLASS(PeoplehubTests) DEFINE_TEST_CASE(TestGetSocialUsers) { + TEST_LOG(L"Test starting: TestGetSocialUsers"); + PeoplehubTestEnvironment env{}; JsonDocument jsonResponse; @@ -360,6 +362,8 @@ DEFINE_TEST_CLASS(PeoplehubTests) DEFINE_TEST_CASE(TestGetSocialGraph) { + TEST_LOG(L"Test starting: TestGetSocialGraph"); + PeoplehubTestEnvironment env{}; JsonDocument jsonResponse; @@ -401,6 +405,8 @@ DEFINE_TEST_CLASS(PeoplehubTests) DEFINE_TEST_CASE(TestInvalidResponse) { + TEST_LOG(L"Test starting: TestInvalidResponse"); + PeoplehubTestEnvironment env{}; JsonDocument peoplehubInvalidJson; @@ -430,6 +436,8 @@ DEFINE_TEST_CLASS(PeoplehubTests) DEFINE_TEST_CASE(TestPartialTitleHistory) { + TEST_LOG(L"Test starting: TestPartialTitleHistory"); + // In some cases PeopleHub service returns a TitleHistory object that isn't fully populated. By design we should // deserialize the provided fields and ignore those that are "null" diff --git a/Tests/UnitTests/Tests/Services/PresenceTests.cpp b/Tests/UnitTests/Tests/Services/PresenceTests.cpp index 1bf87549..e118270b 100644 --- a/Tests/UnitTests/Tests/Services/PresenceTests.cpp +++ b/Tests/UnitTests/Tests/Services/PresenceTests.cpp @@ -362,15 +362,17 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestSetPresenceAsync) { + TEST_LOG(L"Test starting: TestSetPresenceAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); xsapi_internal_stringstream url; url << "https://userpresence.xboxlive.com/users/xuid(" << xboxLiveContext->Xuid() << ")/devices/current/titles/current"; - HttpMock mock("POST", url.str(), 200); + auto mock = std::make_shared("POST", url.str(), 200); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -398,6 +400,8 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestGetPresenceAsync) { + TEST_LOG(L"Test starting: TestGetPresenceAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -419,15 +423,17 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestGetPresenceForMultipleUsersAsync) { + TEST_LOG(L"Test starting: TestGetPresenceForMultipleUsersAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); xsapi_internal_string url{ "https://userpresence.xboxlive.com/users/batch" }; - HttpMock mock("GET", url, 200); - mock.SetResponseBody(defaultMultiplePresenceResponse); + auto mock = std::make_shared("GET", url, 200); + mock->SetResponseBody(defaultMultiplePresenceResponse); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -465,15 +471,17 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestGetPresenceForMultipleUsersOverloadAsync) { + TEST_LOG(L"Test starting: TestGetPresenceForMultipleUsersOverloadAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); xsapi_internal_string url{ "https://userpresence.xboxlive.com/users/batch" }; - HttpMock mock("POST", url, 200); - mock.SetResponseBody(defaultMultiplePresenceResponse); + auto mock = std::make_shared("POST", url, 200); + mock->SetResponseBody(defaultMultiplePresenceResponse); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -512,6 +520,8 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestGetPresenceForSocialGroupAsync) { + TEST_LOG(L"Test starting: TestGetPresenceForSocialGroupAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -534,15 +544,16 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestGetPresenceForSocialGroupOverloadAsync) { + TEST_LOG(L"Test starting: TestGetPresenceForSocialGroupOverloadAsync"); TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); xsapi_internal_string url{ "https://userpresence.xboxlive.com/users/batch" }; - HttpMock mock("POST", url, 200); - mock.SetResponseBody(defaultMultiplePresenceResponse); + auto mock = std::make_shared("POST", url, 200); + mock->SetResponseBody(defaultMultiplePresenceResponse); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -603,38 +614,40 @@ DEFINE_TEST_CLASS(PresenceTests) XblFunctionContext m_token{ 0 }; }; - DEFINE_TEST_CASE(TestRTATitlePresence) - { - TestEnvironment env{}; - auto xboxLiveContext = env.CreateMockXboxLiveContext(); - auto& mockRtaService{ MockRealTimeActivityService::Instance() }; - - const uint64_t xuid = 1234; - const uint32_t titleId = 1563044810; - const char titlePresenceUri[]{ "https://userpresence.xboxlive.com/users/xuid(1234)/titles/1563044810" }; - - mockRtaService.SetSubscribeHandler([&](uint32_t n, xsapi_internal_string uri) - { - if (uri == titlePresenceUri) - { - mockRtaService.CompleteSubscribeHandshake(n, defaultPresenceResponse); - } - }); - - VERIFY_SUCCEEDED(XblPresenceTrackUsers(xboxLiveContext.get(), &xuid, 1)); - VERIFY_SUCCEEDED(XblPresenceTrackAdditionalTitles(xboxLiveContext.get(), &titleId, 1)); - - TitlePresenceChangedHandler handler{ xboxLiveContext }; - // Wait for subscription complete before sending change event - handler.rtaTapReceived.Wait(); - - mockRtaService.RaiseEvent(titlePresenceUri, titlePresenceEndedResponse); - handler.rtaTapReceived.Wait(); - - VERIFY_ARE_EQUAL_INT(xuid, handler.xuid); - VERIFY_ARE_EQUAL_INT(titleId, handler.titleId); - VERIFY_IS_TRUE(handler.state == XblPresenceTitleState::Ended); - } + // Bug 39348459: XSAPI Unit Test: TestRTATitlePresence failing + //DEFINE_TEST_CASE(TestRTATitlePresence) + //{ + // TEST_LOG(L"Test starting: TestRTATitlePresence"); + // TestEnvironment env{}; + // auto xboxLiveContext = env.CreateMockXboxLiveContext(); + // auto& mockRtaService{ MockRealTimeActivityService::Instance() }; + + // const uint64_t xuid = 1234; + // const uint32_t titleId = 1563044810; + // const char titlePresenceUri[]{ "https://userpresence.xboxlive.com/users/xuid(1234)/titles/1563044810" }; + + // mockRtaService.SetSubscribeHandler([&](uint32_t n, xsapi_internal_string uri) + // { + // if (uri == titlePresenceUri) + // { + // mockRtaService.CompleteSubscribeHandshake(n, defaultPresenceResponse); + // } + // }); + + // VERIFY_SUCCEEDED(XblPresenceTrackUsers(xboxLiveContext.get(), &xuid, 1)); + // VERIFY_SUCCEEDED(XblPresenceTrackAdditionalTitles(xboxLiveContext.get(), &titleId, 1)); + + // TitlePresenceChangedHandler handler{ xboxLiveContext }; + // // Wait for subscription complete before sending change event + // handler.rtaTapReceived.Wait(); + + // mockRtaService.RaiseEvent(titlePresenceUri, titlePresenceEndedResponse); + // handler.rtaTapReceived.Wait(); + + // VERIFY_ARE_EQUAL_INT(xuid, handler.xuid); + // VERIFY_ARE_EQUAL_INT(titleId, handler.titleId); + // VERIFY_IS_TRUE(handler.state == XblPresenceTitleState::Ended); + //} struct DevicePresenceChangedHandler { @@ -671,6 +684,8 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestRTADevicePresence) { + TEST_LOG(L"Test starting: TestRTADevicePresence"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto& mockRtaService{ MockRealTimeActivityService::Instance() }; @@ -706,6 +721,8 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestSubscriptionManagement) { + TEST_LOG(L"Test starting: TestSubscriptionManagement"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -747,6 +764,8 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestLegacySubscriptions) { + TEST_LOG(L"Test starting: TestLegacySubscriptions"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -784,6 +803,8 @@ DEFINE_TEST_CLASS(PresenceTests) DEFINE_TEST_CASE(TestPresenceInvalidArgs) { + TEST_LOG(L"Test starting: TestPresenceInvalidArgs"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); diff --git a/Tests/UnitTests/Tests/Services/PrivacyTests.cpp b/Tests/UnitTests/Tests/Services/PrivacyTests.cpp index a771f4ce..cd909da9 100644 --- a/Tests/UnitTests/Tests/Services/PrivacyTests.cpp +++ b/Tests/UnitTests/Tests/Services/PrivacyTests.cpp @@ -174,6 +174,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(TestCheckAvoidList) { + TEST_LOG(L"Test starting: TestCheckAvoidList"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -200,6 +202,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(TestCheckMuteList) { + TEST_LOG(L"Test starting: TestCheckMuteList"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -221,6 +225,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(TestCheckPermissionAsync) { + TEST_LOG(L"Test starting: TestCheckPermissionAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -245,6 +251,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(TestCheckPermissionWithLargeBufferAsync) { + TEST_LOG(L"Test starting: TestCheckPermissionWithLargeBufferAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -271,6 +279,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(TestCheckPermissionForAnonymousUserAsync) { + TEST_LOG(L"Test starting: TestCheckPermissionForAnonymousUserAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -300,6 +310,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(TestCheckPermissionForAnonymousUserWithLargeBufferAsync) { + TEST_LOG(L"Test starting: TestCheckPermissionForAnonymousUserWithLargeBufferAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -331,6 +343,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(TestBatchCheckPermissionAsync) { + TEST_LOG(L"Test starting: TestBatchCheckPermissionAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -369,6 +383,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(TestBatchCheckPermissionWithLargeBufferAsync) { + TEST_LOG(L"Test starting: TestBatchCheckPermissionWithLargeBufferAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -409,6 +425,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(TestInvalidArgs) { + TEST_LOG(L"Test starting: TestInvalidArgs"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -476,6 +494,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(CppTestCheckAvoidList) { + TEST_LOG(L"Test starting: CppTestCheckAvoidList"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateLegacyMockXboxLiveContext(); @@ -498,6 +518,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(CppTestCheckMuteList) { + TEST_LOG(L"Test starting: CppTestCheckMuteList"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateLegacyMockXboxLiveContext(); @@ -567,6 +589,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(CppTestCheckPermissionWithTargetUser) { + TEST_LOG(L"Test starting: CppTestCheckPermissionWithTargetUser"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateLegacyMockXboxLiveContext(); @@ -584,6 +608,8 @@ DEFINE_TEST_CLASS(PrivacyTests) DEFINE_TEST_CASE(CppTestCheckMultiplePermissionsWithMultipleTargetUsers) { + TEST_LOG(L"Test starting: CppTestCheckMultiplePermissionsWithMultipleTargetUsers"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateLegacyMockXboxLiveContext(); diff --git a/Tests/UnitTests/Tests/Services/ProfileTests.cpp b/Tests/UnitTests/Tests/Services/ProfileTests.cpp index ee8b189f..10b3c7fe 100644 --- a/Tests/UnitTests/Tests/Services/ProfileTests.cpp +++ b/Tests/UnitTests/Tests/Services/ProfileTests.cpp @@ -191,16 +191,18 @@ DEFINE_TEST_CLASS(ProfileTests) DEFINE_TEST_CASE(TestGetUserProfileAsync) { + TEST_LOG(L"Test starting: TestGetUserProfileAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); UserProfile expectedProfile{ 1 }; - HttpMock mock{ "", "https://profile.xboxlive.com" }; - mock.SetResponseBody(UserProfile::Serialize({ expectedProfile })); + auto mock = std::make_shared( "", "https://profile.xboxlive.com" ); + mock->SetResponseBody(UserProfile::Serialize({ expectedProfile })); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock*, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { // XblProfileGetUserProfileResult just makes a batch request with 1 xuid @@ -220,6 +222,8 @@ DEFINE_TEST_CLASS(ProfileTests) DEFINE_TEST_CASE(TestGetUserProfilesAsync) { + TEST_LOG(L"Test starting: TestGetUserProfilesAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -230,11 +234,11 @@ DEFINE_TEST_CLASS(ProfileTests) expectedProfiles.push_back(UserProfile{ xuid }); } - HttpMock mock{ "", "https://profile.xboxlive.com" }; - mock.SetResponseBody(UserProfile::Serialize(expectedProfiles)); + auto mock = std::make_shared( "", "https://profile.xboxlive.com" ); + mock->SetResponseBody(UserProfile::Serialize(expectedProfiles)); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock*, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { requestWellFormed = VerifyBatchRequest(requestUrl, requestBody, xuids); @@ -261,6 +265,8 @@ DEFINE_TEST_CLASS(ProfileTests) DEFINE_TEST_CASE(TestGetUserProfilesForSocialGroupAsync) { + TEST_LOG(L"Test starting: TestGetUserProfilesForSocialGroupAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -272,11 +278,11 @@ DEFINE_TEST_CLASS(ProfileTests) expectedProfiles.push_back(UserProfile{ xuid }); } - HttpMock mock{ "", "https://profile.xboxlive.com" }; - mock.SetResponseBody(UserProfile::Serialize(expectedProfiles)); + auto mock = std::make_shared( "", "https://profile.xboxlive.com" ); + mock->SetResponseBody(UserProfile::Serialize(expectedProfiles)); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock*, xsapi_internal_string requestUri, xsapi_internal_string requestBody) { xsapi_internal_stringstream expectedUri; @@ -309,6 +315,8 @@ DEFINE_TEST_CLASS(ProfileTests) DEFINE_TEST_CASE(TestProfileServiceInvalidArgs) { + TEST_LOG(L"Test starting: TestProfileServiceInvalidArgs"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); diff --git a/Tests/UnitTests/Tests/Services/RealTimeActivityManagerTests.cpp b/Tests/UnitTests/Tests/Services/RealTimeActivityManagerTests.cpp index 11e8c957..ed9497ab 100644 --- a/Tests/UnitTests/Tests/Services/RealTimeActivityManagerTests.cpp +++ b/Tests/UnitTests/Tests/Services/RealTimeActivityManagerTests.cpp @@ -98,6 +98,8 @@ DEFINE_TEST_CLASS(RealTimeActivityManagerTests) DEFINE_TEST_CASE(SubscriptionTest) { + TEST_LOG(L"Test starting: SubscriptionTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto& mockRta{ MockRealTimeActivityService::Instance() }; @@ -125,6 +127,8 @@ DEFINE_TEST_CLASS(RealTimeActivityManagerTests) DEFINE_TEST_CASE(TestUnexpectedDataReceived) { + TEST_LOG(L"Test starting: TestUnexpectedDataReceived"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto& mockRta{ MockRealTimeActivityService::Instance() }; @@ -138,6 +142,8 @@ DEFINE_TEST_CLASS(RealTimeActivityManagerTests) DEFINE_TEST_CASE(SubscriptionStressTest) { + TEST_LOG(L"Test starting: SubscriptionStressTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto& mockRta{ MockRealTimeActivityService::Instance() }; @@ -201,6 +207,8 @@ DEFINE_TEST_CLASS(RealTimeActivityManagerTests) DEFINE_TEST_CASE(TestUnsubscribeOnPendingSubscribeState) { + TEST_LOG(L"Test starting: TestUnsubscribeOnPendingSubscribeState"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto rtaManager{ GlobalState::Get()->RTAManager() }; @@ -238,6 +246,8 @@ DEFINE_TEST_CLASS(RealTimeActivityManagerTests) DEFINE_TEST_CASE(NoConnectionTest) { + TEST_LOG(L"Test starting: NoConnectionTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto rtaManager{ GlobalState::Get()->RTAManager() }; @@ -259,6 +269,8 @@ DEFINE_TEST_CLASS(RealTimeActivityManagerTests) DEFINE_TEST_CASE(TestConnectionInterrupt) { + TEST_LOG(L"Test starting: TestConnectionInterrupt"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto rtaManager{ GlobalState::Get()->RTAManager() }; @@ -297,6 +309,8 @@ DEFINE_TEST_CLASS(RealTimeActivityManagerTests) DEFINE_TEST_CASE(RTAResync) { + TEST_LOG(L"Test starting: RTAResync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto rtaManager{ GlobalState::Get()->RTAManager() }; @@ -323,6 +337,8 @@ DEFINE_TEST_CLASS(RealTimeActivityManagerTests) DEFINE_TEST_CASE(TestServiceThrottleError) { + TEST_LOG(L"Test starting: TestServiceThrottleError"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto rtaManager{ GlobalState::Get()->RTAManager() }; diff --git a/Tests/UnitTests/Tests/Services/ReputationTests.cpp b/Tests/UnitTests/Tests/Services/ReputationTests.cpp index cd9ed3d1..7a636073 100644 --- a/Tests/UnitTests/Tests/Services/ReputationTests.cpp +++ b/Tests/UnitTests/Tests/Services/ReputationTests.cpp @@ -49,13 +49,15 @@ DEFINE_TEST_CLASS(ReputationTests) DEFINE_TEST_CASE(TestSubmitReputationFeedbackAsync) { + TEST_LOG(L"Test starting: TestSubmitReputationFeedbackAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock reputationMock{ "POST", "https://reputation.xboxlive.com", 202 }; + auto reputationMock = std::make_shared( "POST", "https://reputation.xboxlive.com", 202 ); bool requestWellFormed{ true }; - reputationMock.SetMockMatchedCallback( + reputationMock->SetMockMatchedCallback( [&](HttpMock*, xsapi_internal_string url, xsapi_internal_string requestBody) { requestWellFormed &= url == "https://reputation.xboxlive.com/users/xuid(1)/feedback"; @@ -100,14 +102,16 @@ DEFINE_TEST_CLASS(ReputationTests) DEFINE_TEST_CASE(CppTestSubmitReputationFeedback) { + TEST_LOG(L"Test starting: CppTestSubmitReputationFeedback"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateLegacyMockXboxLiveContext(); - HttpMock reputationMock{ "POST", "https://reputation.xboxlive.com", 202 }; + auto reputationMock = std::make_shared( "POST", "https://reputation.xboxlive.com", 202 ); bool requestWellFormed{ true }; - reputationMock.SetMockMatchedCallback( + reputationMock->SetMockMatchedCallback( [&](HttpMock*, xsapi_internal_string url, xsapi_internal_string requestBody) { requestWellFormed &= url == "https://reputation.xboxlive.com/users/xuid(1)/feedback"; @@ -141,13 +145,15 @@ DEFINE_TEST_CLASS(ReputationTests) DEFINE_TEST_CASE(TestSubmitBatchReputationFeedbackAsync) { + TEST_LOG(L"Test starting: TestSubmitBatchReputationFeedbackAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock reputationMock{ "POST", "https://reputation.xboxlive.com", 202 }; + auto reputationMock = std::make_shared("POST", "https://reputation.xboxlive.com", 202 ); bool requestWellFormed{ true }; - reputationMock.SetMockMatchedCallback( + reputationMock->SetMockMatchedCallback( [&](HttpMock*, xsapi_internal_string url, xsapi_internal_string requestBody) { requestWellFormed &= url == "https://reputation.xboxlive.com/users/batchtitlefeedback"; @@ -191,13 +197,15 @@ DEFINE_TEST_CLASS(ReputationTests) DEFINE_TEST_CASE(CppTestSubmitBatchReputationFeedback) { + TEST_LOG(L"Test starting: CppTestSubmitBatchReputationFeedback"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateLegacyMockXboxLiveContext(); - HttpMock reputationMock{ "POST", "https://reputation.xboxlive.com", 202 }; + auto reputationMock = std::make_shared("POST", "https://reputation.xboxlive.com", 202 ); bool requestWellFormed{ true }; - reputationMock.SetMockMatchedCallback( + reputationMock->SetMockMatchedCallback( [&](HttpMock*, xsapi_internal_string url, xsapi_internal_string requestBody) { requestWellFormed &= url == "https://reputation.xboxlive.com/users/batchtitlefeedback"; @@ -233,6 +241,8 @@ DEFINE_TEST_CLASS(ReputationTests) DEFINE_TEST_CASE(TestSubmitReputationFeedbackAsyncInvalidArgs) { + TEST_LOG(L"Test starting: TestSubmitReputationFeedbackAsyncInvalidArgs"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); diff --git a/Tests/UnitTests/Tests/Services/SocialManagerTests.cpp b/Tests/UnitTests/Tests/Services/SocialManagerTests.cpp index f9afe3bf..61dd3ed0 100644 --- a/Tests/UnitTests/Tests/Services/SocialManagerTests.cpp +++ b/Tests/UnitTests/Tests/Services/SocialManagerTests.cpp @@ -493,6 +493,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) public: DEFINE_TEST_CASE(TestAddLocalUser) { + TEST_LOG(L"Test starting: TestAddLocalUser"); + SMTestEnvironment env{}; auto xboxLiveContext{ env.CreateMockXboxLiveContext() }; env.AddLocalUser(xboxLiveContext->User()); @@ -500,6 +502,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestBasicCreateFilterGroup) { + TEST_LOG(L"Test starting: TestBasicCreateFilterGroup"); + SMTestEnvironment env{}; auto xboxLiveContext{ env.CreateMockXboxLiveContext() }; env.AddLocalUser(xboxLiveContext->User()); @@ -579,6 +583,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestPresenceRtaUpdates) { + TEST_LOG(L"Test starting: TestPresenceRtaUpdates"); + SMTestEnvironment env{}; auto xboxLiveContext{ env.CreateMockXboxLiveContext() }; env.AddLocalUser(xboxLiveContext->User()); @@ -689,6 +695,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestMultipleLocalUsers) { + TEST_LOG(L"Test starting: TestMultipleLocalUsers"); + SMTestEnvironment env{}; auto xboxLiveContext1 = env.CreateMockXboxLiveContext(); auto xboxLiveContext2 = env.CreateMockXboxLiveContext(202020202020, "MockLocalUser2"); @@ -820,6 +828,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestAddRemoveLocalUser) { + TEST_LOG(L"Test starting: TestAddRemoveLocalUser"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -833,6 +843,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestSocialRelationshipChangedRtaUpdate) { + TEST_LOG(L"Test starting: TestSocialRelationshipChangedRtaUpdate"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); env.AddLocalUser(xboxLiveContext->User()); @@ -951,6 +963,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestListGroupWithSocialRelationshipChanged) { + TEST_LOG(L"Test starting: TestListGroupWithSocialRelationshipChanged"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); env.AddLocalUser(xboxLiveContext->User()); @@ -1080,6 +1094,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestFilterGroupChanges) { + TEST_LOG(L"Test starting: TestFilterGroupChanges"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); env.AddLocalUser(xboxLiveContext->User()); @@ -1142,6 +1158,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestMultipleListGroups) { + TEST_LOG(L"Test starting: TestMultipleListGroups"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); env.AddLocalUser(xboxLiveContext->User()); @@ -1364,6 +1382,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestSocialUserGroupFromListLarge) { + TEST_LOG(L"Test starting: TestSocialUserGroupFromListLarge"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); env.AddLocalUser(xboxLiveContext->User()); @@ -1430,6 +1450,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) // Tests refresh for RTA resync DEFINE_TEST_CASE(TestRtaResync) { + TEST_LOG(L"Test starting: TestRtaResync"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); env.AddLocalUser(xboxLiveContext->User()); @@ -1478,8 +1500,10 @@ DEFINE_TEST_CLASS(SocialManagerTests) VERIFY_SUCCEEDED(XblSocialManagerDestroySocialUserGroup(group)); } - DEFINE_TEST_CASE(TestInvalidArgs) + DEFINE_TEST_CASE(TestSMInvalidArgs) { + TEST_LOG(L"Test starting: TestSMInvalidArgs"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); env.AddLocalUser(xboxLiveContext->User()); @@ -1519,6 +1543,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) #if 0 DEFINE_TEST_CASE(TestImproperCallingPattern) { + TEST_LOG(L"Test starting: TestImproperCallingPattern"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -1537,6 +1563,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestCreateGroupBeforeUserAddedCompletes) { + TEST_LOG(L"Test starting: TestCreateGroupBeforeUserAddedCompletes"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -1574,6 +1602,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestSocialRelationshipChangedDuringInitialization) { + TEST_LOG(L"Test starting: TestSocialRelationshipChangedDuringInitialization"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -1635,6 +1665,7 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestFilters) { + TEST_LOG(L"Test starting: TestFilters"); SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); env.AddLocalUser(xboxLiveContext->User()); @@ -1764,6 +1795,7 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestRichPresencePolling) { + TEST_LOG(L"Test starting: TestRichPresencePolling"); SMTestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); env.AddLocalUser(xboxLiveContext->User()); @@ -1820,6 +1852,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(TestEventUserHandleLifetime) { + TEST_LOG(L"Test starting: TestEventUserHandleLifetime"); + SMTestEnvironment env{}; uint64_t const presenceChangedXuid{ 1 }; @@ -1910,6 +1944,8 @@ DEFINE_TEST_CLASS(SocialManagerTests) DEFINE_TEST_CASE(CppTestBasicCreateFilterGroup) { + TEST_LOG(L"Test starting: CppTestBasicCreateFilterGroup"); + SMTestEnvironment env{}; auto xboxLiveContext = env.CreateLegacyMockXboxLiveContext(); xbox_live_user_t userHandle = xboxLiveContext->user(); diff --git a/Tests/UnitTests/Tests/Services/SocialTests.cpp b/Tests/UnitTests/Tests/Services/SocialTests.cpp index abea70a9..746e1e28 100644 --- a/Tests/UnitTests/Tests/Services/SocialTests.cpp +++ b/Tests/UnitTests/Tests/Services/SocialTests.cpp @@ -158,6 +158,8 @@ DEFINE_TEST_CLASS(SocialTests) DEFINE_TEST_CASE(TestGetSocialRelationshipsAsync) { + TEST_LOG(L"Test starting: TestGetSocialRelationshipsAsync"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -241,6 +243,8 @@ DEFINE_TEST_CLASS(SocialTests) DEFINE_TEST_CASE(TestGetSocialRelationshipsResultPaging) { + TEST_LOG(L"Test starting: TestGetSocialRelationshipsResultPaging"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -294,6 +298,8 @@ DEFINE_TEST_CLASS(SocialTests) DEFINE_TEST_CASE(TestRTASocialRelationshipChange) { + TEST_LOG(L"Test starting: TestRTASocialRelationshipChange"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto& mockRtaService{ MockRealTimeActivityService::Instance() }; @@ -343,6 +349,8 @@ DEFINE_TEST_CLASS(SocialTests) DEFINE_TEST_CASE(CppTestGetSocialRelationships) { + TEST_LOG(L"Test starting: CppTestGetSocialRelationships"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateLegacyMockXboxLiveContext(); @@ -387,6 +395,8 @@ DEFINE_TEST_CLASS(SocialTests) DEFINE_TEST_CASE(CppTestRTASocialRelationshipChange) { + TEST_LOG(L"Test starting: CppTestRTASocialRelationshipChange"); + TestEnvironment env{}; auto& mockRtaService{ MockRealTimeActivityService::Instance() }; auto xboxLiveContext = env.CreateLegacyMockXboxLiveContext(1); diff --git a/Tests/UnitTests/Tests/Services/StatsTests.cpp b/Tests/UnitTests/Tests/Services/StatsTests.cpp index 5086de17..d572b1ec 100644 --- a/Tests/UnitTests/Tests/Services/StatsTests.cpp +++ b/Tests/UnitTests/Tests/Services/StatsTests.cpp @@ -211,6 +211,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetSingleUserStatistics1) { + TEST_LOG(L"Test starting: TestGetSingleUserStatistics1"); + const char* scid{ "7492baca-c1b4-440d-a391-b7ef364a8d40" }; const char* statName{ "OverallReputation" }; @@ -219,6 +221,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetSingleUserStatistics2) { + TEST_LOG(L"Test starting: TestGetSingleUserStatistics2"); + const char* scid{ "7492baca-c1b4-440d-a391-b7ef364a8d41" }; const char* statName{ "UserContentReputation" }; @@ -227,6 +231,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetSingleUserStatisticsWithLargeBuffer1) { + TEST_LOG(L"Test starting: TestGetSingleUserStatisticsWithLargeBuffer1"); + const char* scid{ "7492baca-c1b4-440d-a391-b7ef364a8d40" }; const char* statName{ "OverallReputation" }; @@ -235,6 +241,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetSingleUserStatisticsWithLargeBuffer2) { + TEST_LOG(L"Test starting: TestGetSingleUserStatisticsWithLargeBuffer2"); + const char* scid{ "7492baca-c1b4-440d-a391-b7ef364a8d41" }; const char* statName{ "UserContentReputation" }; @@ -276,6 +284,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetSingleUserStatistics) { + TEST_LOG(L"Test starting: TestGetSingleUserStatistics"); + const char* scid{ "7492baca-c1b4-440d-a391-b7ef364a8d40" }; std::vector statNames{ "OverallReputation", "UserContentReputation" }; @@ -284,6 +294,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetSingleUserStatisticsWithLargeBuffer) { + TEST_LOG(L"Test starting: TestGetSingleUserStatisticsWithLargeBuffer"); + const char* scid{ "7492baca-c1b4-440d-a391-b7ef364a8d40" }; std::vector statNames{ "OverallReputation", "UserContentReputation" }; @@ -292,6 +304,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetBatchUserStatistics) { + TEST_LOG(L"Test starting: TestGetBatchUserStatistics"); + TestEnvironment env{}; const uint32_t xuidCount{ 2 }; @@ -301,11 +315,11 @@ DEFINE_TEST_CLASS(UserStatsTests) const char* statNames[nameCount]{ "namename" }; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock("POST", batchUrl, 200); - mock.SetResponseBody(defaultBatchUsersStatsResponse); + auto mock = std::make_shared("POST", batchUrl, 200); + mock->SetResponseBody(defaultBatchUsersStatsResponse); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed, xuids, scid, statNames](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -360,6 +374,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetBatchUserStatisticsWithLargeBuffer) { + TEST_LOG(L"Test starting: TestGetBatchUserStatisticsWithLargeBuffer"); + TestEnvironment env{}; const uint32_t xuidCount{ 2 }; @@ -369,11 +385,11 @@ DEFINE_TEST_CLASS(UserStatsTests) const char* statNames[nameCount]{ "namename" }; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock("POST", batchUrl, 200); - mock.SetResponseBody(defaultBatchUsersStatsResponse); + auto mock = std::make_shared("POST", batchUrl, 200); + mock->SetResponseBody(defaultBatchUsersStatsResponse); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed, xuids, scid, statNames](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -430,6 +446,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetBatchUserStatisticsForMultipleServiceConfigs) { + TEST_LOG(L"Test starting: TestGetBatchUserStatisticsForMultipleServiceConfigs"); + TestEnvironment env{}; const uint32_t xuidCount{ 1 }; @@ -444,11 +462,11 @@ DEFINE_TEST_CLASS(UserStatsTests) }; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock("POST", batchUrl, 200); - mock.SetResponseBody(defaultBatchUsersStatsResponse); + auto mock = std::make_shared("POST", batchUrl, 200); + mock->SetResponseBody(defaultBatchUsersStatsResponse); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed, xuids, requestedStats](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -508,6 +526,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestGetBatchUserStatisticsForMultipleServiceConfigsWithLargeBuffer) { + TEST_LOG(L"Test starting: TestGetBatchUserStatisticsForMultipleServiceConfigsWithLargeBuffer"); + TestEnvironment env{}; const uint32_t xuidCount{ 1 }; @@ -522,11 +542,11 @@ DEFINE_TEST_CLASS(UserStatsTests) }; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock("POST", batchUrl, 200); - mock.SetResponseBody(defaultBatchUsersStatsResponse); + auto mock = std::make_shared("POST", batchUrl, 200); + mock->SetResponseBody(defaultBatchUsersStatsResponse); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed, xuids, requestedStats](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -588,6 +608,8 @@ DEFINE_TEST_CLASS(UserStatsTests) DEFINE_TEST_CASE(TestRTAStatistics) { + TEST_LOG(L"Test starting: TestRTAStatistics"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(xuid); auto& mockRtaService{ MockRealTimeActivityService::Instance() }; diff --git a/Tests/UnitTests/Tests/Services/StringVerifyTests.cpp b/Tests/UnitTests/Tests/Services/StringVerifyTests.cpp index 7762c453..5b3093ac 100644 --- a/Tests/UnitTests/Tests/Services/StringVerifyTests.cpp +++ b/Tests/UnitTests/Tests/Services/StringVerifyTests.cpp @@ -33,15 +33,17 @@ DEFINE_TEST_CLASS(StringVerifyTests) DEFINE_TEST_CASE(TestVerifyString) { + TEST_LOG(L"Test starting: TestVerifyString"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock("POST", url, 200); - mock.SetResponseBody(defaultStringVerifyResult); + auto mock = std::make_shared("POST", url, 200); + mock->SetResponseBody(defaultStringVerifyResult); auto requestStr = "xboxUserId"; bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed, requestStr](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -72,15 +74,17 @@ DEFINE_TEST_CLASS(StringVerifyTests) DEFINE_TEST_CASE(TestVerifyStringWithLargeBuffer) { + TEST_LOG(L"Test starting: TestVerifyStringWithLargeBuffer"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock("POST", url, 200); - mock.SetResponseBody(defaultStringVerifyResult); + auto mock = std::make_shared("POST", url, 200); + mock->SetResponseBody(defaultStringVerifyResult); auto requestStr = "xboxUserId"; bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed, requestStr](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -113,16 +117,18 @@ DEFINE_TEST_CLASS(StringVerifyTests) DEFINE_TEST_CASE(TestVerifyStrings) { + TEST_LOG(L"Test starting: TestVerifyStrings"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock("POST", url, 200); - mock.SetResponseBody(defaultStringVerifyResult); + auto mock = std::make_shared("POST", url, 200); + mock->SetResponseBody(defaultStringVerifyResult); const size_t requestStrsCount{ 2 }; const char* requestStrs[requestStrsCount]{ "asdf", "asdfasdf" }; bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed, requestStrs, requestStrsCount](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -165,16 +171,18 @@ DEFINE_TEST_CLASS(StringVerifyTests) DEFINE_TEST_CASE(TestVerifyStringsWithLargeBuffer) { + TEST_LOG(L"Test starting: TestVerifyStringsWithLargeBuffer"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); - HttpMock mock("POST", url, 200); - mock.SetResponseBody(defaultStringVerifyResult); + auto mock = std::make_shared("POST", url, 200); + mock->SetResponseBody(defaultStringVerifyResult); const size_t requestStrsCount{ 2 }; const char* requestStrs[requestStrsCount]{ "asdf", "asdfasdf" }; bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&requestWellFormed, requestStrs, requestStrsCount](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); diff --git a/Tests/UnitTests/Tests/Services/TitleManagedStatsTests.cpp b/Tests/UnitTests/Tests/Services/TitleManagedStatsTests.cpp index 94c407ab..b709f060 100644 --- a/Tests/UnitTests/Tests/Services/TitleManagedStatsTests.cpp +++ b/Tests/UnitTests/Tests/Services/TitleManagedStatsTests.cpp @@ -41,6 +41,8 @@ DEFINE_TEST_CLASS(TitleManagedStatsTests) DEFINE_TEST_CASE(TestWriteStats) { + TEST_LOG(L"Test starting: TestWriteStats"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto mock{ WriteStatsMock(writeStatsJson) }; @@ -66,6 +68,8 @@ DEFINE_TEST_CLASS(TitleManagedStatsTests) DEFINE_TEST_CASE(TestUpdateStats) { + TEST_LOG(L"Test starting: TestUpdateStats"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto mock{ WriteStatsMock(patchStatsJson) }; @@ -86,6 +90,8 @@ DEFINE_TEST_CLASS(TitleManagedStatsTests) DEFINE_TEST_CASE(TestDeleteStats) { + TEST_LOG(L"Test starting: TestDeleteStats"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto mock{ WriteStatsMock(deleteStatsJson) }; diff --git a/Tests/UnitTests/Tests/Services/TitleStorageTests.cpp b/Tests/UnitTests/Tests/Services/TitleStorageTests.cpp index 3b9bae5e..91f2b724 100644 --- a/Tests/UnitTests/Tests/Services/TitleStorageTests.cpp +++ b/Tests/UnitTests/Tests/Services/TitleStorageTests.cpp @@ -253,10 +253,10 @@ DEFINE_TEST_CLASS(TitleStorageTests) xboxLiveContext->Xuid() }; - HttpMock mock{ "PUT", "https://titlestorage.xboxlive.com" }; + auto mock = std::make_shared( "PUT", "https://titlestorage.xboxlive.com" ); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -299,12 +299,12 @@ DEFINE_TEST_CLASS(TitleStorageTests) uint32_t bufferSizeMultiplier ) { - HttpMock mock{ "GET", "https://titlestorage.xboxlive.com" }; + auto mock = std::make_shared( "GET", "https://titlestorage.xboxlive.com" ); const uint8_t* responseBody{ nullptr }; size_t responseBodySize{ 0 }; bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { requestWellFormed &= requestBody.empty(); @@ -400,10 +400,10 @@ DEFINE_TEST_CLASS(TitleStorageTests) XblTitleStorageBlobType blobType ) { - HttpMock mock{ "DELETE", "https://titlestorage.xboxlive.com" }; + auto mock = std::make_shared( "DELETE", "https://titlestorage.xboxlive.com" ); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -442,11 +442,11 @@ DEFINE_TEST_CLASS(TitleStorageTests) XblTitleStorageType type ) { - HttpMock mock{ "GET", "https://titlestorage.xboxlive.com" }; + auto mock = std::make_shared( "GET", "https://titlestorage.xboxlive.com" ); JsonDocument responseJson; bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { requestWellFormed &= requestBody.empty(); @@ -502,11 +502,11 @@ DEFINE_TEST_CLASS(TitleStorageTests) XblTitleStorageType type ) { - HttpMock mock{ "GET", "https://titlestorage.xboxlive.com" }; - mock.SetResponseBody(quotaResponse); + auto mock = std::make_shared( "GET", "https://titlestorage.xboxlive.com" ); + mock->SetResponseBody(quotaResponse); bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(mock); @@ -532,6 +532,8 @@ DEFINE_TEST_CLASS(TitleStorageTests) DEFINE_TEST_CASE(GetQuotaTest) { + TEST_LOG(L"Test starting: GetQuotaTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -542,6 +544,8 @@ DEFINE_TEST_CLASS(TitleStorageTests) DEFINE_TEST_CASE(GetBlobMetadataTest) { + TEST_LOG(L"Test starting: GetBlobMetadataTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -552,6 +556,8 @@ DEFINE_TEST_CLASS(TitleStorageTests) DEFINE_TEST_CASE(DeleteBlobTest) { + TEST_LOG(L"Test starting: DeleteBlobTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -563,6 +569,8 @@ DEFINE_TEST_CLASS(TitleStorageTests) DEFINE_TEST_CASE(DownloadBlobTest) { + TEST_LOG(L"Test starting: DownloadBlobTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -577,6 +585,8 @@ DEFINE_TEST_CLASS(TitleStorageTests) DEFINE_TEST_CASE(DownloadBlobWithLargeBufferTest) { + TEST_LOG(L"Test starting: DownloadBlobWithLargeBufferTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -591,6 +601,8 @@ DEFINE_TEST_CLASS(TitleStorageTests) DEFINE_TEST_CASE(UploadBlobTest) { + TEST_LOG(L"Test starting: UploadBlobTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -633,6 +645,8 @@ DEFINE_TEST_CLASS(TitleStorageTests) DEFINE_TEST_CASE(UploadBlobWithLargeBufferTest) { + TEST_LOG(L"Test starting: UploadBlobWithLargeBufferTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -675,6 +689,8 @@ DEFINE_TEST_CLASS(TitleStorageTests) DEFINE_TEST_CASE(UploadBlobMultipleChunksTest) { + TEST_LOG(L"Test starting: UploadBlobMultipleChunksTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -700,11 +716,11 @@ DEFINE_TEST_CLASS(TitleStorageTests) // This should result in multiple Http calls (1 per chunk), but intermediate results should not be // propagated to the client - HttpMock mock{ "PUT", "https://titlestorage.xboxlive.com" }; + auto mock = std::make_shared( "PUT", "https://titlestorage.xboxlive.com" ); uint32_t requestCount{ 0 }; bool requestWellFormed{ true }; - mock.SetMockMatchedCallback( + mock->SetMockMatchedCallback( [&](HttpMock* mock, xsapi_internal_string requestUrl, xsapi_internal_string requestBody) { UNREFERENCED_PARAMETER(requestBody); @@ -753,6 +769,8 @@ DEFINE_TEST_CLASS(TitleStorageTests) DEFINE_TEST_CASE(TitleStorageInvalidArgsTest) { + TEST_LOG(L"Test starting: TitleStorageInvalidArgsTest"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); diff --git a/Tests/UnitTests/Tests/Shared/GlobalTests.cpp b/Tests/UnitTests/Tests/Shared/GlobalTests.cpp index 72d7d786..5d8b5261 100644 --- a/Tests/UnitTests/Tests/Shared/GlobalTests.cpp +++ b/Tests/UnitTests/Tests/Shared/GlobalTests.cpp @@ -45,6 +45,8 @@ DEFINE_TEST_CLASS(GlobalTests) DEFINE_TEST_CASE(TestXblInitializeAndCleanup) { + TEST_LOG(L"Test starting: TestXblInitializeAndCleanup"); + XTaskQueueHandle queueHandle{}; VERIFY_SUCCEEDED(XTaskQueueCreate(XTaskQueueDispatchMode::ThreadPool, XTaskQueueDispatchMode::ThreadPool, &queueHandle)); TaskQueue queue{ queueHandle }; @@ -72,6 +74,8 @@ DEFINE_TEST_CLASS(GlobalTests) DEFINE_TEST_CASE(TestServiceCallRouted) { + TEST_LOG(L"Test starting: TestServiceCallRouted"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -152,6 +156,8 @@ DEFINE_TEST_CLASS(GlobalTests) DEFINE_TEST_CASE(TestMemoryHook) { + TEST_LOG(L"Test starting: TestMemoryHook"); + class MemoryManager { public: @@ -250,6 +256,8 @@ DEFINE_TEST_CLASS(GlobalTests) DEFINE_TEST_CASE(TestCancellation) { + TEST_LOG(L"Test starting: TestCancellation"); + XTaskQueueHandle queue{ nullptr }; VERIFY_SUCCEEDED(XTaskQueueCreate(XTaskQueueDispatchMode::ThreadPool, XTaskQueueDispatchMode::ThreadPool, &queue)); diff --git a/Tests/UnitTests/Tests/Shared/HttpCallSettingsTests.cpp b/Tests/UnitTests/Tests/Shared/HttpCallSettingsTests.cpp index 821f9200..d0192c37 100644 --- a/Tests/UnitTests/Tests/Shared/HttpCallSettingsTests.cpp +++ b/Tests/UnitTests/Tests/Shared/HttpCallSettingsTests.cpp @@ -13,6 +13,8 @@ DEFINE_TEST_CLASS(XboxLiveContextSettingsTests) DEFINE_TEST_CASE(TestXboxLiveContextSettingsApis) { + TEST_LOG(L"Test starting: TestXboxLiveContextSettingsApis"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); auto contextHandle{ xboxLiveContext.get() }; @@ -60,6 +62,8 @@ DEFINE_TEST_CLASS(XboxLiveContextSettingsTests) DEFINE_TEST_CASE(TestHttpTimeouts) { + TEST_LOG(L"Test starting: TestHttpTimeouts"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); diff --git a/Tests/UnitTests/Tests/Shared/HttpCallTests.cpp b/Tests/UnitTests/Tests/Shared/HttpCallTests.cpp index e9fed237..3e8176cb 100644 --- a/Tests/UnitTests/Tests/Shared/HttpCallTests.cpp +++ b/Tests/UnitTests/Tests/Shared/HttpCallTests.cpp @@ -13,6 +13,8 @@ DEFINE_TEST_CLASS(HttpCallTests) DEFINE_TEST_CASE(TestHttpCall) { + TEST_LOG(L"Test starting: TestHttpCall"); + TestEnvironment env{}; auto xboxLiveContext = env.CreateMockXboxLiveContext(); @@ -86,6 +88,8 @@ DEFINE_TEST_CLASS(HttpCallTests) DEFINE_TEST_CASE(CppTestHttpCall) { + TEST_LOG(L"Test starting: CppTestHttpCall"); + TestEnvironment env{}; uint32_t httpStatus{ 200 }; diff --git a/Tests/UnitTests/Tests/Shared/LogTests.cpp b/Tests/UnitTests/Tests/Shared/LogTests.cpp index 24f95bf2..0b2ee649 100644 --- a/Tests/UnitTests/Tests/Shared/LogTests.cpp +++ b/Tests/UnitTests/Tests/Shared/LogTests.cpp @@ -31,6 +31,8 @@ DEFINE_TEST_CLASS(LogTest) DEFINE_TEST_CASE(WriteLog) { + TEST_LOG(L"Test starting: WriteLog"); + VERIFY_SUCCEEDED(HCSettingsSetTraceLevel(HCTraceLevel::Error)); auto testLogger = std::make_shared(); @@ -65,6 +67,8 @@ DEFINE_TEST_CLASS(LogTest) DEFINE_TEST_CASE(WriteLogStream) { + TEST_LOG(L"Test starting: WriteLogStream"); + //TestEnvironment env{}; auto testLogger = std::make_shared(); @@ -83,6 +87,8 @@ DEFINE_TEST_CLASS(LogTest) DEFINE_TEST_CASE(WriteLogConcurrent) { + TEST_LOG(L"Test starting: WriteLogConcurrent"); + auto testLogger = std::make_shared(); // Start 20 threads writing 100 logs @@ -137,6 +143,8 @@ DEFINE_TEST_CLASS(LogTest) DEFINE_TEST_CASE(HCLogging) { + TEST_LOG(L"Test starting: HCLogging"); + VERIFY_SUCCEEDED(HCInitialize(nullptr)); HCTraceSetTraceToDebugger(true); diff --git a/Tests/UnitTests/Tests/Shared/PlatformTests.cpp b/Tests/UnitTests/Tests/Shared/PlatformTests.cpp index 789dd977..2015558c 100644 --- a/Tests/UnitTests/Tests/Shared/PlatformTests.cpp +++ b/Tests/UnitTests/Tests/Shared/PlatformTests.cpp @@ -127,6 +127,7 @@ DEFINE_TEST_CLASS(PlatformTests) public: DEFINE_TEST_CASE(TestCustomLocalStorageHandlers) { + TEST_LOG(L"Test starting: TestCustomLocalStorageHandlers"); LocalStorageManager storageManager{}; TestEnvironment env{}; @@ -183,6 +184,8 @@ DEFINE_TEST_CLASS(PlatformTests) DEFINE_TEST_CASE(TestEnumTraits) { + TEST_LOG(L"Test starting: TestEnumTraits"); + auto s = EnumName(Value1); VERIFY_ARE_EQUAL_STR("Value1", s); @@ -214,6 +217,8 @@ DEFINE_TEST_CLASS(PlatformTests) DEFINE_TEST_CASE(TestPeriodicTask) { + TEST_LOG(L"Test starting: TestPeriodicTask"); + TestEnvironment env{}; XTaskQueueHandle queueHandle{ nullptr }; diff --git a/Tests/UnitTests/Tests/Shared/ServiceCallLoggerTests.cpp b/Tests/UnitTests/Tests/Shared/ServiceCallLoggerTests.cpp index 598c50d1..a85dceca 100644 --- a/Tests/UnitTests/Tests/Shared/ServiceCallLoggerTests.cpp +++ b/Tests/UnitTests/Tests/Shared/ServiceCallLoggerTests.cpp @@ -59,6 +59,8 @@ DEFINE_TEST_CLASS(ServiceCallLoggerTests) DEFINE_TEST_CASE(TestEnabledStates) { + TEST_LOG("Test starting: AddLocalUser_InitializesWithLocalAchievementsCached_Success"); + std::shared_ptr logger = xbox::services::service_call_logger::get_singleton_instance(); VERIFY_IS_NOT_NULL(logger.get()); VERIFY_NO_THROW( @@ -85,6 +87,8 @@ DEFINE_TEST_CLASS(ServiceCallLoggerTests) DEFINE_TEST_CASE(TestLogging) { + TEST_LOG("Test starting: AddLocalUser_InitializesWithLocalAchievementsCached_Success"); + std::shared_ptr logger = xbox::services::service_call_logger::get_singleton_instance(); VERIFY_IS_NOT_NULL(logger.get()); diff --git a/Tests/UnitTests/Tests/Shared/UtilTests.cpp b/Tests/UnitTests/Tests/Shared/UtilTests.cpp index f1f9ffe1..104b7474 100644 --- a/Tests/UnitTests/Tests/Shared/UtilTests.cpp +++ b/Tests/UnitTests/Tests/Shared/UtilTests.cpp @@ -3,7 +3,7 @@ #include "pch.h" #include "UnitTestIncludes.h" -#define TEST_CLASS_OWNER L"jasonsa" +#define TEST_CLASS_OWNER L"XBL" #include "DefineTestMacros.h" #include "Utils.h" @@ -30,6 +30,8 @@ class UtilTests : public UnitTestBase { DEFINE_TEST_CASE_PROPERTIES(); + TEST_LOG("Test starting: TestConvertExceptionToHRESULT"); + VERIFY_EXCEPTION_TO_HR(std::bad_alloc(), E_OUTOFMEMORY); VERIFY_EXCEPTION_TO_HR(std::bad_cast(), E_NOINTERFACE); VERIFY_EXCEPTION_TO_HR(std::invalid_argument("test"), E_INVALIDARG); diff --git a/Tests/UnitTests/Tests/Shared/XboxLiveCallbackTests.cpp b/Tests/UnitTests/Tests/Shared/XboxLiveCallbackTests.cpp index 70425d27..a2f2d6ac 100644 --- a/Tests/UnitTests/Tests/Shared/XboxLiveCallbackTests.cpp +++ b/Tests/UnitTests/Tests/Shared/XboxLiveCallbackTests.cpp @@ -18,6 +18,8 @@ DEFINE_TEST_CLASS(XboxLiveCallbackTests) DEFINE_TEST_CASE(BasicCallback) { + TEST_LOG(L"Test starting: BasicCallback"); + int value = 1; xbox_live_callback lambda = [value](int _value) { @@ -29,6 +31,8 @@ DEFINE_TEST_CLASS(XboxLiveCallbackTests) DEFINE_TEST_CASE(NestedCallbacks) { + TEST_LOG(L"Test starting: NestedCallbacks"); + int firstValue = 1; int secondValue = 2; @@ -48,6 +52,8 @@ DEFINE_TEST_CLASS(XboxLiveCallbackTests) DEFINE_TEST_CASE(TestXAsyncProviderException) { + TEST_LOG(L"Test starting: TestXAsyncProviderException"); + TestEnvironment testEnv{}; Event callbackInvoked; diff --git a/Tests/UnitTests/Tests/Shared/XboxLiveContextTests.cpp b/Tests/UnitTests/Tests/Shared/XboxLiveContextTests.cpp index f0570f0f..7a358b1b 100644 --- a/Tests/UnitTests/Tests/Shared/XboxLiveContextTests.cpp +++ b/Tests/UnitTests/Tests/Shared/XboxLiveContextTests.cpp @@ -13,6 +13,8 @@ DEFINE_TEST_CLASS(XboxLiveContextTests) DEFINE_TEST_CASE(TestXboxLiveContext) { + TEST_LOG(L"Test starting: TestXboxLiveContext"); + TestEnvironment env{}; uint64_t mockXuid{ 1 }; diff --git a/xsapi.staticlib.props b/xsapi.staticlib.props index 20d0c22e..9e49eedc 100644 --- a/xsapi.staticlib.props +++ b/xsapi.staticlib.props @@ -155,7 +155,7 @@ $(XsapiRoot)External\xal\ - $(XalRoot)External\CompactCoreCLL\ + $(XsapiRoot)External\CompactCoreCLL\ @@ -165,8 +165,9 @@ - - {F321E346-9F67-4291-9A71-D219F892BDEC} + + {54ebecdc-a7fd-4e3f-bb1a-40d15f0b6792} + {0B3ED0FC-2866-4D05-A92E-411031596103} {2f1f7c6a-1fda-4cce-935d-0e9324d5db92} @@ -184,18 +185,26 @@ %(AdditionalIncludeDirectories);$(XalInclude);$(XalExtraInclude) - + {7333335C-CD75-4802-8F56-702C0BE2563F} {7326b85d-b8df-4a59-a2c7-c721a7a1b8cb} - - {F321E346-9F67-4291-9A71-D219F892BDEC} - {9E8E68BA-6CBE-408E-8738-320474546551} + + {54ebecdc-a7fd-4e3f-bb1a-40d15f0b6792} + {82cfe4ee-7a03-4bc4-810d-293806b4dab1} + + + {0656b0fd-2f77-4840-aa4f-b9622bb9d39f} + {B4EB5355-7230-456D-97F8-624AA9F78606} + + + {517489c9-dd6f-4a0f-893c-a55bbd7dfbe6} + {4B32FD42-904F-4E50-B244-869D8C6D6F56} - +