void FTestFriendsInterface::OnQueryRecentPlayersComplete(const FUniqueNetId& UserId, const FString& Namespace, bool bWasSuccessful, const FString& ErrorStr) { UE_LOG(LogOnline, Log, TEXT("QueryRecentPlayers() for player (%s) was success=%d error=%s"), *UserId.ToDebugString(), bWasSuccessful, *ErrorStr); if (bWasSuccessful) { TArray< TSharedRef<FOnlineRecentPlayer> > Players; // Grab the friends data so we can print it out if (OnlineSub->GetFriendsInterface()->GetRecentPlayers(UserId, Namespace, Players)) { UE_LOG(LogOnline, Log, TEXT("GetRecentPlayers returned %d players"), Players.Num()); // Log each friend's data out for (auto RecentPlayer : Players) { UE_LOG(LogOnline, Log, TEXT("\t%s has unique id (%s)"), *RecentPlayer->GetDisplayName(), *RecentPlayer->GetUserId()->ToDebugString()); UE_LOG(LogOnline, Log, TEXT("\t LastSeen (%s)"), *RecentPlayer->GetLastSeen().ToString()); } } } // done with this part of the test bQueryRecentPlayers = false; // kick off next test StartNextTest(); }
void FTestUserInterface::Test(const TArray<FString>& InUserIds) { UE_LOG(LogOnline, Display, TEXT("FTestUserInterface::Test")); OnlineSub = IOnlineSubsystem::Get(SubsystemName.Len() ? FName(*SubsystemName, FNAME_Find) : NAME_None); if (OnlineSub != NULL && OnlineSub->GetIdentityInterface().IsValid() && OnlineSub->GetUserInterface().IsValid()) { // Add our delegate for the async call OnQueryUserInfoCompleteDelegate = FOnQueryUserInfoCompleteDelegate::CreateRaw(this, &FTestUserInterface::OnQueryUserInfoComplete); OnlineSub->GetUserInterface()->AddOnQueryUserInfoCompleteDelegate(0, OnQueryUserInfoCompleteDelegate); // list of users to query for (int32 Idx=0; Idx < InUserIds.Num(); Idx++) { TSharedPtr<FUniqueNetId> UserId = OnlineSub->GetIdentityInterface()->CreateUniquePlayerId(InUserIds[Idx]); if (UserId.IsValid()) { QueryUserIds.Add(UserId.ToSharedRef()); } } // kick off next test StartNextTest(); } else { UE_LOG(LogOnline, Warning, TEXT("Failed to get user interface for %s"), *SubsystemName); FinishTest(); } }
void FTestUserInterface::OnQueryUserInfoComplete(int32 LocalPlayer, bool bWasSuccessful, const TArray< TSharedRef<class FUniqueNetId> >& UserIds, const FString& ErrorStr) { UE_LOG(LogOnline, Log, TEXT("GetUserInterface() for player (%d) was success=%d"), LocalPlayer, bWasSuccessful); for (int32 UserIdx=0; UserIdx < UserIds.Num(); UserIdx++) { TSharedPtr<FOnlineUser> User = OnlineSub->GetUserInterface()->GetUserInfo(LocalPlayer, *UserIds[UserIdx]); if (User.IsValid()) { UE_LOG(LogOnline, Log, TEXT("PlayerId=%s found"), *UserIds[UserIdx]->ToDebugString()); UE_LOG(LogOnline, Log, TEXT(" DisplayName=%s"), *User->GetDisplayName()); UE_LOG(LogOnline, Log, TEXT(" RealName=%s"), *User->GetRealName()); } else { UE_LOG(LogOnline, Log, TEXT("PlayerId=%s not found"), *UserIds[UserIdx]->ToDebugString()); } } // done bQueryUserInfo = false; StartNextTest(); }
void FTestFriendsInterface::OnReadFriendsComplete(int32 LocalPlayer, bool bWasSuccessful, const FString& ListName, const FString& ErrorStr) { UE_LOG(LogOnline, Log, TEXT("ReadFriendsList() for player (%d) was success=%d"), LocalPlayer, bWasSuccessful); if (bWasSuccessful) { TArray< TSharedRef<FOnlineFriend> > Friends; // Grab the friends data so we can print it out if (OnlineSub->GetFriendsInterface()->GetFriendsList(LocalPlayer, ListName, Friends)) { UE_LOG(LogOnline, Log, TEXT("GetFriendsList(%d) returned %d friends"), LocalPlayer, Friends.Num()); // Clear old entries InvitesToAccept.Empty(); FriendsToDelete.Empty(); // Log each friend's data out for (int32 Index = 0; Index < Friends.Num(); Index++) { const FOnlineFriend& Friend = *Friends[Index]; const FOnlineUserPresence& Presence = Friend.GetPresence(); UE_LOG(LogOnline, Log, TEXT("\t%s has unique id (%s)"), *Friend.GetDisplayName(), *Friend.GetUserId()->ToDebugString()); UE_LOG(LogOnline, Log, TEXT("\t\t Invite status (%s)"), EInviteStatus::ToString(Friend.GetInviteStatus())); UE_LOG(LogOnline, Log, TEXT("\t\t Presence: %s"), *Presence.PresenceStr); UE_LOG(LogOnline, Log, TEXT("\t\t bIsOnline (%s)"), Presence.bIsOnline ? TEXT("true") : TEXT("false")); UE_LOG(LogOnline, Log, TEXT("\t\t bIsPlaying (%s)"), Presence.bIsPlaying ? TEXT("true") : TEXT("false")); UE_LOG(LogOnline, Log, TEXT("\t\t bIsPlayingThisGame (%s)"), Presence.bIsPlayingThisGame ? TEXT("true") : TEXT("false")); UE_LOG(LogOnline, Log, TEXT("\t\t bIsJoinable (%s)"), Presence.bIsJoinable ? TEXT("true") : TEXT("false")); UE_LOG(LogOnline, Log, TEXT("\t\t bHasVoiceSupport (%s)"), Presence.bHasVoiceSupport ? TEXT("true") : TEXT("false")); // keep track of pending invites from the list and accept them if (Friend.GetInviteStatus() == EInviteStatus::PendingInbound) { InvitesToAccept.AddUnique(Friend.GetUserId()); } // keep track of list of friends to delete FriendsToDelete.AddUnique(Friend.GetUserId()); } } else { UE_LOG(LogOnline, Log, TEXT("GetFriendsList(%d) failed"), LocalPlayer); } } // done with this part of the test bReadFriendsList = false; // kick off next test StartNextTest(); }
void FTestIdentityInterface::Test(UWorld* InWorld, const FOnlineAccountCredentials& InAccountCredentials) { // Toggle the various tests to run bRunLoginTest = true; AccountCredentials = InAccountCredentials; OnlineIdentity = Online::GetIdentityInterface(InWorld, SubsystemName.Len() ? FName(*SubsystemName, FNAME_Find) : NAME_None); if (OnlineIdentity.IsValid()) { // Add delegates for the various async calls OnlineIdentity->AddOnLoginCompleteDelegate(LocalUserIdx, OnLoginCompleteDelegate); // kick off next test StartNextTest(); } else { UE_LOG(LogOnline, Warning, TEXT("Failed to get online identity interface for %s"), *SubsystemName); // done with the test FinishTest(); } }
void FTestFriendsInterface::OnDeleteFriendsListComplete(int32 LocalPlayer, bool bWasSuccessful, const FString& ListName, const FString& ErrorStr) { UE_LOG(LogOnline, Log, TEXT("DeleteFriendsList() for player (%d) was success=%d"), LocalPlayer, bWasSuccessful); // done with this part of the test bDeleteFriendsList = false; // kick off next test StartNextTest(); }
/// Runs all registered tests (if they meet their dependencies) void CFeatureTestMgr::RunAll() { // Writing the list of the active registered tests. // This can be useful to later check, when a crash occurs, // which tests were executed and which are skipped // (We will have no valid results for them) { if(m_pAutoTester && !m_testManifestWritten) { XmlNodeRef testManifest = GetISystem()->CreateXmlNode("testManifest"); testManifest->setTag("testmanifest"); CryLogAlways("About to dump out the testmanifest xml..."); for (TFeatureTestVec::iterator iter(m_featureTests.begin()); iter != m_featureTests.end(); ++iter) { FeatureTestState& fTest = *iter; XmlNodeRef testDescrNode = fTest.m_pTest->XmlDescription(); if(testDescrNode) { testManifest->addChild(testDescrNode); } } m_pAutoTester->WriteTestManifest(testManifest); m_testManifestWritten = true; } } if (!IsRunning()) { // Ensure all tests are cleaned up and scheduled to run ResetAllTests(eFTS_Scheduled); if (StartNextTest() || WaitingForScheduledTests()) { CryLog("Running all map feature tests..."); } else { CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "No tests available to run!"); } } else { CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "Tests are already running, can't start more until tests are complete."); } }
void FTestFriendsInterface::OnDeleteFriendComplete(int32 LocalPlayer, bool bWasSuccessful, const FUniqueNetId& FriendId, const FString& ListName, const FString& ErrorStr) { UE_LOG(LogOnline, Log, TEXT("DeleteFriend() for player (%d) to friend (%s) was success=%d. %s"), LocalPlayer, *FriendId.ToDebugString(), bWasSuccessful, *ErrorStr); // done with this part of the test if no more friends to delete FriendsToDelete.RemoveAt(0); if (bWasSuccessful && FriendsToDelete.Num() == 0) { bDeleteFriends = false; bReadFriendsList = true; } // kick off next test StartNextTest(); }
void FTestFriendsInterface::Test(const TArray<FString>& Invites) { OnlineSub = IOnlineSubsystem::Get(SubsystemName.Len() ? FName(*SubsystemName, FNAME_Find) : NAME_None); if (OnlineSub != NULL && OnlineSub->GetIdentityInterface().IsValid() && OnlineSub->GetFriendsInterface().IsValid()) { // don't affect default friends list for MCP if (SubsystemName.Equals(TEXT("MCP"),ESearchCase::IgnoreCase)) { FriendsListName = TEXT("TestFriends"); } // Add our delegate for the async call OnReadFriendsCompleteDelegate = FOnReadFriendsListCompleteDelegate::CreateRaw(this, &FTestFriendsInterface::OnReadFriendsComplete); OnAcceptInviteCompleteDelegate = FOnAcceptInviteCompleteDelegate::CreateRaw(this, &FTestFriendsInterface::OnAcceptInviteComplete); OnSendInviteCompleteDelegate = FOnSendInviteCompleteDelegate::CreateRaw(this, &FTestFriendsInterface::OnSendInviteComplete); OnDeleteFriendCompleteDelegate = FOnDeleteFriendCompleteDelegate::CreateRaw(this, &FTestFriendsInterface::OnDeleteFriendComplete); OnDeleteFriendsListCompleteDelegate = FOnDeleteFriendsListCompleteDelegate::CreateRaw(this, &FTestFriendsInterface::OnDeleteFriendsListComplete); OnlineSub->GetFriendsInterface()->AddOnReadFriendsListCompleteDelegate(0, OnReadFriendsCompleteDelegate); OnlineSub->GetFriendsInterface()->AddOnAcceptInviteCompleteDelegate(0, OnAcceptInviteCompleteDelegate); OnlineSub->GetFriendsInterface()->AddOnSendInviteCompleteDelegate(0, OnSendInviteCompleteDelegate); OnlineSub->GetFriendsInterface()->AddOnDeleteFriendCompleteDelegate(0, OnDeleteFriendCompleteDelegate); OnlineSub->GetFriendsInterface()->AddOnDeleteFriendsListCompleteDelegate(0, OnDeleteFriendsListCompleteDelegate); // list of pending users to send invites to for (int32 Idx=0; Idx < Invites.Num(); Idx++) { TSharedPtr<FUniqueNetId> FriendId = OnlineSub->GetIdentityInterface()->CreateUniquePlayerId(Invites[Idx]); if (FriendId.IsValid()) { InvitesToSend.Add(FriendId); } } // kick off next test StartNextTest(); } else { UE_LOG(LogOnline, Warning, TEXT("Failed to get friends interface for %s"), *SubsystemName); FinishTest(); } }
void FTestEntitlementsInterface::OnQueryEntitlementsComplete(bool bWasSuccessful, const FUniqueNetId& InUserId, const FString& Namespace, const FString& Error) { UE_LOG(LogOnline, Log, TEXT("enumerated entitlements. UserId=%s Result=%s Error=[%s]"), *InUserId.ToDebugString(), bWasSuccessful ? TEXT("true") : TEXT("false"), *Error); // Now check em out TArray<TSharedRef<FOnlineEntitlement>> Entitlements; EntitlementsOSS->GetAllEntitlements(InUserId, FString(), Entitlements); for (auto It = Entitlements.CreateConstIterator(); It; ++It) { const TSharedRef<FOnlineEntitlement> Entry = *It; UE_LOG(LogOnline, Log, TEXT(" entitlement id=%s name=%s"), *Entry->Id, *Entry->Name); } // kick off next test bQueryEntitlements = false; StartNextTest(); }
void FTestIdentityInterface::OnLoginComplete(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& Error) { if (bWasSuccessful) { UE_LOG(LogOnline, Log, TEXT("Successful authenticated user. UserId=[%s] "), *UserId.ToDebugString()); // update user info for newly registered user UserInfo = OnlineIdentity->GetUserAccount(UserId); } else { UE_LOG(LogOnline, Warning, TEXT("Failed to authenticate new user. Error=[%s]"), *Error); } // Mark test as done bRunLoginTest = false; // kick off next test StartNextTest(); }
/// Runs all registered tests (if they meet their dependencies) void CFeatureTestMgr::RunAll() { if (!IsRunning()) { // Ensure all tests are cleaned up and scheduled to run ResetAllTests(eFTS_Scheduled); if (StartNextTest() || WaitingForScheduledTests()) { CryLog("Running all map feature tests..."); } else { CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "No tests available to run!"); } } else { CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "Tests are already running, can't start more until tests are complete."); } }
void FTestEntitlementsInterface::Test(UWorld* InWorld) { IOnlineSubsystem* OSS = Online::GetSubsystem(InWorld, SubsystemName.Len() ? FName(*SubsystemName, FNAME_Find) : NAME_None); IdentityOSS = OSS->GetIdentityInterface(); if (IdentityOSS.IsValid()) { UserId = IdentityOSS->GetUniquePlayerId(LocalUserIdx); } if (UserId.IsValid() && UserId->IsValid()) { EntitlementsOSS = OSS->GetEntitlementsInterface(); if (EntitlementsOSS.IsValid()) { // Add delegates for the various async calls OnQueryEntitlementsCompleteDelegateHandle = EntitlementsOSS->AddOnQueryEntitlementsCompleteDelegate_Handle(OnQueryEntitlementsCompleteDelegate); // kick off next test StartNextTest(); } else { UE_LOG(LogOnline, Warning, TEXT("Entitlement test failed. Failed to get entitlement service API")); // done with the test FinishTest(); } } else { UE_LOG(LogOnline, Warning, TEXT("Entitlement test failed. No logged in user")); // done with the test FinishTest(); } }
/// Updates testing state void CFeatureTestMgr::Update(float deltaTime) { if (m_pendingLevelReload) { m_pendingLevelReload = false; m_hasQuickloaded = false; CryLogAlways("Reloading level before starting map tests."); gEnv->pConsole->ExecuteString("map"); return; } if (m_pendingQuickload) { m_pendingQuickload = false; bool bAllowQuickload = true; if (gEnv->IsEditor()) { ICVar* pg_allowSaveLoadInEditor = gEnv->pConsole->GetCVar("g_allowSaveLoadInEditor"); const bool bAllowSaveInEditor = pg_allowSaveLoadInEditor && (pg_allowSaveLoadInEditor->GetIVal() != 0); if (!bAllowSaveInEditor) { CryLogAlways("Ignoring quickload tests in editor"); bAllowQuickload = false; } } if (bAllowQuickload) { QuickloadReportResults(); return; } } // WORKAROUND: Auto-tester sends run all request before FG tests have loaded, so we wait for them to register here if (m_pendingRunAll) { // Have any feature tests registered yet? if (!m_featureTests.empty()) { // Initiate the RunAll! m_pendingRunAll = false; RunAll(); } } // If running tests if (m_running) { // If a test is in progress if (m_pRunningTest) { m_pRunningTest->Update(deltaTime); } else // We don't have a current test { // Get one from the scheduled list if (!StartNextTest() && !WaitingForScheduledTests()) { CryLogAlways("Finished running map tests!"); } } } else { //If we have tests scheduled but nothing is running, then wait for a time out if(WaitingForScheduledTests()) { m_timeWaitedForScheduled += deltaTime; if(m_timeWaitedForScheduled >= m_timeoutScheduled) { m_waiting = false; CryLogAlways("More feature tests were scheduled, but exceeded wait time:%.2f!", m_timeoutScheduled); } else { //Try to start the next test again in case conditions are now met StartNextTest(); } } } }