I'm using ETW logging. Here is my codes :
[EventSource(Name = "MyEventSource")]
public sealed class MyEventSource : EventSource
{
public static MyEventSource Log { get; set; } = new MyEventSource();
[NonEvent]
public void Register()
{
Registrator eventSourceRegistrator = new Registrator(this);
eventSourceRegistrator.Register();
}
[Event(120, Message = "App started.Process path: {0}", Level = EventLevel.Informational, Channel = EventChannel.Admin)]
public void ServerStarted(string proccessPath)
{
Register();
WriteEvent(120, proccessPath);
}
}
I'm trying to write unit test for this. For getting Logs from event viewer I'm using EventLogReader and EventRecord:
[TestMethod]
public void EventLogTest()
{
MyApp myApp = new MyApp();
var appStartedLog = GetEventRecordFromEventID(120);
Assert.IsNotNull(appStartedLog);
}
EventRecord GetEventRecordFromEventID(int eventID)
{
string source = "MyEventSource/Admin";
string query = $"*[System/EventID={eventID}]";
var elQuery = new EventLogQuery(source, PathType.LogName, query);
using (var elReader = new EventLogReader(elQuery))
{
List<EventRecord> eventRecords = new List<EventRecord>();
for (EventRecord eventInstance = elReader.ReadEvent(); eventInstance != null; eventInstance = elReader.ReadEvent())
{
eventRecords.Add(eventInstance);
}
var res = eventRecords.OrderBy(a => a.TimeCreated).LastOrDefault();
return res;
}
}
Also MyApp class:
public class MyApp
{
public MyApp()
{
Start();
}
public void Start()
{
var proccessPath = Process.GetCurrentProcess().MainModule.FileName;
MyEventSource.Log.ServerStarted(proccessPath);
}
}
When I clear log from event viewer and run EventLogTest it fails. But after failing test I checked event viewer again and there is my log:
Then I changed my test :
[TestMethod]
public void EventLogTest()
{
MyApp myApp = new MyApp();
Thread.Sleep(2000);
var appStartedLog = GetEventRecordFromEventID(120);
Assert.IsNotNull(appStartedLog);
}
Now I clear logs and run test. It passes. My question is: why it logs 2 second later and how to write unit test for that ?