Skip to content

Commit a5f7c9b

Browse files
committed
add unit tests
1 parent eb3524d commit a5f7c9b

File tree

2 files changed

+167
-5
lines changed

2 files changed

+167
-5
lines changed

tracer/src/Datadog.Trace/Logging/Internal/DatadogLoggingFactory.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,12 @@ private static ConsoleLoggingConfiguration GetConsoleLoggingConfiguration(IConfi
165165
return new DatadogSerilogLogger(internalLogger, rateLimiter, config.File);
166166
}
167167

168-
[TestingAndPrivateOnly]
168+
[TestingOnly]
169169
internal static string GetLogDirectory(IConfigurationTelemetry telemetry)
170170
=> GetLogDirectory(GlobalConfigurationSource.Instance, telemetry);
171171

172-
private static string GetLogDirectory(IConfigurationSource source, IConfigurationTelemetry telemetry)
172+
[TestingAndPrivateOnly]
173+
internal static string GetLogDirectory(IConfigurationSource source, IConfigurationTelemetry telemetry)
173174
{
174175
// This entire block may throw a SecurityException if not granted the System.Security.Permissions.FileIOPermission
175176
// because of the following API calls
@@ -213,7 +214,8 @@ private static string GetLogDirectory(IConfigurationSource source, IConfiguratio
213214
return Path.GetTempPath();
214215
}
215216

216-
private static string GetDefaultLogDirectory(IConfigurationSource source, IConfigurationTelemetry telemetry)
217+
[TestingAndPrivateOnly]
218+
internal static string GetDefaultLogDirectory(IConfigurationSource source, IConfigurationTelemetry telemetry)
217219
{
218220
var isWindows = FrameworkDescription.Instance.IsWindows();
219221

@@ -238,7 +240,8 @@ private static string GetDefaultLogDirectory(IConfigurationSource source, IConfi
238240
return logDirectory;
239241
}
240242

241-
private static string GetProgramDataDirectory()
243+
[TestingAndPrivateOnly]
244+
internal static string GetProgramDataDirectory()
242245
{
243246
// On Nano Server, this returns "", so we fall back to reading from the env var set in the base image instead
244247
// - https://github.com/dotnet/runtime/issues/22690
@@ -262,7 +265,8 @@ private static string GetProgramDataDirectory()
262265
return programData;
263266
}
264267

265-
private static bool TryCreateLogDirectory(string logDirectory)
268+
[TestingAndPrivateOnly]
269+
internal static bool TryCreateLogDirectory(string logDirectory)
266270
{
267271
try
268272
{

tracer/test/Datadog.Trace.Tests/Logging/DatadogLoggingFactoryTests.cs

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
using System;
77
using System.IO;
8+
using System.Runtime.InteropServices;
89
using Datadog.Trace.Configuration;
910
using Datadog.Trace.Configuration.Telemetry;
1011
using Datadog.Trace.Logging;
@@ -197,4 +198,161 @@ public void WhenConsoleSinkIsNotIncluded_DoesNotUseConsoleSink(string sinks)
197198
config.Console.Should().BeNull();
198199
}
199200
}
201+
202+
public class GetDefaultLogDirectoryTests
203+
{
204+
[Fact]
205+
public void WithNoEnvironmentVariables_ReturnsDefaultDirectory()
206+
{
207+
var source = new NameValueConfigurationSource(new());
208+
var result = DatadogLoggingFactory.GetDefaultLogDirectory(source, NullConfigurationTelemetry.Instance);
209+
210+
result.Should().NotBeNullOrEmpty();
211+
212+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
213+
{
214+
result.Should().EndWith(@"Datadog .NET Tracer\logs");
215+
}
216+
else
217+
{
218+
result.Should().Be("/var/log/datadog/dotnet");
219+
}
220+
}
221+
222+
[Fact]
223+
public void WithAzureAppServices_ReturnsAzureLogDirectory()
224+
{
225+
var source = new NameValueConfigurationSource(
226+
new()
227+
{
228+
{ "WEBSITE_SITE_NAME", "my-site-name" }
229+
});
230+
231+
var result = DatadogLoggingFactory.GetDefaultLogDirectory(source, NullConfigurationTelemetry.Instance);
232+
result.Should().NotBeNullOrEmpty();
233+
234+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
235+
{
236+
result.Should().Be(@"C:\home\LogFiles\datadog");
237+
}
238+
else
239+
{
240+
result.Should().Be("/home/LogFiles/datadog");
241+
}
242+
}
243+
}
244+
245+
public class GetProgramDataDirectoryTests
246+
{
247+
[Fact]
248+
public void ReturnsNonEmptyDirectory()
249+
{
250+
// Skip on non-Windows platforms since this method is only called on Windows
251+
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
252+
{
253+
return;
254+
}
255+
256+
var result = DatadogLoggingFactory.GetProgramDataDirectory();
257+
258+
result.Should().NotBeNullOrEmpty();
259+
result.Should().NotBe(string.Empty);
260+
}
261+
262+
[Fact]
263+
public void OnWindows_ReturnsValidProgramDataPath()
264+
{
265+
// Skip on non-Windows platforms
266+
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
267+
{
268+
return;
269+
}
270+
271+
var result = DatadogLoggingFactory.GetProgramDataDirectory();
272+
273+
// Should be a rooted path (e.g., C:\ProgramData)
274+
Path.IsPathRooted(result).Should().BeTrue();
275+
276+
// Should contain "ProgramData" or "Program Data" (for localized versions)
277+
// or be the fallback C:\ProgramData
278+
(result.Contains("ProgramData", StringComparison.OrdinalIgnoreCase) ||
279+
result.Contains("Program Data", StringComparison.OrdinalIgnoreCase) ||
280+
result.Equals(@"C:\ProgramData", StringComparison.OrdinalIgnoreCase))
281+
.Should().BeTrue();
282+
}
283+
}
284+
285+
public class TryCreateLogDirectoryTests
286+
{
287+
[Fact]
288+
public void WithValidPath_CreatesDirectoryAndReturnsTrue()
289+
{
290+
var logDirectory = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
291+
Directory.Exists(logDirectory).Should().BeFalse();
292+
293+
var result = DatadogLoggingFactory.TryCreateLogDirectory(logDirectory);
294+
295+
result.Should().BeTrue();
296+
Directory.Exists(logDirectory).Should().BeTrue();
297+
298+
// Cleanup
299+
try
300+
{
301+
Directory.Delete(logDirectory);
302+
}
303+
catch
304+
{
305+
// Ignore cleanup errors
306+
}
307+
}
308+
309+
[Fact]
310+
public void WithExistingDirectory_ReturnsTrue()
311+
{
312+
var logDirectory = Path.GetTempPath();
313+
Directory.Exists(logDirectory).Should().BeTrue();
314+
315+
var result = DatadogLoggingFactory.TryCreateLogDirectory(logDirectory);
316+
317+
result.Should().BeTrue();
318+
}
319+
320+
[Fact]
321+
public void WithInvalidPath_ReturnsFalse()
322+
{
323+
// Use an invalid path that cannot be created
324+
var logDirectory = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
325+
? @"Z:\nonexistent\invalid\path\that\cannot\be\created"
326+
: "/root/nonexistent/invalid/path/that/cannot/be/created";
327+
328+
var result = DatadogLoggingFactory.TryCreateLogDirectory(logDirectory);
329+
330+
result.Should().BeFalse();
331+
}
332+
333+
[Fact]
334+
public void WithNestedPath_CreatesAllDirectories()
335+
{
336+
var parentDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
337+
var logDirectory = Path.Combine(parentDir, "nested", "log", "directory");
338+
Directory.Exists(logDirectory).Should().BeFalse();
339+
Directory.Exists(parentDir).Should().BeFalse();
340+
341+
var result = DatadogLoggingFactory.TryCreateLogDirectory(logDirectory);
342+
343+
result.Should().BeTrue();
344+
Directory.Exists(logDirectory).Should().BeTrue();
345+
Directory.Exists(parentDir).Should().BeTrue();
346+
347+
// Cleanup
348+
try
349+
{
350+
Directory.Delete(parentDir, recursive: true);
351+
}
352+
catch
353+
{
354+
// Ignore cleanup errors
355+
}
356+
}
357+
}
200358
}

0 commit comments

Comments
 (0)