BaseAssetManagerTest.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/Asset/AssetManager.h>
  10. #include <AzCore/IO/Streamer/Streamer.h>
  11. #include <AzCore/IO/Streamer/StreamerComponent.h>
  12. #include <AzCore/Jobs/JobManager.h>
  13. #include <AzCore/Jobs/JobContext.h>
  14. #include <AzCore/Serialization/ObjectStream.h>
  15. #include <AzCore/Serialization/Utils.h>
  16. #include <AzCore/UnitTest/TestTypes.h>
  17. #include <AZTestShared/Utils/Utils.h>
  18. #include <Tests/FileIOBaseTestTypes.h>
  19. #include <Tests/Asset/TestAssetTypes.h>
  20. #include <Tests/SerializeContextFixture.h>
  21. #include <Tests/TestCatalog.h>
  22. #include <AzCore/UnitTest/Mocks/MockFileIOBase.h>
  23. #include <Streamer/IStreamerMock.h>
  24. namespace UnitTest
  25. {
  26. // Helper subclass of AssetManager that makes it possible to query some of the normally hidden implementation.
  27. class TestAssetManager : public AssetManager
  28. {
  29. public:
  30. TestAssetManager(const Descriptor& desc) : AssetManager(desc) {}
  31. // Find the current status of the reload
  32. AZ::Data::AssetData::AssetStatus GetReloadStatus(const AssetId& assetId);
  33. const AZ::Data::AssetManager::OwnedAssetContainerMap& GetAssetContainers() const;
  34. const AssetMap& GetAssets() const;
  35. // Expose these methods so that they can be queried by the unit tests.
  36. using AssetManager::GetAssetInternal;
  37. using AssetManager::GetAssetContainer;
  38. };
  39. // Base test class for the AssetManager unit tests that provides the general setup/teardown needed for all the tests.
  40. class BaseAssetManagerTest
  41. : public SerializeContextFixture
  42. {
  43. public:
  44. ~BaseAssetManagerTest() override = default;
  45. // Subclasses are required to declare how many job threads they would like for their tests.
  46. virtual size_t GetNumJobManagerThreads() const = 0;
  47. // Subclasses can optionally override the streamer creation and destruction
  48. virtual IO::IStreamer* CreateStreamer() { return aznew IO::Streamer(AZStd::thread_desc{}, StreamerComponent::CreateStreamerStack()); }
  49. virtual void DestroyStreamer(IO::IStreamer* streamer)
  50. {
  51. delete streamer;
  52. streamer = nullptr;
  53. }
  54. void SetUp() override;
  55. void TearDown() override;
  56. static void SuppressTraceOutput(bool suppress);
  57. // Helper methods to create and destroy actual assets on the disk for true end-to-end asset loading.
  58. virtual void WriteAssetToDisk(const AZStd::string& assetName, const AZStd::string& assetIdGuid);
  59. virtual void DeleteAssetFromDisk(const AZStd::string& assetName);
  60. void BlockUntilAssetJobsAreComplete();
  61. constexpr static AZStd::chrono::duration<AZStd::sys_time_t> DefaultTimeoutSeconds{ AZStd::chrono::seconds(AZ_TRAIT_UNIT_TEST_ASSET_MANAGER_TEST_DEFAULT_TIMEOUT_SECS) };
  62. protected:
  63. AZ::JobManager* m_jobManager{ nullptr };
  64. AZ::JobContext* m_jobContext{ nullptr };
  65. IO::FileIOBase* m_prevFileIO{ nullptr };
  66. IO::IStreamer* m_streamer{ nullptr };
  67. TestFileIOBase m_fileIO;
  68. AZStd::vector<AZStd::string> m_assetsWritten;
  69. };
  70. struct ReadRequest
  71. {
  72. AZ::IO::IStreamerTypes::Deadline m_deadline{};
  73. AZ::IO::IStreamerTypes::Priority m_priority{};
  74. IO::IStreamerTypes::RequestMemoryAllocatorResult m_data{ nullptr, 0, IO::IStreamerTypes::MemoryType::ReadWrite };
  75. AZ::IO::IStreamer::OnCompleteCallback m_callback;
  76. IO::FileRequestPtr m_request;
  77. };
  78. struct MemoryStreamerWrapper
  79. {
  80. MemoryStreamerWrapper();
  81. ~MemoryStreamerWrapper() = default;
  82. ReadRequest* GetReadRequest(IO::FileRequestHandle request);
  83. template<typename TObject>
  84. bool WriteMemoryFile(const AZStd::string& filePath, TObject* object, AZ::SerializeContext* context)
  85. {
  86. auto& buffer = m_virtualFiles[filePath];
  87. ByteContainerStream stream(&buffer);
  88. return AZ::Utils::SaveObjectToStream(stream, DataStream::StreamType::ST_XML, object, context);
  89. }
  90. AZStd::vector<char>* FindFile(AZStd::string_view path);
  91. ::testing::NiceMock<StreamerMock> m_mockStreamer;
  92. IO::StreamerContext m_context;
  93. AZStd::atomic_bool m_suspended{ false };
  94. AZStd::recursive_mutex m_mutex;
  95. AZStd::queue<FileRequestHandle> m_processingQueue; // Keeps tracks of requests that have been queued while processing is suspended
  96. AZStd::vector<ReadRequest> m_readRequests;
  97. AZStd::unordered_map<AZ::IO::Path, AZStd::vector<char>> m_virtualFiles;
  98. };
  99. struct DisklessAssetManagerBase : BaseAssetManagerTest
  100. {
  101. void SetUp() override;
  102. void TearDown() override;
  103. IO::IStreamer* CreateStreamer() override;
  104. void DestroyStreamer(IO::IStreamer*) override;
  105. void WriteAssetToDisk(const AZStd::string& assetName, const AZStd::string& assetIdGuid) override;
  106. void DeleteAssetFromDisk(const AZStd::string& assetName) override;
  107. AZStd::unique_ptr<MemoryStreamerWrapper> m_streamerWrapper;
  108. ::testing::NiceMock<MockFileIOBase> m_fileIO;
  109. IO::FileIOBase* m_prevFileIO{};
  110. };
  111. }