From 1fb7a546af6e13d26174e655d439cf7e6a82a212 Mon Sep 17 00:00:00 2001 From: Bobby Galli Date: Thu, 29 May 2025 19:10:04 -0400 Subject: [PATCH] Handle null options in DotNetStandardClient --- Runtime/Client/DotNetStandardClient.cs | 2 + .../Client/DotNetStandardClientTests.cs | 50 ++++++++++++++++++ .../Client/DotNetStandardClientTests.cs.meta | 11 ++++ Tests/Runtime/Client/Fakes/FakeBugSplat.cs | 51 +++++++++++++++++++ .../Runtime/Client/Fakes/FakeBugSplat.cs.meta | 11 ++++ 5 files changed, 125 insertions(+) create mode 100644 Tests/Runtime/Client/DotNetStandardClientTests.cs create mode 100644 Tests/Runtime/Client/DotNetStandardClientTests.cs.meta create mode 100644 Tests/Runtime/Client/Fakes/FakeBugSplat.cs create mode 100644 Tests/Runtime/Client/Fakes/FakeBugSplat.cs.meta diff --git a/Runtime/Client/DotNetStandardClient.cs b/Runtime/Client/DotNetStandardClient.cs index 6148a05..d2e07d4 100644 --- a/Runtime/Client/DotNetStandardClient.cs +++ b/Runtime/Client/DotNetStandardClient.cs @@ -43,6 +43,7 @@ public Task Post(FileInfo minidumpFileInfo, IReportPostOpti private ExceptionPostOptions CreateExceptionPostOptions(IReportPostOptions options) { + options ??= new ReportPostOptions(); var exceptionPostOptions = new ExceptionPostOptions(); foreach (var attribute in options.AdditionalAttributes) @@ -63,6 +64,7 @@ private ExceptionPostOptions CreateExceptionPostOptions(IReportPostOptions optio private MinidumpPostOptions CreateMinidumpPostOptions(IReportPostOptions options) { + options ??= new ReportPostOptions(); var minidumpPostOptions = new MinidumpPostOptions(); foreach (var attribute in options.AdditionalAttributes) diff --git a/Tests/Runtime/Client/DotNetStandardClientTests.cs b/Tests/Runtime/Client/DotNetStandardClientTests.cs new file mode 100644 index 0000000..6f9de95 --- /dev/null +++ b/Tests/Runtime/Client/DotNetStandardClientTests.cs @@ -0,0 +1,50 @@ +using BugSplatDotNetStandard; +using BugSplatUnity.Runtime.Client; +using BugSplatUnity.RuntimeTests.Client.Fakes; +using NUnit.Framework; +using System; +using System.IO; +using System.Threading.Tasks; + +namespace BugSplatUnity.RuntimeTests.Client +{ + public class DotNetStandardClientTests + { + [Test] + public void Post_WithStackTraceNullOptions_ShouldCreateOptions() + { + var bugSplat = new FakeBugSplat("db", "app", "1.0"); + var sut = new DotNetStandardClient(bugSplat); + + sut.Post("stackTrace"); + + Assert.IsNotEmpty(bugSplat.ExceptionCalls); + Assert.NotNull(bugSplat.ExceptionCalls[0].Options); + } + + [Test] + public void Post_WithExceptionNullOptions_ShouldCreateOptions() + { + var bugSplat = new FakeBugSplat("db", "app", "1.0"); + var sut = new DotNetStandardClient(bugSplat); + + sut.Post(new Exception("oops")); + + Assert.IsNotEmpty(bugSplat.ExceptionCalls); + Assert.NotNull(bugSplat.ExceptionCalls[0].Options); + } + + [Test] + public void Post_WithMinidumpNullOptions_ShouldCreateOptions() + { + var bugSplat = new FakeBugSplat("db", "app", "1.0"); + var sut = new DotNetStandardClient(bugSplat); + var file = new FileInfo("test.dmp"); + + sut.Post(file); + + Assert.IsNotEmpty(bugSplat.MinidumpCalls); + Assert.NotNull(bugSplat.MinidumpCalls[0].Options); + } + } +} diff --git a/Tests/Runtime/Client/DotNetStandardClientTests.cs.meta b/Tests/Runtime/Client/DotNetStandardClientTests.cs.meta new file mode 100644 index 0000000..129838f --- /dev/null +++ b/Tests/Runtime/Client/DotNetStandardClientTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 768667da11af4117bf017b7e8af08282 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Tests/Runtime/Client/Fakes/FakeBugSplat.cs b/Tests/Runtime/Client/Fakes/FakeBugSplat.cs new file mode 100644 index 0000000..0ff0e65 --- /dev/null +++ b/Tests/Runtime/Client/Fakes/FakeBugSplat.cs @@ -0,0 +1,51 @@ +using BugSplatDotNetStandard; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Threading.Tasks; + +namespace BugSplatUnity.RuntimeTests.Client.Fakes +{ + class FakeBugSplat : BugSplat + { + public List ExceptionCalls { get; } = new List(); + public List MinidumpCalls { get; } = new List(); + + public FakeBugSplat(string database, string application, string version) + : base(database, application, version) + { + } + + public override Task Post(string stackTrace, ExceptionPostOptions options) + { + ExceptionCalls.Add(new ExceptionPostCall { StackTrace = stackTrace, Options = options }); + return Task.FromResult(new HttpResponseMessage()); + } + + public override Task Post(Exception ex, ExceptionPostOptions options) + { + ExceptionCalls.Add(new ExceptionPostCall { Exception = ex, Options = options }); + return Task.FromResult(new HttpResponseMessage()); + } + + public override Task Post(FileInfo minidumpFileInfo, MinidumpPostOptions options) + { + MinidumpCalls.Add(new MinidumpPostCall { MinidumpFileInfo = minidumpFileInfo, Options = options }); + return Task.FromResult(new HttpResponseMessage()); + } + } + + class ExceptionPostCall + { + public string StackTrace { get; set; } + public Exception Exception { get; set; } + public ExceptionPostOptions Options { get; set; } + } + + class MinidumpPostCall + { + public FileInfo MinidumpFileInfo { get; set; } + public MinidumpPostOptions Options { get; set; } + } +} diff --git a/Tests/Runtime/Client/Fakes/FakeBugSplat.cs.meta b/Tests/Runtime/Client/Fakes/FakeBugSplat.cs.meta new file mode 100644 index 0000000..340000c --- /dev/null +++ b/Tests/Runtime/Client/Fakes/FakeBugSplat.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94bfcd3e6b084555a68691efe84e61f8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: