AssetCacheServerUnitTests.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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/Serialization/Json/JsonSerializationSettings.h>
  9. #include <AzCore/Settings/SettingsRegistryMergeUtils.h>
  10. #include <AzCore/Settings/SettingsRegistryVisitorUtils.h>
  11. #include <AzCore/UnitTest/Mocks/MockSettingsRegistry.h>
  12. #if !defined(Q_MOC_RUN)
  13. #include <AzCore/UnitTest/TestTypes.h>
  14. #endif
  15. #include <AzTest/Utils.h>
  16. #include <AzToolsFramework/Archive/ArchiveAPI.h>
  17. #include <native/resourcecompiler/rcjob.h>
  18. #include <native/utilities/AssetServerHandler.h>
  19. #include <native/utilities/assetUtils.h>
  20. #include <native/unittests/UnitTestUtils.h>
  21. #include <QStandardPaths>
  22. #include <QDir>
  23. namespace UnitTest
  24. {
  25. struct MockArchiveCommandsBusHandler
  26. : public AzToolsFramework::ArchiveCommandsBus::Handler
  27. {
  28. MockArchiveCommandsBusHandler()
  29. {
  30. AzToolsFramework::ArchiveCommandsBus::Handler::BusConnect();
  31. }
  32. ~MockArchiveCommandsBusHandler()
  33. {
  34. AzToolsFramework::ArchiveCommandsBus::Handler::BusDisconnect();
  35. }
  36. MOCK_METHOD2(CreateArchive, std::future<bool>(const AZStd::string&, const AZStd::string&));
  37. MOCK_METHOD2(ExtractArchive, std::future<bool>(const AZStd::string&, const AZStd::string&));
  38. MOCK_METHOD3(ExtractFile, std::future<bool>(const AZStd::string&, const AZStd::string&, const AZStd::string&));
  39. MOCK_METHOD2(ListFilesInArchive, bool(const AZStd::string&, AZStd::vector<AZStd::string>&));
  40. MOCK_METHOD3(AddFileToArchive, std::future<bool>(const AZStd::string&, const AZStd::string&, const AZStd::string&));
  41. MOCK_METHOD3(AddFilesToArchive, std::future<bool>(const AZStd::string&, const AZStd::string&, const AZStd::string&));
  42. };
  43. class AssetServerHandlerUnitTest
  44. : public LeakDetectionFixture
  45. {
  46. public:
  47. AssetServerHandlerUnitTest()
  48. {
  49. AZ::SettingsRegistry::Register(&m_mockSettingsRegistry);
  50. m_tempFolder = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
  51. m_fakeSourceFile = QString(m_tempFolder + m_fakeFullname + ".zip");
  52. using namespace AssetProcessor;
  53. AssetServerBus::Broadcast(&AssetServerBus::Events::SetServerAddress, "");
  54. AssetServerBus::Broadcast(&AssetServerBus::Events::SetRemoteCachingMode, AssetServerMode::Inactive);
  55. }
  56. ~AssetServerHandlerUnitTest()
  57. {
  58. RemoveMockAssetArchive();
  59. using namespace AssetProcessor;
  60. AssetServerBus::Broadcast(&AssetServerBus::Events::SetServerAddress, "");
  61. AssetServerBus::Broadcast(&AssetServerBus::Events::SetRemoteCachingMode, AssetServerMode::Inactive);
  62. AZ::SettingsRegistry::Unregister(&m_mockSettingsRegistry);
  63. }
  64. void MockSettingsRegistry()
  65. {
  66. auto getString = [this](AZStd::string& result, AZStd::string_view input) -> bool
  67. {
  68. if (input == "/O3DE/AssetProcessor/Settings/Server/cacheServerAddress")
  69. {
  70. result = this->m_tempFolder.toUtf8().toStdString().c_str();
  71. }
  72. return true;
  73. };
  74. ON_CALL(m_mockSettingsRegistry, Get(::testing::An<AZStd::string&>(), ::testing::_)).WillByDefault(getString);
  75. auto getBool = [this](bool& result, AZStd::string_view input) -> bool
  76. {
  77. if (input == "/O3DE/AssetProcessor/Settings/Server/enableCacheServer")
  78. {
  79. result = this->m_enableServer;
  80. }
  81. return true;
  82. };
  83. ON_CALL(m_mockSettingsRegistry, Get(::testing::An<bool&>(), ::testing::_)).WillByDefault(getBool);
  84. }
  85. void CreateMockAssetArchive()
  86. {
  87. QFileInfo fileInfo(m_fakeSourceFile);
  88. if (!fileInfo.absoluteDir().exists())
  89. {
  90. EXPECT_TRUE(fileInfo.absoluteDir().mkpath("."));
  91. }
  92. QFile tempFile(m_fakeSourceFile);
  93. tempFile.open(QIODevice::OpenModeFlag::NewOnly);
  94. }
  95. void RemoveMockAssetArchive()
  96. {
  97. QFile tempFile(m_fakeSourceFile);
  98. tempFile.remove();
  99. }
  100. UnitTestUtils::AssertAbsorber m_assertAbsorber;
  101. AZ::MockSettingsRegistry m_mockSettingsRegistry;
  102. MockArchiveCommandsBusHandler m_mockArchiveCommandsBusHandler;
  103. QString m_tempFolder;
  104. QString m_fakeSourceFile;
  105. bool m_enableServer = false;
  106. const char* m_fakeFullname = "/mock_cache/asset_server_key";
  107. const char* m_fakeFilename = "asset_server_key";
  108. };
  109. TEST_F(AssetServerHandlerUnitTest, AssetCacheServer_UnConfiguredToRunAsServer_SetsFalse)
  110. {
  111. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<AZStd::string&>(), ::testing::_)).Times(2);
  112. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<bool&>(), ::testing::_)).Times(1);
  113. AssetProcessor::AssetServerHandler assetServerHandler;
  114. EXPECT_FALSE(assetServerHandler.IsServerAddressValid());
  115. }
  116. TEST_F(AssetServerHandlerUnitTest, AssetCacheServer_ConfiguredToRunAsServer_Works)
  117. {
  118. m_enableServer = true;
  119. MockSettingsRegistry();
  120. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<AZStd::string&>(), ::testing::_)).Times(2);
  121. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<bool&>(), ::testing::_)).Times(1);
  122. AssetProcessor::AssetServerHandler assetServerHandler;
  123. EXPECT_TRUE(assetServerHandler.IsServerAddressValid());
  124. EXPECT_TRUE(assetServerHandler.GetRemoteCachingMode() == AssetProcessor::AssetServerMode::Server);
  125. }
  126. TEST_F(AssetServerHandlerUnitTest, AssetCacheServer_ConfiguredToRunAsClient_Works)
  127. {
  128. m_enableServer = false;
  129. MockSettingsRegistry();
  130. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<AZStd::string&>(), ::testing::_)).Times(2);
  131. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<bool&>(), ::testing::_)).Times(1);
  132. AssetProcessor::AssetServerHandler assetServerHandler;
  133. EXPECT_TRUE(assetServerHandler.IsServerAddressValid());
  134. EXPECT_TRUE(assetServerHandler.GetRemoteCachingMode() == AssetProcessor::AssetServerMode::Client);
  135. }
  136. TEST_F(AssetServerHandlerUnitTest, AssetCacheServer_ServerStoresZipFile_Works)
  137. {
  138. m_enableServer = true;
  139. MockSettingsRegistry();
  140. RemoveMockAssetArchive();
  141. auto createArchive = [this](const AZStd::string& archivePath, const AZStd::string&) -> std::future<bool>
  142. {
  143. AZStd::string targetFilename = AZStd::string(this->m_fakeFilename) + ".zip";
  144. EXPECT_TRUE(archivePath.ends_with(targetFilename));
  145. return std::async(std::launch::async, [] { return true; });
  146. };
  147. ON_CALL(m_mockArchiveCommandsBusHandler, CreateArchive(::testing::_, ::testing::_)).WillByDefault(createArchive);
  148. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<AZStd::string&>(), ::testing::_)).Times(2);
  149. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<bool&>(), ::testing::_)).Times(1);
  150. EXPECT_CALL(m_mockArchiveCommandsBusHandler, CreateArchive(::testing::_, ::testing::_)).Times(1);
  151. QObject parent{};
  152. AssetProcessor::JobDetails jobDetails;
  153. jobDetails.m_jobEntry.m_jobKey = "ACS_Test";
  154. AssetProcessor::RCJob rcJob {&parent};
  155. rcJob.Init(jobDetails);
  156. AZStd::vector<AZStd::string> sourceFileList;
  157. AssetProcessor::BuilderParams builderParams {&rcJob};
  158. builderParams.m_serverKey = m_fakeFilename;
  159. builderParams.m_processJobRequest.m_sourceFile = (m_tempFolder + m_fakeFullname).toUtf8().toStdString().c_str();
  160. AssetProcessor::AssetServerHandler assetServerHandler;
  161. using namespace AssetProcessor;
  162. AssetServerMode mode = {};
  163. AssetServerBus::BroadcastResult(mode , &AssetServerBus::Events::GetRemoteCachingMode);
  164. EXPECT_TRUE(assetServerHandler.IsServerAddressValid());
  165. EXPECT_EQ(mode, AssetServerMode::Server);
  166. EXPECT_TRUE(assetServerHandler.StoreJobResult(builderParams, sourceFileList));
  167. }
  168. TEST_F(AssetServerHandlerUnitTest, AssetCacheServer_ClientReadsZipFile_Works)
  169. {
  170. m_enableServer = false;
  171. MockSettingsRegistry();
  172. CreateMockAssetArchive();
  173. auto extractArchive = [this](const AZStd::string& archivePath, const AZStd::string& tempFolder) -> std::future<bool>
  174. {
  175. AZStd::string targetFilename = AZStd::string(this->m_fakeFilename) + ".zip";
  176. EXPECT_TRUE(archivePath.ends_with(targetFilename));
  177. AZ_UNUSED(tempFolder);
  178. return std::async(std::launch::async, [] { return true; });
  179. };
  180. ON_CALL(m_mockArchiveCommandsBusHandler, ExtractArchive(::testing::_, ::testing::_)).WillByDefault(extractArchive);
  181. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<AZStd::string&>(), ::testing::_)).Times(2);
  182. EXPECT_CALL(m_mockSettingsRegistry, Get(::testing::An<bool&>(), ::testing::_)).Times(1);
  183. EXPECT_CALL(m_mockArchiveCommandsBusHandler, ExtractArchive(::testing::_, ::testing::_)).Times(1);
  184. QObject parent{};
  185. AssetProcessor::JobDetails jobDetails;
  186. jobDetails.m_jobEntry.m_jobKey = "ACS_Test";
  187. AssetProcessor::RCJob rcJob{ &parent };
  188. rcJob.Init(jobDetails);
  189. AssetProcessor::BuilderParams builderParams{ &rcJob };
  190. builderParams.m_serverKey = m_fakeFilename;
  191. builderParams.m_processJobRequest.m_sourceFile = (m_tempFolder + m_fakeFullname).toUtf8().toStdString().c_str();
  192. AssetProcessor::AssetServerHandler assetServerHandler;
  193. using namespace AssetProcessor;
  194. AssetServerMode mode = {};
  195. AssetServerBus::BroadcastResult(mode, &AssetServerBus::Events::GetRemoteCachingMode);
  196. EXPECT_TRUE(assetServerHandler.IsServerAddressValid());
  197. EXPECT_EQ(mode, AssetServerMode::Client);
  198. EXPECT_TRUE(assetServerHandler.RetrieveJobResult(builderParams));
  199. }
  200. }