fed1278fe6
* Initial pass at optimizing product path dependency resolution Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Add version of StripAssetPlatform that doesn't allocate or copy strings. Re-add missing test and fix up compile errors. Add benchmark test Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Change UpdateProductDependencies to directly call s_InsertProductDependencyQuery.BindAndStep Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Add test for same filename on multiple platforms Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Rework search logic to keep track of the source of a search path (source vs product) and keep track of which search matches which dependency to avoid doing another search through every product later on Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Clean up code, expand test Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Fix paths not being lowercased by SanitizeForDatabase. Fix UpdateProductDependencies not updating existing dependencies Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Add test for duplicate dependency matches. Fix saving duplicates Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Clean up code Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Separate test into test and benchmark versions Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Cleanup include Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Fix includes, switch hardcoded job manager setup to use JobManagerComponent instead Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Replaced wildcard_match with PathView::Match. Changed StripAssetPlatformNoCopy to use TokenizeNext. Removed Environment Create/Destroy calls. Made ScopedAllocatorFixture a base class of ScopedAllocatorSetupFixture Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Add AZ Environment create/destroy on AP test environment Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Add missing asserts on database functions Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Fix incorrect usage of StripAssetPlatformNoCopy Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Fix source/product dependency type being ignored. Removed need for unordered_set for list of resolved dependencies. Updated unit tests Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Better variable names Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Remove testing code Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com> * Fix missing includes and namespaces Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>
283 lines
9.1 KiB
C++
283 lines
9.1 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AzTest/AzTest.h>
|
|
#include <AzCore/std/parallel/atomic.h>
|
|
#include <qcoreapplication.h>
|
|
#include "native/tests/AssetProcessorTest.h"
|
|
#include <AssetBuilderSDK/AssetBuilderSDK.h>
|
|
#include "native/assetprocessor.h"
|
|
#include "native/unittests/UnitTestRunner.h"
|
|
#include "native/AssetManager/assetProcessorManager.h"
|
|
#include "native/utilities/PlatformConfiguration.h"
|
|
#include "native/unittests/MockApplicationManager.h"
|
|
#include <AssetManager/FileStateCache.h>
|
|
#include <AzCore/std/smart_ptr/unique_ptr.h>
|
|
|
|
#include <QTemporaryDir>
|
|
#include <QMetaObject>
|
|
#include <AzCore/Jobs/JobContext.h>
|
|
#include <AzCore/Jobs/JobManager.h>
|
|
#include <AzCore/UnitTest/TestTypes.h>
|
|
#include <AzToolsFramework/API/AssetDatabaseBus.h>
|
|
#include "resourcecompiler/rccontroller.h"
|
|
|
|
class AssetProcessorManager_Test;
|
|
|
|
class MockDatabaseLocationListener : public AzToolsFramework::AssetDatabase::AssetDatabaseRequests::Bus::Handler
|
|
{
|
|
public:
|
|
MOCK_METHOD1(GetAssetDatabaseLocation, bool(AZStd::string&));
|
|
};
|
|
|
|
class AssetProcessorManagerTest
|
|
: public AssetProcessor::AssetProcessorTest
|
|
{
|
|
public:
|
|
|
|
|
|
AssetProcessorManagerTest();
|
|
virtual ~AssetProcessorManagerTest()
|
|
{
|
|
}
|
|
|
|
// utility function. Blocks and runs the QT event pump for up to millisecondsMax and will break out as soon as the APM is idle.
|
|
bool BlockUntilIdle(int millisecondsMax);
|
|
|
|
protected:
|
|
void SetUp() override;
|
|
void TearDown() override;
|
|
|
|
QTemporaryDir m_tempDir;
|
|
|
|
AZStd::unique_ptr<AssetProcessorManager_Test> m_assetProcessorManager;
|
|
AZStd::unique_ptr<AssetProcessor::MockApplicationManager> m_mockApplicationManager;
|
|
AZStd::unique_ptr<AssetProcessor::PlatformConfiguration> m_config;
|
|
QString m_gameName;
|
|
QDir m_normalizedCacheRootDir;
|
|
AZStd::atomic_bool m_isIdling;
|
|
QMetaObject::Connection m_idleConnection;
|
|
|
|
struct StaticData
|
|
{
|
|
AZStd::string m_databaseLocation;
|
|
::testing::NiceMock<MockDatabaseLocationListener> m_databaseLocationListener;
|
|
AZ::Entity* m_jobManagerEntity{};
|
|
AZ::ComponentDescriptor* m_descriptor{};
|
|
AZStd::unique_ptr<AZ::SerializeContext> m_serializeContext;
|
|
};
|
|
|
|
AZStd::unique_ptr<StaticData> m_data;
|
|
|
|
private:
|
|
int m_argc;
|
|
char** m_argv;
|
|
AZStd::unique_ptr<UnitTestUtils::ScopedDir> m_scopeDir;
|
|
|
|
AZStd::unique_ptr<QCoreApplication> m_qApp;
|
|
};
|
|
|
|
struct AbsolutePathProductDependencyTest
|
|
: public AssetProcessorManagerTest
|
|
{
|
|
void SetUp() override;
|
|
|
|
AzToolsFramework::AssetDatabase::ProductDependencyDatabaseEntry SetAndReadAbsolutePathProductDependencyFromRelativePath(
|
|
const AZStd::string& relativePath);
|
|
|
|
AZStd::string BuildScanFolderRelativePath(const AZStd::string& relativePath) const;
|
|
|
|
AzToolsFramework::AssetDatabase::ProductDatabaseEntry m_productToHaveDependency;
|
|
const AssetProcessor::ScanFolderInfo* m_scanFolderInfo = nullptr;
|
|
AZStd::string m_testPlatform = "SomePlatform";
|
|
};
|
|
|
|
struct PathDependencyTest
|
|
: public AssetProcessorManagerTest
|
|
{
|
|
void SetUp() override;
|
|
void TearDown() override;
|
|
|
|
using OutputAssetSet = AZStd::vector<AZStd::vector<const char*>>;
|
|
|
|
struct TestAsset
|
|
{
|
|
TestAsset() = default;
|
|
TestAsset(const char* name) : m_name(name) {}
|
|
|
|
AZStd::string m_name;
|
|
AZStd::vector<AZ::Data::AssetId> m_products;
|
|
};
|
|
|
|
void CaptureJobs(AZStd::vector<AssetProcessor::JobDetails>& jobDetails, const char* sourceFilePath);
|
|
bool ProcessAsset(TestAsset& asset, const OutputAssetSet& outputAssets, const AssetBuilderSDK::ProductPathDependencySet& dependencies = {}, const AZStd::string& folderPath = "subfolder1/", const AZStd::string& extension = ".txt");
|
|
|
|
void RunWildcardTest(bool useCorrectDatabaseSeparator, AssetBuilderSDK::ProductPathDependencyType pathDependencyType, bool buildDependenciesFirst);
|
|
AssetProcessor::AssetDatabaseConnection* m_sharedConnection{};
|
|
};
|
|
|
|
struct DuplicateProcessTest
|
|
: public PathDependencyTest
|
|
{
|
|
void SetUp() override;
|
|
};
|
|
|
|
struct MultiplatformPathDependencyTest
|
|
: public PathDependencyTest
|
|
{
|
|
void SetUp() override;
|
|
};
|
|
|
|
struct WildcardSourceDependencyTest
|
|
: AssetProcessorManagerTest
|
|
{
|
|
bool Test(const AZStd::string& dependencyPath, AZStd::vector<AZStd::string>& resolvedPaths);
|
|
AZStd::vector<AZStd::string> FileAddedTest(const QString& path);
|
|
|
|
void SetUp() override;
|
|
};
|
|
|
|
struct MockBuilderInfoHandler
|
|
: public AssetProcessor::AssetBuilderInfoBus::Handler
|
|
{
|
|
~MockBuilderInfoHandler();
|
|
|
|
//! AssetProcessor::AssetBuilderInfoBus Interface
|
|
void GetMatchingBuildersInfo(const AZStd::string& assetPath, AssetProcessor::BuilderInfoList& builderInfoList) override;
|
|
void GetAllBuildersInfo(AssetProcessor::BuilderInfoList& builderInfoList) override;
|
|
|
|
void CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response);
|
|
void ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response);
|
|
|
|
AssetBuilderSDK::AssetBuilderDesc CreateBuilderDesc(const QString& builderName, const QString& builderId, const AZStd::vector<AssetBuilderSDK::AssetBuilderPattern>& builderPatterns);
|
|
|
|
AssetBuilderSDK::AssetBuilderDesc m_builderDesc;
|
|
QString m_jobFingerprint;
|
|
QString m_dependencyFilePath;
|
|
QString m_jobDependencyFilePath;
|
|
int m_createJobsCount = 0;
|
|
};
|
|
|
|
struct ModtimeScanningTest
|
|
: public AssetProcessorManagerTest
|
|
{
|
|
void SetUp() override;
|
|
void TearDown() override;
|
|
|
|
void ProcessAssetJobs();
|
|
void SimulateAssetScanner(QSet<AssetProcessor::AssetFileInfo> filePaths);
|
|
QSet<AssetProcessor::AssetFileInfo> BuildFileSet();
|
|
void ExpectWork(int createJobs, int processJobs);
|
|
void ExpectNoWork();
|
|
void SetFileContents(QString filePath, QString contents);
|
|
|
|
struct StaticData
|
|
{
|
|
QString m_relativePathFromWatchFolder[3];
|
|
AZStd::vector<QString> m_absolutePath;
|
|
AZStd::vector<AssetProcessor::JobDetails> m_processResults;
|
|
AZStd::unordered_multimap<AZStd::string, QString> m_productPaths;
|
|
AZStd::vector<QString> m_deletedSources;
|
|
AZStd::shared_ptr<AssetProcessor::InternalMockBuilder> m_builderTxtBuilder;
|
|
MockBuilderInfoHandler m_mockBuilderInfoHandler;
|
|
};
|
|
|
|
AZStd::unique_ptr<StaticData> m_data;
|
|
};
|
|
|
|
|
|
struct MetadataFileTest
|
|
: public AssetProcessorManagerTest
|
|
{
|
|
void SetUp() override;
|
|
};
|
|
|
|
struct FingerprintTest
|
|
: public AssetProcessorManagerTest
|
|
{
|
|
void SetUp() override;
|
|
void TearDown() override;
|
|
|
|
void RunFingerprintTest(QString builderFingerprint, QString jobFingerprint, bool expectedResult);
|
|
|
|
QString m_absolutePath;
|
|
MockBuilderInfoHandler m_mockBuilderInfoHandler;
|
|
AZStd::vector<AssetProcessor::JobDetails> m_jobResults;
|
|
};
|
|
|
|
struct JobDependencyTest
|
|
: public PathDependencyTest
|
|
{
|
|
void SetUp() override;
|
|
void TearDown() override;
|
|
|
|
struct StaticData
|
|
{
|
|
MockBuilderInfoHandler m_mockBuilderInfoHandler;
|
|
AZ::Uuid m_builderUuid;
|
|
};
|
|
|
|
AZStd::unique_ptr<StaticData> m_data;
|
|
};
|
|
|
|
struct MockMultiBuilderInfoHandler
|
|
: public AssetProcessor::AssetBuilderInfoBus::Handler
|
|
{
|
|
~MockMultiBuilderInfoHandler();
|
|
|
|
struct AssetBuilderExtraInfo
|
|
{
|
|
QString m_jobDependencyFilePath;
|
|
};
|
|
|
|
//! AssetProcessor::AssetBuilderInfoBus Interface
|
|
void GetMatchingBuildersInfo(const AZStd::string& assetPath, AssetProcessor::BuilderInfoList& builderInfoList) override;
|
|
void GetAllBuildersInfo(AssetProcessor::BuilderInfoList& builderInfoList) override;
|
|
|
|
void CreateJobs(AssetBuilderExtraInfo extraInfo, const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response);
|
|
void ProcessJob(AssetBuilderExtraInfo extraInfo, const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response);
|
|
|
|
void CreateBuilderDesc(const QString& builderName, const QString& builderId, const AZStd::vector<AssetBuilderSDK::AssetBuilderPattern>& builderPatterns, AssetBuilderExtraInfo extraInfo);
|
|
|
|
AZStd::vector<AssetBuilderSDK::AssetBuilderDesc> m_builderDesc;
|
|
AZStd::vector<AssetUtilities::BuilderFilePatternMatcher> m_matcherBuilderPatterns;
|
|
AZStd::unordered_map<AZ::Uuid, AssetBuilderSDK::AssetBuilderDesc> m_builderDescMap;
|
|
|
|
int m_createJobsCount = 0;
|
|
};
|
|
|
|
struct ChainJobDependencyTest
|
|
: public PathDependencyTest
|
|
{
|
|
void SetUp() override;
|
|
void TearDown() override;
|
|
|
|
struct StaticData
|
|
{
|
|
MockMultiBuilderInfoHandler m_mockBuilderInfoHandler;
|
|
AZStd::unique_ptr<AssetProcessor::RCController> m_rcController;
|
|
};
|
|
|
|
static constexpr int ChainLength = 10;
|
|
AZStd::unique_ptr<StaticData> m_data;
|
|
};
|
|
|
|
struct DuplicateProductsTest
|
|
: public AssetProcessorManagerTest
|
|
{
|
|
void SetupDuplicateProductsTest(QString& sourceFile, QDir& tempPath, QString& productFile, AZStd::vector<AssetProcessor::JobDetails>& jobDetails, AssetBuilderSDK::ProcessJobResponse& response, bool multipleOutputs, QString extension);
|
|
};
|
|
|
|
struct DeleteTest
|
|
: public ModtimeScanningTest
|
|
{
|
|
void SetUp() override;
|
|
};
|