diff options
author | Sung Yoon Whang <suwhang@microsoft.com> | 2019-07-22 21:32:01 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-22 21:32:01 -0700 |
commit | c01a9a157d512343ef104bb2b1f97b356e708b11 (patch) | |
tree | d5c2e2ed1dbc62cc7ba14c2f61b35ef8cbb4f20a /tests | |
parent | 7e8941976e98230ccaf890c8966a5b506fb280bd (diff) | |
download | coreclr-c01a9a157d512343ef104bb2b1f97b356e708b11.tar.gz coreclr-c01a9a157d512343ef104bb2b1f97b356e708b11.tar.bz2 coreclr-c01a9a157d512343ef104bb2b1f97b356e708b11.zip |
[3.0 port] Fix first value of counter payload being skewed (#25799)
* Fix issue 25709
* rename
* Fix regression test
* cleanup
* Code review feedback
* set maxincrement to 3
* test fix
Diffstat (limited to 'tests')
-rw-r--r-- | tests/src/tracing/eventcounter/regression-25709.cs | 117 | ||||
-rw-r--r-- | tests/src/tracing/eventcounter/regression-25709.csproj | 30 |
2 files changed, 147 insertions, 0 deletions
diff --git a/tests/src/tracing/eventcounter/regression-25709.cs b/tests/src/tracing/eventcounter/regression-25709.cs new file mode 100644 index 0000000000..b18565b8a8 --- /dev/null +++ b/tests/src/tracing/eventcounter/regression-25709.cs @@ -0,0 +1,117 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#if USE_MDT_EVENTSOURCE +using Microsoft.Diagnostics.Tracing; +#else +using System.Diagnostics.Tracing; +#endif +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Diagnostics; + +namespace EventCounterRegressionTests +{ + + public class SimpleEventListener : EventListener + { + private readonly EventLevel _level = EventLevel.Verbose; + + public int MaxIncrement { get; private set; } = 0; + + public SimpleEventListener() + { + } + + + protected override void OnEventSourceCreated(EventSource source) + { + if (source.Name.Equals("System.Runtime")) + { + Dictionary<string, string> refreshInterval = new Dictionary<string, string>(); + refreshInterval.Add("EventCounterIntervalSec", "1"); + EnableEvents(source, _level, (EventKeywords)(-1), refreshInterval); + } + } + + protected override void OnEventWritten(EventWrittenEventArgs eventData) + { + int increment = 0; + bool isExceptionCounter = false; + + for (int i = 0; i < eventData.Payload.Count; i++) + { + IDictionary<string, object> eventPayload = eventData.Payload[i] as IDictionary<string, object>; + if (eventPayload != null) + { + foreach (KeyValuePair<string, object> payload in eventPayload) + { + if (payload.Key.Equals("Name") && payload.Value.ToString().Equals("exception-count")) + isExceptionCounter = true; + if (payload.Key.Equals("Increment")) + { + increment = Int32.Parse(payload.Value.ToString()); + } + } + if (isExceptionCounter) + { + if (MaxIncrement < increment) + { + MaxIncrement = increment; + } + } + } + } + } + } + + public partial class TestEventCounter + { + + public static void ThrowExceptionTask() + { + // This will throw an exception every 1000 ms + while (true) + { + Thread.Sleep(1000); + try + { + Debug.WriteLine("Exception thrown at " + DateTime.UtcNow.ToString("mm.ss.ffffff")); + throw new Exception("an exception"); + } + catch + {} + } + } + + public static int Main(string[] args) + { + Task exceptionTask = Task.Run(ThrowExceptionTask); + Thread.Sleep(5000); + + // Create an EventListener. + using (SimpleEventListener myListener = new SimpleEventListener()) + { + Thread.Sleep(5000); + + // The number below is supposed to be 2 at maximum, but in debug builds, the calls to + // EventSource.Write() takes a lot longer than we thought(~1s), and the reflection in + // workingset counter also adds a huge amount of time (> 1s), which makes the test fail in + // debug CIs. Setting the check to 4 to compensate for these. + if (myListener.MaxIncrement > 4) + { + Console.WriteLine($"Test Failed - Saw more than 3 exceptions / sec {myListener.MaxIncrement}"); + return 1; + } + else + { + Console.WriteLine("Test passed"); + return 100; + } + } + } + } +}
\ No newline at end of file diff --git a/tests/src/tracing/eventcounter/regression-25709.csproj b/tests/src/tracing/eventcounter/regression-25709.csproj new file mode 100644 index 0000000000..c39d10eb9b --- /dev/null +++ b/tests/src/tracing/eventcounter/regression-25709.csproj @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{8E3244CB-407F-4142-BAAB-E7A55901A5FA}</ProjectGuid> + <OutputType>Exe</OutputType> + <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir> + <CLRTestKind>BuildAndRun</CLRTestKind> + <DefineConstants>$(DefineConstants);STATIC</DefineConstants> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> + <CLRTestPriority>0</CLRTestPriority> + <GCStressIncompatible>true</GCStressIncompatible> + <!-- This test has a secondary thread with an infinite loop --> + <UnloadabilityIncompatible>true</UnloadabilityIncompatible> + </PropertyGroup> + <!-- Default configurations to help VS understand the configurations --> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> + </PropertyGroup> + <ItemGroup> + <Compile Include="regression-25709.cs" /> + <ProjectReference Include="../common/common.csproj" /> + </ItemGroup> + <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" /> +</Project> |