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())); }