3
0

ArchiveTests.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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/Asset/AssetManagerBus.h>
  10. #include <AzCore/Math/Uuid.h>
  11. #include <AzCore/Memory/Memory.h>
  12. #include <AzCore/std/smart_ptr/unique_ptr.h>
  13. #include <AzCore/UserSettings/UserSettingsComponent.h>
  14. #include <AzCore/IO/FileIO.h>
  15. #include <AZTestShared/Utils/Utils.h>
  16. #include <AzToolsFramework/Archive/ArchiveAPI.h>
  17. #include <AzFramework/StringFunc/StringFunc.h>
  18. #include <AzToolsFramework/Archive/ArchiveAPI.h>
  19. #include <AzToolsFramework/AssetBundle/AssetBundleAPI.h>
  20. #include <AzToolsFramework/UnitTest/ToolsTestApplication.h>
  21. #include <QString>
  22. #include <QDir>
  23. #include <QFileInfo>
  24. #include <QStandardPaths>
  25. #include <QTemporaryDir>
  26. #include <QTextStream>
  27. namespace UnitTest
  28. {
  29. namespace
  30. {
  31. bool CreateDummyFile(const QString& fullPathToFile, const QString& tempStr = {})
  32. {
  33. QFileInfo fi(fullPathToFile);
  34. QDir fp(fi.path());
  35. fp.mkpath(".");
  36. QFile writer(fullPathToFile);
  37. if (!writer.open(QFile::ReadWrite))
  38. {
  39. return false;
  40. }
  41. {
  42. QTextStream stream(&writer);
  43. stream << tempStr << Qt::endl;
  44. }
  45. writer.close();
  46. return true;
  47. }
  48. class ArchiveComponentTest :
  49. public UnitTest::LeakDetectionFixture
  50. {
  51. public:
  52. QStringList CreateArchiveFileList()
  53. {
  54. QStringList returnList;
  55. returnList.append("basicfile.txt");
  56. returnList.append("basicfile2.txt");
  57. returnList.append("testfolder/folderfile.txt");
  58. returnList.append("testfolder2/sharedfolderfile.txt");
  59. returnList.append("testfolder2/sharedfolderfile2.txt");
  60. returnList.append("testfolder3/testfolder4/depthfile.bat");
  61. return returnList;
  62. }
  63. QString GetArchiveFolderName()
  64. {
  65. return "archive";
  66. }
  67. QString GetExtractFolderName()
  68. {
  69. return "extracted";
  70. }
  71. void CreateArchiveFolder(QString archiveFolderName, QStringList fileList)
  72. {
  73. QDir tempPath = QDir(m_tempDir.GetDirectory()).filePath(archiveFolderName);
  74. for (const auto& thisFile : fileList)
  75. {
  76. QString absoluteTestFilePath = tempPath.absoluteFilePath(thisFile);
  77. EXPECT_TRUE(CreateDummyFile(absoluteTestFilePath));
  78. }
  79. }
  80. QString CreateArchiveListTextFile()
  81. {
  82. QString listFilePath = QDir(m_tempDir.GetDirectory()).absoluteFilePath("filelist.txt");
  83. QString textContent = CreateArchiveFileList().join("\n");
  84. EXPECT_TRUE(CreateDummyFile(listFilePath, textContent));
  85. return listFilePath;
  86. }
  87. void CreateArchiveFolder()
  88. {
  89. CreateArchiveFolder(GetArchiveFolderName(), CreateArchiveFileList());
  90. }
  91. QString GetArchivePath()
  92. {
  93. return QDir(m_tempDir.GetDirectory()).filePath("TestArchive.pak");
  94. }
  95. QString GetArchiveFolder()
  96. {
  97. return QDir(m_tempDir.GetDirectory()).filePath(GetArchiveFolderName());
  98. }
  99. QString GetExtractFolder()
  100. {
  101. return QDir(m_tempDir.GetDirectory()).filePath(GetExtractFolderName());
  102. }
  103. bool CreateArchive()
  104. {
  105. std::future<bool> createResult;
  106. AzToolsFramework::ArchiveCommandsBus::BroadcastResult(createResult,
  107. &AzToolsFramework::ArchiveCommandsBus::Events::CreateArchive,
  108. GetArchivePath().toUtf8().constData(), GetArchiveFolder().toUtf8().constData());
  109. bool result = createResult.get();
  110. return result;
  111. }
  112. void SetUp() override
  113. {
  114. m_app.reset(aznew ToolsTestApplication("ArchiveComponentTest"));
  115. AZ::ComponentApplication::StartupParameters startupParameters;
  116. startupParameters.m_loadSettingsRegistry = false;
  117. m_app->Start(AzFramework::Application::Descriptor(), startupParameters);
  118. // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is
  119. // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash
  120. // in the unit tests.
  121. AZ::UserSettingsComponentRequestBus::Broadcast(&AZ::UserSettingsComponentRequests::DisableSaveOnFinalize);
  122. if (auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); fileIoBase != nullptr)
  123. {
  124. fileIoBase->SetAlias("@products@", m_tempDir.GetDirectory());
  125. }
  126. }
  127. void TearDown() override
  128. {
  129. m_app->Stop();
  130. m_app.reset();
  131. }
  132. AZStd::unique_ptr<ToolsTestApplication> m_app;
  133. AZ::Test::ScopedAutoTempDirectory m_tempDir;
  134. };
  135. TEST_F(ArchiveComponentTest, CreateArchive_FilesAtThreeDepths_ArchiveCreated)
  136. {
  137. CreateArchiveFolder();
  138. AZ_TEST_START_TRACE_SUPPRESSION;
  139. bool createResult = CreateArchive();
  140. AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
  141. EXPECT_TRUE(createResult);
  142. }
  143. TEST_F(ArchiveComponentTest, ListFilesInArchive_FilesAtThreeDepths_FilesFound)
  144. {
  145. CreateArchiveFolder();
  146. AZ_TEST_START_TRACE_SUPPRESSION;
  147. EXPECT_EQ(CreateArchive(), true);
  148. AZStd::vector<AZStd::string> fileList;
  149. bool listResult{ false };
  150. AzToolsFramework::ArchiveCommandsBus::BroadcastResult(listResult,
  151. &AzToolsFramework::ArchiveCommandsBus::Events::ListFilesInArchive,
  152. GetArchivePath().toUtf8().constData(), fileList);
  153. AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
  154. EXPECT_TRUE(listResult);
  155. EXPECT_EQ(fileList.size(), 6);
  156. }
  157. TEST_F(ArchiveComponentTest, CreateDeltaCatalog_AssetsNotRegistered_Failure)
  158. {
  159. QStringList fileList = CreateArchiveFileList();
  160. CreateArchiveFolder(GetArchiveFolderName(), fileList);
  161. AZ_TEST_START_TRACE_SUPPRESSION;
  162. bool createResult = CreateArchive();
  163. AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
  164. EXPECT_EQ(createResult, true);
  165. bool catalogCreated{ true };
  166. AZ::Test::AssertAbsorber assertAbsorber;
  167. AzToolsFramework::AssetBundleCommandsBus::BroadcastResult(catalogCreated,
  168. &AzToolsFramework::AssetBundleCommandsBus::Events::CreateDeltaCatalog, GetArchivePath().toUtf8().constData(), true);
  169. EXPECT_EQ(catalogCreated, false);
  170. }
  171. TEST_F(ArchiveComponentTest, AddFilesToArchive_FromListFile_Success)
  172. {
  173. QString listFile = CreateArchiveListTextFile();
  174. CreateArchiveFolder(GetArchiveFolderName(), CreateArchiveFileList());
  175. AZ_TEST_START_TRACE_SUPPRESSION;
  176. std::future<bool> addResult;
  177. AzToolsFramework::ArchiveCommandsBus::BroadcastResult(
  178. addResult, &AzToolsFramework::ArchiveCommandsBus::Events::AddFilesToArchive, GetArchivePath().toUtf8().constData(),
  179. GetArchiveFolder().toUtf8().constData(), listFile.toUtf8().constData());
  180. bool result = addResult.get();
  181. AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
  182. EXPECT_TRUE(result);
  183. }
  184. TEST_F(ArchiveComponentTest, ExtractArchive_AllFiles_Success)
  185. {
  186. CreateArchiveFolder();
  187. AZ_TEST_START_TRACE_SUPPRESSION;
  188. bool createResult = CreateArchive();
  189. AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
  190. EXPECT_TRUE(createResult);
  191. AZ_TEST_START_TRACE_SUPPRESSION;
  192. std::future<bool> extractResult;
  193. AzToolsFramework::ArchiveCommandsBus::BroadcastResult(
  194. extractResult, &AzToolsFramework::ArchiveCommandsBus::Events::ExtractArchive, GetArchivePath().toUtf8().constData(),
  195. GetExtractFolder().toUtf8().constData());
  196. bool result = extractResult.get();
  197. AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
  198. EXPECT_TRUE(result);
  199. QStringList archiveFiles = CreateArchiveFileList();
  200. for (const auto& file : archiveFiles)
  201. {
  202. QString fullFilePath = QDir(GetExtractFolder()).absoluteFilePath(file);
  203. QFileInfo fi(fullFilePath);
  204. EXPECT_TRUE(fi.exists());
  205. }
  206. }
  207. TEST_F(ArchiveComponentTest, CreateDeltaCatalog_ArchiveWithoutCatalogAssetsRegistered_Success)
  208. {
  209. QStringList fileList = CreateArchiveFileList();
  210. CreateArchiveFolder(GetArchiveFolderName(), fileList);
  211. AZ_TEST_START_TRACE_SUPPRESSION;
  212. bool createResult = CreateArchive();
  213. AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
  214. EXPECT_EQ(createResult, true);
  215. for (const auto& thisPath : fileList)
  216. {
  217. AZ::Data::AssetInfo newInfo;
  218. newInfo.m_relativePath = thisPath.toUtf8().constData();
  219. newInfo.m_assetType = AZ::Uuid::CreateRandom();
  220. newInfo.m_sizeBytes = 100; // Arbitrary
  221. AZ::Data::AssetId generatedID(AZ::Uuid::CreateRandom());
  222. newInfo.m_assetId = generatedID;
  223. AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequestBus::Events::RegisterAsset, generatedID, newInfo);
  224. }
  225. bool catalogCreated{ false };
  226. AZ_TEST_START_TRACE_SUPPRESSION;
  227. AzToolsFramework::AssetBundleCommandsBus::BroadcastResult(catalogCreated, &AzToolsFramework::AssetBundleCommandsBus::Events::CreateDeltaCatalog, GetArchivePath().toUtf8().constData(), true);
  228. AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT; // produces different counts in different platforms
  229. EXPECT_EQ(catalogCreated, true);
  230. }
  231. }
  232. }