AssetManagerTestingBase.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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 <API/AssetDatabaseBus.h>
  10. #include <AzCore/Settings/SettingsRegistryImpl.h>
  11. #if !defined(Q_MOC_RUN)
  12. #include <AzCore/UnitTest/TestTypes.h>
  13. #endif
  14. #include <AzCore/std/parallel/binary_semaphore.h>
  15. #include <Tests/Utils/Utils.h>
  16. #include <native/AssetManager/assetProcessorManager.h>
  17. #include <native/tests/MockAssetDatabaseRequestsHandler.h>
  18. #include <resourcecompiler/rccontroller.h>
  19. #include <tests/UnitTestUtilities.h>
  20. #include <QCoreApplication>
  21. #include <AzToolsFramework/Metadata/MetadataManager.h>
  22. #include <utilities/UuidManager.h>
  23. #include <AzCore/Serialization/Json/RegistrationContext.h>
  24. namespace AZ::IO
  25. {
  26. class LocalFileIO;
  27. }
  28. namespace UnitTests
  29. {
  30. class MockDiskSpaceResponder : public AZ::Interface<AssetProcessor::IDiskSpaceInfo>::Registrar
  31. {
  32. public:
  33. MOCK_METHOD2(CheckSufficientDiskSpace, bool(qint64, bool));
  34. };
  35. class JobSignalReceiver : AZ::Interface<AssetProcessor::IRCJobSignal>::Registrar
  36. {
  37. public:
  38. AZ_RTTI(JobSignalReceiver, "{8C1BEBF9-655C-4352-84DB-3BBB421CB3D3}", AssetProcessor::IRCJobSignal);
  39. void Finished() override
  40. {
  41. m_signal.release();
  42. }
  43. void WaitForFinish()
  44. {
  45. m_signal.acquire();
  46. }
  47. protected:
  48. AZStd::binary_semaphore m_signal;
  49. };
  50. class AssetManagerTestingBase;
  51. class TestingAssetProcessorManager : public AssetProcessor::AssetProcessorManager
  52. {
  53. public:
  54. friend class AssetManagerTestingBase;
  55. TestingAssetProcessorManager(AssetProcessor::PlatformConfiguration* config, QObject* parent = nullptr)
  56. : AssetProcessorManager(config, parent)
  57. {
  58. }
  59. void CheckActiveFiles(int count);
  60. void CheckFilesToExamine(int count);
  61. void CheckJobEntries(int count);
  62. };
  63. // Exposes protected data to automated tests.
  64. class TestingRCController
  65. : public AssetProcessor::RCController
  66. {
  67. public:
  68. TestingRCController() = default;
  69. explicit TestingRCController(int minJobs, int maxJobs, QObject* parent = 0)
  70. : AssetProcessor::RCController(minJobs, maxJobs, parent)
  71. {
  72. }
  73. // There are many queues in the asset processing process.
  74. // This allows automated tests to examine the RCQueueSortModel, and compare
  75. // to the other queues, to make sure the state of these systems matches what's expected.
  76. AssetProcessor::RCQueueSortModel& GetRCQueueSortModel()
  77. {
  78. return m_RCQueueSortModel;
  79. }
  80. };
  81. class AssetManagerTestingBase : public ::UnitTest::LeakDetectionFixture
  82. {
  83. public:
  84. void SetUp() override;
  85. void TearDown() override;
  86. virtual void SetupScanfolders(AZ::IO::Path assetRootDir, const AZStd::vector<AssetBuilderSDK::PlatformInfo>& platforms);
  87. static constexpr int AssetSubId = 1;
  88. static constexpr int ExtraAssetSubId = 2;
  89. static constexpr int MetadataProcessingDelayMs = 1;
  90. protected:
  91. void RunFile(int expectedJobCount, int expectedFileCount = 1, int dependencyFileCount = 0);
  92. void ProcessJob(AssetProcessor::RCController& rcController, const AssetProcessor::JobDetails& jobDetails);
  93. void WaitForNextJobToProcess(UnitTests::JobSignalReceiver& receiver);
  94. AZStd::string MakePath(const char* filename, bool intermediate);
  95. void CheckProduct(const char* relativePath, bool exists = true);
  96. void CheckIntermediate(const char* relativePath, bool exists = true, bool hasMetadata = false);
  97. void ProcessSingleStep(int expectedJobCount = 1, int expectedFileCount = 1, int jobToRun = 0, bool expectSuccess = true);
  98. void ProcessFileMultiStage(
  99. int endStage,
  100. bool doProductOutputCheck,
  101. AssetProcessor::SourceAssetReference = {},
  102. int startStage = 1,
  103. bool expectAutofail = false,
  104. bool hasExtraFile = false);
  105. AssetBuilderSDK::CreateJobFunction CreateJobStage(
  106. const AZStd::string& name, bool commonPlatform, const AzToolsFramework::AssetDatabase::PathOrUuid& sourceDependency = {});
  107. AssetBuilderSDK::ProcessJobFunction ProcessJobStage(
  108. const AZStd::string& outputExtension,
  109. AssetBuilderSDK::ProductOutputFlags flags,
  110. bool outputExtraFile,
  111. AZ::Data::AssetId productDependency = {});
  112. void CreateBuilder(
  113. const char* name,
  114. const char* inputFilter,
  115. const char* outputExtension,
  116. bool createJobCommonPlatform,
  117. AssetBuilderSDK::ProductOutputFlags outputFlags,
  118. bool outputExtraFile = false);
  119. void SetCatalogToUpdateOnJobCompletion();
  120. const char* GetJobProcessFailText();
  121. AZ::IO::Path GetCacheDir();
  122. AZ::IO::FixedMaxPath GetIntermediateAssetsDir();
  123. int m_argc = 0;
  124. char** m_argv{};
  125. TraceBusErrorChecker m_errorChecker;
  126. MockFileStateCache m_fileStateCache;
  127. AZStd::unique_ptr<QCoreApplication> m_qApp;
  128. AZStd::unique_ptr<TestingAssetProcessorManager> m_assetProcessorManager;
  129. AZStd::unique_ptr<AssetProcessor::PlatformConfiguration> m_platformConfig;
  130. AZStd::unique_ptr<AZ::SettingsRegistryImpl> m_settingsRegistry;
  131. AZStd::shared_ptr<AssetProcessor::AssetDatabaseConnection> m_stateData;
  132. AZStd::unique_ptr<::testing::NiceMock<MockDiskSpaceResponder>> m_diskSpaceResponder;
  133. AssetProcessor::MockAssetDatabaseRequestsHandler m_databaseLocationListener;
  134. AzToolsFramework::AssetDatabase::ScanFolderDatabaseEntry m_scanfolder;
  135. MockMultiBuilderInfoHandler m_builderInfoHandler;
  136. AZ::IO::LocalFileIO* m_localFileIo;
  137. AzToolsFramework::UuidUtilComponent m_uuidUtil;
  138. AzToolsFramework::MetadataManager m_metadataManager;
  139. AssetProcessor::UuidManager m_uuidManager;
  140. AZStd::unique_ptr<AZ::SerializeContext> m_serializeContext;
  141. AZStd::unique_ptr<AZ::JsonRegistrationContext> m_jsonRegistrationContext;
  142. AZStd::unique_ptr<testing::NiceMock<MockComponentApplication>> m_componentApplication;
  143. AZ::Entity* m_jobManagerEntity{};
  144. AZ::ComponentDescriptor* m_descriptor{};
  145. AZStd::unique_ptr<TestingRCController> m_rc;
  146. AZStd::vector<AssetProcessor::JobDetails> m_jobDetailsList;
  147. bool m_fileCompiled = false;
  148. bool m_fileFailed = false;
  149. AZStd::string m_testFilePath;
  150. AssetProcessor::JobEntry m_processedJobEntry;
  151. AssetBuilderSDK::ProcessJobResponse m_processJobResponse;
  152. };
  153. } // namespace UnitTests