From 21d8418a93a505d489a1e5809686e282efb4f9d6 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Tue, 16 Mar 2021 14:45:24 +0100 Subject: [PATCH] Big-endian test case fixes: System.Memory tests (#49690) * Fix endian assumptions in preparing input byte patterns * Enable tests that were disabled on big-endian systems --- .../tests/Binary/BinaryReaderUnitTests.cs | 29 ++++++++++++------- .../tests/Binary/BinaryWriterUnitTests.cs | 11 ------- .../MemoryMarshal/AsBytesReadOnlySpan.cs | 10 ++++++- .../tests/MemoryMarshal/AsBytesSpan.cs | 10 ++++++- .../tests/MemoryMarshal/CastReadOnlySpan.cs | 20 +++++++++++-- .../tests/MemoryMarshal/CastSpan.cs | 20 +++++++++++-- .../tests/SequenceReader/BinaryExtensions.cs | 10 +++---- 7 files changed, 77 insertions(+), 33 deletions(-) diff --git a/src/libraries/System.Memory/tests/Binary/BinaryReaderUnitTests.cs b/src/libraries/System.Memory/tests/Binary/BinaryReaderUnitTests.cs index b93985c77c450..b4fb102bb1e6d 100644 --- a/src/libraries/System.Memory/tests/Binary/BinaryReaderUnitTests.cs +++ b/src/libraries/System.Memory/tests/Binary/BinaryReaderUnitTests.cs @@ -14,9 +14,15 @@ public class BinaryReaderUnitTests [Fact] public void SpanRead() { - Assert.True(BitConverter.IsLittleEndian); - - ulong value = 0x8877665544332211; // [11 22 33 44 55 66 77 88] + ulong value; // [11 22 33 44 55 66 77 88] + if (BitConverter.IsLittleEndian) + { + value = 0x8877665544332211; + } + else + { + value = 0x1122334455667788; + } Span span; unsafe { @@ -113,9 +119,15 @@ public void SpanRead() [Fact] public void ReadOnlySpanRead() { - Assert.True(BitConverter.IsLittleEndian); - - ulong value = 0x8877665544332211; // [11 22 33 44 55 66 77 88] + ulong value; // [11 22 33 44 55 66 77 88] + if (BitConverter.IsLittleEndian) + { + value = 0x8877665544332211; + } + else + { + value = 0x1122334455667788; + } ReadOnlySpan span; unsafe { @@ -282,8 +294,6 @@ public void ReadOnlySpanReadFail() [Fact] public void SpanWriteAndReadBigEndianHeterogeneousStruct() { - Assert.True(BitConverter.IsLittleEndian); - Span spanBE = new byte[Unsafe.SizeOf()]; WriteInt16BigEndian(spanBE, s_testStruct.S0); @@ -358,8 +368,6 @@ public void SpanWriteAndReadBigEndianHeterogeneousStruct() [Fact] public void SpanWriteAndReadLittleEndianHeterogeneousStruct() { - Assert.True(BitConverter.IsLittleEndian); - Span spanLE = new byte[Unsafe.SizeOf()]; WriteInt16LittleEndian(spanLE, s_testStruct.S0); @@ -434,7 +442,6 @@ public void SpanWriteAndReadLittleEndianHeterogeneousStruct() [Fact] public void ReadingStructFieldByFieldOrReadAndReverseEndianness() { - Assert.True(BitConverter.IsLittleEndian); Span spanBE = new byte[Unsafe.SizeOf()]; var testExplicitStruct = new TestHelpers.TestStructExplicit diff --git a/src/libraries/System.Memory/tests/Binary/BinaryWriterUnitTests.cs b/src/libraries/System.Memory/tests/Binary/BinaryWriterUnitTests.cs index be50576df78ae..2f9011470521a 100644 --- a/src/libraries/System.Memory/tests/Binary/BinaryWriterUnitTests.cs +++ b/src/libraries/System.Memory/tests/Binary/BinaryWriterUnitTests.cs @@ -14,8 +14,6 @@ public class BinaryWriterUnitTests [Fact] public void SpanWrite() { - Assert.True(BitConverter.IsLittleEndian); - Span span = new byte[8]; byte byteValue = 0x11; @@ -92,7 +90,6 @@ public void SpanWrite() [InlineData(0x00FF)] public void SpanWriteInt16(short value) { - Assert.True(BitConverter.IsLittleEndian); var span = new Span(new byte[2]); WriteInt16BigEndian(span, value); short read = ReadInt16BigEndian(span); @@ -121,7 +118,6 @@ public void SpanWriteInt16(short value) [InlineData(0x00FF)] public void SpanWriteUInt16(ushort value) { - Assert.True(BitConverter.IsLittleEndian); var span = new Span(new byte[2]); WriteUInt16BigEndian(span, value); ushort read = ReadUInt16BigEndian(span); @@ -152,7 +148,6 @@ public void SpanWriteUInt16(ushort value) [InlineData(0x000000FF)] public void SpanWriteInt32(int value) { - Assert.True(BitConverter.IsLittleEndian); var span = new Span(new byte[4]); WriteInt32BigEndian(span, value); int read = ReadInt32BigEndian(span); @@ -183,7 +178,6 @@ public void SpanWriteInt32(int value) [InlineData(0x000000FF)] public void SpanWriteUInt32(uint value) { - Assert.True(BitConverter.IsLittleEndian); var span = new Span(new byte[4]); WriteUInt32BigEndian(span, value); uint read = ReadUInt32BigEndian(span); @@ -218,7 +212,6 @@ public void SpanWriteUInt32(uint value) [InlineData(0x00000000000000FF)] public void SpanWriteInt64(long value) { - Assert.True(BitConverter.IsLittleEndian); var span = new Span(new byte[8]); WriteInt64BigEndian(span, value); long read = ReadInt64BigEndian(span); @@ -253,7 +246,6 @@ public void SpanWriteInt64(long value) [InlineData(0x00000000000000FF)] public void SpanWriteUInt64(ulong value) { - Assert.True(BitConverter.IsLittleEndian); var span = new Span(new byte[8]); WriteUInt64BigEndian(span, value); ulong read = ReadUInt64BigEndian(span); @@ -290,7 +282,6 @@ public static IEnumerable SpanWriteHalf_TestData() [MemberData(nameof(SpanWriteHalf_TestData))] public void SpanWriteHalf(Half value) { - Assert.True(BitConverter.IsLittleEndian); var span = new Span(new byte[4]); WriteHalfBigEndian(span, value); Half read = ReadHalfBigEndian(span); @@ -321,7 +312,6 @@ public void SpanWriteHalf(Half value) [InlineData(float.NaN)] public void SpanWriteSingle(float value) { - Assert.True(BitConverter.IsLittleEndian); var span = new Span(new byte[4]); WriteSingleBigEndian(span, value); float read = ReadSingleBigEndian(span); @@ -352,7 +342,6 @@ public void SpanWriteSingle(float value) [InlineData(double.NaN)] public void SpanWriteDouble(double value) { - Assert.True(BitConverter.IsLittleEndian); var span = new Span(new byte[8]); WriteDoubleBigEndian(span, value); double read = ReadDoubleBigEndian(span); diff --git a/src/libraries/System.Memory/tests/MemoryMarshal/AsBytesReadOnlySpan.cs b/src/libraries/System.Memory/tests/MemoryMarshal/AsBytesReadOnlySpan.cs index 7b4408c31eef9..a3789ecd1bdda 100644 --- a/src/libraries/System.Memory/tests/MemoryMarshal/AsBytesReadOnlySpan.cs +++ b/src/libraries/System.Memory/tests/MemoryMarshal/AsBytesReadOnlySpan.cs @@ -12,7 +12,15 @@ public static partial class MemoryMarshalTests [Fact] public static void ReadOnlySpan_AsBytesUIntToByte() { - uint[] a = { 0x44332211, 0x88776655 }; + uint[] a; + if (BitConverter.IsLittleEndian) + { + a = new uint[] { 0x44332211, 0x88776655 }; + } + else + { + a = new uint[] { 0x11223344, 0x55667788 }; + } ReadOnlySpan span = new ReadOnlySpan(a); ReadOnlySpan asBytes = MemoryMarshal.AsBytes(span); diff --git a/src/libraries/System.Memory/tests/MemoryMarshal/AsBytesSpan.cs b/src/libraries/System.Memory/tests/MemoryMarshal/AsBytesSpan.cs index 85f53e8dcffc9..d1402266c295e 100644 --- a/src/libraries/System.Memory/tests/MemoryMarshal/AsBytesSpan.cs +++ b/src/libraries/System.Memory/tests/MemoryMarshal/AsBytesSpan.cs @@ -12,7 +12,15 @@ public static partial class MemoryMarshalTests [Fact] public static void Span_AsBytesUIntToByte() { - uint[] a = { 0x44332211, 0x88776655 }; + uint[] a; + if (BitConverter.IsLittleEndian) + { + a = new uint[] { 0x44332211, 0x88776655 }; + } + else + { + a = new uint[] { 0x11223344, 0x55667788 }; + } Span span = new Span(a); Span asBytes = MemoryMarshal.AsBytes(span); diff --git a/src/libraries/System.Memory/tests/MemoryMarshal/CastReadOnlySpan.cs b/src/libraries/System.Memory/tests/MemoryMarshal/CastReadOnlySpan.cs index 019c9a5b42012..0c5bb81020266 100644 --- a/src/libraries/System.Memory/tests/MemoryMarshal/CastReadOnlySpan.cs +++ b/src/libraries/System.Memory/tests/MemoryMarshal/CastReadOnlySpan.cs @@ -12,7 +12,15 @@ public static partial class MemoryMarshalTests [Fact] public static void CastReadOnlySpanUIntToUShort() { - uint[] a = { 0x44332211, 0x88776655 }; + uint[] a; + if (BitConverter.IsLittleEndian) + { + a = new uint[] { 0x44332211, 0x88776655 }; + } + else + { + a = new uint[] { 0x22114433, 0x66558877 }; + } ReadOnlySpan span = new ReadOnlySpan(a); ReadOnlySpan asUShort = MemoryMarshal.Cast(span); @@ -23,7 +31,15 @@ public static void CastReadOnlySpanUIntToUShort() [Fact] public static void CastReadOnlySpanShortToLong() { - short[] a = { 0x1234, 0x2345, 0x3456, 0x4567, 0x5678 }; + short[] a; + if (BitConverter.IsLittleEndian) + { + a = new short[] { 0x1234, 0x2345, 0x3456, 0x4567, 0x5678 }; + } + else + { + a = new short[] { 0x4567, 0x3456, 0x2345, 0x1234, 0x5678 }; + } ReadOnlySpan span = new ReadOnlySpan(a); ReadOnlySpan asLong = MemoryMarshal.Cast(span); diff --git a/src/libraries/System.Memory/tests/MemoryMarshal/CastSpan.cs b/src/libraries/System.Memory/tests/MemoryMarshal/CastSpan.cs index b77e853650ef4..796ea5dc05436 100644 --- a/src/libraries/System.Memory/tests/MemoryMarshal/CastSpan.cs +++ b/src/libraries/System.Memory/tests/MemoryMarshal/CastSpan.cs @@ -13,7 +13,15 @@ public static partial class MemoryMarshalTests [Fact] public static void CastSpanUIntToUShort() { - uint[] a = { 0x44332211, 0x88776655 }; + uint[] a; + if (BitConverter.IsLittleEndian) + { + a = new uint[] { 0x44332211, 0x88776655 }; + } + else + { + a = new uint[] { 0x22114433, 0x66558877 }; + } Span span = new Span(a); Span asUShort = MemoryMarshal.Cast(span); @@ -35,7 +43,15 @@ public static void CastSpanToEmptyStruct() [Fact] public static void CastSpanShortToLong() { - short[] a = { 0x1234, 0x2345, 0x3456, 0x4567, 0x5678 }; + short[] a; + if (BitConverter.IsLittleEndian) + { + a = new short[] { 0x1234, 0x2345, 0x3456, 0x4567, 0x5678 }; + } + else + { + a = new short[] { 0x4567, 0x3456, 0x2345, 0x1234, 0x5678 }; + } Span span = new Span(a); Span asLong = MemoryMarshal.Cast(span); diff --git a/src/libraries/System.Memory/tests/SequenceReader/BinaryExtensions.cs b/src/libraries/System.Memory/tests/SequenceReader/BinaryExtensions.cs index 3d0c4379c74a0..5785bb5ca13a4 100644 --- a/src/libraries/System.Memory/tests/SequenceReader/BinaryExtensions.cs +++ b/src/libraries/System.Memory/tests/SequenceReader/BinaryExtensions.cs @@ -51,19 +51,19 @@ public void MultiSegmentBytesReaderNumbers() Assert.Equal(BitConverter.ToInt32(new byte[] { 0, 1, 0, 2 }), intValue); Assert.True(reader.TryReadBigEndian(out intValue)); - Assert.Equal(BitConverter.ToInt32(new byte[] { 4, 3, 2, 1 }), intValue); + Assert.Equal(0x01020304, intValue); Assert.True(reader.TryReadLittleEndian(out long longValue)); - Assert.Equal(BitConverter.ToInt64(new byte[] { 5, 6, 7, 8, 9, 0, 1, 2 }), longValue); + Assert.Equal(0x0201000908070605L, longValue); Assert.True(reader.TryReadBigEndian(out longValue)); - Assert.Equal(BitConverter.ToInt64(new byte[] { 0, 9, 8, 7, 6, 5, 4, 3 }), longValue); + Assert.Equal(0x0304050607080900L, longValue); Assert.True(reader.TryReadLittleEndian(out short shortValue)); - Assert.Equal(BitConverter.ToInt16(new byte[] { 1, 2 }), shortValue); + Assert.Equal(0x0201, shortValue); Assert.True(reader.TryReadBigEndian(out shortValue)); - Assert.Equal(BitConverter.ToInt16(new byte[] { 4, 3 }), shortValue); + Assert.Equal(0x0304, shortValue); } } }