Skip to content

Commit

Permalink
feat: Support for programmatic option configuration (#564)
Browse files Browse the repository at this point in the history
* initial idea

* back to object initializer

* Format code

* updated CHANGELOG.md

* set correct default values

* removed extra line

* expression bodies are the way to go

Co-authored-by: Sentry Github Bot <bot+github-bot@sentry.io>
  • Loading branch information
bitsandfoxes and getsentry-bot authored Feb 16, 2022
1 parent ff0f81e commit de29836
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 2 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

### Features

- Support for programmatic options configuration ([#564](https://github.com/getsentry/sentry-unity/pull/564))

## 0.10.0

### Features
Expand Down
13 changes: 13 additions & 0 deletions src/Sentry.Unity.Editor/ConfigurationWindow/AdvancedTab.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,19 @@ internal static void Display(ScriptableSentryUnityOptions options)
new GUIContent("Windows Native Support", "Whether to enable Native Windows support to " +
"capture errors written in languages such as C and C++."),
options.WindowsNativeSupportEnabled);

EditorGUILayout.Space();
EditorGUI.DrawRect(EditorGUILayout.GetControlRect(false, 1), Color.gray);
EditorGUILayout.Space();

GUILayout.Label("Programmatic Options Configuration", EditorStyles.boldLabel);

options.OptionsConfiguration = EditorGUILayout.ObjectField(
new GUIContent("Options Configuration", "A scriptable object that inherits from " +
"'ScriptableOptionsConfiguration' that allows you to " +
"programmatically modify Sentry options i.e. implement the " +
"'BeforeSend' callback."),
options.OptionsConfiguration, typeof(ScriptableOptionsConfiguration), false) as ScriptableOptionsConfiguration;
}
}
}
7 changes: 7 additions & 0 deletions src/Sentry.Unity.Editor/ScriptableSentryUnityOptionsEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ public override void OnInspectorGUI()
EditorGUI.DrawRect(EditorGUILayout.GetControlRect(false, 1), Color.gray);
EditorGUILayout.Space();

EditorGUILayout.ObjectField("Options Configuration", options.OptionsConfiguration,
typeof(ScriptableOptionsConfiguration), false);

EditorGUILayout.Space();
EditorGUI.DrawRect(EditorGUILayout.GetControlRect(false, 1), Color.gray);
EditorGUILayout.Space();

EditorGUILayout.LabelField("Debug", EditorStyles.boldLabel);
EditorGUILayout.Toggle("Enable Debug Output", options.Debug);
EditorGUILayout.Toggle("Only In Editor", options.DebugOnlyInEditor);
Expand Down
9 changes: 9 additions & 0 deletions src/Sentry.Unity/ScriptableOptionsConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using UnityEngine;

namespace Sentry.Unity
{
public abstract class ScriptableOptionsConfiguration : ScriptableObject
{
public abstract void Configure(SentryUnityOptions options);
}
}
9 changes: 7 additions & 2 deletions src/Sentry.Unity/ScriptableSentryUnityOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,17 @@ public static string GetConfigPath(string? notDefaultConfigName = null)
[field: SerializeField] public bool IsEnvironmentUser { get; set; }

[field: SerializeField] public bool EnableOfflineCaching { get; set; }
[field: SerializeField] public int MaxCacheItems { get; set; }
[field: SerializeField] public int MaxCacheItems { get; set; } = 30;
[field: SerializeField] public int InitCacheFlushTimeout { get; set; }
[field: SerializeField] public float? SampleRate { get; set; }
[field: SerializeField] public int ShutdownTimeout { get; set; }
[field: SerializeField] public int MaxQueueItems { get; set; }
[field: SerializeField] public int MaxQueueItems { get; set; } = 30;
[field: SerializeField] public bool IosNativeSupportEnabled { get; set; } = true;
[field: SerializeField] public bool AndroidNativeSupportEnabled { get; set; } = true;
[field: SerializeField] public bool WindowsNativeSupportEnabled { get; set; } = true;

[field: SerializeField] public ScriptableOptionsConfiguration? OptionsConfiguration { get; set; }

[field: SerializeField] public bool Debug { get; set; }
[field: SerializeField] public bool DebugOnlyInEditor { get; set; }
[field: SerializeField] public SentryLevel DiagnosticLevel { get; set; }
Expand Down Expand Up @@ -125,6 +127,9 @@ internal static SentryUnityOptions ToSentryUnityOptions(ScriptableSentryUnityOpt
options.DiagnosticLevel = scriptableOptions.DiagnosticLevel;

SentryOptionsUtility.TryAttachLogger(options);

scriptableOptions.OptionsConfiguration?.Configure(options);

return options;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public void ScriptableSentryUnityOptions_Creation_AllPropertiesPresent()
StringAssert.Contains("IosNativeSupportEnabled", optionsAsString);
StringAssert.Contains("AndroidNativeSupportEnabled", optionsAsString);
StringAssert.Contains("WindowsNativeSupportEnabled", optionsAsString);
StringAssert.Contains("OptionsConfiguration", optionsAsString);
StringAssert.Contains("Debug", optionsAsString);
StringAssert.Contains("DebugOnlyInEditor", optionsAsString);
StringAssert.Contains("DiagnosticLevel", optionsAsString);
Expand Down
21 changes: 21 additions & 0 deletions test/Sentry.Unity.Tests/ScriptableSentryUnityOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.IO;
using System.Reflection;
using NUnit.Framework;
using Sentry.Extensibility;
using Sentry.Unity.Json;
using Sentry.Unity.Tests.Stubs;
using UnityEngine;
Expand All @@ -21,6 +22,12 @@ class Fixture
persistentDataPath: "test/persistent/data/path");
}

class TestOptionsConfiguration : ScriptableOptionsConfiguration
{
public bool GotCalled;
public override void Configure(SentryUnityOptions options) => GotCalled = true;
}

[SetUp]
public void Setup() => _fixture = new Fixture();
private Fixture _fixture = null!;
Expand Down Expand Up @@ -118,6 +125,20 @@ public void ToSentryUnityOptions_ValueMapping_AreEqual(bool isBuilding, bool ena
AssertOptions(expectedOptions, optionsActual);
}

[Test]
[TestCase(true)]
[TestCase(false)]
public void ToSentryUnityOptions_HasOptionsConfiguration_GetsCalled(bool isBuilding)
{
var optionsConfiguration = ScriptableObject.CreateInstance<TestOptionsConfiguration>();
var scriptableOptions = ScriptableObject.CreateInstance<ScriptableSentryUnityOptions>();
scriptableOptions.OptionsConfiguration = optionsConfiguration;

ScriptableSentryUnityOptions.ToSentryUnityOptions(scriptableOptions, isBuilding);

Assert.IsTrue(optionsConfiguration.GotCalled);
}

[Test]
[TestCase(true)]
[TestCase(false)]
Expand Down

0 comments on commit de29836

Please sign in to comment.