TestViaHeaderpublic class TestViaHeader extends SipHeaderBaseTest RFC3261, p. 179; BNF: p. 232
The Via header field indicates the path taken by the request so far
and indicates the path that should be followed in routing responses.
The branch ID parameter in the Via header field values serves as a
transaction identifier, and is used by proxies to detect loops.
A Via header field value contains the transport protocol used to send
the message, the client's host name or network address, and possibly
the port number at which it wishes to receive responses. A Via
header field value can also contain parameters such as "maddr",
"ttl", "received", and "branch", whose meaning and use are described
in other sections. For implementations compliant to this
specification, the value of the branch parameter MUST start with the
magic cookie "z9hG4bK", as discussed in Section 8.1.1.7.
Transport protocols defined here are "UDP", "TCP", "TLS", and "SCTP".
"TLS" means TLS over TCP. When a request is sent to a SIPS URI, the
protocol still indicates "SIP", and the transport protocol is TLS.
Via: SIP/2.0/UDP erlang.bell-telephone.com:5060;branch=z9hG4bK87asdks7
Via: SIP/2.0/UDP 192.0.2.1:5060 ;received=192.0.2.207 ;branch=z9hG4bK77asjd
The compact form of the Via header field is v.
In this example, the message originated from a multi-homed host with
two addresses, 192.0.2.1 and 192.0.2.207. The sender guessed wrong
as to which network interface would be used. Erlang.bell-
telephone.com noticed the mismatch and added a parameter to the
previous hop's Via header field value, containing the address that
the packet actually came from.
The host or network address and port number are not required to
follow the SIP URI syntax. Specifically, LWS on either side of the
":" or "/" is allowed, as shown here:
Via: SIP / 2.0 / UDP first.example.com: 4000;ttl=16
;maddr=224.2.0.1 ;branch=z9hG4bKa7c6a8dlze.1 |
Fields Summary |
---|
private final String | headerNameA name of the header that will be tested |
Methods Summary |
---|
void | Test1()Body of the test 1.
Test for Via header field: setName()/getName().
// DEBUG: System.out.println("");
// DEBUG: System.out.println("*** Test1 started ***");
SipHeader sh = createSipHeader(headerName,
"SIP/2.0/UDP first.example.com: 4000;ttl=16; " +
"maddr=224.2.0.1 ;branch=z9hG4bKa7c6a8dlze.1");
if (sh == null) {
return;
}
// Testing getName()...
String ret_name = sh.getName();
assertTrue("Invalid header value: " + ret_name,
ret_name.equals(headerName));
// Testing setName()...
try {
sh.setName(headerName);
} catch (java.lang.IllegalArgumentException e) {
fail("setName(" + headerName + ") failed (IAE): " + e);
} catch (Throwable e) {
fail("setName(" + headerName + ") failed: " + e);
}
| void | Test2()Body of the test 2.
Test for Via header field: getValue()/getHeaderValue().
SipHeader sh;
String val;
String headerValue1 = "SIP/2.0/UDP first.example.com:4000";
String headerValue2 = "SIP/2.0/UDP 192.0.2.1:5060";
String headerParam1 = headerValue1;
String headerParam2 = headerValue2;
String[] paramList = {
"ttl=16",
"maddr=224.2.0.1",
"branch=z9hG4bKa7c6a8dlze.1"
};
// DEBUG: System.out.println("");
// DEBUG: System.out.println("*** Test2 started ***");
for (int i = 0; i < paramList.length + 1; i++) {
sh = createSipHeader(headerName, headerParam1);
if (sh != null) {
val = sh.getValue();
assertTrue("getValue() returned invalid parameter value: '" +
val + "'", val.equals(headerValue1));
val = sh.getHeaderValue();
assertTrue("(1) getHeaderValue() returned invalid " +
"parameter value: '" + val + "'", val.equals(headerParam1));
// Test if the value can be changed.
sh.setValue(headerValue2);
val = sh.getHeaderValue();
assertTrue("(2) getHeaderValue() returned invalid " +
"parameter value: '" + val + "'", val.equals(headerParam2));
}
headerParam1 += ";";
headerParam2 += ";";
if (i < paramList.length) {
headerParam1 += paramList[i];
headerParam2 += paramList[i];
}
} // end for
| void | Test4()Body of the test 4.
Test for Via header field: getParameterNames()/getParameter().
// DEBUG: System.out.println("");
// DEBUG: System.out.println("*** Test4 started ***");
SipHeader sh = createSipHeader(headerName,
"SIP/2.0/UDP 192.0.2.1:5060 ;received=192.0.2.207;" +
"branch=z9hG4bK77asjd");
if (sh == null) {
return;
}
// Testing getParameterNames()...
String[] paramList = sh.getParameterNames();
if (paramList == null) {
fail("getParameterNames() returned null!");
} else {
assertTrue("getParameterNames() returned " + paramList.length +
" parameters instead of 2.", paramList.length == 2);
boolean isValid0 = paramList[0].equals("received") ||
paramList[0].equals("branch");
assertTrue("Invalid parameter name: " + paramList[0],
isValid0);
boolean isValid1 = paramList[1].equals("received") ||
paramList[1].equals("branch");
assertTrue("Invalid parameter name: " + paramList[1],
isValid1);
}
// Testing getParameter()...
String paramVal = sh.getParameter("ttl");
assertTrue("getParameter() returned '" + paramVal +
"' for the parameter 'ttl' that doesn't exist.", paramVal == null);
paramVal = sh.getParameter("received");
assertTrue("getParameter() returned '" + paramVal + "' for 'received'" +
" instead of '192.0.2.207'.", paramVal.equals("192.0.2.207"));
| void | Test5()Body of the test 5.
Test for Via header field: setParameter()/removeParameter().
// DEBUG: System.out.println("");
// DEBUG: System.out.println("*** Test5 started ***");
SipHeader sh = createSipHeader(headerName,
"SIP/2.0/UDP first.example.com: 4000;" +
"maddr=224.2.0.1 ;branch=z9hG4bKa7c6a8dlze.1");
if (sh == null) {
return;
}
// Testing setParameter()...
sh.setParameter("maddr", "192.0.0.1");
String paramVal = sh.getParameter("maddr");
assertTrue("getParameter() returned '" + paramVal +
"' instead of '192.0.0.1'.", paramVal.equals("192.0.0.1"));
sh.setParameter("ttl", "10"); // parameter doesn't exist
paramVal = sh.getParameter("ttl");
assertTrue("getParameter() returned '" + paramVal +
"' instead of 10.", paramVal.equals("10"));
// RFC 3261, p. 232: ttl = 1*3DIGIT ; 0 to 255
/*
These checks are disabled according to the clarification
for SipHeader received from the Expert Group.
try {
sh.setParameter("ttl", "300");
fail("Setting 'ttl=300': IAE was not thrown.");
} catch (IllegalArgumentException iae) {
} catch (Exception e) {
fail(e + " was thrown instead of IAE.");
}
try {
sh.setParameter("ttl", "invalid");
fail("Setting 'ttl=invalid': IAE was not thrown.");
} catch (IllegalArgumentException iae) {
} catch (Exception e) {
fail(e + " was thrown instead of IAE.");
}
// RFC 3261, p. 232:
// via-received = "received" EQUAL (IPv4address / IPv6address)
try {
sh.setParameter("received", "invalid");
fail("Setting 'received=invalid': IAE was not thrown.");
} catch (IllegalArgumentException iae) {
} catch (Exception e) {
fail(e + " was thrown instead of IAE.");
}
*/
| public void | runTests()Run the tests
String headerParam =
"SIP/2.0/UDP first.example.com:4000;ttl=16; " +
"maddr=224.2.0.1 ;branch=z9hG4bKa7c6a8dlze.1";
declare("setName()/getName()");
Test1();
declare("getValue()/getHeaderValue()");
Test2();
declare("setValue()");
testSetValue(headerName, headerParam);
declare("getParameterNames()/getParameter()");
Test4();
declare("setParameter()/removeParameter()");
Test5();
declare("toString()");
testToString(headerName, headerParam);
|
|