Skip to content

Commit 95558fa

Browse files
authored
Merge pull request connamara#956 from hvanderwal-mylette/bugfix/955_FileLogClear
Bugfix 955 FileLog.Clear() does not clear the log files, and causes any further logging to throw exceptions
2 parents 536e9ff + eac9aef commit 95558fa

File tree

3 files changed

+64
-26
lines changed

3 files changed

+64
-26
lines changed

QuickFIXn/Logger/FileLog.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ private void EnsureEventLogInit(bool append = true)
9090

9191
#region Log Members
9292

93+
/// <summary>
94+
/// Delete log content and leave ready for next log message
95+
/// </summary>
9396
public void Clear()
9497
{
9598
lock (_sync)
@@ -99,6 +102,9 @@ public void Clear()
99102
_messageLog?.Dispose();
100103
_eventLog?.Dispose();
101104

105+
_messageLog = null;
106+
_eventLog = null;
107+
102108
EnsureMessageLogInit(append: false);
103109
EnsureEventLogInit(append: false);
104110
}

RELEASE_NOTES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ What's New
4444
* #951 - fix: restore Session disconnect during SocketInitiatorThread.Read exception (gbirchmeier/trevor-bush)
4545
* #963 - fix: concurrency bug with NonSessionLog on Windows (gbirchmeier)
4646
* #195 - fix: Acceptor.Stop() then restart now works (huwmjenkins/vyourtchenko)
47+
* #956 - fix: FileLog.Clear() broke in 1.13, now fixed again (hansw96/gbirchmeier)
4748

4849
### v1.13.1
4950
* backport #951 to 1.13

UnitTests/Logger/FileLogTests.cs

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.IO;
1+
using System;
2+
using System.IO;
23
using NUnit.Framework;
34
using QuickFix.Logger;
45

@@ -9,6 +10,13 @@ public class FileLogTests
910
{
1011
private FileLog? _log;
1112

13+
private readonly QuickFix.SessionID _defaultSessionId = new ("FIX.4.2", "SENDERCOMP", "TARGETCOMP");
14+
private readonly string _logDirectory = Path.Combine(TestContext.CurrentContext.TestDirectory, "log");
15+
private readonly string _eventLogFilePath = Path.Combine(TestContext.CurrentContext.TestDirectory, "log",
16+
"FIX.4.2-SENDERCOMP-TARGETCOMP.event.current.log");
17+
private readonly string _messagesLogFilePath = Path.Combine(TestContext.CurrentContext.TestDirectory, "log",
18+
"FIX.4.2-SENDERCOMP-TARGETCOMP.messages.current.log");
19+
1220
[SetUp]
1321
public void Setup()
1422
{ }
@@ -40,60 +48,83 @@ public void TestPrefixForSubsAndLocation()
4048
Assert.That(FileLog.Prefix(sessionIdWithSubsNoLocation), Is.EqualTo("FIX.4.2-SENDERCOMP_SENDERSUB-TARGETCOMP_TARGETSUB"));
4149
}
4250

43-
[Test]
44-
public void TestGeneratedFileName()
51+
private FileLogFactory CreateTestFactory()
4552
{
46-
var logDirectory = Path.Combine(TestContext.CurrentContext.TestDirectory, "log");
53+
if (Directory.Exists(_logDirectory))
54+
Directory.Delete(_logDirectory, true);
4755

48-
if (Directory.Exists(logDirectory))
49-
Directory.Delete(logDirectory, true);
50-
51-
QuickFix.SessionID sessionId = new QuickFix.SessionID("FIX.4.2", "SENDERCOMP", "TARGETCOMP");
5256
QuickFix.SessionSettings settings = new QuickFix.SessionSettings();
53-
5457
QuickFix.SettingsDictionary config = new QuickFix.SettingsDictionary();
5558
config.SetString(QuickFix.SessionSettings.CONNECTION_TYPE, "initiator");
56-
config.SetString(QuickFix.SessionSettings.FILE_LOG_PATH, logDirectory);
57-
58-
settings.Set(sessionId, config);
59+
config.SetString(QuickFix.SessionSettings.FILE_LOG_PATH, _logDirectory);
5960

60-
string expectedEventLogFilePath = Path.Combine(logDirectory, "FIX.4.2-SENDERCOMP-TARGETCOMP.event.current.log");
61-
string expectedMessagesLogFilePath = Path.Combine(logDirectory, "FIX.4.2-SENDERCOMP-TARGETCOMP.messages.current.log");
61+
settings.Set(_defaultSessionId, config);
62+
return new FileLogFactory(settings);
63+
}
6264

