void StunMessageTestSuite::testFullEncodeParse() { StunMessage msg ; StunMessage check ; bool bRC ; char szString[1024] ; uint16_t usValue ; bool bValue ; uint16_t values[16] ; size_t size ; // Valid empty state CPPUNIT_ASSERT(!msg.getMappedAddress(szString, usValue)) ; CPPUNIT_ASSERT(!msg.getResponseAddress(szString, usValue)) ; CPPUNIT_ASSERT(!msg.getChangePort()) ; CPPUNIT_ASSERT(!msg.getChangeIp()) ; CPPUNIT_ASSERT(!msg.getSourceAddress(szString, usValue)) ; CPPUNIT_ASSERT(!msg.getChangedAddress(szString, usValue)) ; CPPUNIT_ASSERT(!msg.getUsername(szString)) ; CPPUNIT_ASSERT(!msg.getPassword(szString)) ; CPPUNIT_ASSERT(!msg.getError(usValue, szString)) ; CPPUNIT_ASSERT(!msg.getUnknownAttributes(values, 16, size)) ; CPPUNIT_ASSERT(!msg.getReflectedFrom(szString, usValue)) ; CPPUNIT_ASSERT(!msg.getServer(szString)) ; // Set Values msg.setType(MSG_STUN_BIND_REQUEST) ; msg.allocTransactionId() ; msg.setMappedAddress("10.1.1.1", 1) ; msg.setResponseAddress("10.1.1.2", 2) ; msg.setChangePort(true) ; msg.setChangeIp(true) ; msg.setSourceAddress("10.1.1.3", 3) ; msg.setChangedAddress("10.1.1.4", 4) ; msg.setUsername("Username") ; msg.setPassword("Password") ; msg.setError(302, "Reason") ; msg.addUnknownAttribute(0x1234) ; msg.setReflectedFrom("10.1.1.5", 5) ; msg.setServer("Server") ; // Verify Values CPPUNIT_ASSERT(msg.getType() == MSG_STUN_BIND_REQUEST) ; bRC = msg.getMappedAddress(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.1") == 0) ; CPPUNIT_ASSERT(usValue == 1) ; bRC = msg.getResponseAddress(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.2") == 0) ; CPPUNIT_ASSERT(usValue == 2) ; bValue = msg.getChangePort() ; CPPUNIT_ASSERT(bValue == true) ; bValue = msg.getChangeIp() ; CPPUNIT_ASSERT(bValue == true) ; bRC = msg.getSourceAddress(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.3") == 0) ; CPPUNIT_ASSERT(usValue == 3) ; bRC = msg.getChangedAddress(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.4") == 0) ; CPPUNIT_ASSERT(usValue == 4) ; bRC = msg.getUsername(szString) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "Username") == 0) ; bRC = msg.getPassword(szString) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "Password") == 0) ; bRC = msg.getError(usValue, szString) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(usValue == 302) ; CPPUNIT_ASSERT(strcmp(szString, "Reason") == 0) ; bRC = msg.getUnknownAttributes(values, 16, size) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(size == 1) ; CPPUNIT_ASSERT(values[0] == 0x1234) ; bRC = msg.getReflectedFrom(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.5") == 0) ; CPPUNIT_ASSERT(usValue == 5) ; bRC = msg.getServer(szString) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "Server") == 0) ; msg.setRequestXorOnly() ; char encoded[4096] ; size_t nLength ; if (msg.encode(encoded, 4096, nLength)) { if (check.parse(encoded, nLength)) { // Verify Values (again -- copy from above) CPPUNIT_ASSERT(msg.getType() == MSG_STUN_BIND_REQUEST) ; bRC = msg.getMappedAddress(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.1") == 0) ; CPPUNIT_ASSERT(usValue == 1) ; bRC = msg.getResponseAddress(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.2") == 0) ; CPPUNIT_ASSERT(usValue == 2) ; bValue = msg.getChangePort() ; CPPUNIT_ASSERT(bValue == true) ; bValue = msg.getChangeIp() ; CPPUNIT_ASSERT(bValue == true) ; bRC = msg.getSourceAddress(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.3") == 0) ; CPPUNIT_ASSERT(usValue == 3) ; bRC = msg.getChangedAddress(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.4") == 0) ; CPPUNIT_ASSERT(usValue == 4) ; bRC = msg.getUsername(szString) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "Username") == 0) ; bRC = msg.getPassword(szString) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "Password") == 0) ; bRC = msg.getError(usValue, szString) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(usValue == 302) ; CPPUNIT_ASSERT(strcmp(szString, "Reason") == 0) ; bRC = msg.getUnknownAttributes(values, 16, size) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(size == 1) ; CPPUNIT_ASSERT(values[0] == 0x1234) ; bRC = msg.getReflectedFrom(szString, usValue) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "10.1.1.5") == 0) ; CPPUNIT_ASSERT(usValue == 5) ; bRC = msg.getServer(szString) ; CPPUNIT_ASSERT(bRC) ; CPPUNIT_ASSERT(strcmp(szString, "Server") == 0) ; } else { CPPUNIT_ASSERT(false) ; } } else { CPPUNIT_ASSERT(false) ; } }
bool StunUtils::sendStunNatTest(OsDatagramSocket* pSocket, const char* szServerIp, const int port, bool bChangePort, bool bChangeIP, char* szMappedIp, unsigned short* piMappedPort, char* szChangedIp, unsigned short* piChangedPort) { StunMessage msgSend ; char cMsgSend[2048] ; StunMessage msgReceive ; char cMsgReceive[2048] ; size_t nLength ; bool bSuccess = false ; msgSend.setType(MSG_STUN_BIND_REQUEST) ; msgSend.allocTransactionId() ; msgSend.setRequestXorOnly() ; if (bChangePort) { msgSend.setChangePort(true) ; } if (bChangeIP) { msgSend.setChangeIp(true) ; } if (msgSend.encode(cMsgSend, sizeof(cMsgSend), nLength)) { for (int i=0; (i<3) && (bSuccess == false); i++) { if (pSocket->write(cMsgSend, (int) nLength, szServerIp, port) > 0) { if (pSocket->isReadyToRead(500)) { int length = pSocket->read(cMsgReceive, sizeof(cMsgReceive)) ; if ((length > 0) && msgReceive.parse(cMsgReceive, length)) { if (msgReceive.getType() == MSG_STUN_BIND_RESPONSE) { bSuccess = true ; // Get optional mapped address if (szMappedIp && piMappedPort) { msgReceive.getMappedAddress(szMappedIp, *piMappedPort) ; } // Get optional changed address if (szChangedIp && piChangedPort) { msgReceive.getChangedAddress(szChangedIp, *piChangedPort) ; } } else { // Abort on error response break ; } } } } else { break ; } } } else { assert(false) ; } return bSuccess ; }