From 2b5a348eeda5d7679fa15a3fc4d180be2201f92a Mon Sep 17 00:00:00 2001 From: kdysput Date: Wed, 26 Mar 2025 18:12:54 +0100 Subject: [PATCH 1/7] Fix machine id generated by using Unity machine identifier --- Runtime/Model/MachineIdStorage.cs | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/Runtime/Model/MachineIdStorage.cs b/Runtime/Model/MachineIdStorage.cs index 07dfc973..81f81987 100644 --- a/Runtime/Model/MachineIdStorage.cs +++ b/Runtime/Model/MachineIdStorage.cs @@ -2,6 +2,8 @@ using System; using System.Linq; using System.Net.NetworkInformation; +using System.Security.Cryptography; +using System.Text; using UnityEngine; [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Backtrace.Unity.Tests.Runtime")] @@ -55,7 +57,15 @@ internal string GenerateMachineId() /// machine identifier in the GUID string format private string FetchMachineIdFromStorage() { - return PlayerPrefs.GetString(MachineIdentifierKey); + var storedMachineId = PlayerPrefs.GetString(MachineIdentifierKey); + if (Guid.TryParse(storedMachineId, out Guid _)) + { + return storedMachineId; + } + + var machineId = ConvertStringToGuid(storedMachineId).ToString(); + StoreMachineId(machineId); + return machineId; } /// @@ -77,7 +87,13 @@ protected virtual string UseUnityIdentifier() { return null; } - return SystemInfo.deviceUniqueIdentifier; + + var unityDeviceIdentifier = SystemInfo.deviceUniqueIdentifier; + if (Guid.TryParse(unityDeviceIdentifier, out Guid unityUuidGuid)) + { + return unityUuidGuid.ToString(); + } + return ConvertStringToGuid(unityDeviceIdentifier).ToString(); } /// @@ -108,5 +124,12 @@ protected virtual string UseNetworkingIdentifier() return null; } + + private Guid ConvertStringToGuid(string value) + { + MD5 md5 = new MD5CryptoServiceProvider(); + return new Guid(md5.ComputeHash(Encoding.UTF8.GetBytes(value))); + + } } -} +} \ No newline at end of file From 7a3d5b7c83e49996b669fa571a813e7350817687 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Wed, 26 Mar 2025 22:17:10 +0100 Subject: [PATCH 2/7] EOL --- Runtime/Model/MachineIdStorage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Model/MachineIdStorage.cs b/Runtime/Model/MachineIdStorage.cs index 81f81987..a0bb0748 100644 --- a/Runtime/Model/MachineIdStorage.cs +++ b/Runtime/Model/MachineIdStorage.cs @@ -132,4 +132,4 @@ private Guid ConvertStringToGuid(string value) } } -} \ No newline at end of file +} From c16c6f7578f6f5c62080605d1d8d51b6900787f0 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Wed, 26 Mar 2025 22:25:30 +0100 Subject: [PATCH 3/7] Code description --- Runtime/Model/MachineIdStorage.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Runtime/Model/MachineIdStorage.cs b/Runtime/Model/MachineIdStorage.cs index a0bb0748..e896941b 100644 --- a/Runtime/Model/MachineIdStorage.cs +++ b/Runtime/Model/MachineIdStorage.cs @@ -58,11 +58,13 @@ internal string GenerateMachineId() private string FetchMachineIdFromStorage() { var storedMachineId = PlayerPrefs.GetString(MachineIdentifierKey); + // in the previous version of the SDK, the stored machine id could be invalid + // to fix the problem, we want to verify if the id is valid and if isn't, fix it. if (Guid.TryParse(storedMachineId, out Guid _)) { return storedMachineId; } - + var machineId = ConvertStringToGuid(storedMachineId).ToString(); StoreMachineId(machineId); return machineId; @@ -124,9 +126,13 @@ protected virtual string UseNetworkingIdentifier() return null; } - + /// + /// Converts a string with machine id into guid. + /// private Guid ConvertStringToGuid(string value) { + // to make sure we're supporting old version of Unity that can use .NET 3.5 + // we're using an older API to generate a GUID. MD5 md5 = new MD5CryptoServiceProvider(); return new Guid(md5.ComputeHash(Encoding.UTF8.GetBytes(value))); From c5effc0d8cc13fbd592f4aba108bceaf42810966 Mon Sep 17 00:00:00 2001 From: kdysput Date: Sun, 6 Apr 2025 21:36:49 +0200 Subject: [PATCH 4/7] Prepare code for unit tests n --- Runtime/Common/GuidHelper.cs | 17 +++ .../Attributes/MachineAttributeProvider.cs | 1 - .../Model/DataProvider.meta | 2 +- .../IMachineIdentifierDataProvider.cs | 8 ++ .../IMachineIdentifierDataProvider.cs.meta | 2 + .../ISessionStorageDataProvider.cs | 9 ++ .../ISessionStorageDataProvider.cs.meta | 2 + .../NetworkIdentifierDataProvider.cs | 35 ++++++ .../NetworkIdentifierDataProvider.cs.meta | 2 + .../SessionStorageDataProvider.cs | 17 +++ .../SessionStorageDataProvider.cs.meta | 2 + .../UnityMachineIdentifierProvider.cs | 37 ++++++ .../UnityMachineIdentifierProvider.cs.meta | 2 + Runtime/Model/MachineIdStorage.cs | 105 +++++------------- .../BacktraceAttributeMachineIdTests.cs | 46 +++++--- .../Client/Mocks/MachineIdStorageMock.cs | 39 ------- .../Client/Mocks/MachineIdStorageMock.cs.meta | 11 -- 17 files changed, 188 insertions(+), 149 deletions(-) rename Tests/Runtime/Client/Mocks.meta => Runtime/Model/DataProvider.meta (77%) create mode 100644 Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs create mode 100644 Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs.meta create mode 100644 Runtime/Model/DataProvider/ISessionStorageDataProvider.cs create mode 100644 Runtime/Model/DataProvider/ISessionStorageDataProvider.cs.meta create mode 100644 Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs create mode 100644 Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs.meta create mode 100644 Runtime/Model/DataProvider/SessionStorageDataProvider.cs create mode 100644 Runtime/Model/DataProvider/SessionStorageDataProvider.cs.meta create mode 100644 Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs create mode 100644 Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs.meta delete mode 100644 Tests/Runtime/Client/Mocks/MachineIdStorageMock.cs delete mode 100644 Tests/Runtime/Client/Mocks/MachineIdStorageMock.cs.meta diff --git a/Runtime/Common/GuidHelper.cs b/Runtime/Common/GuidHelper.cs index 4338cbb5..8472e419 100644 --- a/Runtime/Common/GuidHelper.cs +++ b/Runtime/Common/GuidHelper.cs @@ -1,4 +1,6 @@ using System; +using System.Security.Cryptography; +using System.Text; namespace Backtrace.Unity.Extensions { @@ -23,5 +25,20 @@ public static bool IsNullOrEmpty(string guid) const string emptyGuid = "00000000-0000-0000-0000-000000000000"; return string.IsNullOrEmpty(guid) || guid == emptyGuid; } + + /// + /// Converts a random string into a guid representation. + /// + public static Guid FromString(string value) + { + if (string.IsNullOrEmpty(value)) + { + return Guid.Empty; + } + // to make sure we're supporting old version of Unity that can use .NET 3.5 + // we're using an older API to generate a GUID. + MD5 md5 = new MD5CryptoServiceProvider(); + return new Guid(md5.ComputeHash(Encoding.UTF8.GetBytes(value))); + } } } diff --git a/Runtime/Model/Attributes/MachineAttributeProvider.cs b/Runtime/Model/Attributes/MachineAttributeProvider.cs index 80426746..7c5dd9dd 100644 --- a/Runtime/Model/Attributes/MachineAttributeProvider.cs +++ b/Runtime/Model/Attributes/MachineAttributeProvider.cs @@ -1,5 +1,4 @@ using Backtrace.Unity.Common; -using Backtrace.Unity.Extensions; using System; using System.Collections.Generic; using System.Globalization; diff --git a/Tests/Runtime/Client/Mocks.meta b/Runtime/Model/DataProvider.meta similarity index 77% rename from Tests/Runtime/Client/Mocks.meta rename to Runtime/Model/DataProvider.meta index a4d1551e..29d34515 100644 --- a/Tests/Runtime/Client/Mocks.meta +++ b/Runtime/Model/DataProvider.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: fd956ac43783a6b4bbc9603939fa6a8b +guid: 2925498833be55643891f75e96ad9ded folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs b/Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs new file mode 100644 index 00000000..330fbab9 --- /dev/null +++ b/Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs @@ -0,0 +1,8 @@ +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Backtrace.Unity.Tests.Runtime")] +namespace Backtrace.Unity.Model.DataProvider +{ + internal interface IMachineIdentifierDataProvider + { + string Get(); + } +} diff --git a/Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs.meta b/Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs.meta new file mode 100644 index 00000000..123ed6b9 --- /dev/null +++ b/Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e94db95360eabe94a8f901670f630ab9 \ No newline at end of file diff --git a/Runtime/Model/DataProvider/ISessionStorageDataProvider.cs b/Runtime/Model/DataProvider/ISessionStorageDataProvider.cs new file mode 100644 index 00000000..eeec0974 --- /dev/null +++ b/Runtime/Model/DataProvider/ISessionStorageDataProvider.cs @@ -0,0 +1,9 @@ +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Backtrace.Unity.Tests.Runtime")] +namespace Backtrace.Unity.Model.DataProvider +{ + internal interface ISessionStorageDataProvider + { + void SetString(string key, string value); + string GetString(string key); + } +} diff --git a/Runtime/Model/DataProvider/ISessionStorageDataProvider.cs.meta b/Runtime/Model/DataProvider/ISessionStorageDataProvider.cs.meta new file mode 100644 index 00000000..672e4599 --- /dev/null +++ b/Runtime/Model/DataProvider/ISessionStorageDataProvider.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 79226154fe224d84b9f0014d5c8a4206 \ No newline at end of file diff --git a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs b/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs new file mode 100644 index 00000000..b9e3dbc0 --- /dev/null +++ b/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs @@ -0,0 +1,35 @@ +using Backtrace.Unity.Extensions; +using System; +using System.Linq; +using System.Net.NetworkInformation; + +namespace Backtrace.Unity.Model.DataProvider +{ + internal class NetworkIdentifierDataProvider : IMachineIdentifierDataProvider + { + public string Get() + { + var interfaces = NetworkInterface.GetAllNetworkInterfaces() + .Where(n => n.OperationalStatus == OperationalStatus.Up); + + foreach (var @interface in interfaces) + { + var physicalAddress = @interface.GetPhysicalAddress(); + if (physicalAddress == null) + { + continue; + } + var macAddress = physicalAddress.ToString(); + if (string.IsNullOrEmpty(macAddress)) + { + continue; + } + string hex = macAddress.Replace(":", string.Empty); + var value = Convert.ToInt64(hex, 16); + return GuidHelper.FromLong(value).ToString(); + } + + return null; + } + } +} \ No newline at end of file diff --git a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs.meta b/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs.meta new file mode 100644 index 00000000..6cf96c56 --- /dev/null +++ b/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 782edca6574201243814325779483442 \ No newline at end of file diff --git a/Runtime/Model/DataProvider/SessionStorageDataProvider.cs b/Runtime/Model/DataProvider/SessionStorageDataProvider.cs new file mode 100644 index 00000000..6ac95287 --- /dev/null +++ b/Runtime/Model/DataProvider/SessionStorageDataProvider.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +namespace Backtrace.Unity.Model.DataProvider +{ + internal class SessionStorageDataProvider : ISessionStorageDataProvider + { + public string GetString(string key) + { + return PlayerPrefs.GetString(key); + } + + public void SetString(string key, string value) + { + PlayerPrefs.SetString(key, value); + } + } +} diff --git a/Runtime/Model/DataProvider/SessionStorageDataProvider.cs.meta b/Runtime/Model/DataProvider/SessionStorageDataProvider.cs.meta new file mode 100644 index 00000000..411c7d00 --- /dev/null +++ b/Runtime/Model/DataProvider/SessionStorageDataProvider.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 61658e4a3b261f940a5497ad0125d81f \ No newline at end of file diff --git a/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs b/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs new file mode 100644 index 00000000..e7680903 --- /dev/null +++ b/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs @@ -0,0 +1,37 @@ +using Backtrace.Unity.Extensions; +using System; +using System.Linq; +using System.Net.NetworkInformation; +using UnityEngine; + +namespace Backtrace.Unity.Model.DataProvider +{ + internal class UnityMachineIdentifierProvider : IMachineIdentifierDataProvider + { + private readonly string _deviceUniqueIdentifier; + internal UnityMachineIdentifierProvider() : this(SystemInfo.deviceUniqueIdentifier) { } + + internal UnityMachineIdentifierProvider(string machineIdentifier) + { + _deviceUniqueIdentifier = machineIdentifier; + } + public string Get() + { + if (!IsValidIdentifier()) + { + return null; + } + + if (Guid.TryParse(_deviceUniqueIdentifier, out Guid unityUuidGuid)) + { + return unityUuidGuid.ToString(); + } + return GuidHelper.FromString(_deviceUniqueIdentifier).ToString(); + } + + private bool IsValidIdentifier() + { + return _deviceUniqueIdentifier != SystemInfo.unsupportedIdentifier && !string.IsNullOrEmpty(_deviceUniqueIdentifier); + } + } +} diff --git a/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs.meta b/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs.meta new file mode 100644 index 00000000..2e862da4 --- /dev/null +++ b/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ed39481d15e8b2249875498830f31c6f \ No newline at end of file diff --git a/Runtime/Model/MachineIdStorage.cs b/Runtime/Model/MachineIdStorage.cs index e896941b..26696b53 100644 --- a/Runtime/Model/MachineIdStorage.cs +++ b/Runtime/Model/MachineIdStorage.cs @@ -1,10 +1,6 @@ using Backtrace.Unity.Extensions; +using Backtrace.Unity.Model.DataProvider; using System; -using System.Linq; -using System.Net.NetworkInformation; -using System.Security.Cryptography; -using System.Text; -using UnityEngine; [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Backtrace.Unity.Tests.Runtime")] namespace Backtrace.Unity.Model @@ -19,6 +15,19 @@ internal class MachineIdStorage /// internal const string MachineIdentifierKey = "backtrace-machine-id"; + private readonly ISessionStorageDataProvider _sessionStorageDataProvider; + private readonly IMachineIdentifierDataProvider[] _machineIdentifierDataProviders; + + internal MachineIdStorage() : this( + new IMachineIdentifierDataProvider[] { new UnityMachineIdentifierProvider(), new NetworkIdentifierDataProvider() }, + new SessionStorageDataProvider()) + { } + internal MachineIdStorage(IMachineIdentifierDataProvider[] machineIdentifierDataProviders, ISessionStorageDataProvider sessionStorageDataProvider) + { + _machineIdentifierDataProviders = machineIdentifierDataProviders; + _sessionStorageDataProvider = sessionStorageDataProvider; + } + /// /// Generate unique machine id. /// @@ -32,17 +41,14 @@ internal string GenerateMachineId() } #if !UNITY_WEBGL && !UNITY_SWITCH - var unityIdentifier = UseUnityIdentifier(); - if (!GuidHelper.IsNullOrEmpty(unityIdentifier)) - { - StoreMachineId(unityIdentifier); - return unityIdentifier; - } - var networkIdentifier = UseNetworkingIdentifier(); - if (!GuidHelper.IsNullOrEmpty(networkIdentifier)) + foreach (var machineIdentifierProvider in _machineIdentifierDataProviders) { - StoreMachineId(networkIdentifier); - return networkIdentifier; + var identifier = machineIdentifierProvider.Get(); + if (!GuidHelper.IsNullOrEmpty(identifier)) + { + StoreMachineId(identifier); + return identifier; + } } #endif var backtraceRandomIdentifier = Guid.NewGuid().ToString(); @@ -57,15 +63,15 @@ internal string GenerateMachineId() /// machine identifier in the GUID string format private string FetchMachineIdFromStorage() { - var storedMachineId = PlayerPrefs.GetString(MachineIdentifierKey); + var storedMachineId = _sessionStorageDataProvider.GetString(MachineIdentifierKey); // in the previous version of the SDK, the stored machine id could be invalid // to fix the problem, we want to verify if the id is valid and if isn't, fix it. - if (Guid.TryParse(storedMachineId, out Guid _)) + if (string.IsNullOrEmpty(storedMachineId) || Guid.TryParse(storedMachineId, out Guid _)) { return storedMachineId; } - - var machineId = ConvertStringToGuid(storedMachineId).ToString(); + + var machineId = GuidHelper.FromString(storedMachineId).ToString(); StoreMachineId(machineId); return machineId; } @@ -76,66 +82,7 @@ private string FetchMachineIdFromStorage() /// machine identifier private void StoreMachineId(string machineId) { - PlayerPrefs.SetString(MachineIdentifierKey, machineId); - } - - /// - /// Use Unity device identifier to generate machine identifier - /// - /// Unity machine identifier if the device identifier is supported. Otherwise null - protected virtual string UseUnityIdentifier() - { - if (SystemInfo.deviceUniqueIdentifier == SystemInfo.unsupportedIdentifier) - { - return null; - } - - var unityDeviceIdentifier = SystemInfo.deviceUniqueIdentifier; - if (Guid.TryParse(unityDeviceIdentifier, out Guid unityUuidGuid)) - { - return unityUuidGuid.ToString(); - } - return ConvertStringToGuid(unityDeviceIdentifier).ToString(); - } - - /// - /// Use Networking interface to generate machine identifier - MAC number from the networking interface. - /// - /// Machine id - MAC in a GUID format. If the networking interface is not available then it returns null. - protected virtual string UseNetworkingIdentifier() - { - var interfaces = NetworkInterface.GetAllNetworkInterfaces() - .Where(n => n.OperationalStatus == OperationalStatus.Up); - - foreach (var @interface in interfaces) - { - var physicalAddress = @interface.GetPhysicalAddress(); - if (physicalAddress == null) - { - continue; - } - var macAddress = physicalAddress.ToString(); - if (string.IsNullOrEmpty(macAddress)) - { - continue; - } - string hex = macAddress.Replace(":", string.Empty); - var value = Convert.ToInt64(hex, 16); - return GuidHelper.FromLong(value).ToString(); - } - - return null; - } - /// - /// Converts a string with machine id into guid. - /// - private Guid ConvertStringToGuid(string value) - { - // to make sure we're supporting old version of Unity that can use .NET 3.5 - // we're using an older API to generate a GUID. - MD5 md5 = new MD5CryptoServiceProvider(); - return new Guid(md5.ComputeHash(Encoding.UTF8.GetBytes(value))); - + _sessionStorageDataProvider.SetString(MachineIdentifierKey, machineId); } } } diff --git a/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs b/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs index db7aac69..37ef1390 100644 --- a/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs +++ b/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs @@ -1,6 +1,6 @@ using Backtrace.Unity.Extensions; using Backtrace.Unity.Model; -using Backtrace.Unity.Tests.Runtime.Client.Mocks; +using Backtrace.Unity.Model.DataProvider; using NUnit.Framework; using UnityEngine; @@ -17,7 +17,7 @@ public void Cleanup() [Test] public void TestMachineAttributes_ShouldUseUnityIdentifier_ShouldReturnUnityIdentitfier() { - var machineIdStorage = new MachineIdStorageMock(); + var machineIdStorage = new MachineIdStorage(); var machineId = machineIdStorage.GenerateMachineId(); @@ -27,17 +27,19 @@ public void TestMachineAttributes_ShouldUseUnityIdentifier_ShouldReturnUnityIden [Test] public void TestMachineAttributes_ShouldUseMac_ShouldReturnNetowrkingIdentifier() { - var machineIdStorage = new MachineIdStorageMock(false); + var networkIdentifierDataProvider = new NetworkIdentifierDataProvider(); + var expectedMachineId = networkIdentifierDataProvider.Get(); + var machineIdStorage = new MachineIdStorage(new IMachineIdentifierDataProvider[] { networkIdentifierDataProvider }, new SessionStorageDataProvider()); var machineId = machineIdStorage.GenerateMachineId(); - Assert.IsFalse(GuidHelper.IsNullOrEmpty(machineId)); + Assert.IsFalse(GuidHelper.IsNullOrEmpty(expectedMachineId)); } [Test] public void TestMachineAttributes_ShouldUseRandomMachineId_ShouldReturnRandomMachineId() { - var machineIdStorage = new MachineIdStorageMock(false, false); + var machineIdStorage = new MachineIdStorage(new IMachineIdentifierDataProvider[0], new SessionStorageDataProvider()); var machineId = machineIdStorage.GenerateMachineId(); @@ -45,28 +47,36 @@ public void TestMachineAttributes_ShouldUseRandomMachineId_ShouldReturnRandomMac } [Test] - public void TestMachineAttributes_ShouldAlwaysReturnTheSameValueUnityId_IdentifierAreTheSame() + public void TestMachineAttributes_ShouldConvertInvalidIdIntoGuid_ValidIdIsAlwaysUsed() { - var firstMachineIdStorage = new MachineIdStorageMock().GenerateMachineId(); - var secGenerationOfMachineIdStorage = new MachineIdStorageMock().GenerateMachineId(); + var invalidValue = "randomValue"; + PlayerPrefs.SetString(MachineIdStorage.MachineIdentifierKey, invalidValue); + var expectedGuid = GuidHelper.FromString(invalidValue).ToString(); - Assert.IsTrue(firstMachineIdStorage == secGenerationOfMachineIdStorage); + var machineId = new MachineIdStorage().GenerateMachineId(); + + Assert.IsTrue(expectedGuid == machineId); } [Test] - public void TestMachineAttributes_ShouldAlwaysReturnTheSameValueMacId_IdentifierAreTheSame() + public void TestMachineAttributes_ShouldRetrieveValueFromStorage_IdentifierIsStored() { - var firstMachineIdStorage = new MachineIdStorageMock(false).GenerateMachineId(); - var secGenerationOfMachineIdStorage = new MachineIdStorageMock(false).GenerateMachineId(); + // make sure it's always empty + PlayerPrefs.DeleteKey(MachineIdStorage.MachineIdentifierKey); - Assert.IsTrue(firstMachineIdStorage == secGenerationOfMachineIdStorage); + var machineId = new MachineIdStorage().GenerateMachineId(); + + var storage = new SessionStorageDataProvider(); + var storedMachineId = storage.GetString(MachineIdStorage.MachineIdentifierKey); + + Assert.IsTrue(machineId == storedMachineId); } [Test] - public void TestMachineAttributes_ShouldAlwaysReturnTheSameValueRandomId_IdentifierAreTheSame() + public void TestMachineAttributes_ShouldAlwaysReturnTheSameValueUnityId_IdentifierAreTheSame() { - var firstMachineIdStorage = new MachineIdStorageMock(false, false).GenerateMachineId(); - var secGenerationOfMachineIdStorage = new MachineIdStorageMock(false, false).GenerateMachineId(); + var firstMachineIdStorage = new MachineIdStorage().GenerateMachineId(); + var secGenerationOfMachineIdStorage = new MachineIdStorage().GenerateMachineId(); Assert.IsTrue(firstMachineIdStorage == secGenerationOfMachineIdStorage); } @@ -74,7 +84,7 @@ public void TestMachineAttributes_ShouldAlwaysReturnTheSameValueRandomId_Identif [Test] public void TestMachineAttributes_ShouldAlwaysGenerateTheSameUntiyAttribute_ShouldReturnTheSameUnityIdentitfier() { - var machineIdStorage = new MachineIdStorageMock(); + var machineIdStorage = new MachineIdStorage(); var machineId = machineIdStorage.GenerateMachineId(); PlayerPrefs.DeleteKey(MachineIdStorage.MachineIdentifierKey); @@ -86,7 +96,7 @@ public void TestMachineAttributes_ShouldAlwaysGenerateTheSameUntiyAttribute_Shou [Test] public void TestMachineAttributes_ShouldAlwaysGenerateTheSameMacAttribute_ShouldReturnTheSameMacIdentitfier() { - var machineIdStorage = new MachineIdStorageMock(false); + var machineIdStorage = new MachineIdStorage(new IMachineIdentifierDataProvider[] { new NetworkIdentifierDataProvider() }, new SessionStorageDataProvider()); var machineId = machineIdStorage.GenerateMachineId(); PlayerPrefs.DeleteKey(MachineIdStorage.MachineIdentifierKey); diff --git a/Tests/Runtime/Client/Mocks/MachineIdStorageMock.cs b/Tests/Runtime/Client/Mocks/MachineIdStorageMock.cs deleted file mode 100644 index 4a5760a4..00000000 --- a/Tests/Runtime/Client/Mocks/MachineIdStorageMock.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Backtrace.Unity.Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Backtrace.Unity.Tests.Runtime.Client.Mocks -{ - internal class MachineIdStorageMock : MachineIdStorage - { - private readonly bool _allowUnityIdentifier; - private readonly bool _allowNetworking; - public MachineIdStorageMock(bool allowUnityIdentifier = true, bool allowNetworking = true) : base() - { - _allowUnityIdentifier = allowUnityIdentifier; - _allowNetworking = allowNetworking; - } - - - protected override string UseNetworkingIdentifier() - { - if (!_allowNetworking) - { - return null; - } - return base.UseNetworkingIdentifier(); - } - - protected override string UseUnityIdentifier() - { - if (!_allowUnityIdentifier) - { - return null; - } - return base.UseUnityIdentifier(); - } - } -} diff --git a/Tests/Runtime/Client/Mocks/MachineIdStorageMock.cs.meta b/Tests/Runtime/Client/Mocks/MachineIdStorageMock.cs.meta deleted file mode 100644 index fda396ef..00000000 --- a/Tests/Runtime/Client/Mocks/MachineIdStorageMock.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d5e8f08a85cb6094ab6e27c6a018641e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: From 37d5ad7d91e8e5440842e78fb632282675126616 Mon Sep 17 00:00:00 2001 From: kdysput Date: Sun, 6 Apr 2025 21:37:52 +0200 Subject: [PATCH 5/7] EOL --- Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs b/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs index b9e3dbc0..233e3dc4 100644 --- a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs +++ b/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs @@ -32,4 +32,4 @@ public string Get() return null; } } -} \ No newline at end of file +} From 8ab10c0b62fa1c464e1bc59bd7c8cdce5f8cb51a Mon Sep 17 00:00:00 2001 From: kdysput Date: Wed, 9 Apr 2025 13:13:29 +0200 Subject: [PATCH 6/7] Rename interface to IMachineIdentifierProvider --- ...ntifierDataProvider.cs => IMachineIdentifierProvider.cs} | 2 +- ...aProvider.cs.meta => IMachineIdentifierProvider.cs.meta} | 0 Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs | 2 +- .../Model/DataProvider/UnityMachineIdentifierProvider.cs | 2 +- Runtime/Model/MachineIdStorage.cs | 6 +++--- Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs | 6 +++--- 6 files changed, 9 insertions(+), 9 deletions(-) rename Runtime/Model/DataProvider/{IMachineIdentifierDataProvider.cs => IMachineIdentifierProvider.cs} (77%) rename Runtime/Model/DataProvider/{IMachineIdentifierDataProvider.cs.meta => IMachineIdentifierProvider.cs.meta} (100%) diff --git a/Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs b/Runtime/Model/DataProvider/IMachineIdentifierProvider.cs similarity index 77% rename from Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs rename to Runtime/Model/DataProvider/IMachineIdentifierProvider.cs index 330fbab9..b438c581 100644 --- a/Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs +++ b/Runtime/Model/DataProvider/IMachineIdentifierProvider.cs @@ -1,7 +1,7 @@ [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Backtrace.Unity.Tests.Runtime")] namespace Backtrace.Unity.Model.DataProvider { - internal interface IMachineIdentifierDataProvider + internal interface IMachineIdentifierProvider { string Get(); } diff --git a/Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs.meta b/Runtime/Model/DataProvider/IMachineIdentifierProvider.cs.meta similarity index 100% rename from Runtime/Model/DataProvider/IMachineIdentifierDataProvider.cs.meta rename to Runtime/Model/DataProvider/IMachineIdentifierProvider.cs.meta diff --git a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs b/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs index 233e3dc4..96df31b9 100644 --- a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs +++ b/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs @@ -5,7 +5,7 @@ namespace Backtrace.Unity.Model.DataProvider { - internal class NetworkIdentifierDataProvider : IMachineIdentifierDataProvider + internal class NetworkIdentifierDataProvider : IMachineIdentifierProvider { public string Get() { diff --git a/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs b/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs index e7680903..f716892d 100644 --- a/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs +++ b/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs @@ -6,7 +6,7 @@ namespace Backtrace.Unity.Model.DataProvider { - internal class UnityMachineIdentifierProvider : IMachineIdentifierDataProvider + internal class UnityMachineIdentifierProvider : IMachineIdentifierProvider { private readonly string _deviceUniqueIdentifier; internal UnityMachineIdentifierProvider() : this(SystemInfo.deviceUniqueIdentifier) { } diff --git a/Runtime/Model/MachineIdStorage.cs b/Runtime/Model/MachineIdStorage.cs index 26696b53..28ab39a0 100644 --- a/Runtime/Model/MachineIdStorage.cs +++ b/Runtime/Model/MachineIdStorage.cs @@ -16,13 +16,13 @@ internal class MachineIdStorage internal const string MachineIdentifierKey = "backtrace-machine-id"; private readonly ISessionStorageDataProvider _sessionStorageDataProvider; - private readonly IMachineIdentifierDataProvider[] _machineIdentifierDataProviders; + private readonly IMachineIdentifierProvider[] _machineIdentifierDataProviders; internal MachineIdStorage() : this( - new IMachineIdentifierDataProvider[] { new UnityMachineIdentifierProvider(), new NetworkIdentifierDataProvider() }, + new IMachineIdentifierProvider[] { new UnityMachineIdentifierProvider(), new NetworkIdentifierDataProvider() }, new SessionStorageDataProvider()) { } - internal MachineIdStorage(IMachineIdentifierDataProvider[] machineIdentifierDataProviders, ISessionStorageDataProvider sessionStorageDataProvider) + internal MachineIdStorage(IMachineIdentifierProvider[] machineIdentifierDataProviders, ISessionStorageDataProvider sessionStorageDataProvider) { _machineIdentifierDataProviders = machineIdentifierDataProviders; _sessionStorageDataProvider = sessionStorageDataProvider; diff --git a/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs b/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs index 37ef1390..68fcbad2 100644 --- a/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs +++ b/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs @@ -29,7 +29,7 @@ public void TestMachineAttributes_ShouldUseMac_ShouldReturnNetowrkingIdentifier( { var networkIdentifierDataProvider = new NetworkIdentifierDataProvider(); var expectedMachineId = networkIdentifierDataProvider.Get(); - var machineIdStorage = new MachineIdStorage(new IMachineIdentifierDataProvider[] { networkIdentifierDataProvider }, new SessionStorageDataProvider()); + var machineIdStorage = new MachineIdStorage(new IMachineIdentifierProvider[] { networkIdentifierDataProvider }, new SessionStorageDataProvider()); var machineId = machineIdStorage.GenerateMachineId(); @@ -39,7 +39,7 @@ public void TestMachineAttributes_ShouldUseMac_ShouldReturnNetowrkingIdentifier( [Test] public void TestMachineAttributes_ShouldUseRandomMachineId_ShouldReturnRandomMachineId() { - var machineIdStorage = new MachineIdStorage(new IMachineIdentifierDataProvider[0], new SessionStorageDataProvider()); + var machineIdStorage = new MachineIdStorage(new IMachineIdentifierProvider[0], new SessionStorageDataProvider()); var machineId = machineIdStorage.GenerateMachineId(); @@ -96,7 +96,7 @@ public void TestMachineAttributes_ShouldAlwaysGenerateTheSameUntiyAttribute_Shou [Test] public void TestMachineAttributes_ShouldAlwaysGenerateTheSameMacAttribute_ShouldReturnTheSameMacIdentitfier() { - var machineIdStorage = new MachineIdStorage(new IMachineIdentifierDataProvider[] { new NetworkIdentifierDataProvider() }, new SessionStorageDataProvider()); + var machineIdStorage = new MachineIdStorage(new IMachineIdentifierProvider[] { new NetworkIdentifierDataProvider() }, new SessionStorageDataProvider()); var machineId = machineIdStorage.GenerateMachineId(); PlayerPrefs.DeleteKey(MachineIdStorage.MachineIdentifierKey); From 758824ce361fc67a0a934135a7ba8754820499d9 Mon Sep 17 00:00:00 2001 From: kdysput Date: Wed, 9 Apr 2025 13:21:12 +0200 Subject: [PATCH 7/7] Follow the naming pattern and remove DataProvider from Id providers --- .../Model/DataProvider/NetworkIdentifierDataProvider.cs.meta | 2 -- ...IdentifierDataProvider.cs => NetworkIdentifierProvider.cs} | 2 +- Runtime/Model/DataProvider/NetworkIdentifierProvider.cs.meta | 2 ++ Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs | 2 -- Runtime/Model/MachineIdStorage.cs | 2 +- Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs | 4 ++-- 6 files changed, 6 insertions(+), 8 deletions(-) delete mode 100644 Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs.meta rename Runtime/Model/DataProvider/{NetworkIdentifierDataProvider.cs => NetworkIdentifierProvider.cs} (92%) create mode 100644 Runtime/Model/DataProvider/NetworkIdentifierProvider.cs.meta diff --git a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs.meta b/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs.meta deleted file mode 100644 index 6cf96c56..00000000 --- a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 782edca6574201243814325779483442 \ No newline at end of file diff --git a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs b/Runtime/Model/DataProvider/NetworkIdentifierProvider.cs similarity index 92% rename from Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs rename to Runtime/Model/DataProvider/NetworkIdentifierProvider.cs index 96df31b9..4ac56a69 100644 --- a/Runtime/Model/DataProvider/NetworkIdentifierDataProvider.cs +++ b/Runtime/Model/DataProvider/NetworkIdentifierProvider.cs @@ -5,7 +5,7 @@ namespace Backtrace.Unity.Model.DataProvider { - internal class NetworkIdentifierDataProvider : IMachineIdentifierProvider + internal class NetworkIdentifierProvider : IMachineIdentifierProvider { public string Get() { diff --git a/Runtime/Model/DataProvider/NetworkIdentifierProvider.cs.meta b/Runtime/Model/DataProvider/NetworkIdentifierProvider.cs.meta new file mode 100644 index 00000000..288aecb1 --- /dev/null +++ b/Runtime/Model/DataProvider/NetworkIdentifierProvider.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 92eddf6f5fcf68d489027eabf6b0d935 \ No newline at end of file diff --git a/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs b/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs index f716892d..df1f70e8 100644 --- a/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs +++ b/Runtime/Model/DataProvider/UnityMachineIdentifierProvider.cs @@ -1,7 +1,5 @@ using Backtrace.Unity.Extensions; using System; -using System.Linq; -using System.Net.NetworkInformation; using UnityEngine; namespace Backtrace.Unity.Model.DataProvider diff --git a/Runtime/Model/MachineIdStorage.cs b/Runtime/Model/MachineIdStorage.cs index 28ab39a0..2a199314 100644 --- a/Runtime/Model/MachineIdStorage.cs +++ b/Runtime/Model/MachineIdStorage.cs @@ -19,7 +19,7 @@ internal class MachineIdStorage private readonly IMachineIdentifierProvider[] _machineIdentifierDataProviders; internal MachineIdStorage() : this( - new IMachineIdentifierProvider[] { new UnityMachineIdentifierProvider(), new NetworkIdentifierDataProvider() }, + new IMachineIdentifierProvider[] { new UnityMachineIdentifierProvider(), new NetworkIdentifierProvider() }, new SessionStorageDataProvider()) { } internal MachineIdStorage(IMachineIdentifierProvider[] machineIdentifierDataProviders, ISessionStorageDataProvider sessionStorageDataProvider) diff --git a/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs b/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs index 68fcbad2..e0ffa2fa 100644 --- a/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs +++ b/Tests/Runtime/Client/BacktraceAttributeMachineIdTests.cs @@ -27,7 +27,7 @@ public void TestMachineAttributes_ShouldUseUnityIdentifier_ShouldReturnUnityIden [Test] public void TestMachineAttributes_ShouldUseMac_ShouldReturnNetowrkingIdentifier() { - var networkIdentifierDataProvider = new NetworkIdentifierDataProvider(); + var networkIdentifierDataProvider = new NetworkIdentifierProvider(); var expectedMachineId = networkIdentifierDataProvider.Get(); var machineIdStorage = new MachineIdStorage(new IMachineIdentifierProvider[] { networkIdentifierDataProvider }, new SessionStorageDataProvider()); @@ -96,7 +96,7 @@ public void TestMachineAttributes_ShouldAlwaysGenerateTheSameUntiyAttribute_Shou [Test] public void TestMachineAttributes_ShouldAlwaysGenerateTheSameMacAttribute_ShouldReturnTheSameMacIdentitfier() { - var machineIdStorage = new MachineIdStorage(new IMachineIdentifierProvider[] { new NetworkIdentifierDataProvider() }, new SessionStorageDataProvider()); + var machineIdStorage = new MachineIdStorage(new IMachineIdentifierProvider[] { new NetworkIdentifierProvider() }, new SessionStorageDataProvider()); var machineId = machineIdStorage.GenerateMachineId(); PlayerPrefs.DeleteKey(MachineIdStorage.MachineIdentifierKey);