// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Interfaces/IBuildManifest.h" #include "Algo/Copy.h" #include "BuildPatchManifest.h" #include "Tests/Mock/ManifestField.mock.h" #if WITH_DEV_AUTOMATION_TESTS namespace BuildPatchServices { class FMockManifest : public FBuildPatchAppManifest { public: virtual uint32 GetAppID() const override { return AppId; } virtual const FString& GetAppName() const override { return AppName; } virtual const FString& GetVersionString() const override { return VersionString; } virtual const FString& GetLaunchExe() const override { return LaunchExe; } virtual const FString& GetLaunchCommand() const override { return LaunchCommand; } virtual const FString& GetPrereqName() const override { return PrereqName; } virtual const FString& GetPrereqPath() const override { return PrereqPath; } virtual const FString& GetPrereqArgs() const override { return PrereqArgs; } virtual int64 GetDownloadSize() const override { return DownloadSize; } virtual int64 GetDownloadSize(const TSet& Tags) const override { return TagDownloadSize; } virtual int64 GetDeltaDownloadSize(const TSet& Tags, const IBuildManifestRef& PreviousVersion) const override { return DeltaDownloadSize; } virtual int64 GetBuildSize() const override { return BuildSize; } virtual int64 GetBuildSize(const TSet& Tags) const override { return TagBuildSize; } virtual TArray GetBuildFileList() const override { TArray Filenames; GetFileList(Filenames); return Filenames; } virtual TArray GetBuildFileListView() const override { TArray Filenames; GetFileList(Filenames); return Filenames; } virtual TArray GetBuildFileList(const TSet& Tags) const override { TArray Filenames; GetTaggedFileList(Tags, Filenames); return Filenames; } virtual TArray GetBuildFileListView(const TSet& Tags) const override { TArray Filenames; GetTaggedFileList(Tags, Filenames); return Filenames; } virtual void GetFileTagList(TSet& Tags) const override { Tags = FileTagList; } virtual void GetRemovableFiles(const IBuildManifestRef& OldManifest, TArray< FString >& OutRemovableFiles) const override { OutRemovableFiles = RemovableFiles; } virtual void GetRemovableFiles(const TCHAR* InstallPath, TArray< FString >& OutRemovableFiles) const override { OutRemovableFiles = RemovableFiles; } virtual void CopyCustomFields(const IBuildManifestRef& Other, bool bClobber) override { } virtual bool NeedsResaving() const override { return false; } virtual const IManifestFieldPtr GetCustomField(const FString& FieldName) const override { return MakeShareable(new FMockManifestField(CustomFields[FieldName])); } virtual const IManifestFieldPtr SetCustomField(const FString& FieldName, const FString& Value) override { CustomFields.FindOrAdd(FieldName).String = Value; return GetCustomField(FieldName); } virtual const IManifestFieldPtr SetCustomField(const FString& FieldName, const double& Value) override { CustomFields.FindOrAdd(FieldName).Double = Value; return GetCustomField(FieldName); } virtual const IManifestFieldPtr SetCustomField(const FString& FieldName, const int64& Value) override { CustomFields.FindOrAdd(FieldName).Integer = Value; return GetCustomField(FieldName); } virtual void RemoveCustomField(const FString& FieldName) override { CustomFields.Remove(FieldName); } virtual IBuildManifestRef Duplicate() const override { return MakeShareable(new FMockManifest(*this)); } virtual bool LoadFromFile(const FString& Filename) override { return true; } virtual bool DeserializeFromData(const TArray& DataInput) override { return true; } virtual bool DeserializeFromJSON(const FString& JSONInput) override { return true; } virtual bool SaveToFile(const FString& Filename, EFeatureLevel InFeatureLevel) override { return true; } virtual void SerializeToJSON(FString& JSONOutput) override { } virtual EFeatureLevel GetFeatureLevel() const override { return FeatureLevel; } virtual void GetChunksRequiredForFiles(const TSet& Filenames, TSet& RequiredChunks) const override { RequiredChunks = ChunksRequiredForFiles; } virtual uint32 GetNumberOfChunkReferences(const FGuid& ChunkGuid) const override { return NumberOfChunkReferences; } virtual int64 GetDataSize(const FGuid& DataGuid) const override { return DataSize; } virtual int64 GetDataSize(const TArray& DataGuids) const override { return DataSize; } virtual int64 GetDataSize(const TSet & DataGuids) const override { return DataSize; } virtual int64 GetFileSize(FStringView Filename) const override { return FileNameToFileSize.FindRef(FString(Filename)); } virtual int64 GetFileSize(const TArray& Filenames) const override { int64 FileSize = 0; for (const FString& Filename : Filenames) { FileSize += GetFileSize(Filename); } return FileSize; } virtual int64 GetFileSize(const TSet & Filenames) const override { return GetFileSize(Filenames.Array()); } virtual uint32 GetNumFiles() const override { return NumFiles; } virtual void GetFileList(TArray& Filenames) const override { Filenames = BuildFileList; } virtual void GetFileList(TArray& Filenames) const override { Algo::Copy(BuildFileList, Filenames); } virtual void GetFileList(TSet& Filenames) const override { Algo::Copy(BuildFileList, Filenames); } virtual void GetTaggedFileList(const TSet& Tags, TSet& TaggedFiles) const override { TaggedFiles = TaggedFileList; } virtual void GetTaggedFileList(const TSet& Tags, TArray& TaggedFiles) const override { TaggedFiles = TaggedFileList.Array(); } virtual void GetTaggedFileList(const TSet& Tags, TArray& TaggedFiles) const override { Algo::Copy(TaggedFileList, TaggedFiles); } virtual void GetDataList(TArray& DataGuids) const override { DataGuids = DataList; } virtual void GetDataList(TSet & DataGuids) const override { DataGuids.Append(DataList); } virtual const FFileManifest* GetFileManifest(const FString& Filename) const override { return FileManifests.Find(Filename); } virtual bool IsFileDataManifest() const override { return false; } virtual bool GetChunkHash(const FGuid& ChunkGuid, uint64& OutHash) const override { if (ChunkInfos.Contains(ChunkGuid)) { OutHash = ChunkInfos[ChunkGuid].Hash; return true; } return false; } virtual bool GetChunkShaHash(const FGuid& ChunkGuid, FSHAHash& OutHash) const override { static const uint8 Zero[FSHA1::DigestSize] = { 0 }; if (ChunkInfos.Contains(ChunkGuid)) { OutHash = ChunkInfos[ChunkGuid].ShaHash; return FMemory::Memcmp(OutHash.Hash, Zero, FSHA1::DigestSize) != 0; } return false; } virtual const FChunkInfo* GetChunkInfo(const FGuid& ChunkGuid) const override { if (ChunkInfos.Contains(ChunkGuid)) { return &ChunkInfos[ChunkGuid]; } return nullptr; } virtual bool GetFileHash(const FGuid& FileGuid, FSHAHash& OutHash) const override { if (FileIdToHashes.Contains(FileGuid)) { OutHash = FileIdToHashes[FileGuid]; return true; } return false; } virtual bool GetFileHash(const FString& Filename, FSHAHash& OutHash) const override { if (FileNameToHashes.Contains(Filename)) { OutHash = FileNameToHashes[Filename]; return true; } return false; } virtual bool GetFilePartHash(const FGuid& FilePartGuid, uint64& OutHash) const override { if (FilePartHashes.Contains(FilePartGuid)) { OutHash = FilePartHashes[FilePartGuid]; return true; } return false; } virtual int32 EnumerateProducibleChunks(const FString& InstallDirectory, const TSet& ChunksRequired, TSet& ChunksAvailable) const override { int32 RetVal = ProducibleChunks.Difference(ChunksAvailable).Num(); ChunksAvailable.Append(ProducibleChunks); return RetVal; } virtual void GetOutdatedFiles(const IBuildManifestRef& OldManifest, TSet& OutOutdatedFiles) const override { GetOutdatedFiles(FBuildPatchAppManifestPtr(StaticCastSharedRef(OldManifest)), TEXT(""), OutOutdatedFiles); } virtual void GetOutdatedFiles(const FBuildPatchAppManifestPtr& OldManifest, const FString& InstallDirectory, TSet& OutOutdatedFiles) const override { GetOutdatedFiles(OldManifest.Get(), InstallDirectory, OutOutdatedFiles); } virtual void GetOutdatedFiles(const FBuildPatchAppManifest* OldManifest, const FString& InstallDirectory, TSet& OutOutdatedFiles) const override { GetOutdatedFiles(OldManifest, InstallDirectory, TSet(), OutOutdatedFiles); } virtual void GetOutdatedFiles(const FBuildPatchAppManifest* OldManifest, const FString& InstallDirectory, const TSet& FilesToCheck, TSet& OutOutdatedFiles) const { OutOutdatedFiles = OutOutdatedFiles.Union(OutdatedFiles); } virtual bool IsFileOutdated(const FBuildPatchAppManifestRef& OldManifest, const FString& Filename) const override { return true; } virtual TArray GetFilePartsForChunk(const FGuid& ChunkId) const override { checkNoEntry(); // AFAICT this function is deprecated and never used. return TArray(); } virtual bool HasFileAttributes() const override { return true; } void SyncInternalManifestStructures() { // Normal manifests have some lookup structures we need to be fixed up in order for // things to work. for (const TPair& FileManifest : FileManifests) { FileManifestList.FileList.Add(FileManifest.Value); } InitLookups(); } public: uint64 AppId; FString AppName; FString VersionString; FString LaunchExe; FString LaunchCommand; FString PrereqName; FString PrereqPath; FString PrereqArgs; TArray BuildFileList; TSet FileTagList; int64 DownloadSize; int64 TagDownloadSize; int64 DeltaDownloadSize; int64 BuildSize; int64 TagBuildSize; TArray RemovableFiles; TMap CustomFields; EFeatureLevel FeatureLevel; TSet ChunksRequiredForFiles; uint32 NumberOfChunkReferences; int64 DataSize; TMap FileNameToFileSize; uint32 NumFiles; TSet TaggedFileList; TArray DataList; TMap FileManifests; TMap ChunkInfos; TMap FileIdToHashes; TMap FileNameToHashes; TMap FilePartHashes; TSet ProducibleChunks; TSet OutdatedFiles; }; typedef TSharedPtr FMockManifestPtr; } #endif //WITH_DEV_AUTOMATION_TESTS