Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 24f53c7

Browse files
committed
Make SystemEvents tests more patient
1 parent ca3a186 commit 24f53c7

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

src/Microsoft.Win32.SystemEvents/tests/SystemEvents.CreateTimer.cs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,34 +64,43 @@ public void TimerElapsedSignaled()
6464
finally
6565
{
6666
SystemEvents.TimerElapsed -= handler;
67+
elapsed.Dispose();
6768
}
6869
}
6970

7071
[Fact]
7172
public void ConcurrentTimers()
7273
{
73-
const int numConcurrentTimers = 10;
74+
const int NumConcurrentTimers = 10;
7475
var timersSignalled = new Dictionary<IntPtr, bool>();
76+
int numSignaled = 0;
77+
var elapsed = new AutoResetEvent(false);
7578

7679
TimerElapsedEventHandler handler = (sender, args) =>
7780
{
78-
if (timersSignalled.ContainsKey(args.TimerId))
81+
bool signaled = false;
82+
if (timersSignalled.TryGetValue(args.TimerId, out signaled) && !signaled)
7983
{
8084
timersSignalled[args.TimerId] = true;
85+
86+
if (Interlocked.Increment(ref numSignaled) == NumConcurrentTimers)
87+
{
88+
elapsed.Set();
89+
}
8190
}
8291
};
8392

8493
SystemEvents.TimerElapsed += handler;
8594
try
8695
{
87-
for (int i = 0; i < numConcurrentTimers; i++)
96+
for (int i = 0; i < NumConcurrentTimers; i++)
8897
{
8998
timersSignalled[SystemEvents.CreateTimer(TimerInterval)] = false;
9099
}
91100

92-
Thread.Sleep(TimerInterval * SystemEventsTest.ExpectedEventMultiplier);
101+
Assert.True(elapsed.WaitOne(TimerInterval * SystemEventsTest.ExpectedEventMultiplier));
93102

94-
foreach(var timer in timersSignalled.Keys.ToArray())
103+
foreach (var timer in timersSignalled.Keys.ToArray())
95104
{
96105
Assert.True(timersSignalled[timer]);
97106
SystemEvents.KillTimer(timer);
@@ -100,6 +109,7 @@ public void ConcurrentTimers()
100109
finally
101110
{
102111
SystemEvents.TimerElapsed -= handler;
112+
elapsed.Dispose();
103113
}
104114
}
105115

@@ -112,7 +122,8 @@ public void ConcurrentTimers()
112122
[InlineData(30000)] // 30s
113123
public void TimerElapsedIsRoughlyEquivalentToInterval(int interval)
114124
{
115-
const double permittedPercentDifference = 0.1;
125+
const double permittedProportionUnder = -0.1;
126+
const double permittedProportionOver = 0.5;
116127
var elapsed = new AutoResetEvent(false);
117128
IntPtr timer = IntPtr.Zero;
118129
var stopwatch = new Stopwatch();
@@ -133,14 +144,15 @@ public void TimerElapsedIsRoughlyEquivalentToInterval(int interval)
133144
stopwatch.Start();
134145
Assert.True(elapsed.WaitOne(interval * SystemEventsTest.ExpectedEventMultiplier));
135146

136-
var percentDifference = (double)Math.Abs(stopwatch.ElapsedMilliseconds - interval) / interval;
137-
Assert.True(percentDifference < permittedPercentDifference, $"Timer should fire within {permittedPercentDifference * 100.0}% of expected interval {interval}, actual: {stopwatch.ElapsedMilliseconds}, difference: {percentDifference * 100.0}%");
147+
var proportionDifference = (double)(stopwatch.ElapsedMilliseconds - interval) / interval;
148+
Assert.True(permittedProportionUnder < proportionDifference && proportionDifference < permittedProportionOver,
149+
$"Timer should fire less than {permittedProportionUnder * 100.0}% before and less than {permittedProportionOver * 100.0}% after expected interval {interval}, actual: {stopwatch.ElapsedMilliseconds}, difference: {proportionDifference * 100.0}%");
150+
138151
}
139152
finally
140153
{
141154
SystemEvents.TimerElapsed -= handler;
142155
}
143-
144156
}
145157

146158
[Fact]

src/Microsoft.Win32.SystemEvents/tests/SystemEventsTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public abstract class SystemEventsTest
1212
{
1313
IntPtr s_hwnd = IntPtr.Zero;
1414

15-
public const int PostMessageWait = 100;
16-
public const int ExpectedEventMultiplier = 100;
15+
public const int PostMessageWait = 10000;
16+
public const int ExpectedEventMultiplier = 1000;
1717
public const int UnexpectedEventMultiplier = 10;
1818

1919
protected IntPtr SendMessage(int msg, IntPtr wParam, IntPtr lParam)

0 commit comments

Comments
 (0)