AssetFileInfoListComparison.cpp 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814
  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 <AzCore/UnitTest/TestTypes.h>
  9. #include <AzCore/Settings/SettingsRegistryMergeUtils.h>
  10. #include <AzToolsFramework/Asset/AssetSeedManager.h>
  11. #include <AzFramework/Asset/AssetRegistry.h>
  12. #include <AzCore/IO/FileIO.h>
  13. #include <AzFramework/IO/LocalFileIO.h>
  14. #include <AzFramework/Asset/AssetCatalog.h>
  15. #include <AzFramework/StringFunc/StringFunc.h>
  16. #include <AZTestShared/Utils/Utils.h>
  17. #include <AzToolsFramework/Application/ToolsApplication.h>
  18. #include <AzToolsFramework/Asset/AssetBundler.h>
  19. #include <AzCore/Serialization/SerializeContext.h>
  20. #include <AzCore/std/containers/unordered_set.h>
  21. #include <AzFramework/Platform/PlatformDefaults.h>
  22. #include <AzToolsFramework/AssetCatalog/PlatformAddressedAssetCatalog.h>
  23. #include <AzToolsFramework/UnitTest/ToolsTestApplication.h>
  24. #include <AzCore/UserSettings/UserSettingsComponent.h>
  25. namespace // anonymous
  26. {
  27. constexpr int TotalAssets = 6;
  28. constexpr int TotalTempFiles = 3;
  29. constexpr char TempFiles[TotalTempFiles][AZ_MAX_PATH_LEN] = { "firstAssetFileInfoList.assetlist", "secondAssetFileInfoList.assetlist", "assetFileInfoList.assetlist" };
  30. enum FileIndex
  31. {
  32. FirstAssetFileInfoList,
  33. SecondAssetFileInfoList,
  34. ResultAssetFileInfoList
  35. };
  36. }
  37. namespace UnitTest
  38. {
  39. class AssetFileInfoListComparisonTest
  40. : public LeakDetectionFixture
  41. , public AZ::Data::AssetCatalogRequestBus::Handler
  42. {
  43. public:
  44. void SetUp() override
  45. {
  46. using namespace AZ::Data;
  47. constexpr size_t MaxCommandArgsCount = 128;
  48. using FixedValueString = AZ::SettingsRegistryInterface::FixedValueString;
  49. using ArgumentContainer = AZStd::fixed_vector<char*, MaxCommandArgsCount>;
  50. // The first command line argument is assumed to be the executable name so add a blank entry for it
  51. ArgumentContainer argContainer{ {} };
  52. // Append Command Line override for the Project Cache Path
  53. auto projectPathOverride = FixedValueString::format(R"(--project-path="%s")", m_tempDir.GetDirectory());
  54. argContainer.push_back(projectPathOverride.data());
  55. m_application = new ToolsTestApplication("AssetFileInfoListComparisonTest", aznumeric_caster(argContainer.size()), argContainer.data());
  56. AzToolsFramework::AssetSeedManager assetSeedManager;
  57. AzFramework::AssetRegistry assetRegistry;
  58. const AZ::PlatformId thisPlatform = AZ::PlatformHelper::GetPlatformIdFromName(AZ::OSPlatformToDefaultAssetPlatform(AZ_TRAIT_OS_PLATFORM_CODENAME));
  59. const AZStd::string assetRoot = AzToolsFramework::PlatformAddressedAssetCatalog::GetAssetRootForPlatform(thisPlatform);
  60. for (int idx = 0; idx < TotalAssets; idx++)
  61. {
  62. m_assets[idx] = AssetId(AZ::Uuid::CreateRandom(), 0);
  63. AZ::Data::AssetInfo info;
  64. info.m_relativePath = AZStd::string::format("Asset%d.txt", idx);
  65. info.m_assetId = m_assets[idx];
  66. assetRegistry.RegisterAsset(m_assets[idx], info);
  67. AzFramework::StringFunc::Path::Join(assetRoot.c_str(), info.m_relativePath.c_str(), m_assetsPath[idx]);
  68. AZ_TEST_START_TRACE_SUPPRESSION;
  69. if (m_fileStreams[idx].Open(m_assetsPath[idx].c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary | AZ::IO::OpenMode::ModeCreatePath))
  70. {
  71. AZ::IO::SizeType bytesWritten = m_fileStreams[idx].Write(info.m_relativePath.size(), info.m_relativePath.data());
  72. EXPECT_EQ(bytesWritten, info.m_relativePath.size());
  73. AZ_TEST_STOP_TRACE_SUPPRESSION(1); // writing to asset cache folder
  74. }
  75. else
  76. {
  77. GTEST_FATAL_FAILURE_(AZStd::string::format("Unable to create temporary file ( %s ) in AssetSeedManager unit tests.\n", m_assetsPath[idx].c_str()).c_str());
  78. }
  79. }
  80. // asset1 -> asset2
  81. assetRegistry.RegisterAssetDependency(m_assets[1], AZ::Data::ProductDependency(m_assets[2], 0));
  82. // asset2 -> asset3
  83. assetRegistry.RegisterAssetDependency(m_assets[2], AZ::Data::ProductDependency(m_assets[3], 0));
  84. // asset3 -> asset4
  85. assetRegistry.RegisterAssetDependency(m_assets[3], AZ::Data::ProductDependency(m_assets[4], 0));
  86. AZ::ComponentApplication::StartupParameters startupParameters;
  87. startupParameters.m_loadSettingsRegistry = false;
  88. m_application->Start(AzFramework::Application::Descriptor(), startupParameters);
  89. // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
  90. // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
  91. // in the unit tests.
  92. AZ::UserSettingsComponentRequestBus::Broadcast(&AZ::UserSettingsComponentRequests::DisableSaveOnFinalize);
  93. AZ::SerializeContext* context = nullptr;
  94. AZ::ComponentApplicationBus::BroadcastResult(context, &AZ::ComponentApplicationBus::Events::GetSerializeContext);
  95. ASSERT_TRUE(context) << "No serialize context.\n";
  96. AzToolsFramework::AssetSeedManager::Reflect(context);
  97. // Asset Catalog does not expose its internal asset registry and the only way to set it is through LoadCatalog API
  98. // Currently I am serializing the asset registry to disk
  99. // and invoking the LoadCatalog API to populate the asset catalog created by the azframework app.
  100. const AZStd::string catalogFile = AzToolsFramework::PlatformAddressedAssetCatalog::GetCatalogRegistryPathForPlatform(thisPlatform);
  101. bool catalogSaved = AzFramework::AssetCatalog::SaveCatalog(catalogFile.c_str(), &assetRegistry);
  102. EXPECT_TRUE(catalogSaved) << "Unable to save the asset catalog file.\n";
  103. m_catalog = new AzToolsFramework::PlatformAddressedAssetCatalog(thisPlatform);
  104. const auto thisPlatformFlags = AZ::PlatformHelper::GetPlatformFlag(AZ::OSPlatformToDefaultAssetPlatform(AZ_TRAIT_OS_PLATFORM_CODENAME));
  105. assetSeedManager.AddSeedAsset(m_assets[0], thisPlatformFlags);
  106. assetSeedManager.AddSeedAsset(m_assets[1], thisPlatformFlags);
  107. bool firstAssetFileInfoListSaved = assetSeedManager.SaveAssetFileInfo(TempFiles[FileIndex::FirstAssetFileInfoList], thisPlatformFlags, {});
  108. EXPECT_TRUE(firstAssetFileInfoListSaved);
  109. // Modify contents of asset2
  110. int fileIndex = 2;
  111. AZ_TEST_START_TRACE_SUPPRESSION;
  112. if (m_fileStreams[fileIndex].Open(m_assetsPath[fileIndex].c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary | AZ::IO::OpenMode::ModeCreatePath))
  113. {
  114. AZStd::string fileContent = AZStd::string::format("new Asset%d.txt", fileIndex);// changing file content
  115. AZ::IO::SizeType bytesWritten = m_fileStreams[fileIndex].Write(fileContent.size(), fileContent.c_str());
  116. EXPECT_EQ(bytesWritten, fileContent.size());
  117. AZ_TEST_STOP_TRACE_SUPPRESSION(1); // writing to asset cache folder
  118. }
  119. else
  120. {
  121. GTEST_FATAL_FAILURE_(AZStd::string::format("Unable to open asset file.\n").c_str());
  122. }
  123. // Modify contents of asset 4
  124. fileIndex = 4;
  125. AZ_TEST_START_TRACE_SUPPRESSION;
  126. if (m_fileStreams[fileIndex].Open(m_assetsPath[fileIndex].c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary | AZ::IO::OpenMode::ModeCreatePath))
  127. {
  128. AZStd::string fileContent = AZStd::string::format("new Asset%d.txt", fileIndex);// changing file content
  129. AZ::IO::SizeType bytesWritten = m_fileStreams[fileIndex].Write(fileContent.size(), fileContent.c_str());
  130. EXPECT_EQ(bytesWritten, fileContent.size());
  131. AZ_TEST_STOP_TRACE_SUPPRESSION(1); // writing to asset cache folder
  132. }
  133. else
  134. {
  135. GTEST_FATAL_FAILURE_(AZStd::string::format("Unable to open asset file.\n").c_str());
  136. }
  137. assetSeedManager.RemoveSeedAsset(m_assets[0], thisPlatformFlags);
  138. assetSeedManager.AddSeedAsset(m_assets[5], thisPlatformFlags);
  139. bool secondAssetFileInfoListSaved = assetSeedManager.SaveAssetFileInfo(TempFiles[FileIndex::SecondAssetFileInfoList], thisPlatformFlags, {});
  140. EXPECT_TRUE(secondAssetFileInfoListSaved);
  141. }
  142. void TearDown() override
  143. {
  144. AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance();
  145. // Delete all temporary files
  146. for (int idx = 0; idx < TotalTempFiles; idx++)
  147. {
  148. if (fileIO->Exists(TempFiles[idx]))
  149. {
  150. AZ_TEST_START_TRACE_SUPPRESSION;
  151. AZ::IO::Result result = fileIO->Remove(TempFiles[idx]);
  152. EXPECT_EQ(result.GetResultCode(), AZ::IO::ResultCode::Success);
  153. AZ_TEST_STOP_TRACE_SUPPRESSION(1); // deleting from asset cache folder
  154. }
  155. }
  156. // Deleting all temporary assets files
  157. for (int idx = 0; idx < TotalAssets; idx++)
  158. {
  159. // we need to close the handle before we try to remove the file
  160. m_fileStreams[idx].Close();
  161. if (fileIO->Exists(m_assetsPath[idx].c_str()))
  162. {
  163. AZ_TEST_START_TRACE_SUPPRESSION;
  164. AZ::IO::Result result = fileIO->Remove(m_assetsPath[idx].c_str());
  165. EXPECT_EQ(result.GetResultCode(), AZ::IO::ResultCode::Success);
  166. AZ_TEST_STOP_TRACE_SUPPRESSION(1); // deleting from asset cache folder
  167. }
  168. }
  169. auto pcCatalogFile = AzToolsFramework::PlatformAddressedAssetCatalog::GetCatalogRegistryPathForPlatform(AzFramework::PlatformId::PC);
  170. if (fileIO->Exists(pcCatalogFile.c_str()))
  171. {
  172. AZ_TEST_START_TRACE_SUPPRESSION;
  173. AZ::IO::Result result = fileIO->Remove(pcCatalogFile.c_str());
  174. EXPECT_EQ(result.GetResultCode(), AZ::IO::ResultCode::Success);
  175. AZ_TEST_STOP_TRACE_SUPPRESSION(1); // deleting from asset cache folder
  176. }
  177. delete m_catalog;
  178. m_application->Stop();
  179. delete m_application;
  180. }
  181. void AssetFileInfoValidation_DeltaComparison_Valid()
  182. {
  183. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  184. AzToolsFramework::AssetFileInfoListComparison assetFileInfoListComparison;
  185. AzToolsFramework::AssetFileInfoListComparison::ComparisonData comparisonData(AzToolsFramework::AssetFileInfoListComparison::ComparisonType::Delta, TempFiles[FileIndex::ResultAssetFileInfoList]);
  186. comparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  187. comparisonData.m_secondInput = TempFiles[FileIndex::SecondAssetFileInfoList];
  188. assetFileInfoListComparison.AddComparisonStep(comparisonData);
  189. ASSERT_TRUE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "Delta operation failed.\n";
  190. // AssetFileInfo should contain {2*, 4*, 5}
  191. AzToolsFramework::AssetFileInfoList assetFileInfoList;
  192. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::ResultAssetFileInfoList], assetFileInfoList)) << "Unable to read the asset file info list.\n";
  193. EXPECT_EQ(assetFileInfoList.m_fileInfoList.size(), 3);
  194. // Verifying that the hash of the file are correct. They must be from the second AssetFileInfoList.
  195. AzToolsFramework::AssetFileInfoList secondAssetFileInfoList;
  196. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::SecondAssetFileInfoList], secondAssetFileInfoList)) << "Unable to read the asset file info list.\n";
  197. AZStd::unordered_map<AZ::Data::AssetId, AzToolsFramework::AssetFileInfo> assetIdToAssetFileInfoMap;
  198. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : secondAssetFileInfoList.m_fileInfoList)
  199. {
  200. assetIdToAssetFileInfoMap[assetFileInfo.m_assetId] = AZStd::move(assetFileInfo);
  201. }
  202. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  203. {
  204. auto found = assetIdToAssetFileInfoMap.find(assetFileInfo.m_assetId);
  205. if (found != assetIdToAssetFileInfoMap.end())
  206. {
  207. // checking the file hash
  208. for (int idx = 0; idx < AzToolsFramework::AssetFileInfo::s_arraySize; idx++)
  209. {
  210. if (found->second.m_hash[idx] != assetFileInfo.m_hash[idx])
  211. {
  212. GTEST_FATAL_FAILURE_(AZStd::string::format("Invalid file hash.\n").c_str());
  213. break;
  214. }
  215. }
  216. }
  217. }
  218. // Verifying that correct assetId are present in the assetFileInfo list
  219. AZStd::unordered_set<AZ::Data::AssetId> expectedAssetIds{ m_assets[2], m_assets[4], m_assets[5] };
  220. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  221. {
  222. auto found = expectedAssetIds.find(assetFileInfo.m_assetId);
  223. if (found != expectedAssetIds.end())
  224. {
  225. expectedAssetIds.erase(found);
  226. }
  227. }
  228. EXPECT_EQ(expectedAssetIds.size(), 0);
  229. }
  230. void AssetFileInfoValidation_UnionComparison_Valid()
  231. {
  232. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  233. AzToolsFramework::AssetFileInfoListComparison assetFileInfoListComparison;
  234. AzToolsFramework::AssetFileInfoListComparison::ComparisonData comparisonData(AzToolsFramework::AssetFileInfoListComparison::ComparisonType::Union, TempFiles[FileIndex::ResultAssetFileInfoList]);
  235. comparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  236. comparisonData.m_secondInput = TempFiles[FileIndex::SecondAssetFileInfoList];
  237. assetFileInfoListComparison.AddComparisonStep(comparisonData);
  238. ASSERT_TRUE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "Union operation failed.\n";
  239. // AssetFileInfo should contain {0, 1, 2*, 3, 4*, 5}
  240. AzToolsFramework::AssetFileInfoList assetFileInfoList;
  241. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::ResultAssetFileInfoList], assetFileInfoList)) << "Unable to read the asset file info list.\n";
  242. EXPECT_EQ(assetFileInfoList.m_fileInfoList.size(), 6);
  243. //Verifying that the hash of the files are correct.
  244. AzToolsFramework::AssetFileInfoList firstAssetFileInfoList;
  245. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::FirstAssetFileInfoList], firstAssetFileInfoList)) << "Unable to read the asset file info list.\n";
  246. AZStd::unordered_map<AZ::Data::AssetId, AzToolsFramework::AssetFileInfo> firstAssetIdToAssetFileInfoMap;
  247. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : firstAssetFileInfoList.m_fileInfoList)
  248. {
  249. firstAssetIdToAssetFileInfoMap[assetFileInfo.m_assetId] = AZStd::move(assetFileInfo);
  250. }
  251. AzToolsFramework::AssetFileInfoList secondAssetFileInfoList;
  252. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::SecondAssetFileInfoList], secondAssetFileInfoList)) << "Unable to read the asset file info list.\n";
  253. AZStd::unordered_map<AZ::Data::AssetId, AzToolsFramework::AssetFileInfo> secondAssetIdToAssetFileInfoMap;
  254. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : secondAssetFileInfoList.m_fileInfoList)
  255. {
  256. secondAssetIdToAssetFileInfoMap[assetFileInfo.m_assetId] = AZStd::move(assetFileInfo);
  257. }
  258. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  259. {
  260. auto foundFirst = firstAssetIdToAssetFileInfoMap.find(assetFileInfo.m_assetId);
  261. auto foundSecond = secondAssetIdToAssetFileInfoMap.find(assetFileInfo.m_assetId);
  262. if (foundSecond != secondAssetIdToAssetFileInfoMap.end())
  263. {
  264. // Even if the asset Id is present in both the AssetFileInfo List, it should match the file hash from the second AssetFileInfo list
  265. for (int idx = 0; idx < AzToolsFramework::AssetFileInfo::s_arraySize; idx++)
  266. {
  267. if (foundSecond->second.m_hash[idx] != assetFileInfo.m_hash[idx])
  268. {
  269. GTEST_FATAL_FAILURE_(AZStd::string::format("Invalid file hash.\n").c_str());
  270. break;
  271. }
  272. }
  273. }
  274. else if (foundFirst != firstAssetIdToAssetFileInfoMap.end())
  275. {
  276. // checking the file hash
  277. for (int idx = 0; idx < AzToolsFramework::AssetFileInfo::s_arraySize; idx++)
  278. {
  279. if (foundFirst->second.m_hash[idx] != assetFileInfo.m_hash[idx])
  280. {
  281. GTEST_FATAL_FAILURE_(AZStd::string::format("Invalid file hash.\n").c_str());
  282. break;
  283. }
  284. }
  285. }
  286. else
  287. {
  288. GTEST_FATAL_FAILURE_(AZStd::string::format("Invalid file hash.\n").c_str());
  289. }
  290. }
  291. // Verifying that correct assetId are present in the assetFileInfo list
  292. AZStd::unordered_set<AZ::Data::AssetId> expectedAssetIds{ m_assets[0], m_assets[1], m_assets[2], m_assets[3], m_assets[4], m_assets[5] };
  293. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  294. {
  295. auto found = expectedAssetIds.find(assetFileInfo.m_assetId);
  296. if (found != expectedAssetIds.end())
  297. {
  298. expectedAssetIds.erase(found);
  299. }
  300. }
  301. EXPECT_EQ(expectedAssetIds.size(), 0);
  302. }
  303. void AssetFileInfoValidation_IntersectionComparison_Valid()
  304. {
  305. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  306. AzToolsFramework::AssetFileInfoListComparison assetFileInfoListComparison;
  307. AzToolsFramework::AssetFileInfoListComparison::ComparisonData comparisonData(AzToolsFramework::AssetFileInfoListComparison::ComparisonType::Intersection, TempFiles[FileIndex::ResultAssetFileInfoList]);
  308. comparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  309. comparisonData.m_secondInput = TempFiles[FileIndex::SecondAssetFileInfoList];
  310. assetFileInfoListComparison.AddComparisonStep(comparisonData);
  311. ASSERT_TRUE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "Intersection operation failed.\n";
  312. // AssetFileInfo should contain {1,2*,3,4*}
  313. AzToolsFramework::AssetFileInfoList assetFileInfoList;
  314. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::ResultAssetFileInfoList], assetFileInfoList)) << "Unable to read the asset file info list.\n";
  315. EXPECT_EQ(assetFileInfoList.m_fileInfoList.size(), 4);
  316. // Verifying that the hash of the file are correct. They must be from the second AssetFileInfoList.
  317. AzToolsFramework::AssetFileInfoList secondAssetFileInfoList;
  318. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::SecondAssetFileInfoList], secondAssetFileInfoList)) << "Unable to read the asset file info list.\n";
  319. AZStd::unordered_map<AZ::Data::AssetId, AzToolsFramework::AssetFileInfo> assetIdToAssetFileInfoMap;
  320. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : secondAssetFileInfoList.m_fileInfoList)
  321. {
  322. assetIdToAssetFileInfoMap[assetFileInfo.m_assetId] = AZStd::move(assetFileInfo);
  323. }
  324. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  325. {
  326. auto found = assetIdToAssetFileInfoMap.find(assetFileInfo.m_assetId);
  327. if (found != assetIdToAssetFileInfoMap.end())
  328. {
  329. // checking the file hash
  330. for (int idx = 0; idx < AzToolsFramework::AssetFileInfo::s_arraySize; idx++)
  331. {
  332. if (found->second.m_hash[idx] != assetFileInfo.m_hash[idx])
  333. {
  334. GTEST_FATAL_FAILURE_(AZStd::string::format("Invalid file hash.\n").c_str());
  335. break;
  336. }
  337. }
  338. }
  339. }
  340. // Verifying that correct assetId are present in the assetFileInfo list
  341. AZStd::unordered_set<AZ::Data::AssetId> expectedAssetIds{ m_assets[1], m_assets[2], m_assets[3], m_assets[4] };
  342. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  343. {
  344. auto found = expectedAssetIds.find(assetFileInfo.m_assetId);
  345. if (found != expectedAssetIds.end())
  346. {
  347. expectedAssetIds.erase(found);
  348. }
  349. }
  350. EXPECT_EQ(expectedAssetIds.size(), 0);
  351. }
  352. void AssetFileInfoValidation_ComplementComparison_Valid()
  353. {
  354. using namespace AzToolsFramework;
  355. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  356. AssetFileInfoListComparison assetFileInfoListComparison;
  357. AzToolsFramework::AssetFileInfoListComparison::ComparisonData comparisonData(AssetFileInfoListComparison::ComparisonType::Complement, TempFiles[FileIndex::ResultAssetFileInfoList]);
  358. comparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  359. comparisonData.m_secondInput = TempFiles[FileIndex::SecondAssetFileInfoList];
  360. assetFileInfoListComparison.AddComparisonStep(comparisonData);
  361. ASSERT_TRUE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "Complement comparison failed.\n";
  362. // AssetFileInfo should contain {5}
  363. AssetFileInfoList assetFileInfoList;
  364. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::ResultAssetFileInfoList], assetFileInfoList)) << "Unable to read the asset file info list.\n";
  365. EXPECT_EQ(assetFileInfoList.m_fileInfoList.size(), 1);
  366. // Verifying that the hash of the file are correct. They must be from the second AssetFileInfoList.
  367. AssetFileInfoList secondAssetFileInfoList;
  368. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::SecondAssetFileInfoList], secondAssetFileInfoList)) << "Unable to read the asset file info list.\n";
  369. AZStd::unordered_map<AZ::Data::AssetId, AssetFileInfo> assetIdToAssetFileInfoMap;
  370. for (const AssetFileInfo& assetFileInfo : secondAssetFileInfoList.m_fileInfoList)
  371. {
  372. assetIdToAssetFileInfoMap[assetFileInfo.m_assetId] = AZStd::move(assetFileInfo);
  373. }
  374. for (const AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  375. {
  376. auto found = assetIdToAssetFileInfoMap.find(assetFileInfo.m_assetId);
  377. if (found != assetIdToAssetFileInfoMap.end())
  378. {
  379. // checking the file hash
  380. for (int idx = 0; idx < AssetFileInfo::s_arraySize; idx++)
  381. {
  382. if (found->second.m_hash[idx] != assetFileInfo.m_hash[idx])
  383. {
  384. GTEST_FATAL_FAILURE_(AZStd::string::format("Invalid file hash.\n").c_str());
  385. break;
  386. }
  387. }
  388. }
  389. }
  390. // Verifying that correct assetId are present in the assetFileInfo list
  391. AZStd::unordered_set<AZ::Data::AssetId> expectedAssetIds{ m_assets[5] };
  392. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  393. {
  394. auto found = expectedAssetIds.find(assetFileInfo.m_assetId);
  395. if (found != expectedAssetIds.end())
  396. {
  397. expectedAssetIds.erase(found);
  398. }
  399. }
  400. EXPECT_EQ(expectedAssetIds.size(), 0);
  401. }
  402. void AssetFileInfoValidation_FilePatternWildcardComparisonAll_Valid()
  403. {
  404. using namespace AzToolsFramework;
  405. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  406. AssetFileInfoListComparison assetFileInfoListComparison;
  407. AssetFileInfoListComparison::ComparisonData comparisonData(AssetFileInfoListComparison::ComparisonType::FilePattern, TempFiles[FileIndex::ResultAssetFileInfoList], "Asset*.txt", AssetFileInfoListComparison::FilePatternType::Wildcard);
  408. comparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  409. assetFileInfoListComparison.AddComparisonStep(comparisonData);
  410. ASSERT_TRUE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "File pattern match failed.\n";
  411. // AssetFileInfo should contain {0,1,2,3,4}
  412. AssetFileInfoList assetFileInfoList;
  413. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::ResultAssetFileInfoList], assetFileInfoList)) << "Unable to read the asset file info list.\n";
  414. EXPECT_EQ(assetFileInfoList.m_fileInfoList.size(), 5);
  415. // Verifying that correct assetId are present in the assetFileInfo list
  416. AZStd::unordered_set<AZ::Data::AssetId> expectedAssetIds{ m_assets[0], m_assets[1], m_assets[2], m_assets[3], m_assets[4] };
  417. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  418. {
  419. auto found = expectedAssetIds.find(assetFileInfo.m_assetId);
  420. if (found != expectedAssetIds.end())
  421. {
  422. expectedAssetIds.erase(found);
  423. }
  424. }
  425. EXPECT_EQ(expectedAssetIds.size(), 0);
  426. }
  427. void AssetFileInfoValidation_FilePatternWildcardComparisonNone_ExpectFailure()
  428. {
  429. using namespace AzToolsFramework;
  430. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  431. AssetFileInfoListComparison assetFileInfoListComparison;
  432. AssetFileInfoListComparison::ComparisonData comparisonData(AssetFileInfoListComparison::ComparisonType::FilePattern, TempFiles[FileIndex::ResultAssetFileInfoList], "Foo*.txt", AssetFileInfoListComparison::FilePatternType::Wildcard);
  433. comparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  434. assetFileInfoListComparison.AddComparisonStep(comparisonData);
  435. ASSERT_FALSE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "File pattern match should not have produced any output.\n";
  436. // AssetFileInfo should not exist on-disk
  437. ASSERT_FALSE(AZ::IO::FileIOBase::GetInstance()->Exists(TempFiles[FileIndex::ResultAssetFileInfoList])) << "Asset List file should not exist on-disk.\n";
  438. }
  439. void AssetFileInfoValidation_FilePatternRegexComparisonPartial_Valid()
  440. {
  441. using namespace AzToolsFramework;
  442. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  443. AssetFileInfoListComparison assetFileInfoListComparison;
  444. AssetFileInfoListComparison::ComparisonData comparisonData(AssetFileInfoListComparison::ComparisonType::FilePattern, TempFiles[FileIndex::ResultAssetFileInfoList], "Asset[0-3].txt", AssetFileInfoListComparison::FilePatternType::Regex);
  445. comparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  446. assetFileInfoListComparison.AddComparisonStep(comparisonData);
  447. ASSERT_TRUE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "File pattern match failed.\n";
  448. // AssetFileInfo should be {0,1,2,3}
  449. AssetFileInfoList assetFileInfoList;
  450. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::ResultAssetFileInfoList], assetFileInfoList)) << "Unable to read the asset file info list.\n";
  451. EXPECT_EQ(assetFileInfoList.m_fileInfoList.size(), 4);
  452. AZStd::unordered_set<AZ::Data::AssetId> expectedAssetIds{ m_assets[0], m_assets[1], m_assets[2], m_assets[3]};
  453. for (const AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  454. {
  455. auto found = expectedAssetIds.find(assetFileInfo.m_assetId);
  456. if (found != expectedAssetIds.end())
  457. {
  458. expectedAssetIds.erase(found);
  459. }
  460. }
  461. EXPECT_EQ(expectedAssetIds.size(), 0);
  462. }
  463. void AssetFileInfoValidation_DeltaFilePatternComparisonOperation_Valid()
  464. {
  465. using namespace AzToolsFramework;
  466. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  467. AssetFileInfoListComparison assetFileInfoListComparison;
  468. AzToolsFramework::AssetFileInfoListComparison::ComparisonData deltaComparisonData(AzToolsFramework::AssetFileInfoListComparison::ComparisonType::Delta, "$1");
  469. deltaComparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  470. deltaComparisonData.m_secondInput = TempFiles[FileIndex::SecondAssetFileInfoList];
  471. assetFileInfoListComparison.AddComparisonStep(deltaComparisonData);
  472. AssetFileInfoListComparison::ComparisonData filePatternComparisonData(AssetFileInfoListComparison::ComparisonType::FilePattern, TempFiles[FileIndex::ResultAssetFileInfoList], "Asset[0-3].txt", AssetFileInfoListComparison::FilePatternType::Regex);
  473. filePatternComparisonData.m_firstInput = "$1";
  474. assetFileInfoListComparison.AddComparisonStep(filePatternComparisonData);
  475. ASSERT_TRUE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "Multiple Comparison Operation( Delta + FilePattern ) failed.\n";
  476. // Output of the Delta Operation should be {2*, 4*, 5}
  477. // Output of the FilePattern Operation should be {2*}
  478. AzToolsFramework::AssetFileInfoList assetFileInfoList;
  479. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::ResultAssetFileInfoList], assetFileInfoList)) << "Unable to read the asset file info list.\n";
  480. EXPECT_EQ(assetFileInfoList.m_fileInfoList.size(), 1);
  481. AZStd::unordered_map<AZ::Data::AssetId, AssetFileInfo> assetIdToAssetFileInfoMap;
  482. AzToolsFramework::AssetFileInfoList secondAssetFileInfoList;
  483. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::SecondAssetFileInfoList], secondAssetFileInfoList)) << "Unable to read the asset file info list.\n";
  484. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : secondAssetFileInfoList.m_fileInfoList)
  485. {
  486. assetIdToAssetFileInfoMap[assetFileInfo.m_assetId] = AZStd::move(assetFileInfo);
  487. }
  488. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  489. {
  490. auto found = assetIdToAssetFileInfoMap.find(assetFileInfo.m_assetId);
  491. if (found != assetIdToAssetFileInfoMap.end())
  492. {
  493. // checking the file hash
  494. for (int idx = 0; idx < AzToolsFramework::AssetFileInfo::s_arraySize; idx++)
  495. {
  496. if (found->second.m_hash[idx] != assetFileInfo.m_hash[idx])
  497. {
  498. GTEST_FATAL_FAILURE_(AZStd::string::format("Invalid file hash.\n").c_str());
  499. break;
  500. }
  501. }
  502. }
  503. }
  504. // Verifying that correct assetId are present in the assetFileInfo list
  505. AZStd::unordered_set<AZ::Data::AssetId> expectedAssetIds{ m_assets[2] };
  506. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  507. {
  508. auto found = expectedAssetIds.find(assetFileInfo.m_assetId);
  509. if (found != expectedAssetIds.end())
  510. {
  511. expectedAssetIds.erase(found);
  512. }
  513. }
  514. EXPECT_EQ(expectedAssetIds.size(), 0);
  515. }
  516. void AssetFileInfoValidation_FilePatternDeltaComparisonOperation_Valid()
  517. {
  518. using namespace AzToolsFramework;
  519. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  520. AssetFileInfoListComparison assetFileInfoListComparison;
  521. AssetFileInfoListComparison::ComparisonData filePatternComparisonData(AssetFileInfoListComparison::ComparisonType::FilePattern,"$1", "Asset[0-3].txt", AssetFileInfoListComparison::FilePatternType::Regex);
  522. filePatternComparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  523. assetFileInfoListComparison.AddComparisonStep(filePatternComparisonData);
  524. AzToolsFramework::AssetFileInfoListComparison::ComparisonData deltaComparisonData(AzToolsFramework::AssetFileInfoListComparison::ComparisonType::Delta, TempFiles[FileIndex::ResultAssetFileInfoList]);
  525. deltaComparisonData.m_firstInput = "$1";
  526. deltaComparisonData.m_secondInput = TempFiles[FileIndex::SecondAssetFileInfoList];
  527. assetFileInfoListComparison.AddComparisonStep(deltaComparisonData);
  528. ASSERT_TRUE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "Multiple Comparison Operation( FilePattern + Delta ) failed.\n";
  529. // Output of the FilePattern Operation should be {0,1,2,3}
  530. // Output of the Delta Operation should be {2*,4*,5}
  531. AzToolsFramework::AssetFileInfoList assetFileInfoList;
  532. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::ResultAssetFileInfoList], assetFileInfoList)) << "Unable to read the asset file info list.\n";
  533. EXPECT_EQ(assetFileInfoList.m_fileInfoList.size(), 3);
  534. AZStd::unordered_map<AZ::Data::AssetId, AssetFileInfo> assetIdToAssetFileInfoMap;
  535. AzToolsFramework::AssetFileInfoList secondAssetFileInfoList;
  536. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::SecondAssetFileInfoList], secondAssetFileInfoList)) << "Unable to read the asset file info list.\n";
  537. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : secondAssetFileInfoList.m_fileInfoList)
  538. {
  539. assetIdToAssetFileInfoMap[assetFileInfo.m_assetId] = AZStd::move(assetFileInfo);
  540. }
  541. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  542. {
  543. auto found = assetIdToAssetFileInfoMap.find(assetFileInfo.m_assetId);
  544. if (found != assetIdToAssetFileInfoMap.end())
  545. {
  546. // checking the file hash
  547. for (int idx = 0; idx < AzToolsFramework::AssetFileInfo::s_arraySize; idx++)
  548. {
  549. if (found->second.m_hash[idx] != assetFileInfo.m_hash[idx])
  550. {
  551. GTEST_FATAL_FAILURE_(AZStd::string::format("Invalid file hash.\n").c_str());
  552. break;
  553. }
  554. }
  555. }
  556. }
  557. // Verifying that correct assetId are present in the assetFileInfo list
  558. AZStd::unordered_set<AZ::Data::AssetId> expectedAssetIds{ m_assets[2], m_assets[4], m_assets[5] };
  559. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  560. {
  561. auto found = expectedAssetIds.find(assetFileInfo.m_assetId);
  562. if (found != expectedAssetIds.end())
  563. {
  564. expectedAssetIds.erase(found);
  565. }
  566. }
  567. EXPECT_EQ(expectedAssetIds.size(), 0);
  568. }
  569. void AssetFileInfoValidation_DeltaUnionFilePatternComparisonOperation_Valid()
  570. {
  571. using namespace AzToolsFramework;
  572. // First AssetFileInfoList {0,1,2,3,4} , Second AssetFileInfoList {1,2*,3,4*,5} where * indicate that hash has changed for that asset
  573. AssetFileInfoListComparison assetFileInfoListComparison;
  574. AzToolsFramework::AssetFileInfoListComparison::ComparisonData deltaComparisonData(AzToolsFramework::AssetFileInfoListComparison::ComparisonType::Delta, "$1");
  575. deltaComparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  576. deltaComparisonData.m_secondInput = TempFiles[FileIndex::SecondAssetFileInfoList];
  577. assetFileInfoListComparison.AddComparisonStep(deltaComparisonData);
  578. AssetFileInfoListComparison::ComparisonData unionComparisonData(AssetFileInfoListComparison::ComparisonType::Union, "$2");
  579. unionComparisonData.m_firstInput = TempFiles[FileIndex::FirstAssetFileInfoList];
  580. unionComparisonData.m_secondInput = "$1";
  581. assetFileInfoListComparison.AddComparisonStep(unionComparisonData);
  582. AssetFileInfoListComparison::ComparisonData filePatternComparisonData(AssetFileInfoListComparison::ComparisonType::FilePattern, TempFiles[FileIndex::ResultAssetFileInfoList], "Asset[4-5].txt", AssetFileInfoListComparison::FilePatternType::Regex);
  583. filePatternComparisonData.m_firstInput = "$2";
  584. assetFileInfoListComparison.AddComparisonStep(filePatternComparisonData);
  585. ASSERT_TRUE(assetFileInfoListComparison.CompareAndSaveResults().IsSuccess()) << "Multiple Comparison Operation( Delta + Union + FilePattern ) failed.\n";
  586. // Output of the Delta Operation should be {2*, 4*, 5}
  587. // Putput of the Union Operation should be {0, 1, 2*, 3, 4*, 5}
  588. // Output of the FilePattern Operation should be {4*, 5}
  589. AzToolsFramework::AssetFileInfoList assetFileInfoList;
  590. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::ResultAssetFileInfoList], assetFileInfoList)) << "Unable to read the asset file info list.\n";
  591. EXPECT_EQ(assetFileInfoList.m_fileInfoList.size(), 2);
  592. AZStd::unordered_map<AZ::Data::AssetId, AssetFileInfo> assetIdToAssetFileInfoMap;
  593. AzToolsFramework::AssetFileInfoList secondAssetFileInfoList;
  594. ASSERT_TRUE(AZ::Utils::LoadObjectFromFileInPlace(TempFiles[FileIndex::SecondAssetFileInfoList], secondAssetFileInfoList)) << "Unable to read the asset file info list.\n";
  595. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : secondAssetFileInfoList.m_fileInfoList)
  596. {
  597. assetIdToAssetFileInfoMap[assetFileInfo.m_assetId] = AZStd::move(assetFileInfo);
  598. }
  599. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  600. {
  601. auto found = assetIdToAssetFileInfoMap.find(assetFileInfo.m_assetId);
  602. if (found != assetIdToAssetFileInfoMap.end())
  603. {
  604. // checking the file hash
  605. for (int idx = 0; idx < AzToolsFramework::AssetFileInfo::s_arraySize; idx++)
  606. {
  607. if (found->second.m_hash[idx] != assetFileInfo.m_hash[idx])
  608. {
  609. GTEST_FATAL_FAILURE_(AZStd::string::format("Invalid file hash.\n").c_str());
  610. break;
  611. }
  612. }
  613. }
  614. }
  615. // Verifying that correct assetId are present in the assetFileInfo list
  616. AZStd::unordered_set<AZ::Data::AssetId> expectedAssetIds{ m_assets[4], m_assets[5] };
  617. for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
  618. {
  619. auto found = expectedAssetIds.find(assetFileInfo.m_assetId);
  620. if (found != expectedAssetIds.end())
  621. {
  622. expectedAssetIds.erase(found);
  623. }
  624. }
  625. EXPECT_EQ(expectedAssetIds.size(), 0);
  626. }
  627. ToolsTestApplication* m_application = nullptr;
  628. AZ::Test::ScopedAutoTempDirectory m_tempDir;
  629. AzToolsFramework::PlatformAddressedAssetCatalog* m_catalog = nullptr;
  630. AZ::IO::FileIOStream m_fileStreams[TotalAssets];
  631. AZ::Data::AssetId m_assets[TotalAssets];
  632. AZStd::string m_assetsPath[TotalAssets];
  633. };
  634. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_DeltaComparison_Valid)
  635. {
  636. AssetFileInfoValidation_DeltaComparison_Valid();
  637. }
  638. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_UnionComparison_Valid)
  639. {
  640. AssetFileInfoValidation_UnionComparison_Valid();
  641. }
  642. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_IntersectionComparison_Valid)
  643. {
  644. AssetFileInfoValidation_IntersectionComparison_Valid();
  645. }
  646. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_ComplementComparison_Valid)
  647. {
  648. AssetFileInfoValidation_ComplementComparison_Valid();
  649. }
  650. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_FilePatternWildcardComparisonAll_Valid)
  651. {
  652. AssetFileInfoValidation_FilePatternWildcardComparisonAll_Valid();
  653. }
  654. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_FilePatternWildcardComparisonNone_ExpectFailure)
  655. {
  656. AssetFileInfoValidation_FilePatternWildcardComparisonNone_ExpectFailure();
  657. }
  658. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_FilePatternRegexComparisonPartial_Valid)
  659. {
  660. AssetFileInfoValidation_FilePatternRegexComparisonPartial_Valid();
  661. }
  662. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_DeltaFilePatternComparisonOperation_Valid)
  663. {
  664. AssetFileInfoValidation_DeltaFilePatternComparisonOperation_Valid();
  665. }
  666. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_FilePatternDeltaComparisonOperation_Valid)
  667. {
  668. AssetFileInfoValidation_FilePatternDeltaComparisonOperation_Valid();
  669. }
  670. TEST_F(AssetFileInfoListComparisonTest, AssetFileInfoValidation_DeltaUnionFilePatternComparisonOperation_Valid)
  671. {
  672. AssetFileInfoValidation_DeltaUnionFilePatternComparisonOperation_Valid();
  673. }
  674. }