JobDependencySubIdTests.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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 <native/tests/assetmanager/JobDependencySubIdTests.h>
  9. #include <native/unittests/UnitTestUtils.h>
  10. #include <QApplication>
  11. namespace UnitTests
  12. {
  13. // sets up data such that:
  14. // SOURCE FILES DATABASE TABLE
  15. // source1 = parent.txt
  16. // source2 = child.txt
  17. // JOB DATABASE TABLE
  18. // job1 "Mock Job" (completed)
  19. // PRODUCT DATABASE TABLE
  20. // product.txt (subid 0) for job1 - sets hash to input "hashA"
  21. // procuct777.txt (subid 77) for job1 - sets hash to input "HashB"
  22. // SOURCE FILE DEPENDENCY TABLE
  23. // JobToJob Dependency - child.txt DEPENDS ON parent.txt - SUBID is either empty, or 777
  24. void JobDependencySubIdTest::CreateTestData(AZ::u64 hashA, AZ::u64 hashB, bool useSubId)
  25. {
  26. using namespace AzToolsFramework::AssetDatabase;
  27. SourceDatabaseEntry source1{ m_scanfolder.m_scanFolderID, "parent.txt", AZ::Uuid::CreateRandom(), "fingerprint" };
  28. SourceDatabaseEntry source2{ m_scanfolder.m_scanFolderID, "child.txt", AZ::Uuid::CreateRandom(), "fingerprint" };
  29. m_parentFile = AZ::IO::Path(m_scanfolder.m_scanFolder) / "parent.txt";
  30. m_childFile = AZ::IO::Path(m_scanfolder.m_scanFolder) / "child.txt";
  31. UnitTestUtils::CreateDummyFile(m_parentFile.Native().c_str(), QString("tempdata"));
  32. UnitTestUtils::CreateDummyFile(m_childFile.Native().c_str(), QString("tempdata"));
  33. ASSERT_TRUE(m_stateData->SetSource(source1));
  34. ASSERT_TRUE(m_stateData->SetSource(source2));
  35. JobDatabaseEntry job1{
  36. source1.m_sourceID, "Mock Job", 1234, "pc", m_builderInfoHandler.m_builderDescMap.begin()->second.m_busId, AzToolsFramework::AssetSystem::JobStatus::Completed, 999
  37. };
  38. ASSERT_TRUE(m_stateData->SetJob(job1));
  39. ProductDatabaseEntry product1{ job1.m_jobID, 0, "pc/product.txt", m_assetType,
  40. AZ::Uuid::CreateName("product.txt"), hashA, static_cast<int>(AssetBuilderSDK::ProductOutputFlags::ProductAsset) };
  41. ProductDatabaseEntry product2{ job1.m_jobID, 777, "pc/product777.txt", m_assetType,
  42. AZ::Uuid::CreateName("product777.txt"), hashB, static_cast<int>(AssetBuilderSDK::ProductOutputFlags::ProductAsset) };
  43. ASSERT_TRUE(m_stateData->SetProduct(product1));
  44. ASSERT_TRUE(m_stateData->SetProduct(product2));
  45. SourceFileDependencyEntry dependency1{ AZ::Uuid::CreateRandom(),
  46. source2.m_sourceGuid,
  47. PathOrUuid(source1.m_sourceName),
  48. SourceFileDependencyEntry::DEP_JobToJob,
  49. 0,
  50. useSubId ? AZStd::to_string(product2.m_subID).c_str() : "" };
  51. ASSERT_TRUE(m_stateData->SetSourceFileDependency(dependency1));
  52. }
  53. void JobDependencySubIdTest::RunTest(bool firstProductChanged, bool secondProductChanged)
  54. {
  55. AZ::IO::Path cacheDir(m_databaseLocationListener.GetAssetRootDir());
  56. cacheDir /= "Cache";
  57. cacheDir /= "pc";
  58. AZStd::string productFilename = "product.txt";
  59. AZStd::string product2Filename = "product777.txt";
  60. AZStd::string productPath = (cacheDir / productFilename).AsPosix().c_str();
  61. AZStd::string product2Path = (cacheDir / product2Filename).AsPosix().c_str();
  62. UnitTestUtils::CreateDummyFile(productPath.c_str(), "unit test file");
  63. UnitTestUtils::CreateDummyFile(product2Path.c_str(), "unit test file");
  64. AZ::u64 hashA = firstProductChanged ? 0 : AssetUtilities::GetFileHash(productPath.c_str());
  65. AZ::u64 hashB = secondProductChanged ? 0 : AssetUtilities::GetFileHash(product2Path.c_str());
  66. CreateTestData(hashA, hashB, true);
  67. QMetaObject::invokeMethod(
  68. m_assetProcessorManager.get(), "AssessModifiedFile", Qt::QueuedConnection, Q_ARG(QString, m_parentFile.c_str()));
  69. QCoreApplication::processEvents();
  70. m_assetProcessorManager->CheckActiveFiles(1);
  71. QCoreApplication::processEvents();
  72. m_assetProcessorManager->CheckActiveFiles(0);
  73. m_assetProcessorManager->CheckFilesToExamine(1);
  74. QCoreApplication::processEvents();
  75. m_assetProcessorManager->CheckJobEntries(1);
  76. AZStd::vector<AssetProcessor::JobDetails> jobDetailsList;
  77. QObject::connect(
  78. m_assetProcessorManager.get(), &AssetProcessor::AssetProcessorManager::AssetToProcess,
  79. [&jobDetailsList](AssetProcessor::JobDetails jobDetails)
  80. {
  81. jobDetailsList.push_back(jobDetails);
  82. });
  83. QCoreApplication::processEvents();
  84. ASSERT_EQ(jobDetailsList.size(), 1);
  85. AssetBuilderSDK::ProcessJobResponse response;
  86. response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success;
  87. response.m_outputProducts.push_back(AssetBuilderSDK::JobProduct(productFilename, m_assetType, 0));
  88. response.m_outputProducts.push_back(AssetBuilderSDK::JobProduct(product2Filename, m_assetType, 777));
  89. m_assetProcessorManager->AssetProcessed(jobDetailsList[0].m_jobEntry, response);
  90. // We're only really interested in ActiveFiles but check the others to be sure
  91. m_assetProcessorManager->CheckFilesToExamine(0);
  92. m_assetProcessorManager->CheckActiveFiles(secondProductChanged ? 1 : 0); // The 2nd product is the one we have a dependency on, only if that changed should we see the other file process
  93. m_assetProcessorManager->CheckJobEntries(0);
  94. }
  95. TEST_F(JobDependencySubIdTest, RegularJobDependency_NoSubId_ProcessDependent)
  96. {
  97. CreateTestData(0, 0, false);
  98. QMetaObject::invokeMethod(
  99. m_assetProcessorManager.get(), "AssessModifiedFile", Qt::QueuedConnection, Q_ARG(QString, m_parentFile.c_str()));
  100. QCoreApplication::processEvents();
  101. m_assetProcessorManager->CheckActiveFiles(1);
  102. QCoreApplication::processEvents();
  103. m_assetProcessorManager->CheckActiveFiles(0);
  104. m_assetProcessorManager->CheckFilesToExamine(2);
  105. }
  106. TEST_F(JobDependencySubIdTest, JobDependencyWithSubID_SameHash_DependentDoesNotProcess)
  107. {
  108. RunTest(false, false);
  109. }
  110. TEST_F(JobDependencySubIdTest, JobDependencyWithSubID_DifferentHashOnCorrectSubId_DependentProcesses)
  111. {
  112. RunTest(false, true);
  113. }
  114. TEST_F(JobDependencySubIdTest, JobDependencyWithSubID_BothHashesDifferent_DependentProcesses)
  115. {
  116. // Should be the same result as above but check just in case
  117. RunTest(true, true);
  118. }
  119. TEST_F(JobDependencySubIdTest, JobDependencyWithSubID_DifferentHashOnIncorrectSubId_DependentDoesNotProcess)
  120. {
  121. RunTest(true, false);
  122. }
  123. }