Example #1
0
        private static SmallTestStruct DecodeSmallTestStruct(Span <byte> span)
        {
            SmallTestStruct testStruct = new SmallTestStruct();

            testStruct.A = Nethermind.Ssz.Ssz.DecodeUShort(span.Slice(0, 2));
            testStruct.B = Nethermind.Ssz.Ssz.DecodeUShort(span.Slice(2, 2));
            return(testStruct);
        }
Example #2
0
        private static SmallTestStruct ParseSmallTestStruct(YamlMappingNode mappingNode)
        {
            SmallTestStruct testStruct = new SmallTestStruct();

            testStruct.A = ushort.Parse(((YamlScalarNode)mappingNode.Children["A"]).Value);
            testStruct.B = ushort.Parse(((YamlScalarNode)mappingNode.Children["B"]).Value);
            return(testStruct);
        }
        public void Default()
        {
            var test  = new MemoryStorage().CreateDatabase("db").CreateTable <SmallTestStruct>();
            var typed = new Table <long, SmallTestStruct>(test);

            for (var i = 0; i < 1000; i++)
            {
                typed.Insert(new SmallTestStruct()
                {
                    Content = "", DateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local).AddHours(i), Name = "host" + (i % 10), Level = TestEnum.A, Source = "this",
                });
            }
            Assert.AreEqual(1000, test.RowCount);
            Assert.AreEqual(1, test.Count(Search.None, ResultOption.Group(nameof(SmallTestStruct.Content))));
            Assert.AreEqual(1000, test.Count(Search.None, ResultOption.Group(nameof(SmallTestStruct.DateTime))));
            Assert.AreEqual(10, test.Count(Search.None, ResultOption.Group(nameof(SmallTestStruct.Name))));

            Assert.AreEqual(10, test.Count(Search.None, ResultOption.Group(nameof(SmallTestStruct.Content)) + ResultOption.Group(nameof(SmallTestStruct.Name))));

            var rows = typed.GetStructs(Search.None, ResultOption.Group(nameof(SmallTestStruct.Name)) + ResultOption.SortDescending(nameof(SmallTestStruct.Name)));

            Assert.AreEqual(10, rows.Count);
            for (var i = 0; i < 10; i++)
            {
                Assert.AreEqual("host" + (9 - i), rows[i].Name);
            }

            rows = typed.GetStructs(
                Search.FieldGreater(nameof(SmallTestStruct.DateTime), new DateTime(1970, 1, 1, 5, 0, 0, DateTimeKind.Local)) &
                Search.FieldSmallerOrEqual(nameof(SmallTestStruct.DateTime), new DateTime(1970, 1, 1, 10, 0, 0, DateTimeKind.Local)),
                ResultOption.SortDescending(nameof(SmallTestStruct.DateTime)));
            var rowsExpected = typed.GetStructs().
                               Where(i => i.DateTime > new DateTime(1970, 1, 1, 5, 0, 0, DateTimeKind.Local) &&
                                     i.DateTime <= new DateTime(1970, 1, 1, 10, 0, 0, DateTimeKind.Local)).
                               OrderBy(i => - i.DateTime.Ticks).ToList();

            CollectionAssert.AreEqual(rowsExpected, rows);

            rows = typed.GetStructs(
                Search.FieldGreaterOrEqual(nameof(SmallTestStruct.DateTime), new DateTime(1970, 1, 1, 5, 0, 0, DateTimeKind.Local)) &
                Search.FieldSmaller(nameof(SmallTestStruct.DateTime), new DateTime(1970, 1, 1, 10, 0, 0, DateTimeKind.Local)),
                ResultOption.SortAscending(nameof(SmallTestStruct.DateTime)));
            rowsExpected = typed.GetStructs().
                           Where(i => i.DateTime >= new DateTime(1970, 1, 1, 5, 0, 0, DateTimeKind.Local) &&
                                 i.DateTime < new DateTime(1970, 1, 1, 10, 0, 0, DateTimeKind.Local)).
                           OrderBy(i => i.DateTime).ToList();
            CollectionAssert.AreEqual(rowsExpected, rows);

            for (var i = 0; i < 1000; i++)
            {
                var e = new SmallTestStruct()
                {
                    ID = i + 1, Content = "Updated" + i.ToString(), DateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local).AddHours(i % 100), Name = "this", Level = TestEnum.B, Source = "this",
                };
                typed.Update(e);
                Assert.AreEqual(e, typed.GetStruct(i + 1));
            }
            Assert.AreEqual(100, test.Count(Search.None, ResultOption.Group(nameof(SmallTestStruct.DateTime))));
            Assert.AreEqual(1000, test.Count(Search.None, ResultOption.Group(nameof(SmallTestStruct.Content))));
            Assert.AreEqual(1000, test.RowCount);

            for (var i = 0; i < 1000; i++)
            {
                var e = new SmallTestStruct()
                {
                    ID = i + 1, Content = "Replaced", DateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local).AddHours(i), Name = "this", Level = TestEnum.B, Source = "this",
                };
                typed.Update(e);
                Assert.AreEqual(e, typed.GetStruct(i + 1));
            }
            Assert.AreEqual(1000, test.Count(Search.None, ResultOption.Group(nameof(SmallTestStruct.DateTime))));
            Assert.AreEqual(1, test.Count(Search.None, ResultOption.Group(nameof(SmallTestStruct.Content))));
            Assert.AreEqual(1000, test.RowCount);
        }
