示例#1
0
        public void Fragments()
        {
            ClientMessage m = null;

            Assert.Throws <ArgumentNullException>(() => _ = m.Fragment(512).GetEnumerator().MoveNext());

            // for some reason, fragment ids are unique
            ClientMessageFragmentingExtensions.FragmentIdSequence = new Int64Sequence();
            var fragmentIdSequence = 1L;

            // create 8 frames of *total* size 64 bytes
            var frames = new Frame[8];

            for (var i = 0; i < 8; i++)
            {
                frames[i] = new Frame(new byte[64 - Hazelcast.Messaging.FrameFields.SizeOf.LengthAndFlags]);
            }

            m = new ClientMessage();
            for (var i = 0; i < 8; i++)
            {
                m.Append(frames[i]);
            }
            Assert.That(m.LastFrame.IsFinal);

            void AssertFragments(List <ClientMessage> messages)
            {
                foreach (var message in messages)
                {
                    if (message == m)
                    {
                        // contains message = there should only be 1, with fragment id zero
                        Assert.That(message.FragmentId, Is.Zero);
                        continue;
                    }
                    Assert.That(message.FragmentId, Is.EqualTo(fragmentIdSequence++));
                }

                foreach (var message in messages)
                {
                    Assert.That(message.LastFrame.Next, Is.Null);
                }

                var frameCount = 1; // 'x' message 1st frame

                foreach (var fragment in messages)
                {
                    foreach (var frame in fragment)
                    {
                        frameCount++;
                    }
                }

                // beware, AppendFragment does *not* clone the fragments but MODIFIES them

                var x = new ClientMessage(new Frame());

                foreach (var fragment in messages)
                {
                    x.AppendFragment(fragment.FirstFrame, fragment.LastFrame, false);
                }
                Assert.That(x.Count(), Is.EqualTo(frameCount));
                Assert.That(x.LastFrame.IsFinal);
            }

            // frames are too big to even fit in 1 fragment = 8 fragments
            var fragments = m.Fragment(2).ToList();

            Assert.That(fragments.Count, Is.EqualTo(8));
            AssertFragments(fragments);

            // entire message fits in 1 fragment = 1 fragment
            fragments = m.Fragment(2048).ToList();
            Assert.That(fragments.Count, Is.EqualTo(1));
            AssertFragments(fragments);

            // each fragment can contain only 1 of the frames = 8 fragments
            fragments = m.Fragment(127).ToList();
            Assert.That(fragments.Count, Is.EqualTo(8));
            AssertFragments(fragments);

            // each fragment can contain exactly 2 frames = 4 fragments
            fragments = m.Fragment(128).ToList();
            Assert.That(fragments.Count, Is.EqualTo(4));
            AssertFragments(fragments);

            // each fragment can contain exactly 4 frames = 2 fragments
            fragments = m.Fragment(256).ToList();
            Assert.That(fragments.Count, Is.EqualTo(2));
            AssertFragments(fragments);

            // each fragment can contain exactly 8 frames = 1 fragments
            fragments = m.Fragment(512).ToList();
            Assert.That(fragments.Count, Is.EqualTo(1));
            AssertFragments(fragments);

            frames = new Frame[8];
            for (var i = 0; i < 8; i++)
            {
                frames[i] = new Frame(new byte[(1 + i % 2) * 64 - Hazelcast.Messaging.FrameFields.SizeOf.LengthAndFlags]);
            }

            m = new ClientMessage();
            for (var i = 0; i < 8; i++)
            {
                m.Append(frames[i]);
            }

            fragments = m.Fragment(128).ToList();
            Assert.That(fragments.Count, Is.EqualTo(8));
            AssertFragments(fragments);

            frames = new Frame[8];
            for (var i = 0; i < 8; i++)
            {
                frames[i] = new Frame(new byte[(1 + 2 * (i % 2)) * 64 - Hazelcast.Messaging.FrameFields.SizeOf.LengthAndFlags]);
            }

            m = new ClientMessage();
            for (var i = 0; i < 8; i++)
            {
                m.Append(frames[i]);
            }

            fragments = m.Fragment(128).ToList();
            Assert.That(fragments.Count, Is.EqualTo(8));
            AssertFragments(fragments);

            Assert.Throws <ArgumentNullException>(() => _ = m.AppendFragment(null, null));
            Assert.Throws <ArgumentNullException>(() => _ = m.AppendFragment(new Frame(), null));
            Assert.Throws <ArgumentException>(() => _     = m.AppendFragment(new Frame(), new Frame()));
        }