3
0

PassBuilderTest.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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. #include <AzTest/AzTest.h>
  9. #include <AssetBuilderSDK/AssetBuilderBusses.h>
  10. #include <AssetBuilderSDK/AssetBuilderSDK.h>
  11. #include <AzCore/IO/Streamer/FileRequest.h>
  12. #include <AzCore/Serialization/ObjectStream.h>
  13. #include <AzCore/Serialization/SerializeContext.h>
  14. #include <AzCore/Serialization/Utils.h>
  15. #include <AzCore/std/smart_ptr/make_shared.h>
  16. #include <AzCore/Serialization/Json/JsonUtils.h>
  17. #include <Atom/RHI.Reflect/ReflectSystemComponent.h>
  18. #include <Atom/RPI.Reflect/Pass/FullscreenTrianglePassData.h>
  19. #include <Atom/RPI.Reflect/Pass/PassAsset.h>
  20. #include <Atom/RPI.Reflect/Pass/PassTemplate.h>
  21. #include <Pass/PassBuilder.h>
  22. #include <Tests.Builders/BuilderTestFixture.h>
  23. namespace UnitTest
  24. {
  25. using namespace AZ;
  26. class PassBuilderTests
  27. : public BuilderTestFixture
  28. {
  29. protected:
  30. RPI::PassAssetHandler* m_assetHandler;
  31. void SetUp() override
  32. {
  33. BuilderTestFixture::SetUp();
  34. m_assetHandler = new RPI::PassAssetHandler();
  35. m_assetHandler->m_serializeContext = m_context.get();
  36. m_assetHandler->Register();
  37. }
  38. void TearDown() override
  39. {
  40. m_assetHandler->Unregister();
  41. delete m_assetHandler;
  42. BuilderTestFixture::TearDown();
  43. }
  44. template<typename T>
  45. void SaveAssetToFile(T& data, const char* saveFileName)
  46. {
  47. Utils::SaveObjectToFile(saveFileName, AZ::DataStream::ST_XML, &data, T::TYPEINFO_Uuid(), m_context.get());
  48. }
  49. Data::Asset<Data::AssetData> LoadAssetFromFile(const char* assetFile)
  50. {
  51. Data::Asset<Data::AssetData> outAsset(m_assetHandler->CreateAsset(Data::AssetId(Uuid::CreateRandom(), 1), Data::AssetType()),
  52. Data::AssetLoadBehavior::PreLoad);
  53. AZ::u64 fileLength = 0;
  54. AZ::IO::FileIOBase::GetInstance()->Size(assetFile, fileLength);
  55. AZStd::shared_ptr<AZ::Data::AssetDataStream> stream = AZStd::make_shared<AZ::Data::AssetDataStream>();
  56. stream->Open(assetFile, 0, fileLength);
  57. stream->BlockUntilLoadComplete();
  58. m_assetHandler->LoadAssetData(outAsset, stream, {});
  59. stream->Close();
  60. // Force a file streamer flush to ensure that file handles don't remain used
  61. auto streamer = AZ::Interface<AZ::IO::IStreamer>::Get();
  62. AZStd::binary_semaphore wait;
  63. AZ::IO::FileRequestPtr flushRequest = streamer->FlushCaches();
  64. streamer->SetRequestCompleteCallback(flushRequest, [&wait]([[maybe_unused]] AZ::IO::FileRequestHandle request)
  65. {
  66. wait.release();
  67. });
  68. streamer->QueueRequest(flushRequest);
  69. wait.acquire();
  70. return outAsset;
  71. }
  72. void SetPassTemplateForTestingOnly(RPI::PassAsset& passAsset, RPI::PassTemplate& passTemplate)
  73. {
  74. passAsset.SetPassTemplateForTestingOnly(passTemplate);
  75. }
  76. };
  77. TEST_F(PassBuilderTests, ProcessJob)
  78. {
  79. const char* testAssetName = "PassTestAsset.pass";
  80. AZ::Test::ScopedAutoTempDirectory productDir;
  81. AZ::Test::ScopedAutoTempDirectory sourceDir;
  82. AZ::IO::Path sourceFilePath = sourceDir.Resolve(testAssetName);
  83. // Basic test: test data before and after are same. Test data class doesn't have converter or asset reference.
  84. AssetBuilderSDK::ProcessJobRequest request;
  85. // Initial job request
  86. request.m_fullPath = sourceFilePath.Native();
  87. request.m_tempDirPath = productDir.GetDirectory();
  88. // Dummy pass template
  89. RPI::PassTemplate passTemplate;
  90. passTemplate.m_name = "TemplateTestName";
  91. // Dummy pass data with random asset ID to test asset dependency
  92. AZStd::shared_ptr<RPI::FullscreenTrianglePassData> passData = AZStd::make_shared<RPI::FullscreenTrianglePassData>();
  93. passData->m_shaderAsset.m_assetId = Data::AssetId(Uuid::CreateRandom(), 1);
  94. passTemplate.m_passData = passData;
  95. // Create and write pass data
  96. RPI::PassAsset passAsset;
  97. SetPassTemplateForTestingOnly(passAsset, passTemplate);
  98. JsonSerializationUtils::SaveObjectToFile(&passAsset, sourceFilePath.Native());
  99. // Process job
  100. RPI::PassBuilder builder;
  101. AssetBuilderSDK::ProcessJobResponse response;
  102. builder.ProcessJob(request, response);
  103. // Verify job success
  104. EXPECT_TRUE(response.m_resultCode == AssetBuilderSDK::ProcessJobResult_Success);
  105. EXPECT_TRUE(response.m_outputProducts.size() == 1);
  106. // Verify input and output names are the same
  107. Data::Asset<Data::AssetData> readAsset = LoadAssetFromFile(response.m_outputProducts[0].m_productFileName.c_str());
  108. RPI::PassAsset* readPassAsset = static_cast<RPI::PassAsset*>(readAsset.GetData());
  109. EXPECT_TRUE(passTemplate.m_name == readPassAsset->GetPassTemplate()->m_name);
  110. }
  111. } // namespace UnitTests