public void TestDecode()
        {
            ShortHeaderPacket shp = new ShortHeaderPacket();

            shp.PacketNumber = 42;
            shp.DCID         = new byte[] { 0x00, 0x00, 0x00, 0x7b };
            shp.AddFrame(new DebugFrame {
                Message = "Message"
            });

            byte[] pack = shp.Encode();

            Packet p = Packet.Unpack(pack);

            Assert.AreEqual(p.GetType(), typeof(ShortHeaderPacket));
            ShortHeaderPacket sh = p as ShortHeaderPacket;

            CollectionAssert.AreEqual(sh.DCID, new byte[] { 0x00, 0x00, 0x00, 0x7b });
            Assert.AreEqual(sh.PacketNumber, (UInt64)42);
            Assert.AreEqual(sh.Spin, false);
            Assert.AreEqual(sh.KeyPhase, false);
            Assert.AreEqual(sh.PacketNumberLength, (UInt32)4);

            foreach (Frame f in p.Frames)
            {
                Assert.AreEqual(f.Type, 0x1e);
                DebugFrame fd = f as DebugFrame;
                Assert.AreEqual(fd.Message, "Message");
            }
        }
        public void TestEncode()
        {
            ShortHeaderPacket shp = new ShortHeaderPacket();

            shp.PacketNumber = 42;
            shp.DCID         = new byte[] { 0x00, 0x00, 0x00, 0x7b };
            shp.AddFrame(new DebugFrame {
                Message = "Message"
            });

            byte[] pack = shp.Encode();

            /*
             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             | 0 | 1 | S | R | R | K | P P |
             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             | Destination Connection ID(0..160)           ...
             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             | Packet Number(8 / 16 / 24 / 32)...
             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             | Protected Payload(*)...
             +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             */
            Assert.AreEqual(pack.Length, 17);

            Assert.AreEqual(pack[0] & 0x80, 0);    // First bit
            Assert.AreEqual(pack[0] & 0x40, 0x40); // Second bit
            Assert.AreEqual(pack[0] & 0x20, 0);
            Assert.AreEqual(pack[0] & 0x04, 0);
            Assert.AreEqual(pack[0] & 0x02, 0x02);
            Assert.AreEqual(pack[0] & 0x01, 0x01);

            Assert.AreEqual(pack[1], 0);
            Assert.AreEqual(pack[2], 0);
            Assert.AreEqual(pack[3], 0);
            Assert.AreEqual(pack[4], 0x7b);

            Assert.AreEqual(pack[5], 0);
            Assert.AreEqual(pack[6], 0);
            Assert.AreEqual(pack[7], 0);
            Assert.AreEqual(pack[8], 42);

            // Payload
            Assert.AreEqual(pack[9], 0x1e); // Type Debug
            Assert.AreEqual(pack[10], Convert.ToByte('M'));
            Assert.AreEqual(pack[11], Convert.ToByte('e'));
            Assert.AreEqual(pack[12], Convert.ToByte('s'));
            Assert.AreEqual(pack[13], Convert.ToByte('s'));
            Assert.AreEqual(pack[14], Convert.ToByte('a'));
            Assert.AreEqual(pack[15], Convert.ToByte('g'));
            Assert.AreEqual(pack[16], Convert.ToByte('e'));
        }