OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <string> | 11 #include <string> |
12 | 12 |
13 #include "webrtc/p2p/base/stun.h" | |
14 #include "webrtc/base/arraysize.h" | 13 #include "webrtc/base/arraysize.h" |
15 #include "webrtc/base/bytebuffer.h" | 14 #include "webrtc/base/bytebuffer.h" |
16 #include "webrtc/base/gunit.h" | 15 #include "webrtc/base/gunit.h" |
17 #include "webrtc/base/logging.h" | 16 #include "webrtc/base/logging.h" |
18 #include "webrtc/base/messagedigest.h" | 17 #include "webrtc/base/messagedigest.h" |
| 18 #include "webrtc/base/ptr_util.h" |
19 #include "webrtc/base/socketaddress.h" | 19 #include "webrtc/base/socketaddress.h" |
| 20 #include "webrtc/p2p/base/stun.h" |
20 | 21 |
21 namespace cricket { | 22 namespace cricket { |
22 | 23 |
23 class StunTest : public ::testing::Test { | 24 class StunTest : public ::testing::Test { |
24 protected: | 25 protected: |
25 void CheckStunHeader(const StunMessage& msg, StunMessageType expected_type, | 26 void CheckStunHeader(const StunMessage& msg, StunMessageType expected_type, |
26 size_t expected_length) { | 27 size_t expected_length) { |
27 ASSERT_EQ(expected_type, msg.type()); | 28 ASSERT_EQ(expected_type, msg.type()); |
28 ASSERT_EQ(expected_length, msg.length()); | 29 ASSERT_EQ(expected_length, msg.length()); |
29 } | 30 } |
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
815 // However, no owner is still an error, should fail and write nothing. | 816 // However, no owner is still an error, should fail and write nothing. |
816 addr2.SetOwner(NULL); | 817 addr2.SetOwner(NULL); |
817 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr()); | 818 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr()); |
818 wrong_buf.Clear(); | 819 wrong_buf.Clear(); |
819 EXPECT_FALSE(addr2.Write(&wrong_buf)); | 820 EXPECT_FALSE(addr2.Write(&wrong_buf)); |
820 } | 821 } |
821 | 822 |
822 TEST_F(StunTest, CreateIPv6AddressAttribute) { | 823 TEST_F(StunTest, CreateIPv6AddressAttribute) { |
823 rtc::IPAddress test_ip(kIPv6TestAddress2); | 824 rtc::IPAddress test_ip(kIPv6TestAddress2); |
824 | 825 |
825 StunAddressAttribute* addr = | 826 auto addr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); |
826 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); | |
827 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2); | 827 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2); |
828 addr->SetAddress(test_addr); | 828 addr->SetAddress(test_addr); |
829 | 829 |
830 CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV6, | 830 CheckStunAddressAttribute(addr.get(), STUN_ADDRESS_IPV6, kTestMessagePort2, |
831 kTestMessagePort2, test_ip); | 831 test_ip); |
832 delete addr; | |
833 } | 832 } |
834 | 833 |
835 TEST_F(StunTest, CreateIPv4AddressAttribute) { | 834 TEST_F(StunTest, CreateIPv4AddressAttribute) { |
836 struct in_addr test_in_addr; | 835 struct in_addr test_in_addr; |
837 test_in_addr.s_addr = 0xBEB0B0BE; | 836 test_in_addr.s_addr = 0xBEB0B0BE; |
838 rtc::IPAddress test_ip(test_in_addr); | 837 rtc::IPAddress test_ip(test_in_addr); |
839 | 838 |
840 StunAddressAttribute* addr = | 839 auto addr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); |
841 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); | |
842 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2); | 840 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2); |
843 addr->SetAddress(test_addr); | 841 addr->SetAddress(test_addr); |
844 | 842 |
845 CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV4, | 843 CheckStunAddressAttribute(addr.get(), STUN_ADDRESS_IPV4, kTestMessagePort2, |
846 kTestMessagePort2, test_ip); | 844 test_ip); |
847 delete addr; | |
848 } | 845 } |
849 | 846 |
850 // Test that we don't care what order we set the parts of an address | 847 // Test that we don't care what order we set the parts of an address |
851 TEST_F(StunTest, CreateAddressInArbitraryOrder) { | 848 TEST_F(StunTest, CreateAddressInArbitraryOrder) { |
852 StunAddressAttribute* addr = | 849 auto addr = StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS); |
853 StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS); | |
854 // Port first | 850 // Port first |
855 addr->SetPort(kTestMessagePort1); | 851 addr->SetPort(kTestMessagePort1); |
856 addr->SetIP(rtc::IPAddress(kIPv4TestAddress1)); | 852 addr->SetIP(rtc::IPAddress(kIPv4TestAddress1)); |
857 ASSERT_EQ(kTestMessagePort1, addr->port()); | 853 ASSERT_EQ(kTestMessagePort1, addr->port()); |
858 ASSERT_EQ(rtc::IPAddress(kIPv4TestAddress1), addr->ipaddr()); | 854 ASSERT_EQ(rtc::IPAddress(kIPv4TestAddress1), addr->ipaddr()); |
859 | 855 |
860 StunAddressAttribute* addr2 = | 856 auto addr2 = StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS); |
861 StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS); | |
862 // IP first | 857 // IP first |
863 addr2->SetIP(rtc::IPAddress(kIPv4TestAddress1)); | 858 addr2->SetIP(rtc::IPAddress(kIPv4TestAddress1)); |
864 addr2->SetPort(kTestMessagePort2); | 859 addr2->SetPort(kTestMessagePort2); |
865 ASSERT_EQ(kTestMessagePort2, addr2->port()); | 860 ASSERT_EQ(kTestMessagePort2, addr2->port()); |
866 ASSERT_EQ(rtc::IPAddress(kIPv4TestAddress1), addr2->ipaddr()); | 861 ASSERT_EQ(rtc::IPAddress(kIPv4TestAddress1), addr2->ipaddr()); |
867 | |
868 delete addr; | |
869 delete addr2; | |
870 } | 862 } |
871 | 863 |
872 TEST_F(StunTest, WriteMessageWithIPv6AddressAttribute) { | 864 TEST_F(StunTest, WriteMessageWithIPv6AddressAttribute) { |
873 StunMessage msg; | 865 StunMessage msg; |
874 size_t size = sizeof(kStunMessageWithIPv6MappedAddress); | 866 size_t size = sizeof(kStunMessageWithIPv6MappedAddress); |
875 | 867 |
876 rtc::IPAddress test_ip(kIPv6TestAddress1); | 868 rtc::IPAddress test_ip(kIPv6TestAddress1); |
877 | 869 |
878 msg.SetType(STUN_BINDING_REQUEST); | 870 msg.SetType(STUN_BINDING_REQUEST); |
879 msg.SetTransactionID( | 871 msg.SetTransactionID( |
880 std::string(reinterpret_cast<const char*>(kTestTransactionId1), | 872 std::string(reinterpret_cast<const char*>(kTestTransactionId1), |
881 kStunTransactionIdLength)); | 873 kStunTransactionIdLength)); |
882 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); | 874 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); |
883 | 875 |
884 StunAddressAttribute* addr = | 876 auto addr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); |
885 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); | |
886 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2); | 877 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2); |
887 addr->SetAddress(test_addr); | 878 addr->SetAddress(test_addr); |
888 msg.AddAttribute(addr); | 879 msg.AddAttribute(std::move(addr)); |
889 | 880 |
890 CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20)); | 881 CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20)); |
891 | 882 |
892 rtc::ByteBufferWriter out; | 883 rtc::ByteBufferWriter out; |
893 EXPECT_TRUE(msg.Write(&out)); | 884 EXPECT_TRUE(msg.Write(&out)); |
894 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6MappedAddress)); | 885 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6MappedAddress)); |
895 int len1 = static_cast<int>(out.Length()); | 886 int len1 = static_cast<int>(out.Length()); |
896 rtc::ByteBufferReader read_buf(out); | 887 rtc::ByteBufferReader read_buf(out); |
897 std::string bytes; | 888 std::string bytes; |
898 read_buf.ReadString(&bytes, len1); | 889 read_buf.ReadString(&bytes, len1); |
899 ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv6MappedAddress, len1)); | 890 ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv6MappedAddress, len1)); |
900 } | 891 } |
901 | 892 |
902 TEST_F(StunTest, WriteMessageWithIPv4AddressAttribute) { | 893 TEST_F(StunTest, WriteMessageWithIPv4AddressAttribute) { |
903 StunMessage msg; | 894 StunMessage msg; |
904 size_t size = sizeof(kStunMessageWithIPv4MappedAddress); | 895 size_t size = sizeof(kStunMessageWithIPv4MappedAddress); |
905 | 896 |
906 rtc::IPAddress test_ip(kIPv4TestAddress1); | 897 rtc::IPAddress test_ip(kIPv4TestAddress1); |
907 | 898 |
908 msg.SetType(STUN_BINDING_RESPONSE); | 899 msg.SetType(STUN_BINDING_RESPONSE); |
909 msg.SetTransactionID( | 900 msg.SetTransactionID( |
910 std::string(reinterpret_cast<const char*>(kTestTransactionId1), | 901 std::string(reinterpret_cast<const char*>(kTestTransactionId1), |
911 kStunTransactionIdLength)); | 902 kStunTransactionIdLength)); |
912 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); | 903 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); |
913 | 904 |
914 StunAddressAttribute* addr = | 905 auto addr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); |
915 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); | |
916 rtc::SocketAddress test_addr(test_ip, kTestMessagePort4); | 906 rtc::SocketAddress test_addr(test_ip, kTestMessagePort4); |
917 addr->SetAddress(test_addr); | 907 addr->SetAddress(test_addr); |
918 msg.AddAttribute(addr); | 908 msg.AddAttribute(std::move(addr)); |
919 | 909 |
920 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20)); | 910 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20)); |
921 | 911 |
922 rtc::ByteBufferWriter out; | 912 rtc::ByteBufferWriter out; |
923 EXPECT_TRUE(msg.Write(&out)); | 913 EXPECT_TRUE(msg.Write(&out)); |
924 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4MappedAddress)); | 914 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4MappedAddress)); |
925 int len1 = static_cast<int>(out.Length()); | 915 int len1 = static_cast<int>(out.Length()); |
926 rtc::ByteBufferReader read_buf(out); | 916 rtc::ByteBufferReader read_buf(out); |
927 std::string bytes; | 917 std::string bytes; |
928 read_buf.ReadString(&bytes, len1); | 918 read_buf.ReadString(&bytes, len1); |
929 ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv4MappedAddress, len1)); | 919 ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv4MappedAddress, len1)); |
930 } | 920 } |
931 | 921 |
932 TEST_F(StunTest, WriteMessageWithIPv6XorAddressAttribute) { | 922 TEST_F(StunTest, WriteMessageWithIPv6XorAddressAttribute) { |
933 StunMessage msg; | 923 StunMessage msg; |
934 size_t size = sizeof(kStunMessageWithIPv6XorMappedAddress); | 924 size_t size = sizeof(kStunMessageWithIPv6XorMappedAddress); |
935 | 925 |
936 rtc::IPAddress test_ip(kIPv6TestAddress1); | 926 rtc::IPAddress test_ip(kIPv6TestAddress1); |
937 | 927 |
938 msg.SetType(STUN_BINDING_RESPONSE); | 928 msg.SetType(STUN_BINDING_RESPONSE); |
939 msg.SetTransactionID( | 929 msg.SetTransactionID( |
940 std::string(reinterpret_cast<const char*>(kTestTransactionId2), | 930 std::string(reinterpret_cast<const char*>(kTestTransactionId2), |
941 kStunTransactionIdLength)); | 931 kStunTransactionIdLength)); |
942 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength); | 932 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength); |
943 | 933 |
944 StunAddressAttribute* addr = | 934 auto addr = StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS); |
945 StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS); | |
946 rtc::SocketAddress test_addr(test_ip, kTestMessagePort1); | 935 rtc::SocketAddress test_addr(test_ip, kTestMessagePort1); |
947 addr->SetAddress(test_addr); | 936 addr->SetAddress(test_addr); |
948 msg.AddAttribute(addr); | 937 msg.AddAttribute(std::move(addr)); |
949 | 938 |
950 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20)); | 939 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20)); |
951 | 940 |
952 rtc::ByteBufferWriter out; | 941 rtc::ByteBufferWriter out; |
953 EXPECT_TRUE(msg.Write(&out)); | 942 EXPECT_TRUE(msg.Write(&out)); |
954 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6XorMappedAddress)); | 943 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6XorMappedAddress)); |
955 int len1 = static_cast<int>(out.Length()); | 944 int len1 = static_cast<int>(out.Length()); |
956 rtc::ByteBufferReader read_buf(out); | 945 rtc::ByteBufferReader read_buf(out); |
957 std::string bytes; | 946 std::string bytes; |
958 read_buf.ReadString(&bytes, len1); | 947 read_buf.ReadString(&bytes, len1); |
959 ASSERT_EQ(0, | 948 ASSERT_EQ(0, |
960 memcmp(bytes.c_str(), kStunMessageWithIPv6XorMappedAddress, len1)); | 949 memcmp(bytes.c_str(), kStunMessageWithIPv6XorMappedAddress, len1)); |
961 } | 950 } |
962 | 951 |
963 TEST_F(StunTest, WriteMessageWithIPv4XoreAddressAttribute) { | 952 TEST_F(StunTest, WriteMessageWithIPv4XoreAddressAttribute) { |
964 StunMessage msg; | 953 StunMessage msg; |
965 size_t size = sizeof(kStunMessageWithIPv4XorMappedAddress); | 954 size_t size = sizeof(kStunMessageWithIPv4XorMappedAddress); |
966 | 955 |
967 rtc::IPAddress test_ip(kIPv4TestAddress1); | 956 rtc::IPAddress test_ip(kIPv4TestAddress1); |
968 | 957 |
969 msg.SetType(STUN_BINDING_RESPONSE); | 958 msg.SetType(STUN_BINDING_RESPONSE); |
970 msg.SetTransactionID( | 959 msg.SetTransactionID( |
971 std::string(reinterpret_cast<const char*>(kTestTransactionId1), | 960 std::string(reinterpret_cast<const char*>(kTestTransactionId1), |
972 kStunTransactionIdLength)); | 961 kStunTransactionIdLength)); |
973 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); | 962 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); |
974 | 963 |
975 StunAddressAttribute* addr = | 964 auto addr = StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS); |
976 StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS); | |
977 rtc::SocketAddress test_addr(test_ip, kTestMessagePort3); | 965 rtc::SocketAddress test_addr(test_ip, kTestMessagePort3); |
978 addr->SetAddress(test_addr); | 966 addr->SetAddress(test_addr); |
979 msg.AddAttribute(addr); | 967 msg.AddAttribute(std::move(addr)); |
980 | 968 |
981 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20)); | 969 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20)); |
982 | 970 |
983 rtc::ByteBufferWriter out; | 971 rtc::ByteBufferWriter out; |
984 EXPECT_TRUE(msg.Write(&out)); | 972 EXPECT_TRUE(msg.Write(&out)); |
985 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4XorMappedAddress)); | 973 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4XorMappedAddress)); |
986 int len1 = static_cast<int>(out.Length()); | 974 int len1 = static_cast<int>(out.Length()); |
987 rtc::ByteBufferReader read_buf(out); | 975 rtc::ByteBufferReader read_buf(out); |
988 std::string bytes; | 976 std::string bytes; |
989 read_buf.ReadString(&bytes, len1); | 977 read_buf.ReadString(&bytes, len1); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1066 | 1054 |
1067 TEST_F(StunTest, WriteMessageWithAnErrorCodeAttribute) { | 1055 TEST_F(StunTest, WriteMessageWithAnErrorCodeAttribute) { |
1068 StunMessage msg; | 1056 StunMessage msg; |
1069 size_t size = sizeof(kStunMessageWithErrorAttribute); | 1057 size_t size = sizeof(kStunMessageWithErrorAttribute); |
1070 | 1058 |
1071 msg.SetType(STUN_BINDING_ERROR_RESPONSE); | 1059 msg.SetType(STUN_BINDING_ERROR_RESPONSE); |
1072 msg.SetTransactionID( | 1060 msg.SetTransactionID( |
1073 std::string(reinterpret_cast<const char*>(kTestTransactionId1), | 1061 std::string(reinterpret_cast<const char*>(kTestTransactionId1), |
1074 kStunTransactionIdLength)); | 1062 kStunTransactionIdLength)); |
1075 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); | 1063 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); |
1076 StunErrorCodeAttribute* errorcode = StunAttribute::CreateErrorCode(); | 1064 auto errorcode = StunAttribute::CreateErrorCode(); |
1077 errorcode->SetCode(kTestErrorCode); | 1065 errorcode->SetCode(kTestErrorCode); |
1078 errorcode->SetReason(kTestErrorReason); | 1066 errorcode->SetReason(kTestErrorReason); |
1079 msg.AddAttribute(errorcode); | 1067 msg.AddAttribute(std::move(errorcode)); |
1080 CheckStunHeader(msg, STUN_BINDING_ERROR_RESPONSE, (size - 20)); | 1068 CheckStunHeader(msg, STUN_BINDING_ERROR_RESPONSE, (size - 20)); |
1081 | 1069 |
1082 rtc::ByteBufferWriter out; | 1070 rtc::ByteBufferWriter out; |
1083 EXPECT_TRUE(msg.Write(&out)); | 1071 EXPECT_TRUE(msg.Write(&out)); |
1084 ASSERT_EQ(size, out.Length()); | 1072 ASSERT_EQ(size, out.Length()); |
1085 // No padding. | 1073 // No padding. |
1086 ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithErrorAttribute, size)); | 1074 ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithErrorAttribute, size)); |
1087 } | 1075 } |
1088 | 1076 |
1089 TEST_F(StunTest, WriteMessageWithAUInt16ListAttribute) { | 1077 TEST_F(StunTest, WriteMessageWithAUInt16ListAttribute) { |
1090 StunMessage msg; | 1078 StunMessage msg; |
1091 size_t size = sizeof(kStunMessageWithUInt16ListAttribute); | 1079 size_t size = sizeof(kStunMessageWithUInt16ListAttribute); |
1092 | 1080 |
1093 msg.SetType(STUN_BINDING_REQUEST); | 1081 msg.SetType(STUN_BINDING_REQUEST); |
1094 msg.SetTransactionID( | 1082 msg.SetTransactionID( |
1095 std::string(reinterpret_cast<const char*>(kTestTransactionId2), | 1083 std::string(reinterpret_cast<const char*>(kTestTransactionId2), |
1096 kStunTransactionIdLength)); | 1084 kStunTransactionIdLength)); |
1097 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength); | 1085 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength); |
1098 StunUInt16ListAttribute* list = StunAttribute::CreateUnknownAttributes(); | 1086 auto list = StunAttribute::CreateUnknownAttributes(); |
1099 list->AddType(0x1U); | 1087 list->AddType(0x1U); |
1100 list->AddType(0x1000U); | 1088 list->AddType(0x1000U); |
1101 list->AddType(0xAB0CU); | 1089 list->AddType(0xAB0CU); |
1102 msg.AddAttribute(list); | 1090 msg.AddAttribute(std::move(list)); |
1103 CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20)); | 1091 CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20)); |
1104 | 1092 |
1105 rtc::ByteBufferWriter out; | 1093 rtc::ByteBufferWriter out; |
1106 EXPECT_TRUE(msg.Write(&out)); | 1094 EXPECT_TRUE(msg.Write(&out)); |
1107 ASSERT_EQ(size, out.Length()); | 1095 ASSERT_EQ(size, out.Length()); |
1108 // Check everything up to the padding. | 1096 // Check everything up to the padding. |
1109 ASSERT_EQ(0, | 1097 ASSERT_EQ(0, |
1110 memcmp(out.Data(), kStunMessageWithUInt16ListAttribute, size - 2)); | 1098 memcmp(out.Data(), kStunMessageWithUInt16ListAttribute, size - 2)); |
1111 } | 1099 } |
1112 | 1100 |
1113 TEST_F(StunTest, WriteMessageWithOriginAttribute) { | 1101 TEST_F(StunTest, WriteMessageWithOriginAttribute) { |
1114 StunMessage msg; | 1102 StunMessage msg; |
1115 size_t size = sizeof(kStunMessageWithOriginAttribute); | 1103 size_t size = sizeof(kStunMessageWithOriginAttribute); |
1116 | 1104 |
1117 msg.SetType(STUN_BINDING_REQUEST); | 1105 msg.SetType(STUN_BINDING_REQUEST); |
1118 msg.SetTransactionID( | 1106 msg.SetTransactionID( |
1119 std::string(reinterpret_cast<const char*>(kTestTransactionId1), | 1107 std::string(reinterpret_cast<const char*>(kTestTransactionId1), |
1120 kStunTransactionIdLength)); | 1108 kStunTransactionIdLength)); |
1121 StunByteStringAttribute* origin = | 1109 auto origin = |
1122 new StunByteStringAttribute(STUN_ATTR_ORIGIN, kTestOrigin); | 1110 rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_ORIGIN, kTestOrigin); |
1123 msg.AddAttribute(origin); | 1111 msg.AddAttribute(std::move(origin)); |
1124 | 1112 |
1125 rtc::ByteBufferWriter out; | 1113 rtc::ByteBufferWriter out; |
1126 EXPECT_TRUE(msg.Write(&out)); | 1114 EXPECT_TRUE(msg.Write(&out)); |
1127 ASSERT_EQ(size, out.Length()); | 1115 ASSERT_EQ(size, out.Length()); |
1128 // Check everything up to the padding | 1116 // Check everything up to the padding |
1129 ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithOriginAttribute, size - 2)); | 1117 ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithOriginAttribute, size - 2)); |
1130 } | 1118 } |
1131 | 1119 |
1132 // Test that we fail to read messages with invalid lengths. | 1120 // Test that we fail to read messages with invalid lengths. |
1133 void CheckFailureToRead(const unsigned char* testcase, size_t length) { | 1121 void CheckFailureToRead(const unsigned char* testcase, size_t length) { |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1382 in_addr legacy_in_addr; | 1370 in_addr legacy_in_addr; |
1383 legacy_in_addr.s_addr = htonl(17U); | 1371 legacy_in_addr.s_addr = htonl(17U); |
1384 rtc::IPAddress legacy_ip(legacy_in_addr); | 1372 rtc::IPAddress legacy_ip(legacy_in_addr); |
1385 | 1373 |
1386 const StunAddressAttribute* addr = msg.GetAddress(STUN_ATTR_MAPPED_ADDRESS); | 1374 const StunAddressAttribute* addr = msg.GetAddress(STUN_ATTR_MAPPED_ADDRESS); |
1387 ASSERT_TRUE(addr != NULL); | 1375 ASSERT_TRUE(addr != NULL); |
1388 EXPECT_EQ(1, addr->family()); | 1376 EXPECT_EQ(1, addr->family()); |
1389 EXPECT_EQ(13, addr->port()); | 1377 EXPECT_EQ(13, addr->port()); |
1390 EXPECT_EQ(legacy_ip, addr->ipaddr()); | 1378 EXPECT_EQ(legacy_ip, addr->ipaddr()); |
1391 | 1379 |
1392 StunAddressAttribute* addr2 = | 1380 auto addr2 = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); |
1393 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); | |
1394 addr2->SetPort(13); | 1381 addr2->SetPort(13); |
1395 addr2->SetIP(legacy_ip); | 1382 addr2->SetIP(legacy_ip); |
1396 msg2.AddAttribute(addr2); | 1383 msg2.AddAttribute(std::move(addr2)); |
1397 | 1384 |
1398 const StunByteStringAttribute* bytes = msg.GetByteString(STUN_ATTR_USERNAME); | 1385 const StunByteStringAttribute* bytes = msg.GetByteString(STUN_ATTR_USERNAME); |
1399 ASSERT_TRUE(bytes != NULL); | 1386 ASSERT_TRUE(bytes != NULL); |
1400 EXPECT_EQ(12U, bytes->length()); | 1387 EXPECT_EQ(12U, bytes->length()); |
1401 EXPECT_EQ("abcdefghijkl", bytes->GetString()); | 1388 EXPECT_EQ("abcdefghijkl", bytes->GetString()); |
1402 | 1389 |
1403 StunByteStringAttribute* bytes2 = | 1390 auto bytes2 = StunAttribute::CreateByteString(STUN_ATTR_USERNAME); |
1404 StunAttribute::CreateByteString(STUN_ATTR_USERNAME); | |
1405 bytes2->CopyBytes("abcdefghijkl"); | 1391 bytes2->CopyBytes("abcdefghijkl"); |
1406 msg2.AddAttribute(bytes2); | 1392 msg2.AddAttribute(std::move(bytes2)); |
1407 | 1393 |
1408 const StunUInt32Attribute* uval = msg.GetUInt32(STUN_ATTR_LIFETIME); | 1394 const StunUInt32Attribute* uval = msg.GetUInt32(STUN_ATTR_LIFETIME); |
1409 ASSERT_TRUE(uval != NULL); | 1395 ASSERT_TRUE(uval != NULL); |
1410 EXPECT_EQ(11U, uval->value()); | 1396 EXPECT_EQ(11U, uval->value()); |
1411 | 1397 |
1412 StunUInt32Attribute* uval2 = StunAttribute::CreateUInt32(STUN_ATTR_LIFETIME); | 1398 auto uval2 = StunAttribute::CreateUInt32(STUN_ATTR_LIFETIME); |
1413 uval2->SetValue(11); | 1399 uval2->SetValue(11); |
1414 msg2.AddAttribute(uval2); | 1400 msg2.AddAttribute(std::move(uval2)); |
1415 | 1401 |
1416 bytes = msg.GetByteString(STUN_ATTR_MAGIC_COOKIE); | 1402 bytes = msg.GetByteString(STUN_ATTR_MAGIC_COOKIE); |
1417 ASSERT_TRUE(bytes != NULL); | 1403 ASSERT_TRUE(bytes != NULL); |
1418 EXPECT_EQ(4U, bytes->length()); | 1404 EXPECT_EQ(4U, bytes->length()); |
1419 EXPECT_EQ(0, | 1405 EXPECT_EQ(0, |
1420 memcmp(bytes->bytes(), | 1406 memcmp(bytes->bytes(), |
1421 TURN_MAGIC_COOKIE_VALUE, | 1407 TURN_MAGIC_COOKIE_VALUE, |
1422 sizeof(TURN_MAGIC_COOKIE_VALUE))); | 1408 sizeof(TURN_MAGIC_COOKIE_VALUE))); |
1423 | 1409 |
1424 bytes2 = StunAttribute::CreateByteString(STUN_ATTR_MAGIC_COOKIE); | 1410 bytes2 = StunAttribute::CreateByteString(STUN_ATTR_MAGIC_COOKIE); |
1425 bytes2->CopyBytes(reinterpret_cast<const char*>(TURN_MAGIC_COOKIE_VALUE), | 1411 bytes2->CopyBytes(reinterpret_cast<const char*>(TURN_MAGIC_COOKIE_VALUE), |
1426 sizeof(TURN_MAGIC_COOKIE_VALUE)); | 1412 sizeof(TURN_MAGIC_COOKIE_VALUE)); |
1427 msg2.AddAttribute(bytes2); | 1413 msg2.AddAttribute(std::move(bytes2)); |
1428 | 1414 |
1429 uval = msg.GetUInt32(STUN_ATTR_BANDWIDTH); | 1415 uval = msg.GetUInt32(STUN_ATTR_BANDWIDTH); |
1430 ASSERT_TRUE(uval != NULL); | 1416 ASSERT_TRUE(uval != NULL); |
1431 EXPECT_EQ(6U, uval->value()); | 1417 EXPECT_EQ(6U, uval->value()); |
1432 | 1418 |
1433 uval2 = StunAttribute::CreateUInt32(STUN_ATTR_BANDWIDTH); | 1419 uval2 = StunAttribute::CreateUInt32(STUN_ATTR_BANDWIDTH); |
1434 uval2->SetValue(6); | 1420 uval2->SetValue(6); |
1435 msg2.AddAttribute(uval2); | 1421 msg2.AddAttribute(std::move(uval2)); |
1436 | 1422 |
1437 addr = msg.GetAddress(STUN_ATTR_DESTINATION_ADDRESS); | 1423 addr = msg.GetAddress(STUN_ATTR_DESTINATION_ADDRESS); |
1438 ASSERT_TRUE(addr != NULL); | 1424 ASSERT_TRUE(addr != NULL); |
1439 EXPECT_EQ(1, addr->family()); | 1425 EXPECT_EQ(1, addr->family()); |
1440 EXPECT_EQ(13, addr->port()); | 1426 EXPECT_EQ(13, addr->port()); |
1441 EXPECT_EQ(legacy_ip, addr->ipaddr()); | 1427 EXPECT_EQ(legacy_ip, addr->ipaddr()); |
1442 | 1428 |
1443 addr2 = StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS); | 1429 addr2 = StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS); |
1444 addr2->SetPort(13); | 1430 addr2->SetPort(13); |
1445 addr2->SetIP(legacy_ip); | 1431 addr2->SetIP(legacy_ip); |
1446 msg2.AddAttribute(addr2); | 1432 msg2.AddAttribute(std::move(addr2)); |
1447 | 1433 |
1448 addr = msg.GetAddress(STUN_ATTR_SOURCE_ADDRESS2); | 1434 addr = msg.GetAddress(STUN_ATTR_SOURCE_ADDRESS2); |
1449 ASSERT_TRUE(addr != NULL); | 1435 ASSERT_TRUE(addr != NULL); |
1450 EXPECT_EQ(1, addr->family()); | 1436 EXPECT_EQ(1, addr->family()); |
1451 EXPECT_EQ(13, addr->port()); | 1437 EXPECT_EQ(13, addr->port()); |
1452 EXPECT_EQ(legacy_ip, addr->ipaddr()); | 1438 EXPECT_EQ(legacy_ip, addr->ipaddr()); |
1453 | 1439 |
1454 addr2 = StunAttribute::CreateAddress(STUN_ATTR_SOURCE_ADDRESS2); | 1440 addr2 = StunAttribute::CreateAddress(STUN_ATTR_SOURCE_ADDRESS2); |
1455 addr2->SetPort(13); | 1441 addr2->SetPort(13); |
1456 addr2->SetIP(legacy_ip); | 1442 addr2->SetIP(legacy_ip); |
1457 msg2.AddAttribute(addr2); | 1443 msg2.AddAttribute(std::move(addr2)); |
1458 | 1444 |
1459 bytes = msg.GetByteString(STUN_ATTR_DATA); | 1445 bytes = msg.GetByteString(STUN_ATTR_DATA); |
1460 ASSERT_TRUE(bytes != NULL); | 1446 ASSERT_TRUE(bytes != NULL); |
1461 EXPECT_EQ(7U, bytes->length()); | 1447 EXPECT_EQ(7U, bytes->length()); |
1462 EXPECT_EQ("abcdefg", bytes->GetString()); | 1448 EXPECT_EQ("abcdefg", bytes->GetString()); |
1463 | 1449 |
1464 bytes2 = StunAttribute::CreateByteString(STUN_ATTR_DATA); | 1450 bytes2 = StunAttribute::CreateByteString(STUN_ATTR_DATA); |
1465 bytes2->CopyBytes("abcdefg"); | 1451 bytes2->CopyBytes("abcdefg"); |
1466 msg2.AddAttribute(bytes2); | 1452 msg2.AddAttribute(std::move(bytes2)); |
1467 | 1453 |
1468 rtc::ByteBufferWriter out; | 1454 rtc::ByteBufferWriter out; |
1469 EXPECT_TRUE(msg.Write(&out)); | 1455 EXPECT_TRUE(msg.Write(&out)); |
1470 EXPECT_EQ(size, out.Length()); | 1456 EXPECT_EQ(size, out.Length()); |
1471 size_t len1 = out.Length(); | 1457 size_t len1 = out.Length(); |
1472 rtc::ByteBufferReader read_buf(out); | 1458 rtc::ByteBufferReader read_buf(out); |
1473 std::string outstring; | 1459 std::string outstring; |
1474 read_buf.ReadString(&outstring, len1); | 1460 read_buf.ReadString(&outstring, len1); |
1475 EXPECT_EQ(0, memcmp(outstring.c_str(), input, len1)); | 1461 EXPECT_EQ(0, memcmp(outstring.c_str(), input, len1)); |
1476 | 1462 |
1477 rtc::ByteBufferWriter out2; | 1463 rtc::ByteBufferWriter out2; |
1478 EXPECT_TRUE(msg2.Write(&out2)); | 1464 EXPECT_TRUE(msg2.Write(&out2)); |
1479 EXPECT_EQ(size, out2.Length()); | 1465 EXPECT_EQ(size, out2.Length()); |
1480 size_t len2 = out2.Length(); | 1466 size_t len2 = out2.Length(); |
1481 rtc::ByteBufferReader read_buf2(out2); | 1467 rtc::ByteBufferReader read_buf2(out2); |
1482 std::string outstring2; | 1468 std::string outstring2; |
1483 read_buf2.ReadString(&outstring2, len2); | 1469 read_buf2.ReadString(&outstring2, len2); |
1484 EXPECT_EQ(0, memcmp(outstring2.c_str(), input, len2)); | 1470 EXPECT_EQ(0, memcmp(outstring2.c_str(), input, len2)); |
1485 } | 1471 } |
1486 | 1472 |
1487 } // namespace cricket | 1473 } // namespace cricket |
OLD | NEW |