Esempio n. 1
0
        public void ConversionMismatch()
        {
            var cvt = new Dictionary <Type, PacketConverter>()
            {
                [typeof(TestRef)] = new TestBadConverter()
            };

            try
            {
                var buf = PacketConvert.Serialize(new TestRef(), cvt);
                Assert.Fail();
            }
            catch (PacketException ex) when(ex.ErrorCode == PacketError.ConversionMismatch)
            {
                // ignore
            }
        }
Esempio n. 2
0
        public void Collection()
        {
            var arr = Enumerable.Range(0, 8).Select(r => new TestIndex {
                Id = r, Name = r.ToString()
            }).ToArray();
            var buf = PacketConvert.Serialize(arr);
            var rs  = PacketConvert.Deserialize <PacketReader[]>(buf);
            var rr  = PacketConvert.Deserialize <PacketRawReader[]>(buf);
            var ra  = PacketConvert.Deserialize <TestIndex[]>(buf);
            var rl  = PacketConvert.Deserialize <List <TestIndex> >(buf);
            var ri  = PacketConvert.Deserialize <IList <TestIndex> >(buf);
            var rc  = PacketConvert.Deserialize <ICollection <TestIndex> >(buf);

            ThrowIfNotSequenceEqual(arr, ra);
            ThrowIfNotSequenceEqual(arr, rl);
            ThrowIfNotSequenceEqual(arr, ri);
            ThrowIfNotSequenceEqual(arr, rc);
            return;
        }
Esempio n. 3
0
    public void SerializeObjectDirectly()
    {
        var a = 1;
        var b = "Sample text.";
        var c = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };

        var ta = PacketConvert.Serialize(a);
        var tb = PacketConvert.Serialize(b);
        var tc = PacketConvert.Serialize(c);

        var sa = PacketConvert.GetValue <int>(ta);
        var sb = PacketConvert.GetValue(tb, typeof(string)) as string;
        var sc = new PacketReader(tc);

        Assert.AreEqual(a, sa);
        Assert.AreEqual(b, sb);
        Assert.AreEqual(b, Encoding.UTF8.GetString(tb));
        ThrowIfNotSequenceEqual(c, sc.GetEnumerable <int>());
    }
Esempio n. 4
0
        public void HashSet()
        {
            var a = new HashSet <byte>()
            {
                1, 128, 255
            };
            var b = new HashSet <string>()
            {
                "a", "beta", "candy", "dave"
            };

            var ta = PacketConvert.Serialize(a);
            var tb = new PacketWriter().SetEnumerable("b", b).GetBytes();

            var ra  = PacketConvert.Deserialize <HashSet <byte> >(ta);
            var rea = new PacketReader(tb);
            var rb  = rea["b"].GetHashSet <string>();

            ThrowIfNotEqual(a, ra);
            ThrowIfNotEqual(b, rb);
            return;
        }
Esempio n. 5
0
        public void EmptyCollection()
        {
            var obj = new
            {
                array   = new int[0],
                bytes   = new byte[0],
                sbytes  = new sbyte[0],
                empty   = new IPAddress[0],
                numbers = new List <double>(),
                list    = new List <string>()
            };
            var buf = PacketConvert.Serialize(obj);
            var res = PacketConvert.Deserialize(buf, obj);

            ThrowIfNotSequenceEqual(obj.array, res.array);
            ThrowIfNotSequenceEqual(obj.list, res.list);
            ThrowIfNotSequenceEqual(obj.numbers, res.numbers);
            ThrowIfNotSequenceEqual(obj.empty, res.empty);
            ThrowIfNotSequenceEqual(obj.bytes, res.bytes);
            ThrowIfNotSequenceEqual(obj.sbytes, res.sbytes);
            return;
        }
Esempio n. 6
0
        public void DynamicObjectArray()
        {
            var target = Enumerable.Range(0, 16).Select(x => (dynamic) new PacketWriter()).ToArray();

            for (var i = 0; i < target.Length; i++)
            {
                var writer = target[i];
                writer.id        = i;
                writer.body.name = $"{i:d2}";
            }
            var buffer = PacketConvert.Serialize(target.Cast <PacketWriter>());
            var result = PacketConvert.Deserialize(buffer, anonymous: new[] { new { id = 0, body = new { name = (string)null } } });

            Assert.AreEqual(16, result.Length);
            for (var i = 0; i < result.Length; i++)
            {
                var item = result[i];
                Assert.IsNotNull(item);
                Assert.AreEqual(i, item.id);
                Assert.AreEqual($"{i:d2}", item.body.name);
            }
        }
