From 9d1ac2606035bc65465fa6259603b63eda9c90ac Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 19 Oct 2026 12:13:24 -0500 Subject: [PATCH 1/3] test: generate canonical bools in NetworkVariable serialization tests RandGenBytes filled each bool with a random byte, so most values were neither 0 nor 1. On mac arm64 IL2CPP the List and NativeHashMap cases then failed with both sides printing identical all-True contents. RandGenBool returns only false or true. --- .../NetworkVariable/NetworkVariableTests.cs | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs index 2d76f87a3c..c0f47b3232 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs @@ -1796,6 +1796,13 @@ public unsafe T RandGenBytes(System.Random rand) where T : unmanaged return t; } + // RandGenBytes yields bools whose byte is neither 0 nor 1, which IL2CPP on ARM64 can + // compare as unequal even though both print True. + public bool RandGenBool(System.Random rand) + { + return rand.Next(2) == 1; + } + public FixedString32Bytes RandGenFixedString32(System.Random rand) { var s = new FixedString32Bytes(); @@ -2401,7 +2408,7 @@ public void WhenSerializingAndDeserializingVeryLargeListNetworkVariables_ValuesA } else if (testType == typeof(bool)) { - (var original, var original2, var changed, var changed2) = GetLists(RandGenBytes); + (var original, var original2, var changed, var changed2) = GetLists(RandGenBool); TestList(original, changed); TestList(original2, changed2); } @@ -2594,7 +2601,7 @@ public void WhenSerializingAndDeserializingVeryLargeHashSetNetworkVariables_Valu } else if (testType == typeof(bool)) { - (var original, var original2, var changed, var changed2) = GetHashSets(RandGenBytes); + (var original, var original2, var changed, var changed2) = GetHashSets(RandGenBool); TestHashSet(original, changed); TestHashSet(original2, changed2); } @@ -2944,27 +2951,27 @@ public void WhenSerializingAndDeserializingVeryLargeDictionaryNetworkVariables_V { if (keyType == typeof(byte)) { - (var original, var original2, var changed, var changed2) = GetDictionaries(RandGenBytes, RandGenBytes); + (var original, var original2, var changed, var changed2) = GetDictionaries(RandGenBytes, RandGenBool); TestDictionary(original, changed); TestDictionary(original2, changed2); } else if (keyType == typeof(ulong)) { - (var original, var original2, var changed, var changed2) = GetDictionaries(RandGenBytes, RandGenBytes); + (var original, var original2, var changed, var changed2) = GetDictionaries(RandGenBytes, RandGenBool); TestDictionary(original, changed); TestDictionary(original2, changed2); } else if (keyType == typeof(Vector2)) { - (var original, var original2, var changed, var changed2) = GetDictionaries((rand) => new Vector2((float)rand.NextDouble(), (float)rand.NextDouble()), RandGenBytes); + (var original, var original2, var changed, var changed2) = GetDictionaries((rand) => new Vector2((float)rand.NextDouble(), (float)rand.NextDouble()), RandGenBool); TestDictionary(original, changed); TestDictionary(original2, changed2); } else if (keyType == typeof(HashMapKeyClass)) { - (var original, var original2, var changed, var changed2) = GetDictionaries((rand) => new HashMapKeyClass { Data = RandGenBytes(rand) }, RandGenBytes); + (var original, var original2, var changed, var changed2) = GetDictionaries((rand) => new HashMapKeyClass { Data = RandGenBytes(rand) }, RandGenBool); TestDictionary(original, changed); TestDictionary(original2, changed2); } @@ -3899,7 +3906,7 @@ public void WhenSerializingAndDeserializingVeryLargeValueTypeNativeListNetworkVa } else if (testType == typeof(bool)) { - (var original, var original2, var changed, var changed2) = GetNativeLists(RandGenBytes); + (var original, var original2, var changed, var changed2) = GetNativeLists(RandGenBool); TestValueTypeNativeList(original, changed); TestValueTypeNativeList(original2, changed2); } @@ -4088,7 +4095,7 @@ public void WhenSerializingAndDeserializingVeryLargeValueTypeNativeHashSetNetwor } else if (testType == typeof(bool)) { - (var original, var original2, var changed, var changed2) = GetNativeHashSets(RandGenBytes); + (var original, var original2, var changed, var changed2) = GetNativeHashSets(RandGenBool); TestValueTypeNativeHashSet(original, changed); TestValueTypeNativeHashSet(original2, changed2); } @@ -4434,27 +4441,27 @@ public void WhenSerializingAndDeserializingVeryLargeValueTypeNativeHashMapNetwor { if (keyType == typeof(byte)) { - (var original, var original2, var changed, var changed2) = GetMaps(RandGenBytes, RandGenBytes); + (var original, var original2, var changed, var changed2) = GetMaps(RandGenBytes, RandGenBool); TestValueTypeNativeHashMap(original, changed); TestValueTypeNativeHashMap(original2, changed2); } else if (keyType == typeof(ulong)) { - (var original, var original2, var changed, var changed2) = GetMaps(RandGenBytes, RandGenBytes); + (var original, var original2, var changed, var changed2) = GetMaps(RandGenBytes, RandGenBool); TestValueTypeNativeHashMap(original, changed); TestValueTypeNativeHashMap(original2, changed2); } else if (keyType == typeof(Vector2)) { - (var original, var original2, var changed, var changed2) = GetMaps((rand) => new Vector2((float)rand.NextDouble(), (float)rand.NextDouble()), RandGenBytes); + (var original, var original2, var changed, var changed2) = GetMaps((rand) => new Vector2((float)rand.NextDouble(), (float)rand.NextDouble()), RandGenBool); TestValueTypeNativeHashMap(original, changed); TestValueTypeNativeHashMap(original2, changed2); } else if (keyType == typeof(HashMapKeyStruct)) { - (var original, var original2, var changed, var changed2) = GetMaps(RandGenBytes, RandGenBytes); + (var original, var original2, var changed, var changed2) = GetMaps(RandGenBytes, RandGenBool); TestValueTypeNativeHashMap(original, changed); TestValueTypeNativeHashMap(original2, changed2); } From 329b637d4f9b57140de47c3a2b7b03312811fb85 Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 19 Oct 2026 13:04:30 -0500 Subject: [PATCH 2/3] test: use RandGenBool for the NativeArray case --- .../Tests/Runtime/NetworkVariable/NetworkVariableTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs index c0f47b3232..20019c5ab8 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs @@ -1947,7 +1947,7 @@ public void WhenSerializingAndDeserializingVeryLargeValueTypeNativeArrayNetworkV } else if (testType == typeof(bool)) { - (var original, var original2, var changed, var changed2) = GetArarys((rand) => rand.Next(2) == 1); + (var original, var original2, var changed, var changed2) = GetArarys(RandGenBool); TestValueTypeNativeArray(original, changed); TestValueTypeNativeArray(original2, changed2); } From ba2ae2f5d7e4e3da751e3dba7db68f37ed005ffc Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Wed, 21 Oct 2026 10:26:55 -0500 Subject: [PATCH 3/3] test: make changed2 always differ from original2 in collection generators With RandGenBool an overwrite keeps the existing value half the time, so when no elements were added or removed, changed2 could equal original2 and the "do not match" assertions failed. Each overwrite now redraws until it differs from the original element. --- .../NetworkVariable/NetworkVariableTests.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs index 20019c5ab8..6fa812d0e2 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableTests.cs @@ -1870,6 +1870,11 @@ public string ArrayStr(NativeArray arr) where T : unmanaged { var idx = rand.Next(changed2.Length - 1); var item = generator(rand); + // Ensures changed2 differs from original2 when its length matches original2. + while (idx < original2.Length && EqualityComparer.Default.Equals(item, original2[idx])) + { + item = generator(rand); + } changed2[idx] = item; } @@ -2165,6 +2170,11 @@ public string DictionaryStr(Dictionary list) { var idx = rand.Next(changed2.Count - 1); var item = generator(rand); + // Ensures changed2 differs from original2 when no elements are added or removed. + while (EqualityComparer.Default.Equals(item, original2[idx])) + { + item = generator(rand); + } changed2[idx] = item; } @@ -3663,6 +3673,11 @@ public string NativeHashMapStr(NativeHashMap list) { var idx = rand.Next(changed2.Length - 1); var item = generator(rand); + // Ensures changed2 differs from original2 when no elements are added or removed. + while (EqualityComparer.Default.Equals(item, original2[idx])) + { + item = generator(rand); + } changed2[idx] = item; }