99 lines
2.8 KiB
C#
99 lines
2.8 KiB
C#
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Reactive.Concurrency;
|
|||
|
using System.Threading;
|
|||
|
#if NUNIT
|
|||
|
using NUnit.Framework;
|
|||
|
using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
|
|||
|
using TestMethodAttribute = NUnit.Framework.TestAttribute;
|
|||
|
using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
|
|||
|
#else
|
|||
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|||
|
#endif
|
|||
|
|
|||
|
namespace ReactiveTests.Tests
|
|||
|
{
|
|||
|
[TestClass]
|
|||
|
public class ConcurrencyTest
|
|||
|
{
|
|||
|
[TestMethod]
|
|||
|
public void CurrentScheduler_EnsureTrampoline()
|
|||
|
{
|
|||
|
const int concurrency = 100;
|
|||
|
|
|||
|
var passed = true;
|
|||
|
|
|||
|
var s = new Semaphore(0, int.MaxValue);
|
|||
|
var e = new ManualResetEvent(false);
|
|||
|
|
|||
|
for (var i = 0; i < concurrency; ++i)
|
|||
|
NewThreadScheduler.Default.Schedule(() =>
|
|||
|
{
|
|||
|
e.WaitOne();
|
|||
|
try
|
|||
|
{
|
|||
|
if (Scheduler.CurrentThread.ScheduleRequired)
|
|||
|
Scheduler.CurrentThread.Schedule(() => { });
|
|||
|
else
|
|||
|
new Action(() => { })();
|
|||
|
}
|
|||
|
catch (NullReferenceException)
|
|||
|
{
|
|||
|
passed = false;
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
s.Release();
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
e.Set();
|
|||
|
|
|||
|
for (var i = 0; i < concurrency; ++i)
|
|||
|
s.WaitOne();
|
|||
|
|
|||
|
Assert.IsTrue(passed);
|
|||
|
}
|
|||
|
|
|||
|
[TestMethod]
|
|||
|
public void CurrentScheduler_Schedule()
|
|||
|
{
|
|||
|
const int concurrency = 100;
|
|||
|
|
|||
|
var passed = true;
|
|||
|
|
|||
|
var s = new Semaphore(0, int.MaxValue);
|
|||
|
var e = new ManualResetEvent(false);
|
|||
|
|
|||
|
for (var i = 0; i < concurrency; ++i)
|
|||
|
NewThreadScheduler.Default.Schedule(() =>
|
|||
|
{
|
|||
|
e.WaitOne();
|
|||
|
try
|
|||
|
{
|
|||
|
if (Scheduler.CurrentThread.ScheduleRequired)
|
|||
|
Scheduler.CurrentThread.Schedule(() => { });
|
|||
|
else
|
|||
|
new Action(() => { })();
|
|||
|
}
|
|||
|
catch (NullReferenceException)
|
|||
|
{
|
|||
|
passed = false;
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
s.Release();
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
e.Set();
|
|||
|
|
|||
|
for (var i = 0; i < concurrency; ++i)
|
|||
|
s.WaitOne();
|
|||
|
|
|||
|
Assert.IsTrue(passed);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|