Esempio n. 7
0
public void DirectConvert()
{
    var a   = 1.1;
    var b   = "some";
    var tax = PacketConvert.GetBytes(a);
    var tay = PacketConvert.GetBytes(a, typeof(double));
    var tbx = PacketConvert.GetBytes(b);
    var tby = PacketConvert.GetBytes(b, typeof(string));

    var rax = PacketConvert.GetValue <double>(tax);
    var ray = PacketConvert.GetValue(tay, typeof(double));
    var rbx = PacketConvert.GetValue <string>(tbx);
    var rby = PacketConvert.GetValue(tby, typeof(string));

    Assert.AreEqual(a, rax);
    Assert.AreEqual(a, ray);
    Assert.AreEqual(b, rbx);
    Assert.AreEqual(b, rby);

    var off = new Random().Next(8, 16);
    var ba  = new byte[128];

    Buffer.BlockCopy(tax, 0, ba, off, tax.Length);
    var bb = new byte[128];

    Buffer.BlockCopy(tbx, 0, bb, off, tbx.Length);

    var sax = PacketConvert.GetValue <double>(ba, off, tax.Length);
    var say = PacketConvert.GetValue(ba, off, tax.Length, typeof(double));
    var sbx = PacketConvert.GetValue <string>(bb, off, tbx.Length);
    var sby = PacketConvert.GetValue(bb, off, tbx.Length, typeof(string));

    Assert.AreEqual(a, sax);
    Assert.AreEqual(a, say);
    Assert.AreEqual(b, sbx);
    Assert.AreEqual(b, sby);
}
Esempio n. 8
0
        public void Dictionary()
        {
            var a = new Dictionary <string, sbyte> {
                ["a"] = 1, ["beta"] = -1, ["other"] = 127
            };
            var b = new Dictionary <byte, string> {
                [1] = "one", [128] = "many", [255] = "max", [0] = "zero"
            };
            var c = new Dictionary <string, IPAddress> {
                ["loopback"] = IPAddress.Loopback, ["ipv6 loopback"] = IPAddress.IPv6Loopback
            };

            var obj = new { a, b, c };
            var ta  = PacketConvert.Serialize(obj);
            var va  = PacketConvert.Deserialize(ta, new { a = default(Dictionary <string, sbyte>), b = default(IDictionary <byte, string>), c = default(IDictionary <string, IPAddress>) });

            var wtr = new PacketWriter()
                      .SetDictionary("a", a)
                      .SetDictionary("b", b)
                      .SetDictionary("c", c);
            var tb  = wtr.GetBytes();
            var rea = new PacketReader(tb);
            var ra  = rea["a"].GetDictionary <string, sbyte>();
            var rb  = rea["b"].GetDictionary <byte, string>();
            var rc  = rea["c"].GetDictionary <string, IPAddress>();

            Assert.AreEqual(ta.Length, tb.Length);

            ThrowIfNotEqual(a, ra);
            ThrowIfNotEqual(b, rb);
            ThrowIfNotEqual(c, rc);

            ThrowIfNotEqual(a, va.a);
            ThrowIfNotEqual(b, va.b);
            ThrowIfNotEqual(c, va.c);
            return;
        }
Esempio n. 9
0
        public void DeserializeOffset()
        {
            var obj = new { id = 1.1, text = "what the" };
            var ta  = PacketConvert.Serialize(obj);
            var buf = new byte[ta.Length + 128];
            var off = new Random().Next(8, 32);

            Buffer.BlockCopy(ta, 0, buf, off, ta.Length);

            var ra = PacketConvert.Deserialize(ta, obj.GetType());
            var rb = PacketConvert.Deserialize(buf, off, ta.Length, obj.GetType());

            void AreEqual(object a, object b)
            {
                var x = a.Cast(obj);
                var y = b.Cast(obj);

                if (x.id == y.id && x.text == y.text)
                {
                    return;
                }
                throw new ApplicationException();
            }

            AreEqual(obj, ra);
            AreEqual(obj, rb);

            var str = "world";
            var tb  = PacketConvert.GetBytes(str);
            var tc  = new byte[tb.Length + 128];

            Buffer.BlockCopy(tb, 0, tc, off, tb.Length);
            var rc = PacketConvert.Deserialize <string>(tc, off, tb.Length);

            Assert.AreEqual(str, rc);
        }
