FixAntenna/Tools/TestUtils/Hooks/EventHook.cs (103 lines of code) (raw):

// Copyright (c) 2021 EPAM Systems // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using System; using System.Threading; using Epam.FixAntenna.NetCore.Common.Logging; namespace Epam.FixAntenna.TestUtils.Hooks { internal class EventHook { private static readonly ILog Log = LogFactory.GetLog(typeof(EventHook)); protected readonly object LockObject = new object(); protected Event EventState = Event.Unknown; protected long TimeToWaitSum; public object EventData { get; set; } public string Name { get; } public int TimeToWait { get; } public EventHook(string eventName) : this(eventName, int.MaxValue) { } public EventHook(string eventName, int timeToWait) { TimeToWait = timeToWait; Name = eventName; } [Obsolete] public EventHook(string eventName, long timeToWait) { TimeToWait = (int)timeToWait; Name = eventName; } public virtual void RaiseEvent() { EventState = Event.RaisedEvent; lock (LockObject) { Monitor.PulseAll(LockObject); } if (Log.IsDebugEnabled) { Log.Debug("Event " + Name + " raised"); } } public virtual void ResetEvent() { lock (LockObject) { EventState = Event.Unknown; } if (Log.IsDebugEnabled) { Log.Debug("Event " + Name + " reset"); } } public virtual bool IsEventRaised() { if (EventState == Event.RaisedEvent) { return true; } lock (LockObject) { Monitor.Wait(LockObject, TimeToWait); } return EventState == Event.RaisedEvent; } public virtual bool IsEventRaised(int timeout) { if (EventState == Event.RaisedEvent) { return true; } lock (LockObject) { Monitor.Wait(LockObject, timeout); if (EventState != Event.RaisedEvent) { TimeToWaitSum += timeout; if (TimeToWaitSum >= TimeToWait) { EventState = Event.Timeout; } } return EventState == Event.RaisedEvent; } } public virtual bool IsTimeOut() { lock (LockObject) { return EventState == Event.Timeout; } } [Obsolete] public virtual string GetName() { return Name ?? ToString(); } [Obsolete] public virtual long GetTimeToWait() { return TimeToWait; } } }