Example #4
0
        private static bool RunGenericSszTests(string category)
        {
            bool success = true;

            string[] valid   = Directory.GetDirectories(Path.Combine("generic", category, "valid"));
            string[] invalid = Directory.GetDirectories(Path.Combine("generic", category, "invalid"));

            foreach (string validDir in valid)
            {
                TestContext.Out.WriteLine(validDir);
                string[] files = Directory.GetFiles(validDir);
                (YamlNode valueNode, YamlNodeType valueType) = LoadValue(Path.Combine(validDir, "value.yaml"));
                (YamlNode merkleRootYaml, _) = LoadValue(Path.Combine(validDir, "meta.yaml"));
                UInt256.CreateFromLittleEndian(out UInt256 expectedMerkleRoot, Bytes.FromHexString(((YamlScalarNode)merkleRootYaml["root"]).Value));

                Span <byte> output = null;
                Span <byte> ssz    = File.ReadAllBytes(Path.Combine(validDir, "serialized.ssz"));

                if (valueType == YamlNodeType.Sequence)
                {
                    YamlSequenceNode sequenceNode = (YamlSequenceNode)valueNode;
                    if (validDir.Contains("bool"))
                    {
                        bool[] value        = sequenceNode.Children.Cast <YamlScalarNode>().Select(sn => bool.Parse(sn?.Value ?? "false")).ToArray();
                        bool[] valueFromSsz = Nethermind.Ssz.Ssz.DecodeBools(ssz).ToArray();
                        output = new byte[value.Length];
                        Nethermind.Ssz.Ssz.Encode(output, value);
                        byte[] clone = output.ToArray();
                        Nethermind.Ssz.Ssz.Encode(output, valueFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint256"))
                    {
                        UInt256[] value        = sequenceNode.Children.Cast <YamlScalarNode>().Select(sn => UInt256.Parse(sn.Value)).ToArray();
                        UInt256[] valueFromSsz = Nethermind.Ssz.Ssz.DecodeUInts256(ssz);
                        output = new byte[value.Length * 32];
                        Nethermind.Ssz.Ssz.Encode(output, value);
                        byte[] clone = output.ToArray();
                        Nethermind.Ssz.Ssz.Encode(output, valueFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint128"))
                    {
                        UInt128[] value        = sequenceNode.Children.Cast <YamlScalarNode>().Select(sn => UInt128.Parse(sn.Value)).ToArray();
                        UInt128[] valueFromSsz = Nethermind.Ssz.Ssz.DecodeUInts128(ssz);
                        output = new byte[value.Length * 16];
                        Nethermind.Ssz.Ssz.Encode(output, value);
                        byte[] clone = output.ToArray();
                        Nethermind.Ssz.Ssz.Encode(output, valueFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint64"))
                    {
                        ulong[] value        = sequenceNode.Children.Cast <YamlScalarNode>().Select(sn => ulong.Parse(sn.Value ?? ulong.MinValue.ToString())).ToArray();
                        ulong[] valueFromSsz = Nethermind.Ssz.Ssz.DecodeULongs(ssz).ToArray();
                        output = new byte[value.Length * 8];
                        Nethermind.Ssz.Ssz.Encode(output, value);
                        byte[] clone = output.ToArray();
                        Nethermind.Ssz.Ssz.Encode(output, valueFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint32"))
                    {
                        uint[] value        = sequenceNode.Children.Cast <YamlScalarNode>().Select(sn => uint.Parse(sn.Value ?? uint.MinValue.ToString())).ToArray();
                        uint[] valueFromSsz = Nethermind.Ssz.Ssz.DecodeUInts(ssz).ToArray();
                        output = new byte[value.Length * 4];
                        Nethermind.Ssz.Ssz.Encode(output, value);
                        byte[] clone = output.ToArray();
                        Nethermind.Ssz.Ssz.Encode(output, valueFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint16"))
                    {
                        ushort[] value        = sequenceNode.Children.Cast <YamlScalarNode>().Select(sn => ushort.Parse(sn.Value ?? ushort.MinValue.ToString())).ToArray();
                        ushort[] valueFromSsz = Nethermind.Ssz.Ssz.DecodeUShorts(ssz).ToArray();
                        output = new byte[value.Length * 2];
                        Nethermind.Ssz.Ssz.Encode(output, value);
                        byte[] clone = output.ToArray();
                        Nethermind.Ssz.Ssz.Encode(output, valueFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint8"))
                    {
                        byte[] value        = sequenceNode.Children.Cast <YamlScalarNode>().Select(sn => byte.Parse(sn.Value ?? byte.MinValue.ToString())).ToArray();
                        byte[] valueFromSsz = Nethermind.Ssz.Ssz.DecodeBytes(ssz).ToArray();
                        output = new byte[value.Length];
                        Nethermind.Ssz.Ssz.Encode(output, value);
                        byte[] clone = output.ToArray();
                        Nethermind.Ssz.Ssz.Encode(output, valueFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                }
                else if (valueType == YamlNodeType.Scalar)
                {
                    if (validDir.Contains("bitvec") || validDir.Contains("bitlist"))
                    {
                        uint  limit = 0;
                        Match match = Regex.Match(validDir, "bitlist_(\\d+)", RegexOptions.IgnoreCase);
                        if (match.Success)
                        {
                            limit = (uint.Parse(match.Groups[1].Value) + 255) / 256;
                        }

                        byte[] value        = Bytes.FromHexString(((YamlScalarNode)valueNode).Value);
                        byte[] valueFromSsz = Nethermind.Ssz.Ssz.DecodeBytes(ssz).ToArray();
                        output = new byte[value.Length];
                        Nethermind.Ssz.Ssz.Encode(output, value);
                        byte[] clone = output.ToArray();
                        Nethermind.Ssz.Ssz.Encode(output, valueFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");


                        UInt256 root;
                        if (validDir.Contains("bitvec"))
                        {
                            Merkle.Ize(out root, valueFromSsz);
                        }
                        else
                        {
                            Merkle.IzeBits(out root, valueFromSsz, limit);
                        }

                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("boolean"))
                    {
                        string yamlValue    = ((YamlScalarNode)valueNode)?.Value;
                        bool?  value        = yamlValue is null ? null : (bool?)bool.Parse(yamlValue);
                        bool?  valueFromSsz = Nethermind.Ssz.Ssz.DecodeBool(ssz);
                        Assert.AreEqual(value, valueFromSsz);
                        output    = new byte[1];
                        output[0] = Nethermind.Ssz.Ssz.Encode(value ?? false);

                        Merkle.Ize(out UInt256 root, valueFromSsz ?? false);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint_256"))
                    {
                        UInt256 value        = UInt256.Parse(((YamlScalarNode)valueNode).Value);
                        UInt256 valueFromSsz = Nethermind.Ssz.Ssz.DecodeUInt256(ssz);
                        Assert.AreEqual(value, valueFromSsz);

                        output = new byte[32];
                        Nethermind.Ssz.Ssz.Encode(output, value);

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint_128"))
                    {
                        UInt128 value        = UInt128.Parse(((YamlScalarNode)valueNode).Value);
                        UInt128 valueFromSsz = Nethermind.Ssz.Ssz.DecodeUInt128(ssz);
                        Assert.AreEqual(value, valueFromSsz);

                        output = new byte[16];
                        Nethermind.Ssz.Ssz.Encode(output, value);

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint_64"))
                    {
                        ulong value        = ulong.Parse(((YamlScalarNode)valueNode).Value);
                        ulong valueFromSsz = Nethermind.Ssz.Ssz.DecodeULong(ssz);
                        Assert.AreEqual(value, valueFromSsz);

                        output = new byte[8];
                        Nethermind.Ssz.Ssz.Encode(output, value);

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint_32"))
                    {
                        uint value        = uint.Parse(((YamlScalarNode)valueNode).Value);
                        uint valueFromSsz = Nethermind.Ssz.Ssz.DecodeUInt(ssz);
                        Assert.AreEqual(value, valueFromSsz);

                        output = new byte[4];
                        Nethermind.Ssz.Ssz.Encode(output, value);

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint_16"))
                    {
                        ushort value        = ushort.Parse(((YamlScalarNode)valueNode).Value);
                        ushort valueFromSsz = Nethermind.Ssz.Ssz.DecodeUShort(ssz);
                        Assert.AreEqual(value, valueFromSsz);

                        output = new byte[2];
                        Nethermind.Ssz.Ssz.Encode(output, value);

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                    else if (validDir.Contains("uint_8"))
                    {
                        byte value        = byte.Parse(((YamlScalarNode)valueNode).Value);
                        byte valueFromSsz = Nethermind.Ssz.Ssz.DecodeByte(ssz);
                        Assert.AreEqual(value, valueFromSsz);

                        output = new byte[1];
                        Nethermind.Ssz.Ssz.Encode(output, value);

                        Merkle.Ize(out UInt256 root, valueFromSsz);
                        Assert.AreEqual(expectedMerkleRoot, root);
                    }
                }
                else if (valueType == YamlNodeType.Mapping)
                {
                    var mappingNode = (YamlMappingNode)valueNode;
                    if (validDir.Contains("BitsStruct"))
                    {
                        BitsStruct testStruct        = ParseBitsStruct(mappingNode);
                        BitsStruct testStructFromSsz = DecodeBitsStruct(ssz);
                        output = new byte[13];
                        Encode(output, testStruct);
                        byte[] clone = output.ToArray();
                        Encode(output, testStructFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");
                    }
                    else if (validDir.Contains("SmallTestStruct"))
                    {
                        SmallTestStruct testStruct        = ParseSmallTestStruct(mappingNode);
                        SmallTestStruct testStructFromSsz = DecodeSmallTestStruct(ssz);
                        output = new byte[4];
                        Encode(output, testStruct);
                        byte[] clone = output.ToArray();
                        Encode(output, testStructFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");
                    }
                    else if (validDir.Contains("SingleFieldTestStruct"))
                    {
                        SingleFieldTestStruct testStruct        = new SingleFieldTestStruct();
                        SingleFieldTestStruct testStructFromSsz = DecodeSingleFieldTestStruct(ssz);
                        testStruct.A = byte.Parse(((YamlScalarNode)mappingNode.Children["A"]).Value);
                        output       = new byte[1];
                        Encode(output, testStruct);
                        byte[] clone = output.ToArray();
                        Encode(output, testStructFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");
                    }
                    else if (validDir.Contains("VarTestStruct"))
                    {
                        VarTestStruct testStruct        = ParseVarTestStruct(mappingNode);
                        VarTestStruct testStructFromSsz = DecodeVarTestStruct(ssz);
                        output = new byte[7 + testStruct.B.Length * 2];
                        Encode(output, testStruct);
                        byte[] clone = output.ToArray();
                        Encode(output, testStructFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");
                    }
                    else if (validDir.Contains("FixedTestStruct"))
                    {
                        FixedTestStruct testStruct        = ParseFixedTestStruct(mappingNode);
                        FixedTestStruct testStructFromSsz = DecodeFixTestStruct(ssz);
                        output = new byte[13];
                        Encode(output, testStruct);
                        byte[] clone = output.ToArray();
                        Encode(output, testStructFromSsz);
                        Assert.AreEqual(clone.ToHexString(), output.ToHexString(), "ssz");
                    }
                    else if (validDir.Contains("ComplexTestStruct"))
                    {
                        ComplexTestStruct testStruct = ParseComplexTestStruct(mappingNode);
                        output = new byte[8236];
                        Encode(ref output, testStruct);
                    }
                }

                if (ssz.ToHexString() != output.ToHexString())
                {
                    TestContext.Out.WriteLine($"  expected {ssz.ToHexString()}");
                    TestContext.Out.WriteLine($"  actual   {output.ToHexString()}");
                    success = false;
                }
            }

            return(success);
        }
Example #5
0
 private static void Encode(Span <byte> span, SmallTestStruct testStruct)
 {
     Nethermind.Ssz.Ssz.Encode(span.Slice(0, 2), testStruct.A);
     Nethermind.Ssz.Ssz.Encode(span.Slice(2, 2), testStruct.B);
 }