public static void SkipValue_ExtremelyNestedValues_ShouldNotStackOverflow(int depth) { // Construct a valid CBOR encoding with extreme nesting: // defines a tower of `depth` nested singleton arrays, // with the innermost array containing zero. byte[] encoding = new byte[depth + 1]; encoding.AsSpan(0, depth).Fill(0x81); // array of length 1 encoding[depth] = 0; var reader = new CborReader(encoding); reader.SkipValue(); Assert.Equal(CborReaderState.Finished, reader.Peek()); }
public static void VerifyArray(CborReader reader, object[] expectedValues, bool expectDefiniteLengthCollections = true) { Assert.Equal(CborReaderState.StartArray, reader.Peek()); ulong?length = reader.ReadStartArray(); if (expectDefiniteLengthCollections) { Assert.NotNull(length); Assert.Equal(expectedValues.Length, (int)length !.Value); } else { Assert.Null(length); } foreach (object value in expectedValues) { VerifyValue(reader, value); } Assert.Equal(CborReaderState.EndArray, reader.Peek()); reader.ReadEndArray(); }
public static void VerifyArray(CborReader reader, params object[] expectedValues) { Assert.Equal(CborReaderState.StartArray, reader.Peek()); ulong?length = reader.ReadStartArray(); Assert.NotNull(length); Assert.Equal(expectedValues.Length, (int)length !.Value); foreach (object value in expectedValues) { switch (value) { case int expected: if (expected >= 0) { Assert.Equal(CborReaderState.UnsignedInteger, reader.Peek()); } else { Assert.Equal(CborReaderState.NegativeInteger, reader.Peek()); } long i = reader.ReadInt64(); Assert.Equal(expected, (int)i); break; case string expected: Assert.Equal(CborReaderState.TextString, reader.Peek()); string s = reader.ReadTextString(); Assert.Equal(expected, s); break; case byte[] expected: Assert.Equal(CborReaderState.ByteString, reader.Peek()); byte[] b = reader.ReadByteString(); Assert.Equal(expected, b); break; case object[] nested: VerifyArray(reader, nested); break; default: throw new ArgumentException($"Unrecognized argument type {value.GetType()}"); } } Assert.Equal(CborReaderState.EndArray, reader.Peek()); reader.ReadEndArray(); }
public static void VerifyValue(CborReader reader, object expectedValue, bool expectDefiniteLengthCollections = true) { switch (expectedValue) { case null: Assert.Equal(CborReaderState.Null, reader.Peek()); reader.ReadNull(); break; case bool expected: Assert.Equal(CborReaderState.Boolean, reader.Peek()); bool b = reader.ReadBoolean(); Assert.Equal(expected, b); break; case int expected: VerifyPeekInteger(reader, isUnsignedInteger: expected >= 0); long i = reader.ReadInt64(); Assert.Equal(expected, (int)i); break; case long expected: VerifyPeekInteger(reader, isUnsignedInteger: expected >= 0); long l = reader.ReadInt64(); Assert.Equal(expected, l); break; case ulong expected: VerifyPeekInteger(reader, isUnsignedInteger: true); ulong u = reader.ReadUInt64(); Assert.Equal(expected, u); break; case float expected: Assert.Equal(CborReaderState.SinglePrecisionFloat, reader.Peek()); float f = reader.ReadSingle(); Assert.Equal(expected, f); break; case double expected: Assert.Equal(CborReaderState.DoublePrecisionFloat, reader.Peek()); double d = reader.ReadDouble(); Assert.Equal(expected, d); break; case string expected: Assert.Equal(CborReaderState.TextString, reader.Peek()); string s = reader.ReadTextString(); Assert.Equal(expected, s); break; case byte[] expected: Assert.Equal(CborReaderState.ByteString, reader.Peek()); byte[] bytes = reader.ReadByteString(); Assert.Equal(expected.ByteArrayToHex(), bytes.ByteArrayToHex()); break; case string[] expectedChunks: Assert.Equal(CborReaderState.StartTextString, reader.Peek()); reader.ReadStartTextStringIndefiniteLength(); foreach (string expectedChunk in expectedChunks) { Assert.Equal(CborReaderState.TextString, reader.Peek()); string chunk = reader.ReadTextString(); Assert.Equal(expectedChunk, chunk); } Assert.Equal(CborReaderState.EndTextString, reader.Peek()); reader.ReadEndTextStringIndefiniteLength(); break; case byte[][] expectedChunks: Assert.Equal(CborReaderState.StartByteString, reader.Peek()); reader.ReadStartByteStringIndefiniteLength(); foreach (byte[] expectedChunk in expectedChunks) { Assert.Equal(CborReaderState.ByteString, reader.Peek()); byte[] chunk = reader.ReadByteString(); Assert.Equal(expectedChunk.ByteArrayToHex(), chunk.ByteArrayToHex()); } Assert.Equal(CborReaderState.EndByteString, reader.Peek()); reader.ReadEndByteStringIndefiniteLength(); break; case object[] nested when CborWriterTests.Helpers.IsCborMapRepresentation(nested): VerifyMap(reader, nested, expectDefiniteLengthCollections); break; case object[] nested: VerifyArray(reader, nested, expectDefiniteLengthCollections); break; default: throw new ArgumentException($"Unrecognized argument type {expectedValue.GetType()}"); }
static void VerifyPeekInteger(CborReader reader, bool isUnsignedInteger) { CborReaderState expectedState = isUnsignedInteger ? CborReaderState.UnsignedInteger : CborReaderState.NegativeInteger; Assert.Equal(expectedState, reader.Peek()); }
public static void Peek_EmptyBuffer_ShouldReturnEof() { var reader = new CborReader(ReadOnlyMemory <byte> .Empty); Assert.Equal(CborReaderState.EndOfData, reader.Peek()); }