/// <summary> /// O( ) /// </summary> public static void TestAConstructor_And_Reserialization() { //Permute every possible value in the 5 bit BlockCount except the last, it is possible to have 32 with there are 31 entries in the SourceList, this logic should be tested seperately. for (byte SourceCounter = byte.MinValue; SourceCounter <= Media.Common.Binary.FiveBitMaxValue - 1; ++SourceCounter) { //Permute every possible value in the Padding field. for (byte PaddingCounter = byte.MinValue; PaddingCounter <= Media.Common.Binary.FiveBitMaxValue; ++PaddingCounter) { //Enumerate every possible reason length within reason. for (byte ReasonLength = byte.MinValue; ReasonLength <= Media.Common.Binary.FiveBitMaxValue; ++ReasonLength) { //Create the RandomId and ReasonForLeaving int RandomId = RFC3550.Random32(Utility.Random.Next()); IEnumerable <byte> ReasonForLeaving = Array.ConvertAll(Enumerable.Range(1, (int)ReasonLength).ToArray(), Convert.ToByte); //Create a GoodbyeReport instance using the specified options. using (Media.Rtcp.GoodbyeReport p = new Rtcp.GoodbyeReport(0, PaddingCounter, RandomId, new RFC3550.SourceList(SourceCounter), ReasonForLeaving.ToArray())) { //Check IsComplete System.Diagnostics.Debug.Assert(p.IsComplete, "IsComplete must be true."); //Check SynchronizationSourceIdentifier System.Diagnostics.Debug.Assert(p.SynchronizationSourceIdentifier == RandomId, "Unexpected SynchronizationSourceIdentifier"); //Calculate the length of the ReasonForLeaving, should always be padded to 32 bits for octet alignment. int expectedReasonLength = ReasonLength > 0 ? Binary.BytesToMachineWords(ReasonLength + 1) * Binary.BytesPerInteger : 0; //Check HasReasonForLeaving System.Diagnostics.Debug.Assert(expectedReasonLength > 0 == p.HasReasonForLeaving, "Unexpected HasReasonForLeaving"); //The ssrc is always present in these tests. int expectedBlockCount = SourceCounter + 1; //Check BlockCount System.Diagnostics.Debug.Assert(p.BlockCount == expectedBlockCount, "Unexpected BlockCount"); //Check the SourceList int expectedSourceListSize = expectedBlockCount * RFC3550.SourceList.ItemSize; //The first entry is in the header.... if (expectedSourceListSize > 0) { //Use the SourceList using (Media.RFC3550.SourceList sourceList = p.GetSourceList()) { System.Diagnostics.Debug.Assert(sourceList.IsComplete == true, "SourceList.IsComplete"); System.Diagnostics.Debug.Assert(expectedSourceListSize == sourceList.Size, "Unexpected SourceList Size"); System.Diagnostics.Debug.Assert(expectedBlockCount == sourceList.Count, "Unexpected SourceList Count"); System.Diagnostics.Debug.Assert(RandomId == sourceList.CurrentSource, "Unexpected Source in SourceList"); System.Diagnostics.Debug.Assert((uint)RandomId == sourceList.First(), "Unexpected Source in SourceList"); System.Diagnostics.Debug.Assert(sourceList.Skip(1).All(s => s == uint.MinValue), "Unexpected Source in SourceList"); System.Diagnostics.Debug.Assert(sourceList.ToArray().SequenceEqual(Enumerable.Concat <uint>(LinqExtensions.Yield((uint)RandomId), Enumerable.Repeat(uint.MinValue, SourceCounter))), "Unexpected Source in SourceList"); } } //The amount of bytes expected in the payload does not contain the first entry of the list. int expectedInPayload = expectedSourceListSize - RFC3550.SourceList.ItemSize; //Check the Payload.Count System.Diagnostics.Debug.Assert(p.Payload.Count == expectedInPayload + PaddingCounter + expectedReasonLength, "Unexpected Payload Count"); //Check the Length, System.Diagnostics.Debug.Assert(p.Length == p.Header.Size + expectedInPayload + PaddingCounter + expectedReasonLength, "Unexpected Length"); //Check the reaosn for leaving System.Diagnostics.Debug.Assert(p.ReasonForLeavingData.SequenceEqual(ReasonForLeaving), "Unexpected ReasonForLeaving data"); //Check the PaddingOctets count System.Diagnostics.Debug.Assert(p.PaddingOctets == PaddingCounter, "Unexpected PaddingOctets"); //Check all data in the padding but not the padding octet itself. System.Diagnostics.Debug.Assert(p.PaddingData.Take(PaddingCounter - 1).All(b => b == 0), "Unexpected PaddingData"); //Add remaining amount of reports to test the Add method //Enumerate the RtcpReport version of the instance //Serialize and Deserialize and verify again using (Rtcp.GoodbyeReport s = new Rtcp.GoodbyeReport(new Rtcp.RtcpPacket(p.Prepare().ToArray(), 0), true)) { //Check the Payload.Count System.Diagnostics.Debug.Assert(s.Payload.Count == p.Payload.Count, "Unexpected Payload Count"); //Check the Length, System.Diagnostics.Debug.Assert(s.Length == p.Length, "Unexpected Length"); //Check the BlockCount count System.Diagnostics.Debug.Assert(s.BlockCount == p.BlockCount, "Unexpected BlockCount"); //Check the reaosn for leaving System.Diagnostics.Debug.Assert(s.ReasonForLeavingData.SequenceEqual(ReasonForLeaving) && s.ReasonForLeavingData.Count() == ReasonLength, "Unexpected ReasonForLeaving data"); //Check the PaddingOctets count System.Diagnostics.Debug.Assert(s.PaddingOctets == p.PaddingOctets, "Unexpected PaddingOctets"); //Check all data in the padding but not the padding octet itself. System.Diagnostics.Debug.Assert(s.PaddingData.SequenceEqual(p.PaddingData), "Unexpected PaddingData"); } } } } } }
/// <summary> /// O( ) /// </summary> public static void TestAConstructor_And_Reserialization() { //Permute every possible value in the 5 bit BlockCount for (byte ReportBlockCounter = byte.MinValue; ReportBlockCounter <= Media.Common.Binary.FiveBitMaxValue; ++ReportBlockCounter) { //Permute every possible value in the Padding field. for (byte PaddingCounter = byte.MinValue; PaddingCounter <= Media.Common.Binary.FiveBitMaxValue; ++PaddingCounter) { //Enumerate every possible reason length for (byte ReasonLength = byte.MinValue; ReasonLength <= Media.Common.Binary.FiveBitMaxValue; ++ReasonLength) { //Create the RandomId and ReasonForLeaving int RandomId = RFC3550.Random32(Utility.Random.Next()); IEnumerable <byte> ReasonForLeaving = Array.ConvertAll(Enumerable.Range(1, (int)ReasonLength).ToArray(), Convert.ToByte); //Create a GoodbyeReport instance using the specified options. using (Media.Rtcp.GoodbyeReport p = new Rtcp.GoodbyeReport(0, PaddingCounter, RandomId, new RFC3550.SourceList(ReportBlockCounter), ReasonForLeaving.ToArray())) { //Check IsComplete System.Diagnostics.Debug.Assert(p.IsComplete, "IsComplete must be true."); //Check SynchronizationSourceIdentifier System.Diagnostics.Debug.Assert(p.SynchronizationSourceIdentifier == RandomId, "Unexpected SynchronizationSourceIdentifier"); //Calculate the length of the ReasonForLeaving, should always be padded to 32 bits for octet alignment. int expectedReasonLength = ReasonLength > 0 ? Binary.BytesToMachineWords(ReasonLength + 1) * Binary.BytesPerInteger : 0; //Check HasReasonForLeaving System.Diagnostics.Debug.Assert(expectedReasonLength > 0 == p.HasReasonForLeaving, "Unexpected HasReasonForLeaving"); //Check the Payload.Count System.Diagnostics.Debug.Assert(p.Payload.Count == ReportBlockCounter * Binary.BytesPerInteger + PaddingCounter + expectedReasonLength, "Unexpected Payload Count"); //Check the Length, System.Diagnostics.Debug.Assert(p.Length == p.Header.Size + ReportBlockCounter * Binary.BytesPerInteger + PaddingCounter + expectedReasonLength, "Unexpected Length"); //Check the BlockCount count System.Diagnostics.Debug.Assert(p.BlockCount == ReportBlockCounter, "Unexpected BlockCount"); //Check the reaosn for leaving System.Diagnostics.Debug.Assert(p.ReasonForLeaving.SequenceEqual(ReasonForLeaving), "Unexpected ReasonForLeaving data"); //Check the PaddingOctets count System.Diagnostics.Debug.Assert(p.PaddingOctets == PaddingCounter, "Unexpected PaddingOctets"); //Check all data in the padding but not the padding octet itself. System.Diagnostics.Debug.Assert(p.PaddingData.Take(PaddingCounter - 1).All(b => b == 0), "Unexpected PaddingData"); //Serialize and Deserialize and verify again using (Rtcp.GoodbyeReport s = new Rtcp.GoodbyeReport(new Rtcp.RtcpPacket(p.Prepare().ToArray(), 0), true)) { //Check the Payload.Count System.Diagnostics.Debug.Assert(s.Payload.Count == p.Payload.Count, "Unexpected Payload Count"); //Check the Length, System.Diagnostics.Debug.Assert(s.Length == p.Length, "Unexpected Length"); //Check the BlockCount count System.Diagnostics.Debug.Assert(s.BlockCount == p.BlockCount, "Unexpected BlockCount"); //Check the reaosn for leaving System.Diagnostics.Debug.Assert(s.ReasonForLeaving.SequenceEqual(ReasonForLeaving) && s.ReasonForLeaving.Count() == ReasonLength, "Unexpected ReasonForLeaving data"); //Check the PaddingOctets count System.Diagnostics.Debug.Assert(s.PaddingOctets == p.PaddingOctets, "Unexpected PaddingOctets"); //Check all data in the padding but not the padding octet itself. System.Diagnostics.Debug.Assert(s.PaddingData.SequenceEqual(p.PaddingData), "Unexpected PaddingData"); } } } } } }