Skip to content

Commit ca8be79

Browse files
committed
add a test for valuetask source
1 parent 91a5c9f commit ca8be79

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System;
5+
using System.Runtime.CompilerServices;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using System.Threading.Tasks.Sources;
9+
using Xunit;
10+
11+
public class Async2ValueTaskSource
12+
{
13+
static string trace;
14+
15+
[Fact]
16+
static void TestEntry()
17+
{
18+
ValueTask vtUseContext = new ValueTask(new Source(true), 1);
19+
20+
AwaitConfigDefault(vtUseContext).GetAwaiter().GetResult();
21+
Assert.Equal("UseSchedulingContext", trace);
22+
AwaitConfigTrue(vtUseContext).GetAwaiter().GetResult();
23+
Assert.Equal("UseSchedulingContext", trace);
24+
AwaitConfigFalse(vtUseContext).GetAwaiter().GetResult();
25+
Assert.Equal("None", trace);
26+
27+
ValueTask vtIgnoreContext = new ValueTask(new Source(true), 1);
28+
AwaitConfigDefault(vtIgnoreContext).GetAwaiter().GetResult();
29+
Assert.Equal("UseSchedulingContext", trace);
30+
AwaitConfigTrue(vtIgnoreContext).GetAwaiter().GetResult();
31+
Assert.Equal("UseSchedulingContext", trace);
32+
AwaitConfigFalse(vtIgnoreContext).GetAwaiter().GetResult();
33+
Assert.Equal("None", trace);
34+
35+
Console.WriteLine();
36+
SynchronizationContext.SetSynchronizationContext(new SideeffectingContext());
37+
38+
AwaitConfigDefault(vtUseContext).GetAwaiter().GetResult();
39+
Assert.Equal("UseSchedulingContext Posted", trace);
40+
AwaitConfigTrue(vtUseContext).GetAwaiter().GetResult();
41+
Assert.Equal("UseSchedulingContext Posted", trace);
42+
AwaitConfigFalse(vtUseContext).GetAwaiter().GetResult();
43+
Assert.Equal("None Posted", trace);
44+
45+
AwaitConfigDefault(vtIgnoreContext).GetAwaiter().GetResult();
46+
Assert.Equal("UseSchedulingContext Posted", trace);
47+
AwaitConfigTrue(vtIgnoreContext).GetAwaiter().GetResult();
48+
Assert.Equal("UseSchedulingContext Posted", trace);
49+
AwaitConfigFalse(vtIgnoreContext).GetAwaiter().GetResult();
50+
Assert.Equal("None Posted", trace);
51+
}
52+
53+
class SideeffectingContext : SynchronizationContext
54+
{
55+
public override void Post(SendOrPostCallback d, object? state)
56+
{
57+
trace += " Posted";
58+
base.Post(d, state);
59+
}
60+
}
61+
62+
static async ValueTask AwaitConfigDefault(ValueTask vt)
63+
{
64+
await (vt);
65+
}
66+
67+
static async ValueTask AwaitConfigTrue(ValueTask vt)
68+
{
69+
await (vt).ConfigureAwait(true);
70+
}
71+
72+
static async ValueTask AwaitConfigFalse(ValueTask vt)
73+
{
74+
await (vt).ConfigureAwait(false);
75+
}
76+
77+
class Source : IValueTaskSource
78+
{
79+
private readonly bool _useContext;
80+
public Source(bool useContext)
81+
{
82+
_useContext = useContext;
83+
}
84+
85+
public void GetResult(short token)
86+
{
87+
}
88+
89+
public ValueTaskSourceStatus GetStatus(short token)
90+
{
91+
return ValueTaskSourceStatus.Pending;
92+
}
93+
94+
public void OnCompleted(Action<object?> continuation, object? state, short token, ValueTaskSourceOnCompletedFlags flags)
95+
{
96+
trace = flags.ToString();
97+
98+
var schedulingContext = SynchronizationContext.Current;
99+
if (_useContext && schedulingContext != null)
100+
{
101+
schedulingContext.Post((obj) => continuation(obj), state);
102+
}
103+
else
104+
{
105+
ThreadPool.QueueUserWorkItem((obj) => continuation(obj), state);
106+
}
107+
}
108+
}
109+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project Sdk="Microsoft.NET.Sdk.IL">
2+
<PropertyGroup>
3+
<Optimize>True</Optimize>
4+
</PropertyGroup>
5+
<ItemGroup>
6+
<Compile Include="$(MSBuildProjectName).cs" />
7+
</ItemGroup>
8+
</Project>

0 commit comments

Comments
 (0)