Exemplo n.º 1
0
        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());
        }
Exemplo n.º 2
0
            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();
            }
Exemplo n.º 3
0
        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();
        }
Exemplo n.º 4
0
            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()}");
                }
Exemplo n.º 5
0
                static void VerifyPeekInteger(CborReader reader, bool isUnsignedInteger)
                {
                    CborReaderState expectedState = isUnsignedInteger ? CborReaderState.UnsignedInteger : CborReaderState.NegativeInteger;

                    Assert.Equal(expectedState, reader.Peek());
                }
Exemplo n.º 6
0
        public static void Peek_EmptyBuffer_ShouldReturnEof()
        {
            var reader = new CborReader(ReadOnlyMemory <byte> .Empty);

            Assert.Equal(CborReaderState.EndOfData, reader.Peek());
        }