chr
2026-04-08 53e656200368a983e563550e2cc1acbc6d86b729
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System.Linq;
using System.Threading.Tasks;
using NUnit.Framework;
using OpenTap.EngineUnitTestUtils;
 
 
namespace OpenTap.UnitTests;
 
[TestFixture]
public class PluginSearcherThreadSafeTest
{
    [TestCase(1)]
    [TestCase(5)]
    [TestCase(10)]
    [TestCase(20)]
    [TestCase(40)]
    public void TestSearchAsync(int searchCount)
    {
        using var session = Session.Create(SessionOptions.RedirectLogging);
        var listener = new TestTraceListener();
        Log.AddListener(listener);
        var tasks = Enumerable.Range(0, searchCount).Select(_ => PluginManager.SearchAsync()).ToArray();
        Task.WaitAll(tasks);
        Assert.That(tasks.All(t => t.IsCompletedSuccessfully));
        Assert.That(listener.ErrorMessage, Is.Empty);
    }
 
    [TestCase(1)]
    [TestCase(5)]
    [TestCase(10)]
    [TestCase(20)]
    [TestCase(40)]
    public void TestSearchSync(int searchCount)
    {
        using var session = Session.Create(SessionOptions.RedirectLogging);
        var listener = new TestTraceListener();
        Log.AddListener(listener);
        var tasks = Enumerable.Range(0, searchCount).Select(_ => TapThread.StartAwaitable(() => PluginManager.Search())).ToArray();
        Task.WaitAll(tasks);
        Assert.That(tasks.All(t => t.IsCompletedSuccessfully));
        Assert.That(listener.ErrorMessage, Is.Empty);
    }
 
    [TestCase(2)]
    [TestCase(6)]
    [TestCase(10)]
    [TestCase(20)]
    [TestCase(40)]
    public void TestSearchMixed(int searchCount)
    {
        using var session = Session.Create(SessionOptions.RedirectLogging);
        var listener = new TestTraceListener();
        Log.AddListener(listener);
        var tasks = Enumerable.Range(0, searchCount / 2).Select(_ => PluginManager.SearchAsync())
            .Concat(Enumerable.Range(0, searchCount / 2).Select(_ => TapThread.StartAwaitable(() => PluginManager.Search()))).ToArray();
        Task.WaitAll(tasks);
        Assert.That(tasks.All(t => t.IsCompletedSuccessfully));
        Assert.That(listener.ErrorMessage, Is.Empty);
    }
}