Esempio n. 10
0
    public void SerializeDictionaryDirectly()
    {
        var a   = 1;
        var b   = "some";
        var dic = new Dictionary <string, object>
        {
            ["a"] = a,
            ["b"] = b,
            ["c"] = new Dictionary <string, object>()
            {
                ["a"] = a,
                ["b"] = b,
            }
        };
        var buf = PacketConvert.Serialize(dic);
        var rea = new PacketReader(buf);

        Assert.AreEqual(dic.Count, rea.Count);
        Assert.AreEqual(dic.Count, rea.Keys.Count());
        Assert.AreEqual(a, rea["a"].GetValue <int>());
        Assert.AreEqual(b, rea["b"].GetValue <string>());
        Assert.AreEqual(a, rea["c/a"].GetValue <int>());
        Assert.AreEqual(b, rea["c/b"].GetValue <string>());
    }
Esempio n. 11
0
public void KeyValueCollection()
{
    try
    {
        var collection = Enumerable.Range(0, 8).Select(r => new KeyValuePair <int, string>(r, r.ToString()));
        var buffer     = PacketConvert.Serialize(collection);
        Assert.Fail();
    }
    catch (PacketException ex) when(ex.ErrorCode == PacketError.InvalidType)
    {
        // ignore
    }

    try
    {
        var kvp    = new KeyValuePair <string, double>("one", 1.0);
        var buffer = PacketConvert.Serialize(kvp);
        Assert.Fail();
    }
    catch (PacketException ex) when(ex.ErrorCode == PacketError.InvalidType)
    {
        // ignore
    }
}
Esempio n. 12
0
 private void SendPacket(Request request)
 {
     byte[] requestPkt = PacketConvert.RequestToByte(request);
     Connect();
     _socket.Send(requestPkt);
 }
Esempio n. 13
0
        private async Task _Start()
        {
            var soc = default(Socket);
            var iep = default(IPEndPoint);

            for (int i = 0; i < _endpoints.Length; i++)
            {
                if (soc != null)
                {
                    break;
                }
                soc = new Socket(SocketType.Stream, ProtocolType.Tcp);
                iep = _endpoints[i];

                try
                {
                    await soc.ConnectAsyncEx(iep).TimeoutAfter("Share receiver timeout.");
                }
                catch (Exception err)
                {
                    Log.Error(err);
                    soc.Dispose();
                    soc = null;
                }
            }

            if (soc == null)
            {
                Status = ShareStatus.失败;
                Dispose();
                return;
            }

            var buf = PacketConvert.Serialize(new
            {
                path   = "share." + (_batch ? "directory" : "file"),
                data   = _key,
                source = LinkModule.Id,
                target = Id,
            });

            try
            {
                soc.SetKeepAlive();
                await soc.SendAsyncExt(buf);

                Status = ShareStatus.运行;
                await _Receive(soc, _cancel.Token);

                Status = ShareStatus.成功;
                PostModule.Notice(Id, _batch ? "share.dir" : "share.file", _origin);
            }
            catch (OperationCanceledException)
            {
                Status = ShareStatus.取消;
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                Status = ShareStatus.中断;
            }
            finally
            {
                soc.Dispose();
                Dispose();
            }
        }
