2
0

UuidUtilTests.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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/RTTI/ReflectContext.h>
  9. #include <AzCore/UnitTest/TestTypes.h>
  10. #include <AzToolsFramework/Metadata/MetadataManager.h>
  11. #include <AzCore/Serialization/Json/JsonSystemComponent.h>
  12. #include <AzCore/Serialization/Json/RegistrationContext.h>
  13. #include <AzCore/UnitTest/Mocks/MockFileIOBase.h>
  14. #include <AzCore/Component/ComponentApplication.h>
  15. #include <AzCore/Utils/Utils.h>
  16. #include <AzToolsFramework/Metadata/UuidUtils.h>
  17. #include <AzCore/UnitTest/MockComponentApplication.h>
  18. namespace UnitTest
  19. {
  20. struct UuidUtilTests
  21. : LeakDetectionFixture
  22. {
  23. void SetUp() override
  24. {
  25. UnitTest::TestRunner::Instance().m_suppressPrintf = false;
  26. UnitTest::TestRunner::Instance().m_suppressAsserts = true;
  27. UnitTest::TestRunner::Instance().m_suppressErrors = true;
  28. UnitTest::TestRunner::Instance().m_suppressOutput = false;
  29. UnitTest::TestRunner::Instance().m_suppressWarnings = false;
  30. m_serializeContext = AZStd::make_unique<AZ::SerializeContext>();
  31. m_jsonRegistrationContext = AZStd::make_unique<AZ::JsonRegistrationContext>();
  32. m_applicationMock = AZStd::make_unique<testing::NiceMock<UnitTest::MockComponentApplication>>();
  33. ON_CALL(*m_applicationMock, GetSerializeContext())
  34. .WillByDefault(
  35. [this]()
  36. {
  37. return m_serializeContext.get();
  38. });
  39. ON_CALL(*m_applicationMock, GetJsonRegistrationContext())
  40. .WillByDefault(
  41. [this]()
  42. {
  43. return m_jsonRegistrationContext.get();
  44. });
  45. AZ::JsonSystemComponent::Reflect(m_jsonRegistrationContext.get());
  46. AzToolsFramework::UuidUtilComponent::Reflect(m_serializeContext.get());
  47. AzToolsFramework::MetadataManager::Reflect(m_serializeContext.get());
  48. // Cache the existing file io instance and build our mock file io
  49. m_priorFileIO = AZ::IO::FileIOBase::GetInstance();
  50. m_fileIOMock = AZStd::make_unique<testing::NiceMock<AZ::IO::MockFileIOBase>>();
  51. // Swap out current file io instance for our mock
  52. AZ::IO::FileIOBase::SetInstance(nullptr);
  53. AZ::IO::FileIOBase::SetInstance(m_fileIOMock.get());
  54. // Setup the default returns for our mock file io calls
  55. AZ::IO::MockFileIOBase::InstallDefaultReturns(*m_fileIOMock.get());
  56. using namespace ::testing;
  57. using namespace AZ;
  58. ON_CALL(*m_fileIOMock, Open(_, _, _))
  59. .WillByDefault(Invoke(
  60. [](auto filePath, auto, IO::HandleType& handle)
  61. {
  62. handle = AZ::u32(AZStd::hash<AZStd::string>{}( filePath ));
  63. return AZ::IO::Result(AZ::IO::ResultCode::Success);
  64. }));
  65. ON_CALL(*m_fileIOMock, Size(An<AZ::IO::HandleType>(), _))
  66. .WillByDefault(Invoke(
  67. [this](auto handle, AZ::u64& size)
  68. {
  69. size = m_mockFiles[handle].size();
  70. return AZ::IO::ResultCode::Success;
  71. }));
  72. ON_CALL(*m_fileIOMock, Size(An<const char*>(), _))
  73. .WillByDefault(Invoke(
  74. [this](const char* filePath, AZ::u64& size)
  75. {
  76. auto handle = AZ::u32(AZStd::hash<AZStd::string>{}(filePath));
  77. size = m_mockFiles[handle].size();
  78. return AZ::IO::ResultCode::Success;
  79. }));
  80. ON_CALL(*m_fileIOMock, Exists(_))
  81. .WillByDefault(Invoke(
  82. [this](const char* filePath)
  83. {
  84. auto handle = AZ::u32(AZStd::hash<AZStd::string>{}(filePath));
  85. auto itr = m_mockFiles.find(handle);
  86. return itr != m_mockFiles.end() && itr->second.size() > 0;
  87. }));
  88. ON_CALL(*m_fileIOMock, Read(_, _, _, _, _))
  89. .WillByDefault(Invoke(
  90. [this](auto handle, void* buffer, auto, auto, AZ::u64* bytesRead)
  91. {
  92. auto itr = m_mockFiles.find(handle);
  93. if (itr == m_mockFiles.end())
  94. {
  95. return AZ::IO::ResultCode::Error;
  96. }
  97. memcpy(buffer, itr->second.c_str(), itr->second.size());
  98. *bytesRead = itr->second.size();
  99. return AZ::IO::ResultCode::Success;
  100. }));
  101. ON_CALL(*m_fileIOMock, Write(_, _, _, _))
  102. .WillByDefault(Invoke(
  103. [this](IO::HandleType fileHandle, const void* buffer, AZ::u64 size, AZ::u64* bytesWritten)
  104. {
  105. AZStd::string& file = m_mockFiles[fileHandle];
  106. file.resize(size);
  107. memcpy((void*)file.c_str(), buffer, size);
  108. *bytesWritten = size;
  109. return AZ::IO::ResultCode::Success;
  110. }));
  111. m_utilInterface = AZ::Interface<AzToolsFramework::IUuidUtil>::Get();
  112. ASSERT_TRUE(m_utilInterface);
  113. }
  114. void TearDown() override
  115. {
  116. m_jsonRegistrationContext->EnableRemoveReflection();
  117. AZ::JsonSystemComponent::Reflect(m_jsonRegistrationContext.get());
  118. m_jsonRegistrationContext->DisableRemoveReflection();
  119. m_jsonRegistrationContext.reset();
  120. m_serializeContext.reset();
  121. AZ::IO::FileIOBase::SetInstance(nullptr);
  122. AZ::IO::FileIOBase::SetInstance(m_priorFileIO);
  123. UnitTest::TestRunner::Instance().ResetSuppressionSettingsToDefault();
  124. }
  125. AZStd::unique_ptr<testing::NiceMock<UnitTest::MockComponentApplication>> m_applicationMock;
  126. AZStd::unique_ptr<AZ::SerializeContext> m_serializeContext;
  127. AZStd::unique_ptr<AZ::JsonRegistrationContext> m_jsonRegistrationContext;
  128. AZStd::unique_ptr<testing::NiceMock<AZ::IO::MockFileIOBase>> m_fileIOMock;
  129. AZ::IO::FileIOBase* m_priorFileIO = nullptr;
  130. AZStd::unordered_map<AZ::IO::HandleType, AZStd::string> m_mockFiles;
  131. AzToolsFramework::MetadataManager m_manager;
  132. AzToolsFramework::UuidUtilComponent m_uuidUtil;
  133. // Cached pointer, no need to clean up
  134. AzToolsFramework::IUuidUtil* m_utilInterface{};
  135. };
  136. TEST_F(UuidUtilTests, CreateSourceUuid_Random_ReturnsRandomUuid)
  137. {
  138. auto result = m_utilInterface->CreateSourceUuid("mockfile");
  139. ASSERT_TRUE(result);
  140. EXPECT_FALSE(result.GetValue().IsNull());
  141. }
  142. TEST_F(UuidUtilTests, CreateSourceUuid_SpecifyUuid_ReturnsTrue)
  143. {
  144. auto uuid = AZ::Uuid::CreateRandom();
  145. EXPECT_TRUE(m_utilInterface->CreateSourceUuid("mockfile", uuid));
  146. }
  147. TEST_F(UuidUtilTests, CreateSourceUuidRandom_AlreadyAssigned_Fails)
  148. {
  149. m_utilInterface->CreateSourceUuid("mockfile");
  150. auto result = m_utilInterface->CreateSourceUuid("mockfile");
  151. EXPECT_FALSE(result);
  152. }
  153. TEST_F(UuidUtilTests, CreateSourceUuid_AlreadyAssigned_Fails)
  154. {
  155. auto uuid = AZ::Uuid::CreateRandom();
  156. m_utilInterface->CreateSourceUuid("mockfile");
  157. EXPECT_FALSE(m_utilInterface->CreateSourceUuid("mockfile", uuid));
  158. }
  159. }