Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: webrtc/p2p/base/stun_unittest.cc

Issue 1821083002: Split ByteBuffer into writer/reader objects. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/p2p/base/stun.cc ('k') | webrtc/p2p/base/stunrequest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 } else { 55 } else {
56 ASSERT_TRUE(addr->family() == STUN_ADDRESS_IPV6 || 56 ASSERT_TRUE(addr->family() == STUN_ADDRESS_IPV6 ||
57 addr->family() == STUN_ADDRESS_IPV4); 57 addr->family() == STUN_ADDRESS_IPV4);
58 } 58 }
59 } 59 }
60 60
61 size_t ReadStunMessageTestCase(StunMessage* msg, 61 size_t ReadStunMessageTestCase(StunMessage* msg,
62 const unsigned char* testcase, 62 const unsigned char* testcase,
63 size_t size) { 63 size_t size) {
64 const char* input = reinterpret_cast<const char*>(testcase); 64 const char* input = reinterpret_cast<const char*>(testcase);
65 rtc::ByteBuffer buf(input, size); 65 rtc::ByteBufferReader buf(input, size);
66 if (msg->Read(&buf)) { 66 if (msg->Read(&buf)) {
67 // Returns the size the stun message should report itself as being 67 // Returns the size the stun message should report itself as being
68 return (size - 20); 68 return (size - 20);
69 } else { 69 } else {
70 return 0; 70 return 0;
71 } 71 }
72 } 72 }
73 }; 73 };
74 74
75 75
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 732
733 // Owner with a different transaction ID. 733 // Owner with a different transaction ID.
734 msg2.SetTransactionID("ABCDABCDABCD"); 734 msg2.SetTransactionID("ABCDABCDABCD");
735 StunXorAddressAttribute addr2(STUN_ATTR_XOR_MAPPED_ADDRESS, 20, NULL); 735 StunXorAddressAttribute addr2(STUN_ATTR_XOR_MAPPED_ADDRESS, 20, NULL);
736 addr2.SetIP(addr->ipaddr()); 736 addr2.SetIP(addr->ipaddr());
737 addr2.SetPort(addr->port()); 737 addr2.SetPort(addr->port());
738 addr2.SetOwner(&msg2); 738 addr2.SetOwner(&msg2);
739 // The internal IP address shouldn't change. 739 // The internal IP address shouldn't change.
740 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr()); 740 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr());
741 741
742 rtc::ByteBuffer correct_buf; 742 rtc::ByteBufferWriter correct_buf;
743 rtc::ByteBuffer wrong_buf; 743 rtc::ByteBufferWriter wrong_buf;
744 EXPECT_TRUE(addr->Write(&correct_buf)); 744 EXPECT_TRUE(addr->Write(&correct_buf));
745 EXPECT_TRUE(addr2.Write(&wrong_buf)); 745 EXPECT_TRUE(addr2.Write(&wrong_buf));
746 // But when written out, the buffers should look different. 746 // But when written out, the buffers should look different.
747 ASSERT_NE(0, 747 ASSERT_NE(0,
748 memcmp(correct_buf.Data(), wrong_buf.Data(), wrong_buf.Length())); 748 memcmp(correct_buf.Data(), wrong_buf.Data(), wrong_buf.Length()));
749 // And when reading a known good value, the address should be wrong. 749 // And when reading a known good value, the address should be wrong.
750 addr2.Read(&correct_buf); 750 rtc::ByteBufferReader read_buf(correct_buf);
751 addr2.Read(&read_buf);
751 ASSERT_NE(addr->ipaddr(), addr2.ipaddr()); 752 ASSERT_NE(addr->ipaddr(), addr2.ipaddr());
752 addr2.SetIP(addr->ipaddr()); 753 addr2.SetIP(addr->ipaddr());
753 addr2.SetPort(addr->port()); 754 addr2.SetPort(addr->port());
754 // Try writing with no owner at all, should fail and write nothing. 755 // Try writing with no owner at all, should fail and write nothing.
755 addr2.SetOwner(NULL); 756 addr2.SetOwner(NULL);
756 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr()); 757 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr());
757 wrong_buf.Consume(wrong_buf.Length()); 758 wrong_buf.Clear();
758 EXPECT_FALSE(addr2.Write(&wrong_buf)); 759 EXPECT_FALSE(addr2.Write(&wrong_buf));
759 ASSERT_EQ(0U, wrong_buf.Length()); 760 ASSERT_EQ(0U, wrong_buf.Length());
760 } 761 }
761 762
762 TEST_F(StunTest, SetIPv4XorAddressAttributeOwner) { 763 TEST_F(StunTest, SetIPv4XorAddressAttributeOwner) {
763 // Unlike the IPv6XorAddressAttributeOwner test, IPv4 XOR address attributes 764 // Unlike the IPv6XorAddressAttributeOwner test, IPv4 XOR address attributes
764 // should _not_ be affected by a change in owner. IPv4 XOR address uses the 765 // should _not_ be affected by a change in owner. IPv4 XOR address uses the
765 // magic cookie value which is fixed. 766 // magic cookie value which is fixed.
766 StunMessage msg; 767 StunMessage msg;
767 StunMessage msg2; 768 StunMessage msg2;
(...skipping 11 matching lines...) Expand all
779 780
780 // Owner with a different transaction ID. 781 // Owner with a different transaction ID.
781 msg2.SetTransactionID("ABCDABCDABCD"); 782 msg2.SetTransactionID("ABCDABCDABCD");
782 StunXorAddressAttribute addr2(STUN_ATTR_XOR_MAPPED_ADDRESS, 20, NULL); 783 StunXorAddressAttribute addr2(STUN_ATTR_XOR_MAPPED_ADDRESS, 20, NULL);
783 addr2.SetIP(addr->ipaddr()); 784 addr2.SetIP(addr->ipaddr());
784 addr2.SetPort(addr->port()); 785 addr2.SetPort(addr->port());
785 addr2.SetOwner(&msg2); 786 addr2.SetOwner(&msg2);
786 // The internal IP address shouldn't change. 787 // The internal IP address shouldn't change.
787 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr()); 788 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr());
788 789
789 rtc::ByteBuffer correct_buf; 790 rtc::ByteBufferWriter correct_buf;
790 rtc::ByteBuffer wrong_buf; 791 rtc::ByteBufferWriter wrong_buf;
791 EXPECT_TRUE(addr->Write(&correct_buf)); 792 EXPECT_TRUE(addr->Write(&correct_buf));
792 EXPECT_TRUE(addr2.Write(&wrong_buf)); 793 EXPECT_TRUE(addr2.Write(&wrong_buf));
793 // The same address data should be written. 794 // The same address data should be written.
794 ASSERT_EQ(0, 795 ASSERT_EQ(0,
795 memcmp(correct_buf.Data(), wrong_buf.Data(), wrong_buf.Length())); 796 memcmp(correct_buf.Data(), wrong_buf.Data(), wrong_buf.Length()));
796 // And an attribute should be able to un-XOR an address belonging to a message 797 // And an attribute should be able to un-XOR an address belonging to a message
797 // with a different transaction ID. 798 // with a different transaction ID.
798 EXPECT_TRUE(addr2.Read(&correct_buf)); 799 rtc::ByteBufferReader read_buf(correct_buf);
800 EXPECT_TRUE(addr2.Read(&read_buf));
799 ASSERT_EQ(addr->ipaddr(), addr2.ipaddr()); 801 ASSERT_EQ(addr->ipaddr(), addr2.ipaddr());
800 802
801 // However, no owner is still an error, should fail and write nothing. 803 // However, no owner is still an error, should fail and write nothing.
802 addr2.SetOwner(NULL); 804 addr2.SetOwner(NULL);
803 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr()); 805 ASSERT_EQ(addr2.ipaddr(), addr->ipaddr());
804 wrong_buf.Consume(wrong_buf.Length()); 806 wrong_buf.Clear();
805 EXPECT_FALSE(addr2.Write(&wrong_buf)); 807 EXPECT_FALSE(addr2.Write(&wrong_buf));
806 } 808 }
807 809
808 TEST_F(StunTest, CreateIPv6AddressAttribute) { 810 TEST_F(StunTest, CreateIPv6AddressAttribute) {
809 rtc::IPAddress test_ip(kIPv6TestAddress2); 811 rtc::IPAddress test_ip(kIPv6TestAddress2);
810 812
811 StunAddressAttribute* addr = 813 StunAddressAttribute* addr =
812 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); 814 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
813 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2); 815 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2);
814 addr->SetAddress(test_addr); 816 addr->SetAddress(test_addr);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); 870 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
869 871
870 StunAddressAttribute* addr = 872 StunAddressAttribute* addr =
871 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); 873 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
872 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2); 874 rtc::SocketAddress test_addr(test_ip, kTestMessagePort2);
873 addr->SetAddress(test_addr); 875 addr->SetAddress(test_addr);
874 EXPECT_TRUE(msg.AddAttribute(addr)); 876 EXPECT_TRUE(msg.AddAttribute(addr));
875 877
876 CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20)); 878 CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20));
877 879
878 rtc::ByteBuffer out; 880 rtc::ByteBufferWriter out;
879 EXPECT_TRUE(msg.Write(&out)); 881 EXPECT_TRUE(msg.Write(&out));
880 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6MappedAddress)); 882 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6MappedAddress));
881 int len1 = static_cast<int>(out.Length()); 883 int len1 = static_cast<int>(out.Length());
884 rtc::ByteBufferReader read_buf(out);
882 std::string bytes; 885 std::string bytes;
883 out.ReadString(&bytes, len1); 886 read_buf.ReadString(&bytes, len1);
884 ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv6MappedAddress, len1)); 887 ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv6MappedAddress, len1));
885 } 888 }
886 889
887 TEST_F(StunTest, WriteMessageWithIPv4AddressAttribute) { 890 TEST_F(StunTest, WriteMessageWithIPv4AddressAttribute) {
888 StunMessage msg; 891 StunMessage msg;
889 size_t size = sizeof(kStunMessageWithIPv4MappedAddress); 892 size_t size = sizeof(kStunMessageWithIPv4MappedAddress);
890 893
891 rtc::IPAddress test_ip(kIPv4TestAddress1); 894 rtc::IPAddress test_ip(kIPv4TestAddress1);
892 895
893 msg.SetType(STUN_BINDING_RESPONSE); 896 msg.SetType(STUN_BINDING_RESPONSE);
894 msg.SetTransactionID( 897 msg.SetTransactionID(
895 std::string(reinterpret_cast<const char*>(kTestTransactionId1), 898 std::string(reinterpret_cast<const char*>(kTestTransactionId1),
896 kStunTransactionIdLength)); 899 kStunTransactionIdLength));
897 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); 900 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
898 901
899 StunAddressAttribute* addr = 902 StunAddressAttribute* addr =
900 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS); 903 StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
901 rtc::SocketAddress test_addr(test_ip, kTestMessagePort4); 904 rtc::SocketAddress test_addr(test_ip, kTestMessagePort4);
902 addr->SetAddress(test_addr); 905 addr->SetAddress(test_addr);
903 EXPECT_TRUE(msg.AddAttribute(addr)); 906 EXPECT_TRUE(msg.AddAttribute(addr));
904 907
905 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20)); 908 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20));
906 909
907 rtc::ByteBuffer out; 910 rtc::ByteBufferWriter out;
908 EXPECT_TRUE(msg.Write(&out)); 911 EXPECT_TRUE(msg.Write(&out));
909 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4MappedAddress)); 912 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4MappedAddress));
910 int len1 = static_cast<int>(out.Length()); 913 int len1 = static_cast<int>(out.Length());
914 rtc::ByteBufferReader read_buf(out);
911 std::string bytes; 915 std::string bytes;
912 out.ReadString(&bytes, len1); 916 read_buf.ReadString(&bytes, len1);
913 ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv4MappedAddress, len1)); 917 ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv4MappedAddress, len1));
914 } 918 }
915 919
916 TEST_F(StunTest, WriteMessageWithIPv6XorAddressAttribute) { 920 TEST_F(StunTest, WriteMessageWithIPv6XorAddressAttribute) {
917 StunMessage msg; 921 StunMessage msg;
918 size_t size = sizeof(kStunMessageWithIPv6XorMappedAddress); 922 size_t size = sizeof(kStunMessageWithIPv6XorMappedAddress);
919 923
920 rtc::IPAddress test_ip(kIPv6TestAddress1); 924 rtc::IPAddress test_ip(kIPv6TestAddress1);
921 925
922 msg.SetType(STUN_BINDING_RESPONSE); 926 msg.SetType(STUN_BINDING_RESPONSE);
923 msg.SetTransactionID( 927 msg.SetTransactionID(
924 std::string(reinterpret_cast<const char*>(kTestTransactionId2), 928 std::string(reinterpret_cast<const char*>(kTestTransactionId2),
925 kStunTransactionIdLength)); 929 kStunTransactionIdLength));
926 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength); 930 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength);
927 931
928 StunAddressAttribute* addr = 932 StunAddressAttribute* addr =
929 StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS); 933 StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
930 rtc::SocketAddress test_addr(test_ip, kTestMessagePort1); 934 rtc::SocketAddress test_addr(test_ip, kTestMessagePort1);
931 addr->SetAddress(test_addr); 935 addr->SetAddress(test_addr);
932 EXPECT_TRUE(msg.AddAttribute(addr)); 936 EXPECT_TRUE(msg.AddAttribute(addr));
933 937
934 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20)); 938 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20));
935 939
936 rtc::ByteBuffer out; 940 rtc::ByteBufferWriter out;
937 EXPECT_TRUE(msg.Write(&out)); 941 EXPECT_TRUE(msg.Write(&out));
938 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6XorMappedAddress)); 942 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6XorMappedAddress));
939 int len1 = static_cast<int>(out.Length()); 943 int len1 = static_cast<int>(out.Length());
944 rtc::ByteBufferReader read_buf(out);
940 std::string bytes; 945 std::string bytes;
941 out.ReadString(&bytes, len1); 946 read_buf.ReadString(&bytes, len1);
942 ASSERT_EQ(0, 947 ASSERT_EQ(0,
943 memcmp(bytes.c_str(), kStunMessageWithIPv6XorMappedAddress, len1)); 948 memcmp(bytes.c_str(), kStunMessageWithIPv6XorMappedAddress, len1));
944 } 949 }
945 950
946 TEST_F(StunTest, WriteMessageWithIPv4XoreAddressAttribute) { 951 TEST_F(StunTest, WriteMessageWithIPv4XoreAddressAttribute) {
947 StunMessage msg; 952 StunMessage msg;
948 size_t size = sizeof(kStunMessageWithIPv4XorMappedAddress); 953 size_t size = sizeof(kStunMessageWithIPv4XorMappedAddress);
949 954
950 rtc::IPAddress test_ip(kIPv4TestAddress1); 955 rtc::IPAddress test_ip(kIPv4TestAddress1);
951 956
952 msg.SetType(STUN_BINDING_RESPONSE); 957 msg.SetType(STUN_BINDING_RESPONSE);
953 msg.SetTransactionID( 958 msg.SetTransactionID(
954 std::string(reinterpret_cast<const char*>(kTestTransactionId1), 959 std::string(reinterpret_cast<const char*>(kTestTransactionId1),
955 kStunTransactionIdLength)); 960 kStunTransactionIdLength));
956 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); 961 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
957 962
958 StunAddressAttribute* addr = 963 StunAddressAttribute* addr =
959 StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS); 964 StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
960 rtc::SocketAddress test_addr(test_ip, kTestMessagePort3); 965 rtc::SocketAddress test_addr(test_ip, kTestMessagePort3);
961 addr->SetAddress(test_addr); 966 addr->SetAddress(test_addr);
962 EXPECT_TRUE(msg.AddAttribute(addr)); 967 EXPECT_TRUE(msg.AddAttribute(addr));
963 968
964 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20)); 969 CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20));
965 970
966 rtc::ByteBuffer out; 971 rtc::ByteBufferWriter out;
967 EXPECT_TRUE(msg.Write(&out)); 972 EXPECT_TRUE(msg.Write(&out));
968 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4XorMappedAddress)); 973 ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4XorMappedAddress));
969 int len1 = static_cast<int>(out.Length()); 974 int len1 = static_cast<int>(out.Length());
975 rtc::ByteBufferReader read_buf(out);
970 std::string bytes; 976 std::string bytes;
971 out.ReadString(&bytes, len1); 977 read_buf.ReadString(&bytes, len1);
972 ASSERT_EQ(0, 978 ASSERT_EQ(0,
973 memcmp(bytes.c_str(), kStunMessageWithIPv4XorMappedAddress, len1)); 979 memcmp(bytes.c_str(), kStunMessageWithIPv4XorMappedAddress, len1));
974 } 980 }
975 981
976 TEST_F(StunTest, ReadByteStringAttribute) { 982 TEST_F(StunTest, ReadByteStringAttribute) {
977 StunMessage msg; 983 StunMessage msg;
978 size_t size = ReadStunMessage(&msg, kStunMessageWithByteStringAttribute); 984 size_t size = ReadStunMessage(&msg, kStunMessageWithByteStringAttribute);
979 985
980 CheckStunHeader(msg, STUN_BINDING_REQUEST, size); 986 CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
981 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength); 987 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 msg.SetTransactionID( 1060 msg.SetTransactionID(
1055 std::string(reinterpret_cast<const char*>(kTestTransactionId1), 1061 std::string(reinterpret_cast<const char*>(kTestTransactionId1),
1056 kStunTransactionIdLength)); 1062 kStunTransactionIdLength));
1057 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength); 1063 CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
1058 StunErrorCodeAttribute* errorcode = StunAttribute::CreateErrorCode(); 1064 StunErrorCodeAttribute* errorcode = StunAttribute::CreateErrorCode();
1059 errorcode->SetCode(kTestErrorCode); 1065 errorcode->SetCode(kTestErrorCode);
1060 errorcode->SetReason(kTestErrorReason); 1066 errorcode->SetReason(kTestErrorReason);
1061 EXPECT_TRUE(msg.AddAttribute(errorcode)); 1067 EXPECT_TRUE(msg.AddAttribute(errorcode));
1062 CheckStunHeader(msg, STUN_BINDING_ERROR_RESPONSE, (size - 20)); 1068 CheckStunHeader(msg, STUN_BINDING_ERROR_RESPONSE, (size - 20));
1063 1069
1064 rtc::ByteBuffer out; 1070 rtc::ByteBufferWriter out;
1065 EXPECT_TRUE(msg.Write(&out)); 1071 EXPECT_TRUE(msg.Write(&out));
1066 ASSERT_EQ(size, out.Length()); 1072 ASSERT_EQ(size, out.Length());
1067 // No padding. 1073 // No padding.
1068 ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithErrorAttribute, size)); 1074 ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithErrorAttribute, size));
1069 } 1075 }
1070 1076
1071 TEST_F(StunTest, WriteMessageWithAUInt16ListAttribute) { 1077 TEST_F(StunTest, WriteMessageWithAUInt16ListAttribute) {
1072 StunMessage msg; 1078 StunMessage msg;
1073 size_t size = sizeof(kStunMessageWithUInt16ListAttribute); 1079 size_t size = sizeof(kStunMessageWithUInt16ListAttribute);
1074 1080
1075 msg.SetType(STUN_BINDING_REQUEST); 1081 msg.SetType(STUN_BINDING_REQUEST);
1076 msg.SetTransactionID( 1082 msg.SetTransactionID(
1077 std::string(reinterpret_cast<const char*>(kTestTransactionId2), 1083 std::string(reinterpret_cast<const char*>(kTestTransactionId2),
1078 kStunTransactionIdLength)); 1084 kStunTransactionIdLength));
1079 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength); 1085 CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength);
1080 StunUInt16ListAttribute* list = StunAttribute::CreateUnknownAttributes(); 1086 StunUInt16ListAttribute* list = StunAttribute::CreateUnknownAttributes();
1081 list->AddType(0x1U); 1087 list->AddType(0x1U);
1082 list->AddType(0x1000U); 1088 list->AddType(0x1000U);
1083 list->AddType(0xAB0CU); 1089 list->AddType(0xAB0CU);
1084 EXPECT_TRUE(msg.AddAttribute(list)); 1090 EXPECT_TRUE(msg.AddAttribute(list));
1085 CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20)); 1091 CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20));
1086 1092
1087 rtc::ByteBuffer out; 1093 rtc::ByteBufferWriter out;
1088 EXPECT_TRUE(msg.Write(&out)); 1094 EXPECT_TRUE(msg.Write(&out));
1089 ASSERT_EQ(size, out.Length()); 1095 ASSERT_EQ(size, out.Length());
1090 // Check everything up to the padding. 1096 // Check everything up to the padding.
1091 ASSERT_EQ(0, 1097 ASSERT_EQ(0,
1092 memcmp(out.Data(), kStunMessageWithUInt16ListAttribute, size - 2)); 1098 memcmp(out.Data(), kStunMessageWithUInt16ListAttribute, size - 2));
1093 } 1099 }
1094 1100
1095 TEST_F(StunTest, WriteMessageWithOriginAttribute) { 1101 TEST_F(StunTest, WriteMessageWithOriginAttribute) {
1096 StunMessage msg; 1102 StunMessage msg;
1097 size_t size = sizeof(kStunMessageWithOriginAttribute); 1103 size_t size = sizeof(kStunMessageWithOriginAttribute);
1098 1104
1099 msg.SetType(STUN_BINDING_REQUEST); 1105 msg.SetType(STUN_BINDING_REQUEST);
1100 msg.SetTransactionID( 1106 msg.SetTransactionID(
1101 std::string(reinterpret_cast<const char*>(kTestTransactionId1), 1107 std::string(reinterpret_cast<const char*>(kTestTransactionId1),
1102 kStunTransactionIdLength)); 1108 kStunTransactionIdLength));
1103 StunByteStringAttribute* origin = 1109 StunByteStringAttribute* origin =
1104 new StunByteStringAttribute(STUN_ATTR_ORIGIN, kTestOrigin); 1110 new StunByteStringAttribute(STUN_ATTR_ORIGIN, kTestOrigin);
1105 EXPECT_TRUE(msg.AddAttribute(origin)); 1111 EXPECT_TRUE(msg.AddAttribute(origin));
1106 1112
1107 rtc::ByteBuffer out; 1113 rtc::ByteBufferWriter out;
1108 EXPECT_TRUE(msg.Write(&out)); 1114 EXPECT_TRUE(msg.Write(&out));
1109 ASSERT_EQ(size, out.Length()); 1115 ASSERT_EQ(size, out.Length());
1110 // Check everything up to the padding 1116 // Check everything up to the padding
1111 ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithOriginAttribute, size - 2)); 1117 ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithOriginAttribute, size - 2));
1112 } 1118 }
1113 1119
1114 // Test that we fail to read messages with invalid lengths. 1120 // Test that we fail to read messages with invalid lengths.
1115 void CheckFailureToRead(const unsigned char* testcase, size_t length) { 1121 void CheckFailureToRead(const unsigned char* testcase, size_t length) {
1116 StunMessage msg; 1122 StunMessage msg;
1117 const char* input = reinterpret_cast<const char*>(testcase); 1123 const char* input = reinterpret_cast<const char*>(testcase);
1118 rtc::ByteBuffer buf(input, length); 1124 rtc::ByteBufferReader buf(input, length);
1119 ASSERT_FALSE(msg.Read(&buf)); 1125 ASSERT_FALSE(msg.Read(&buf));
1120 } 1126 }
1121 1127
1122 TEST_F(StunTest, FailToReadInvalidMessages) { 1128 TEST_F(StunTest, FailToReadInvalidMessages) {
1123 CheckFailureToRead(kStunMessageWithZeroLength, 1129 CheckFailureToRead(kStunMessageWithZeroLength,
1124 kRealLengthOfInvalidLengthTestCases); 1130 kRealLengthOfInvalidLengthTestCases);
1125 CheckFailureToRead(kStunMessageWithSmallLength, 1131 CheckFailureToRead(kStunMessageWithSmallLength,
1126 kRealLengthOfInvalidLengthTestCases); 1132 kRealLengthOfInvalidLengthTestCases);
1127 CheckFailureToRead(kStunMessageWithExcessLength, 1133 CheckFailureToRead(kStunMessageWithExcessLength,
1128 kRealLengthOfInvalidLengthTestCases); 1134 kRealLengthOfInvalidLengthTestCases);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 EXPECT_EQ(i >= sizeof(buf) - 8, StunMessage::ValidateMessageIntegrity( 1206 EXPECT_EQ(i >= sizeof(buf) - 8, StunMessage::ValidateMessageIntegrity(
1201 buf, sizeof(buf), kRfc5769SampleMsgPassword)); 1207 buf, sizeof(buf), kRfc5769SampleMsgPassword));
1202 } 1208 }
1203 } 1209 }
1204 1210
1205 // Validate that we generate correct MESSAGE-INTEGRITY attributes. 1211 // Validate that we generate correct MESSAGE-INTEGRITY attributes.
1206 // Note the use of IceMessage instead of StunMessage; this is necessary because 1212 // Note the use of IceMessage instead of StunMessage; this is necessary because
1207 // the RFC5769 test messages used include attributes not found in basic STUN. 1213 // the RFC5769 test messages used include attributes not found in basic STUN.
1208 TEST_F(StunTest, AddMessageIntegrity) { 1214 TEST_F(StunTest, AddMessageIntegrity) {
1209 IceMessage msg; 1215 IceMessage msg;
1210 rtc::ByteBuffer buf( 1216 rtc::ByteBufferReader buf(
1211 reinterpret_cast<const char*>(kRfc5769SampleRequestWithoutMI), 1217 reinterpret_cast<const char*>(kRfc5769SampleRequestWithoutMI),
1212 sizeof(kRfc5769SampleRequestWithoutMI)); 1218 sizeof(kRfc5769SampleRequestWithoutMI));
1213 EXPECT_TRUE(msg.Read(&buf)); 1219 EXPECT_TRUE(msg.Read(&buf));
1214 EXPECT_TRUE(msg.AddMessageIntegrity(kRfc5769SampleMsgPassword)); 1220 EXPECT_TRUE(msg.AddMessageIntegrity(kRfc5769SampleMsgPassword));
1215 const StunByteStringAttribute* mi_attr = 1221 const StunByteStringAttribute* mi_attr =
1216 msg.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY); 1222 msg.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY);
1217 EXPECT_EQ(20U, mi_attr->length()); 1223 EXPECT_EQ(20U, mi_attr->length());
1218 EXPECT_EQ(0, memcmp( 1224 EXPECT_EQ(0, memcmp(
1219 mi_attr->bytes(), kCalculatedHmac1, sizeof(kCalculatedHmac1))); 1225 mi_attr->bytes(), kCalculatedHmac1, sizeof(kCalculatedHmac1)));
1220 1226
1221 rtc::ByteBuffer buf1; 1227 rtc::ByteBufferWriter buf1;
1222 EXPECT_TRUE(msg.Write(&buf1)); 1228 EXPECT_TRUE(msg.Write(&buf1));
1223 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( 1229 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
1224 reinterpret_cast<const char*>(buf1.Data()), buf1.Length(), 1230 reinterpret_cast<const char*>(buf1.Data()), buf1.Length(),
1225 kRfc5769SampleMsgPassword)); 1231 kRfc5769SampleMsgPassword));
1226 1232
1227 IceMessage msg2; 1233 IceMessage msg2;
1228 rtc::ByteBuffer buf2( 1234 rtc::ByteBufferReader buf2(
1229 reinterpret_cast<const char*>(kRfc5769SampleResponseWithoutMI), 1235 reinterpret_cast<const char*>(kRfc5769SampleResponseWithoutMI),
1230 sizeof(kRfc5769SampleResponseWithoutMI)); 1236 sizeof(kRfc5769SampleResponseWithoutMI));
1231 EXPECT_TRUE(msg2.Read(&buf2)); 1237 EXPECT_TRUE(msg2.Read(&buf2));
1232 EXPECT_TRUE(msg2.AddMessageIntegrity(kRfc5769SampleMsgPassword)); 1238 EXPECT_TRUE(msg2.AddMessageIntegrity(kRfc5769SampleMsgPassword));
1233 const StunByteStringAttribute* mi_attr2 = 1239 const StunByteStringAttribute* mi_attr2 =
1234 msg2.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY); 1240 msg2.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY);
1235 EXPECT_EQ(20U, mi_attr2->length()); 1241 EXPECT_EQ(20U, mi_attr2->length());
1236 EXPECT_EQ( 1242 EXPECT_EQ(
1237 0, memcmp(mi_attr2->bytes(), kCalculatedHmac2, sizeof(kCalculatedHmac2))); 1243 0, memcmp(mi_attr2->bytes(), kCalculatedHmac2, sizeof(kCalculatedHmac2)));
1238 1244
1239 rtc::ByteBuffer buf3; 1245 rtc::ByteBufferWriter buf3;
1240 EXPECT_TRUE(msg2.Write(&buf3)); 1246 EXPECT_TRUE(msg2.Write(&buf3));
1241 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( 1247 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
1242 reinterpret_cast<const char*>(buf3.Data()), buf3.Length(), 1248 reinterpret_cast<const char*>(buf3.Data()), buf3.Length(),
1243 kRfc5769SampleMsgPassword)); 1249 kRfc5769SampleMsgPassword));
1244 } 1250 }
1245 1251
1246 // Check our STUN message validation code against the RFC5769 test messages. 1252 // Check our STUN message validation code against the RFC5769 test messages.
1247 TEST_F(StunTest, ValidateFingerprint) { 1253 TEST_F(StunTest, ValidateFingerprint) {
1248 EXPECT_TRUE(StunMessage::ValidateFingerprint( 1254 EXPECT_TRUE(StunMessage::ValidateFingerprint(
1249 reinterpret_cast<const char*>(kRfc5769SampleRequest), 1255 reinterpret_cast<const char*>(kRfc5769SampleRequest),
(...skipping 25 matching lines...) Expand all
1275 buf[i - 1] ^= 0x01; 1281 buf[i - 1] ^= 0x01;
1276 EXPECT_FALSE(StunMessage::ValidateFingerprint(buf, sizeof(buf))); 1282 EXPECT_FALSE(StunMessage::ValidateFingerprint(buf, sizeof(buf)));
1277 } 1283 }
1278 // Put them all back to normal and the check should pass again. 1284 // Put them all back to normal and the check should pass again.
1279 buf[sizeof(buf) - 1] ^= 0x01; 1285 buf[sizeof(buf) - 1] ^= 0x01;
1280 EXPECT_TRUE(StunMessage::ValidateFingerprint(buf, sizeof(buf))); 1286 EXPECT_TRUE(StunMessage::ValidateFingerprint(buf, sizeof(buf)));
1281 } 1287 }
1282 1288
1283 TEST_F(StunTest, AddFingerprint) { 1289 TEST_F(StunTest, AddFingerprint) {
1284 IceMessage msg; 1290 IceMessage msg;
1285 rtc::ByteBuffer buf( 1291 rtc::ByteBufferReader buf(
1286 reinterpret_cast<const char*>(kRfc5769SampleRequestWithoutMI), 1292 reinterpret_cast<const char*>(kRfc5769SampleRequestWithoutMI),
1287 sizeof(kRfc5769SampleRequestWithoutMI)); 1293 sizeof(kRfc5769SampleRequestWithoutMI));
1288 EXPECT_TRUE(msg.Read(&buf)); 1294 EXPECT_TRUE(msg.Read(&buf));
1289 EXPECT_TRUE(msg.AddFingerprint()); 1295 EXPECT_TRUE(msg.AddFingerprint());
1290 1296
1291 rtc::ByteBuffer buf1; 1297 rtc::ByteBufferWriter buf1;
1292 EXPECT_TRUE(msg.Write(&buf1)); 1298 EXPECT_TRUE(msg.Write(&buf1));
1293 EXPECT_TRUE(StunMessage::ValidateFingerprint( 1299 EXPECT_TRUE(StunMessage::ValidateFingerprint(
1294 reinterpret_cast<const char*>(buf1.Data()), buf1.Length())); 1300 reinterpret_cast<const char*>(buf1.Data()), buf1.Length()));
1295 } 1301 }
1296 1302
1297 // Sample "GTURN" relay message. 1303 // Sample "GTURN" relay message.
1298 static const unsigned char kRelayMessage[] = { 1304 static const unsigned char kRelayMessage[] = {
1299 0x00, 0x01, 0x00, 88, // message header 1305 0x00, 0x01, 0x00, 88, // message header
1300 0x21, 0x12, 0xA4, 0x42, // magic cookie 1306 0x21, 0x12, 0xA4, 0x42, // magic cookie
1301 '0', '1', '2', '3', // transaction id 1307 '0', '1', '2', '3', // transaction id
(...skipping 22 matching lines...) Expand all
1324 'a', 'b', 'c', 'd', 1330 'a', 'b', 'c', 'd',
1325 'e', 'f', 'g', 0 // DATA must be padded per rfc5766. 1331 'e', 'f', 'g', 0 // DATA must be padded per rfc5766.
1326 }; 1332 };
1327 1333
1328 // Test that we can read the GTURN-specific fields. 1334 // Test that we can read the GTURN-specific fields.
1329 TEST_F(StunTest, ReadRelayMessage) { 1335 TEST_F(StunTest, ReadRelayMessage) {
1330 RelayMessage msg, msg2; 1336 RelayMessage msg, msg2;
1331 1337
1332 const char* input = reinterpret_cast<const char*>(kRelayMessage); 1338 const char* input = reinterpret_cast<const char*>(kRelayMessage);
1333 size_t size = sizeof(kRelayMessage); 1339 size_t size = sizeof(kRelayMessage);
1334 rtc::ByteBuffer buf(input, size); 1340 rtc::ByteBufferReader buf(input, size);
1335 EXPECT_TRUE(msg.Read(&buf)); 1341 EXPECT_TRUE(msg.Read(&buf));
1336 1342
1337 EXPECT_EQ(STUN_BINDING_REQUEST, msg.type()); 1343 EXPECT_EQ(STUN_BINDING_REQUEST, msg.type());
1338 EXPECT_EQ(size - 20, msg.length()); 1344 EXPECT_EQ(size - 20, msg.length());
1339 EXPECT_EQ("0123456789ab", msg.transaction_id()); 1345 EXPECT_EQ("0123456789ab", msg.transaction_id());
1340 1346
1341 msg2.SetType(STUN_BINDING_REQUEST); 1347 msg2.SetType(STUN_BINDING_REQUEST);
1342 msg2.SetTransactionID("0123456789ab"); 1348 msg2.SetTransactionID("0123456789ab");
1343 1349
1344 in_addr legacy_in_addr; 1350 in_addr legacy_in_addr;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1420 1426
1421 bytes = msg.GetByteString(STUN_ATTR_DATA); 1427 bytes = msg.GetByteString(STUN_ATTR_DATA);
1422 ASSERT_TRUE(bytes != NULL); 1428 ASSERT_TRUE(bytes != NULL);
1423 EXPECT_EQ(7U, bytes->length()); 1429 EXPECT_EQ(7U, bytes->length());
1424 EXPECT_EQ("abcdefg", bytes->GetString()); 1430 EXPECT_EQ("abcdefg", bytes->GetString());
1425 1431
1426 bytes2 = StunAttribute::CreateByteString(STUN_ATTR_DATA); 1432 bytes2 = StunAttribute::CreateByteString(STUN_ATTR_DATA);
1427 bytes2->CopyBytes("abcdefg"); 1433 bytes2->CopyBytes("abcdefg");
1428 EXPECT_TRUE(msg2.AddAttribute(bytes2)); 1434 EXPECT_TRUE(msg2.AddAttribute(bytes2));
1429 1435
1430 rtc::ByteBuffer out; 1436 rtc::ByteBufferWriter out;
1431 EXPECT_TRUE(msg.Write(&out)); 1437 EXPECT_TRUE(msg.Write(&out));
1432 EXPECT_EQ(size, out.Length()); 1438 EXPECT_EQ(size, out.Length());
1433 size_t len1 = out.Length(); 1439 size_t len1 = out.Length();
1440 rtc::ByteBufferReader read_buf(out);
1434 std::string outstring; 1441 std::string outstring;
1435 out.ReadString(&outstring, len1); 1442 read_buf.ReadString(&outstring, len1);
1436 EXPECT_EQ(0, memcmp(outstring.c_str(), input, len1)); 1443 EXPECT_EQ(0, memcmp(outstring.c_str(), input, len1));
1437 1444
1438 rtc::ByteBuffer out2; 1445 rtc::ByteBufferWriter out2;
1439 EXPECT_TRUE(msg2.Write(&out2)); 1446 EXPECT_TRUE(msg2.Write(&out2));
1440 EXPECT_EQ(size, out2.Length()); 1447 EXPECT_EQ(size, out2.Length());
1441 size_t len2 = out2.Length(); 1448 size_t len2 = out2.Length();
1449 rtc::ByteBufferReader read_buf2(out2);
1442 std::string outstring2; 1450 std::string outstring2;
1443 out2.ReadString(&outstring2, len2); 1451 read_buf2.ReadString(&outstring2, len2);
1444 EXPECT_EQ(0, memcmp(outstring2.c_str(), input, len2)); 1452 EXPECT_EQ(0, memcmp(outstring2.c_str(), input, len2));
1445 } 1453 }
1446 1454
1447 } // namespace cricket 1455 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/p2p/base/stun.cc ('k') | webrtc/p2p/base/stunrequest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698