63-
FileLogFactory factory = new FileLogFactory(settings);
64-
_log = (FileLog)factory.Create(sessionId);
65+
[Test]
66+
public void TestGeneratedFileName()
67+
{
68+
FileLogFactory factory = CreateTestFactory();
69+
_log = (FileLog)factory.Create(_defaultSessionId);
6570

66-
Assert.That(!File.Exists(expectedEventLogFilePath));
67-
Assert.That(!File.Exists(expectedMessagesLogFilePath));
71+
// Log files aren't created before first log statement
72+
Assert.That(!File.Exists(_eventLogFilePath));
73+
Assert.That(!File.Exists(_messagesLogFilePath));
6874

6975
_log.OnEvent("some event");
7076

71-
Assert.That(File.Exists(expectedEventLogFilePath));
72-
Assert.That(!File.Exists(expectedMessagesLogFilePath));
77+
// The event file exists now
78+
Assert.That(File.Exists(_eventLogFilePath));
79+
Assert.That(!File.Exists(_messagesLogFilePath));
7380

7481
_log.OnIncoming("some incoming");
7582
_log.OnOutgoing("some outgoing");
7683

77-
Assert.That(File.Exists(expectedEventLogFilePath));
78-
Assert.That(File.Exists(expectedMessagesLogFilePath));
84+
// The message file exists now
85+
Assert.That(File.Exists(_eventLogFilePath));
86+
Assert.That(File.Exists(_messagesLogFilePath));
7987

8088
// cleanup (don't delete log unless success)
8189
_log.Dispose();
8290
_log = null;
83-
Directory.Delete(logDirectory, true);
91+
Directory.Delete(_logDirectory, true);
8492
}
8593

8694
[Test]
8795
public void TestThrowsIfNoConfig()
8896
{
89-
QuickFix.SessionID sessionId = new QuickFix.SessionID("FIX.4.2", "SENDERCOMP", "TARGETCOMP");
9097
QuickFix.SettingsDictionary config = new QuickFix.SettingsDictionary();
9198
config.SetString(QuickFix.SessionSettings.CONNECTION_TYPE, "initiator");
9299
QuickFix.SessionSettings settings = new QuickFix.SessionSettings();
93-
settings.Set(sessionId, config);
100+
settings.Set(_defaultSessionId, config);
94101

95102
FileLogFactory factory = new FileLogFactory(settings);
103+
var ex = Assert.Throws<QuickFix.ConfigError>(delegate { factory.Create(_defaultSessionId); });
104+
Assert.That(ex!.Message, Does.Contain("Configuration failed: No value for key: FileLogPath"));
105+
}
96106

97-
Assert.Throws<QuickFix.ConfigError>(delegate { factory.Create(sessionId); });
107+
[Test]
108+
public void TestClear()
109+
{
110+
FileLogFactory factory = CreateTestFactory();
111+
_log = (FileLog)factory.Create(_defaultSessionId);
112+
113+
_log.OnEvent("some event");
114+
_log.OnIncoming("some incoming");
115+
116+
// Clear() should delete the contents of the log files...
117+
_log.Clear();
118+
Assert.That(new FileInfo(_eventLogFilePath).Length, Is.EqualTo(0));
119+
Assert.That(new FileInfo(_messagesLogFilePath).Length, Is.EqualTo(0));
120+
121+
// ... and leave them ready for more logging
122+
Assert.DoesNotThrow(delegate { _log.OnEvent("another event after clear"); });
123+
Assert.DoesNotThrow(delegate { _log.OnIncoming("another incoming after clear"); });
124+
125+
// cleanup (don't delete log unless success)
126+
_log.Dispose();
127+
_log = null;
128+
Directory.Delete(_logDirectory, true);
98129
}
99130
}

0 commit comments

Comments
 (0)