AssetScannerTests.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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/assetscanner/AssetScannerTests.h>
  9. #include <native/AssetManager/assetScanner.h>
  10. namespace AssetProcessor
  11. {
  12. class AssetScanner_Test
  13. : public AssetScanner
  14. {
  15. public:
  16. AssetScanner_Test(PlatformConfiguration* config, QObject* parent = nullptr)
  17. :AssetScanner(config, parent)
  18. {
  19. }
  20. friend class GTEST_TEST_CLASS_NAME_(AssetScannerTest, AssetScannerExcludeFileTest);
  21. friend class GTEST_TEST_CLASS_NAME_(AssetScannerTest, AssetScannerExcludeFolderTest);
  22. };
  23. AssetScannerTest::AssetScannerTest()
  24. :m_argc(0)
  25. ,m_argv(0)
  26. {
  27. m_qApp.reset(new QCoreApplication(m_argc,m_argv));
  28. qRegisterMetaType<QSet<QString> >("QSet<QString>");
  29. qRegisterMetaType<AssetProcessor::AssetScanningStatus>("AssetScanningStatus");
  30. qRegisterMetaType<QSet<AssetFileInfo>>("QSet<AssetFileInfo>");
  31. }
  32. bool AssetScannerTest::BlockUntilScanComplete(int millisecondsMax)
  33. {
  34. QElapsedTimer limit;
  35. limit.start();
  36. while ((!m_scanComplete) && (limit.elapsed() < millisecondsMax))
  37. {
  38. QCoreApplication::processEvents(QEventLoop::AllEvents, 10);
  39. }
  40. // and then once more, so that any queued events as a result of the above finish.
  41. QCoreApplication::processEvents(QEventLoop::AllEvents, 10);
  42. return m_scanComplete;
  43. }
  44. void AssetScannerTest::SetUp()
  45. {
  46. using namespace UnitTestUtils;
  47. AssetProcessorTest::SetUp();
  48. QDir tempPath(m_tempDir.path());
  49. QSet<QString> expectedFiles;
  50. expectedFiles << tempPath.absoluteFilePath("rootfile.txt");
  51. expectedFiles << tempPath.absoluteFilePath("subfolder1/basefile.txt");
  52. expectedFiles << tempPath.absoluteFilePath("subfolder2/basefile.txt");
  53. expectedFiles << tempPath.absoluteFilePath("subfolder2/aaa/basefile.txt");
  54. for (const QString& expect : expectedFiles)
  55. {
  56. EXPECT_TRUE(CreateDummyFile(expect));
  57. }
  58. m_platformConfig.reset(new AssetProcessor::PlatformConfiguration());
  59. AZStd::vector<AssetBuilderSDK::PlatformInfo> platforms;
  60. m_platformConfig.get()->PopulatePlatformsForScanFolder(platforms);
  61. // PATH DisplayName PortKey root recurse platforms
  62. m_platformConfig.get()->AddScanFolder(ScanFolderInfo(tempPath.absolutePath(), "", "ap1", true, false, platforms));
  63. m_platformConfig.get()->AddScanFolder(ScanFolderInfo(tempPath.filePath("subfolder1"), "", "ap2", false, true, platforms));
  64. m_platformConfig.get()->AddScanFolder(ScanFolderInfo(tempPath.filePath("subfolder2"), "", "ap3", false, true, platforms));
  65. m_assetScanner.reset(new AssetScanner_Test(m_platformConfig.get()));
  66. QObject::connect(m_assetScanner.get(), &AssetScanner::FilesFound, [this](QSet<AssetProcessor::AssetFileInfo> fileList)
  67. {
  68. for (AssetProcessor::AssetFileInfo foundFile : fileList)
  69. {
  70. m_files.insert(foundFile.m_filePath);
  71. }
  72. }
  73. );
  74. QObject::connect(m_assetScanner.get(), &AssetScanner::AssetScanningStatusChanged, [this](AssetProcessor::AssetScanningStatus status)
  75. {
  76. if ((status == AssetProcessor::AssetScanningStatus::Completed) || (status == AssetProcessor::AssetScanningStatus::Stopped))
  77. {
  78. m_scanComplete = true;
  79. }
  80. }
  81. );
  82. QObject::connect(m_assetScanner.get(), &AssetScanner::FoldersFound, [this](QSet<AssetProcessor::AssetFileInfo> folderList)
  83. {
  84. for (AssetProcessor::AssetFileInfo foundFolder : folderList)
  85. {
  86. m_folders.insert(foundFolder.m_filePath);
  87. }
  88. }
  89. );
  90. }
  91. void AssetScannerTest::TearDown()
  92. {
  93. m_assetScanner.reset();
  94. m_platformConfig.reset();
  95. QDir tempDir(m_tempDir.path());
  96. tempDir.removeRecursively();
  97. m_qApp.reset();
  98. AssetProcessor::AssetProcessorTest::TearDown();
  99. }
  100. TEST_F(AssetScannerTest, AssetScannerExcludeFileTest)
  101. {
  102. QDir tempDir(m_tempDir.path());
  103. ExcludeAssetRecognizer excludeRecogniser;
  104. excludeRecogniser.m_name = "backup";
  105. // we are excluding all the files in the folder but not the folder itself
  106. excludeRecogniser.m_patternMatcher = AssetBuilderSDK::FilePatternMatcher("(^|[^/]+/)aaa/.*", AssetBuilderSDK::AssetBuilderPattern::Regex);
  107. m_platformConfig.get()->AddExcludeRecognizer(excludeRecogniser);
  108. m_assetScanner.get()->StartScan();
  109. BlockUntilScanComplete(5000);
  110. EXPECT_EQ(m_files.size(), 3);
  111. EXPECT_FALSE(m_files.contains(tempDir.filePath("subfolder2/aaa/basefile.txt")));
  112. EXPECT_EQ(m_folders.size(), 1);
  113. EXPECT_TRUE(m_folders.contains(tempDir.filePath("subfolder2/aaa")));
  114. }
  115. TEST_F(AssetScannerTest, AssetScannerExcludeFolderTest)
  116. {
  117. QDir tempDir(m_tempDir.path());
  118. ExcludeAssetRecognizer excludeRecogniser;
  119. excludeRecogniser.m_name = "backup";
  120. // we are excluding the complete folder here
  121. excludeRecogniser.m_patternMatcher = AssetBuilderSDK::FilePatternMatcher("(^|[^/]+/)aaa", AssetBuilderSDK::AssetBuilderPattern::Regex);
  122. m_platformConfig.get()->AddExcludeRecognizer(excludeRecogniser);
  123. m_assetScanner.get()->StartScan();
  124. BlockUntilScanComplete(5000);
  125. EXPECT_EQ(m_files.size(), 3);
  126. EXPECT_FALSE(m_files.contains(tempDir.filePath("subfolder2/aaa/basefile.txt")));
  127. EXPECT_EQ(m_folders.size(), 0);
  128. }
  129. }