package org.mobicents.media.server.impl.rtp;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Arrays;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
*
* @author baranowb
*
*/
public class RtpHeaderTest {
public static final int _HEADER_LENGTH = 12;
public static final int _TEST_HEADER_LENGTH = 25;
public static final int _OVERLAP = _TEST_HEADER_LENGTH - _HEADER_LENGTH;
private byte[] packet = new byte[]{(byte)0x80, (byte)0x03, (byte)0x08, (byte)0x18,
(byte)0xa5, (byte)0x1f, (byte)0xce, (byte)0xb5, (byte)0x57, (byte)0x3d, (byte)0x59, (byte)0xba};
@Test
public void testAppend() {
boolean marker = false;
byte payloadType = 9;
int seqNumber = 13717;
int timestamp = 1234897;
long ssrc = 1438967189;
byte[] bin = new byte[12];
bin[0] = (byte) (0x80);
bin[1] = marker ? (byte) (payloadType | 0x80) : (byte) (payloadType & 0x7f);
bin[2] = ((byte) ((seqNumber & 0xFF00) >> 8));
bin[3] = ((byte) (seqNumber & 0x00FF));
bin[4] = ((byte) ((timestamp & 0xFF000000) >> 24));
bin[5] = ((byte) ((timestamp & 0x00FF0000) >> 16));
bin[6] = ((byte) ((timestamp & 0x0000FF00) >> 8));
bin[7] = ((byte) ((timestamp & 0x000000FF)));
bin[8] = ((byte) ((ssrc & 0xFF000000) >> 24));
bin[9] = ((byte) ((ssrc & 0x00FF0000) >> 16));
bin[10] = ((byte) ((ssrc & 0x0000FF00) >> 8));
bin[11] = ((byte) ((ssrc & 0x000000FF)));
RtpHeader h2 = new RtpHeader();
int i = 0;
while (!h2.isFilled()) {
h2.append(bin, i++, 1);
}
assertEquals(marker, h2.getMarker());
assertEquals(payloadType, h2.getPayloadType());
assertEquals(seqNumber, h2.getSeqNumber());
assertEquals(timestamp, h2.getTimestamp());
assertEquals(ssrc, h2.getSsrc());
}
@Test
public void testFullParse() {
// There was a bug, nwe have to cover it :)
RtpHeader header = new RtpHeader();
//Values we want
boolean marker = false;
byte payloadType = 9;
int seqNumber = 13717;
int timestamp = 1234897;
long ssrc = 1438967189;
byte[] bin = new byte[12];
bin[0] = (byte) (0x80);
bin[1] = marker ? (byte) (payloadType | 0x80) : (byte) (payloadType & 0x7f);
bin[2] = ((byte) ((seqNumber & 0xFF00) >> 8));
bin[3] = ((byte) (seqNumber & 0x00FF));
bin[4] = ((byte) ((timestamp & 0xFF000000) >> 24));
bin[5] = ((byte) ((timestamp & 0x00FF0000) >> 16));
bin[6] = ((byte) ((timestamp & 0x0000FF00) >> 8));
bin[7] = ((byte) ((timestamp & 0x000000FF)));
bin[8] = ((byte) ((ssrc & 0xFF000000) >> 24));
bin[9] = ((byte) ((ssrc & 0x00FF0000) >> 16));
bin[10] = ((byte) ((ssrc & 0x0000FF00) >> 8));
bin[11] = ((byte) ((ssrc & 0x000000FF)));
try {
header.init(bin);
assertEquals("Payload value is not correct, on full init.", payloadType, header.getPayloadType());
assertEquals("Seq value is not correct, on full init.", seqNumber, header.getSeqNumber());
assertEquals("timestamp value is not correct, on full init.", timestamp, header.getTimestamp());
assertEquals("Ssrc value is not correct, on full init.", ssrc, header.getSsrc());
assertTrue("Binary representation is null.", header.toByteArray() != null);
assertTrue("Failed to match binary representation.", Arrays.equals(bin, header.toByteArray()));
} catch (Exception e) {
e.printStackTrace();
fail("Failed to parse due exception.");
}
}
@Test
public void testInitFromJavaPrimitivesVsBin() {
RtpHeader header = new RtpHeader();
//Values we want
boolean marker = false;
byte payloadType = 9;
int seqNumber = 13717;
int timestamp = 1234897;
long ssrc = 1438967189;
byte[] bin = new byte[12];
bin[0] = (byte) (0x80);
bin[1] = marker ? (byte) (payloadType | 0x80) : (byte) (payloadType & 0x7f);
bin[2] = ((byte) ((seqNumber & 0xFF00) >> 8));
bin[3] = ((byte) (seqNumber & 0x00FF));
bin[4] = ((byte) ((timestamp & 0xFF000000) >> 24));
bin[5] = ((byte) ((timestamp & 0x00FF0000) >> 16));
bin[6] = ((byte) ((timestamp & 0x0000FF00) >> 8));
bin[7] = ((byte) ((timestamp & 0x000000FF)));
bin[8] = ((byte) ((ssrc & 0xFF000000) >> 24));
bin[9] = ((byte) ((ssrc & 0x00FF0000) >> 16));
bin[10] = ((byte) ((ssrc & 0x0000FF00) >> 8));
bin[11] = ((byte) ((ssrc & 0x000000FF)));
try {
header.init(payloadType, seqNumber, timestamp, ssrc);
assertEquals("Payload value is not correct, on primitives init.", payloadType, header.getPayloadType());
assertEquals("Seq value is not correct, on primitives init.", seqNumber, header.getSeqNumber());
assertEquals("timestamp value is not correct, on primitives init.", timestamp, header.getTimestamp());
assertEquals("Ssrc value is not correct, on primitives init.", ssrc, header.getSsrc());
assertTrue("Binary representation is null.", header.toByteArray() != null);
assertTrue("Failed to match binary representation.", Arrays.equals(bin, header.toByteArray()));
} catch (Exception e) {
e.printStackTrace();
fail("Failed to parse due exception.");
}
}
@Test
public void testParse() {
RtpHeader h = new RtpHeader();
h.init(packet);
assertEquals(3, h.getPayloadType());
assertEquals(2072, h.getSeqNumber());
assertEquals(2770325173L, h.getTimestamp());
assertEquals(1463638458L, h.getSsrc());
}
@Test
public void testEncode() {
RtpHeader h = new RtpHeader();
h.init(false, (byte)3, 2072, (int)(2770325173L), 1463638458L );
byte[] res = h.toByteArray();
for (int i = 0; i < 12; i++) {
assertEquals(packet[i], res[i]);
}
}
@Test
public void testEncode2() {
RtpHeader h = new RtpHeader();
h.init(false, (byte)3, 2072, (int)(2770325173L), 1463638458L );
byte[] res = h.toByteArray();
RtpHeader h2 = new RtpHeader();
h2.init(res);
assertEquals(3, h2.getPayloadType());
assertEquals(2072, h2.getSeqNumber());
assertEquals(2770325173L, h2.getTimestamp());
assertEquals(1463638458L, h2.getSsrc());
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
}