Esempio n. 14
0
        /// <summary>
        /// Performance test
        /// </summary>
        internal static void DoWork()
        {
            var dic = new Dictionary <string, List <TimeSpan> >();

            TraceWatch.InstanceDisposed = (tag, span) =>
            {
                if (dic.TryGetValue(tag, out var val))
                {
                    val.Add(span);
                }
                else
                {
                    dic.Add(tag, new List <TimeSpan>()
                    {
                        span
                    });
                }
            };

            const int max  = 1 << 20;
            const int loop = 10;

            var ano = new
            {
                num = 1024,
                str = "string",
                arr = new[] { 7, 11, 555, 1313 },
                sub = new
                {
                    sum = 2.2D,
                    lst = new List <string> {
                        "one", "two", "three"
                    },
                }
            };

            var tmp = PacketConvert.Serialize(ano);

            // release mode
            for (int idx = 0; idx < loop; idx++)
            {
                using (new TraceWatch("BitConverter")) // 8.00 ms
                {
                    for (int i = 0; i < max; i++)
                    {
                        var buf = BitConverter.GetBytes(i);
                        var res = BitConverter.ToInt32(buf, 0);
                    }
                }

                using (new TraceWatch("PacketWriter<>")) // 2228.99 ms, avg
                {
                    for (int i = 0; i < max; i++)
                    {
                        var wtr = new PacketWriter().
                                  SetValue(nameof(ano.num), ano.num).
                                  SetValue(nameof(ano.str), ano.str).
                                  SetEnumerable(nameof(ano.arr), ano.arr).
                                  SetItem(nameof(ano.sub), new PacketWriter().
                                          SetValue(nameof(ano.sub.sum), ano.sub.sum).
                                          SetEnumerable(nameof(ano.sub.lst), ano.sub.lst));
                        var buf = wtr.GetBytes();
                    }
                }

                using (new TraceWatch("Serialize (anonymous)")) // 2453.45 ms, avg
                {
                    for (int i = 0; i < max; i++)
                    {
                        var _ = PacketConvert.Serialize(ano);
                    }
                }

                using (new TraceWatch("Deserialize (anonymous)")) // 1960.96 ms, avg
                {
                    for (int i = 0; i < max; i++)
                    {
                        var _ = PacketConvert.Deserialize(tmp, ano);
                    }
                }
            }

            foreach (var i in dic)
            {
                var key = i.Key;
                var val = i.Value;
                if (val.Count > 6)
                {
                    val.RemoveRange(0, 4);
                }
                var sum = val.Select(r => r.Ticks).Sum();
                var cir = new TimeSpan(sum / val.Count);
                var avg = new TimeSpan(1000 * sum / val.Count / max);
                Console.WriteLine($"{key,-24} | " +
                                  $"total: {new TimeSpan(sum).TotalMilliseconds,10:0.000} ms | " +
                                  $"loop: {cir.TotalMilliseconds,10:0.000} ms | " +
                                  $"avg: {avg.TotalMilliseconds,10:0.0000} ns");
            }
        }
Esempio n. 15
0
public void InvalidType()
{
    try
    {
        var list = new HashSet <object> {
            1.2F, 3.4D, "5.6M"
        };
        var result = PacketConvert.Serialize(list);
        Assert.Fail();
    }
    catch (PacketException ex) when(ex.ErrorCode == PacketError.InvalidElementType)
    {
        // ignore
    }

    try
    {
        var empty  = new byte[0];
        var reader = new PacketReader(empty);
        var result = reader.Deserialize <Dictionary <object, string> >();
        Assert.Fail();
    }
    catch (PacketException ex) when(ex.ErrorCode == PacketError.InvalidKeyType)
    {
        // ignore
    }

    try
    {
        var empty  = new Dictionary <object, string>();
        var writer = PacketWriter.Serialize(empty);
        Assert.Fail();
    }
    catch (PacketException ex) when(ex.ErrorCode == PacketError.InvalidKeyType)
    {
        // ignore
    }

    var array      = new[] { 0F, -1.1F, 2.2F };
    var anonymous  = new { solution = "Exchange", count = 4 };
    var collection = new Dictionary <int, object>
    {
        [1]  = 1,
        [2]  = 2L,
        [4]  = "four",
        [8]  = anonymous,
        [16] = array,
    };

    var buffer     = PacketConvert.Serialize(collection);
    var dictionary = PacketConvert.Deserialize <Dictionary <int, object> >(buffer);

    var r1 = ((PacketReader)dictionary[1]).GetValue <int>();
    var r2 = ((PacketReader)dictionary[2]).GetValue <long>();
    var r4 = ((PacketReader)dictionary[4]).GetValue <string>();
    var ro = ((PacketReader)dictionary[8]).Deserialize(anonymous.GetType());
    var ra = ((PacketReader)dictionary[16]).GetArray <float>();

    Assert.AreEqual(collection[1], r1);
    Assert.AreEqual(collection[2], r2);
    Assert.AreEqual(collection[4], r4);

    Assert.AreEqual(anonymous, ro);
    ThrowIfNotSequenceEqual(array, ra);
}