You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
269 lines
8.7 KiB
C++
269 lines
8.7 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/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;
|
|
};
|
|
|
|
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 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;
|
|
};
|