Files
Hasebe/Library/PackageCache/com.unity.scriptablebuildpipeline@61526b33bf2c/Tests/Editor/ThreadingManagerTasks.cs
T
2026-09-21 12:15:57 +03:00

161 lines
5.3 KiB
C#

using System.Collections.Concurrent;
using System.Threading;
using NUnit.Framework;
namespace UnityEditor.Build.Pipeline.Tests
{
/// <summary>
/// ThreadingManagerTasks
/// </summary>
[TestFixture]
public class ThreadingManagerTasks
{
/// <summary>
/// ThreadingTasks_SameQueues_ExecuteSequentially
/// </summary>
/// <param name="queue">queue</param>
[TestCase(ThreadingManager.ThreadQueues.SaveQueue)]
[TestCase(ThreadingManager.ThreadQueues.UploadQueue)]
[TestCase(ThreadingManager.ThreadQueues.PruneQueue)]
public void ThreadingTasks_SameQueues_ExecuteSequentially(object queue)
{
var testQueue = (ThreadingManager.ThreadQueues)queue;
SemaphoreSlim s1 = new SemaphoreSlim(0);
SemaphoreSlim s2 = new SemaphoreSlim(0);
ConcurrentQueue<int> callOrder = new ConcurrentQueue<int>();
ThreadingManager.QueueTask(testQueue, (_) =>
{
s1.Wait();
callOrder.Enqueue(1);
Thread.Sleep(50);
callOrder.Enqueue(2);
}, null);
ThreadingManager.QueueTask(testQueue, (_) =>
{
callOrder.Enqueue(3);
}, null);
Thread.Sleep(100);
s1.Release();
ThreadingManager.WaitForOutstandingTasks();
Assert.AreEqual(3, callOrder.Count);
CollectionAssert.AreEqual(new[] { 1, 2, 3 }, callOrder.ToArray());
}
/// <summary>
/// ThreadingTasks_SaveQueue_RunsInParallelWith_UploadQueue
/// </summary>
[Test]
public void ThreadingTasks_SaveQueue_RunsInParallelWith_UploadQueue()
{
SemaphoreSlim s1 = new SemaphoreSlim(0);
SemaphoreSlim s2 = new SemaphoreSlim(0);
SemaphoreSlim s3 = new SemaphoreSlim(0);
ConcurrentQueue<int> callOrder = new ConcurrentQueue<int>();
ThreadingManager.QueueTask(ThreadingManager.ThreadQueues.SaveQueue, (_) =>
{
s1.Wait();
callOrder.Enqueue(1);
s2.Release();
s3.Wait();
callOrder.Enqueue(2);
}, null);
ThreadingManager.QueueTask(ThreadingManager.ThreadQueues.UploadQueue, (_) =>
{
s2.Wait();
callOrder.Enqueue(3);
s3.Release();
}, null);
Thread.Sleep(100);
s1.Release();
ThreadingManager.WaitForOutstandingTasks();
Assert.AreEqual(3, callOrder.Count);
CollectionAssert.AreEqual(new[] { 1, 3, 2 }, callOrder.ToArray());
}
/// <summary>
/// ThreadingTasks_PruneQueue_RunsAfter_SaveAndUploadQueue
/// </summary>
[Test]
public void ThreadingTasks_PruneQueue_RunsAfter_SaveAndUploadQueue()
{
SemaphoreSlim s1 = new SemaphoreSlim(0);
SemaphoreSlim s2 = new SemaphoreSlim(0);
SemaphoreSlim s3 = new SemaphoreSlim(0);
ConcurrentQueue<int> callOrder = new ConcurrentQueue<int>();
ThreadingManager.QueueTask(ThreadingManager.ThreadQueues.SaveQueue, (_) =>
{
s1.Wait();
callOrder.Enqueue(1);
s2.Release();
s3.Wait();
callOrder.Enqueue(2);
}, null);
ThreadingManager.QueueTask(ThreadingManager.ThreadQueues.UploadQueue, (_) =>
{
s2.Wait();
callOrder.Enqueue(3);
s3.Release();
}, null);
ThreadingManager.QueueTask(ThreadingManager.ThreadQueues.PruneQueue, (_) =>
{
callOrder.Enqueue(4);
}, null);
Thread.Sleep(100);
s1.Release();
ThreadingManager.WaitForOutstandingTasks();
Assert.AreEqual(4, callOrder.Count);
CollectionAssert.AreEqual(new[] { 1, 3, 2, 4 }, callOrder.ToArray());
}
/// <summary>
/// WhenPruneTaskActive_SaveAndUploadTasksWaitForPruneCompletion
/// </summary>
[Test]
public void WhenPruneTaskActive_SaveAndUploadTasksWaitForPruneCompletion()
{
SemaphoreSlim s1 = new SemaphoreSlim(0);
ConcurrentQueue<int> callOrder = new ConcurrentQueue<int>();
ThreadingManager.QueueTask(ThreadingManager.ThreadQueues.PruneQueue, (_) =>
{
s1.Wait();
callOrder.Enqueue(1);
}, null);
ThreadingManager.QueueTask(ThreadingManager.ThreadQueues.SaveQueue, (_) =>
{
callOrder.Enqueue(2);
}, null);
ThreadingManager.QueueTask(ThreadingManager.ThreadQueues.UploadQueue, (_) =>
{
callOrder.Enqueue(3);
}, null);
Thread.Sleep(100);
s1.Release();
ThreadingManager.WaitForOutstandingTasks();
Assert.AreEqual(3, callOrder.Count);
Assert.IsTrue(callOrder.TryDequeue(out int result));
Assert.AreEqual(1, result);
var results = callOrder.ToArray();
CollectionAssert.AreEquivalent(new[] { 2, 3 }, results);
}
}
}