[LYN-9953] Asset Processor: Fix file watcher event handlers calling APM methods directly instead … (#7289)

* Fix file watcher event handlers calling APM methods directly instead of queuing them to run on the APM thread

Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>

* Add unit test

Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>

* Fix compile errors

Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>

* Fix compile errors

Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>

* Fix compile errors

Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>

* Fix compile errors

Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>

* Change ASSERT_ checks to EXPECT_ checks

Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>

* Refactored Test

Removed leftover direct call
Changed invokeMethod to use lambda form

Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>

* Fix compile error

Signed-off-by: amzn-mike <80125227+amzn-mike@users.noreply.github.com>
This commit is contained in:
amzn-mike
2022-02-14 11:09:39 -06:00
committed by GitHub
parent 6f52fcb9f0
commit 5dd88ba05c
18 changed files with 452 additions and 73 deletions
@@ -0,0 +1,27 @@
/*
* 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
*
*/
#include <tests/assetmanager/MockAssetProcessorManager.h>
namespace UnitTests
{
void MockAssetProcessorManager::AssessAddedFile(QString filePath)
{
m_events[TestEvents::Added].Signal();
}
void MockAssetProcessorManager::AssessModifiedFile(QString filePath)
{
m_events[TestEvents::Modified].Signal();
}
void MockAssetProcessorManager::AssessDeletedFile(QString filePath)
{
m_events[TestEvents::Deleted].Signal();
}
}
@@ -0,0 +1,32 @@
/*
* 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 <QObject>
#include <native/AssetManager/assetProcessorManager.h>
#include <tests/assetmanager/TestEventSignal.h>
namespace UnitTests
{
struct MockAssetProcessorManager : ::AssetProcessor::AssetProcessorManager
{
Q_OBJECT
using AssetProcessorManager::AssetProcessorManager;
public Q_SLOTS:
void AssessAddedFile(QString filePath) override;
void AssessModifiedFile(QString filePath) override;
void AssessDeletedFile(QString filePath) override;
public:
TestEventPair m_events[TestEvents::NumEvents];
};
}
@@ -0,0 +1,22 @@
/*
* 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
*
*/
#include "MockFileProcessor.h"
namespace UnitTests
{
void MockFileProcessor::AssessAddedFile(QString fileName)
{
m_events[TestEvents::Added].Signal();
}
void MockFileProcessor::AssessDeletedFile(QString fileName)
{
m_events[TestEvents::Deleted].Signal();
}
}
@@ -0,0 +1,30 @@
/*
* 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 <QObject>
#include <FileProcessor/FileProcessor.h>
#include <tests/assetmanager/TestEventSignal.h>
namespace UnitTests
{
struct MockFileProcessor : ::AssetProcessor::FileProcessor
{
Q_OBJECT
using FileProcessor::FileProcessor;
public Q_SLOTS:
void AssessAddedFile(QString fileName) override;
void AssessDeletedFile(QString fileName) override;
public:
TestEventPair m_events[TestEvents::NumEvents];
};
}
@@ -0,0 +1,37 @@
/*
* 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
*
*/
#include <native/tests/assetmanager/TestEventSignal.h>
#include <AzCore/std/parallel/thread.h>
#include <AzCore/UnitTest/TestTypes.h>
namespace UnitTests
{
void TestEventPair::Signal()
{
bool expected = false;
ASSERT_TRUE(m_signaled.compare_exchange_strong(expected, true));
ASSERT_EQ(m_threadId, AZStd::thread_id{});
m_threadId = AZStd::this_thread::get_id();
m_event.release();
}
bool TestEventPair::WaitAndCheck()
{
constexpr int MaxWaitTimeMilliseconds = 100;
auto thisThreadId = AZStd::this_thread::get_id();
bool acquireSuccess = m_event.try_acquire_for(AZStd::chrono::milliseconds(MaxWaitTimeMilliseconds));
EXPECT_TRUE(acquireSuccess);
EXPECT_NE(m_threadId, AZStd::thread_id{});
EXPECT_TRUE(m_threadId != thisThreadId);
return acquireSuccess && m_threadId != AZStd::thread_id{} && m_threadId != thisThreadId;
}
}
@@ -0,0 +1,33 @@
/*
* 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 <AzCore/std/parallel/binary_semaphore.h>
namespace UnitTests
{
class TestEventPair
{
AZStd::atomic_bool m_signaled{ false };
AZStd::thread_id m_threadId;
AZStd::binary_semaphore m_event;
public:
void Signal();
bool WaitAndCheck();
};
enum TestEvents : int
{
Added = 0,
Modified,
Deleted,
NumEvents
};
}