// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Containers/Ticker.h" #include "Tests/Mock/HttpManager.mock.h" #include "Tests/Mock/HttpRequest.mock.h" #include "Tests/Mock/HttpResponse.mock.h" #if WITH_DEV_AUTOMATION_TESTS namespace BuildPatchServices { class FFakeHttpRequest : public FMockHttpRequest { public: virtual bool ProcessRequest() override; public: class FFakeHttpManager* FakeHttpModule; }; class FFakeHttpResponse : public FMockHttpResponse { public: virtual int32 GetResponseCode() const override; virtual const TArray& GetContent() const override; virtual FString GetContentAsString() const override; virtual uint64 GetContentLength() const override; public: TArray Data; EHttpResponseCodes::Type Code; }; class FFakeHttpManager : public FMockHttpManager { public: FFakeHttpManager(FTSTicker& Ticker); virtual TSharedRef CreateRequest() override; virtual bool Tick(float Delta); virtual bool OnProcessRequest(FFakeHttpRequest* FakeHttpRequest); public: TArray> NewRequests; TArray> RunningRequests; TArray> ProgressedRequests; TMap> DataServed; }; bool FFakeHttpRequest::ProcessRequest() { ++RxProcessRequest; return FakeHttpModule->OnProcessRequest(this); } int32 FFakeHttpResponse::GetResponseCode() const { return static_cast(Code); } const TArray& FFakeHttpResponse::GetContent() const { return Data; } FString FFakeHttpResponse::GetContentAsString() const { TArray ZeroTerminatedPayload(GetContent()); ZeroTerminatedPayload.Add(0); return UTF8_TO_TCHAR(ZeroTerminatedPayload.GetData()); } uint64 FFakeHttpResponse::GetContentLength() const { return Data.Num(); } FFakeHttpManager::FFakeHttpManager(FTSTicker& Ticker) { Ticker.AddTicker(FTickerDelegate::CreateRaw(this, &FFakeHttpManager::Tick)); } TSharedRef FFakeHttpManager::CreateRequest() { ++RxCreateRequest; NewRequests.Emplace(new FFakeHttpRequest()); NewRequests.Last()->FakeHttpModule = this; return NewRequests.Last(); } bool FFakeHttpManager::Tick(float Delta) { // Complete progressed. for (const TSharedRef& ProgressedRequest : ProgressedRequests) { FFakeHttpResponse* FakeHttpResponse = new FFakeHttpResponse(); FakeHttpResponse->Code = EHttpResponseCodes::Ok; const FString& Url = ProgressedRequest->RxSetURL.Last().Get<0>(); if (DataServed.Contains(Url)) { FakeHttpResponse->Data = DataServed[Url]; } ProgressedRequest->HttpRequestCompleteDelegate.ExecuteIfBound( ProgressedRequest, MakeShareable(FakeHttpResponse), true); } // Progress started. ProgressedRequests = MoveTemp(RunningRequests); for (const TSharedRef& ProgressedRequest : ProgressedRequests) { const FString& Url = ProgressedRequest->RxSetURL.Last().Get<0>(); int32 Progress = 0; if (DataServed.Contains(Url)) { Progress = DataServed[Url].Num() / 2; } ProgressedRequest->HttpRequestProgressDelegate.ExecuteIfBound( ProgressedRequest, 0, Progress); } return true; } bool FFakeHttpManager::OnProcessRequest(FFakeHttpRequest* FakeHttpRequest) { int32 Index = NewRequests.IndexOfByPredicate([FakeHttpRequest](const TSharedRef& Element) { return &Element.Get() == FakeHttpRequest; }); bool bValidRequest = Index >= 0; if (bValidRequest) { const TSharedRef& Request = NewRequests[Index]; bValidRequest = Request->RxSetURL.Num() > 0; if (bValidRequest) { RunningRequests.Add(Request); NewRequests.RemoveAtSwap(Index); } } return bValidRequest; } } #endif //WITH_DEV_AUTOMATION_TESTS