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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
using System;
using System.Threading;
using System.Threading.Tasks;
using NUnit.Framework;
using System.Security;
using System.Security.Permissions;
using System.Security.Principal;
namespace MonoTests.System.Threading.Tasks
{
[TestFixture]
public class ThreadPrincipalTests
{
#if !MONOTOUCH // Uses LogicalCallContext
[Test]
[Category ("MultiThreaded")]
public void PrincipalFlowsToAsyncTask ()
{
/* run in different thread to work around problems on platforms
* where SynchronizationContext is set (e.g. Xamarin.iOS) */
Assert.IsTrue (Task.Run (async () => await _PrincipalFlowsToAsyncTask ()).Wait (5000));
}
#endif
public async Task _PrincipalFlowsToAsyncTask ()
{
var mockIdentity = new MockIdentity {
AuthenticationType = "authtype",
IsAuthenticated = true,
Name = "name"
};
var mockPrincipal = new MockPrincipal {
Identity = mockIdentity
};
var oldPrincipal = Thread.CurrentPrincipal;
Thread.CurrentPrincipal = mockPrincipal;
try {
await Task.Factory.StartNew(async () =>
{
var newThreadId = Thread.CurrentThread.ManagedThreadId; // on different thread.
Assert.IsTrue(Thread.CurrentPrincipal.Identity.IsAuthenticated);
Assert.AreEqual(mockPrincipal, Thread.CurrentPrincipal);
await Task.Factory.StartNew(() =>
{
// still works even when nesting..
newThreadId = Thread.CurrentThread.ManagedThreadId;
Assert.IsTrue(Thread.CurrentPrincipal.Identity.IsAuthenticated);
Assert.AreEqual(mockPrincipal, Thread.CurrentPrincipal);
}, TaskCreationOptions.LongRunning);
}, TaskCreationOptions.LongRunning);
await Task.Run(() =>
{
// Following works on NET4.7 and fails under Xamarin.Android.
var newThreadId = Thread.CurrentThread.ManagedThreadId;
Assert.IsTrue(Thread.CurrentPrincipal.Identity.IsAuthenticated);
Assert.AreEqual(mockPrincipal, Thread.CurrentPrincipal);
});
} finally {
Thread.CurrentPrincipal = oldPrincipal;
}
}
}
public class MockPrincipal : IPrincipal {
public IIdentity Identity { get; set; }
public bool IsInRole (string role) {
return true;
}
}
public class MockIdentity : IIdentity {
public string AuthenticationType { get; set; }
public bool IsAuthenticated { get; set; }
public string Name { get; set; }
}
}
|