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 |
(...skipping 1757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1768 rtc::SocketAddress addr(kLocalAddr1); | 1768 rtc::SocketAddress addr(kLocalAddr1); |
1769 std::string username; | 1769 std::string username; |
1770 | 1770 |
1771 // BINDING-REQUEST from local to remote with valid ICE username, | 1771 // BINDING-REQUEST from local to remote with valid ICE username, |
1772 // MESSAGE-INTEGRITY, and FINGERPRINT. | 1772 // MESSAGE-INTEGRITY, and FINGERPRINT. |
1773 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 1773 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
1774 "rfrag:lfrag")); | 1774 "rfrag:lfrag")); |
1775 in_msg->AddMessageIntegrity("rpass"); | 1775 in_msg->AddMessageIntegrity("rpass"); |
1776 in_msg->AddFingerprint(); | 1776 in_msg->AddFingerprint(); |
1777 WriteStunMessage(in_msg.get(), buf.get()); | 1777 WriteStunMessage(in_msg.get(), buf.get()); |
1778 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1778 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1779 out_msg.accept(), &username)); | 1779 &username)); |
1780 EXPECT_TRUE(out_msg.get() != NULL); | 1780 EXPECT_TRUE(out_msg.get() != NULL); |
1781 EXPECT_EQ("lfrag", username); | 1781 EXPECT_EQ("lfrag", username); |
1782 | 1782 |
1783 // BINDING-RESPONSE without username, with MESSAGE-INTEGRITY and FINGERPRINT. | 1783 // BINDING-RESPONSE without username, with MESSAGE-INTEGRITY and FINGERPRINT. |
1784 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE)); | 1784 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE)); |
1785 in_msg->AddAttribute( | 1785 in_msg->AddAttribute( |
1786 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2)); | 1786 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2)); |
1787 in_msg->AddMessageIntegrity("rpass"); | 1787 in_msg->AddMessageIntegrity("rpass"); |
1788 in_msg->AddFingerprint(); | 1788 in_msg->AddFingerprint(); |
1789 WriteStunMessage(in_msg.get(), buf.get()); | 1789 WriteStunMessage(in_msg.get(), buf.get()); |
1790 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1790 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1791 out_msg.accept(), &username)); | 1791 &username)); |
1792 EXPECT_TRUE(out_msg.get() != NULL); | 1792 EXPECT_TRUE(out_msg.get() != NULL); |
1793 EXPECT_EQ("", username); | 1793 EXPECT_EQ("", username); |
1794 | 1794 |
1795 // BINDING-ERROR-RESPONSE without username, with error, M-I, and FINGERPRINT. | 1795 // BINDING-ERROR-RESPONSE without username, with error, M-I, and FINGERPRINT. |
1796 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE)); | 1796 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE)); |
1797 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE, | 1797 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE, |
1798 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); | 1798 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); |
1799 in_msg->AddFingerprint(); | 1799 in_msg->AddFingerprint(); |
1800 WriteStunMessage(in_msg.get(), buf.get()); | 1800 WriteStunMessage(in_msg.get(), buf.get()); |
1801 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1801 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1802 out_msg.accept(), &username)); | 1802 &username)); |
1803 EXPECT_TRUE(out_msg.get() != NULL); | 1803 EXPECT_TRUE(out_msg.get() != NULL); |
1804 EXPECT_EQ("", username); | 1804 EXPECT_EQ("", username); |
1805 ASSERT_TRUE(out_msg->GetErrorCode() != NULL); | 1805 ASSERT_TRUE(out_msg->GetErrorCode() != NULL); |
1806 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, out_msg->GetErrorCode()->code()); | 1806 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, out_msg->GetErrorCode()->code()); |
1807 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), | 1807 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), |
1808 out_msg->GetErrorCode()->reason()); | 1808 out_msg->GetErrorCode()->reason()); |
1809 } | 1809 } |
1810 | 1810 |
1811 // Tests handling of ICE binding requests with missing or incorrect usernames. | 1811 // Tests handling of ICE binding requests with missing or incorrect usernames. |
1812 TEST_F(PortTest, TestHandleStunMessageBadUsername) { | 1812 TEST_F(PortTest, TestHandleStunMessageBadUsername) { |
1813 rtc::scoped_ptr<TestPort> port( | 1813 rtc::scoped_ptr<TestPort> port( |
1814 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 1814 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
1815 | 1815 |
1816 rtc::scoped_ptr<IceMessage> in_msg, out_msg; | 1816 rtc::scoped_ptr<IceMessage> in_msg, out_msg; |
1817 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); | 1817 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); |
1818 rtc::SocketAddress addr(kLocalAddr1); | 1818 rtc::SocketAddress addr(kLocalAddr1); |
1819 std::string username; | 1819 std::string username; |
1820 | 1820 |
1821 // BINDING-REQUEST with no username. | 1821 // BINDING-REQUEST with no username. |
1822 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST)); | 1822 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST)); |
1823 in_msg->AddMessageIntegrity("rpass"); | 1823 in_msg->AddMessageIntegrity("rpass"); |
1824 in_msg->AddFingerprint(); | 1824 in_msg->AddFingerprint(); |
1825 WriteStunMessage(in_msg.get(), buf.get()); | 1825 WriteStunMessage(in_msg.get(), buf.get()); |
1826 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1826 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1827 out_msg.accept(), &username)); | 1827 &username)); |
1828 EXPECT_TRUE(out_msg.get() == NULL); | 1828 EXPECT_TRUE(out_msg.get() == NULL); |
1829 EXPECT_EQ("", username); | 1829 EXPECT_EQ("", username); |
1830 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); | 1830 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); |
1831 | 1831 |
1832 // BINDING-REQUEST with empty username. | 1832 // BINDING-REQUEST with empty username. |
1833 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "")); | 1833 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "")); |
1834 in_msg->AddMessageIntegrity("rpass"); | 1834 in_msg->AddMessageIntegrity("rpass"); |
1835 in_msg->AddFingerprint(); | 1835 in_msg->AddFingerprint(); |
1836 WriteStunMessage(in_msg.get(), buf.get()); | 1836 WriteStunMessage(in_msg.get(), buf.get()); |
1837 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1837 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1838 out_msg.accept(), &username)); | 1838 &username)); |
1839 EXPECT_TRUE(out_msg.get() == NULL); | 1839 EXPECT_TRUE(out_msg.get() == NULL); |
1840 EXPECT_EQ("", username); | 1840 EXPECT_EQ("", username); |
1841 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 1841 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
1842 | 1842 |
1843 // BINDING-REQUEST with too-short username. | 1843 // BINDING-REQUEST with too-short username. |
1844 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "rfra")); | 1844 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "rfra")); |
1845 in_msg->AddMessageIntegrity("rpass"); | 1845 in_msg->AddMessageIntegrity("rpass"); |
1846 in_msg->AddFingerprint(); | 1846 in_msg->AddFingerprint(); |
1847 WriteStunMessage(in_msg.get(), buf.get()); | 1847 WriteStunMessage(in_msg.get(), buf.get()); |
1848 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1848 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1849 out_msg.accept(), &username)); | 1849 &username)); |
1850 EXPECT_TRUE(out_msg.get() == NULL); | 1850 EXPECT_TRUE(out_msg.get() == NULL); |
1851 EXPECT_EQ("", username); | 1851 EXPECT_EQ("", username); |
1852 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 1852 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
1853 | 1853 |
1854 // BINDING-REQUEST with reversed username. | 1854 // BINDING-REQUEST with reversed username. |
1855 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 1855 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
1856 "lfrag:rfrag")); | 1856 "lfrag:rfrag")); |
1857 in_msg->AddMessageIntegrity("rpass"); | 1857 in_msg->AddMessageIntegrity("rpass"); |
1858 in_msg->AddFingerprint(); | 1858 in_msg->AddFingerprint(); |
1859 WriteStunMessage(in_msg.get(), buf.get()); | 1859 WriteStunMessage(in_msg.get(), buf.get()); |
1860 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1860 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1861 out_msg.accept(), &username)); | 1861 &username)); |
1862 EXPECT_TRUE(out_msg.get() == NULL); | 1862 EXPECT_TRUE(out_msg.get() == NULL); |
1863 EXPECT_EQ("", username); | 1863 EXPECT_EQ("", username); |
1864 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 1864 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
1865 | 1865 |
1866 // BINDING-REQUEST with garbage username. | 1866 // BINDING-REQUEST with garbage username. |
1867 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 1867 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
1868 "abcd:efgh")); | 1868 "abcd:efgh")); |
1869 in_msg->AddMessageIntegrity("rpass"); | 1869 in_msg->AddMessageIntegrity("rpass"); |
1870 in_msg->AddFingerprint(); | 1870 in_msg->AddFingerprint(); |
1871 WriteStunMessage(in_msg.get(), buf.get()); | 1871 WriteStunMessage(in_msg.get(), buf.get()); |
1872 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1872 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1873 out_msg.accept(), &username)); | 1873 &username)); |
1874 EXPECT_TRUE(out_msg.get() == NULL); | 1874 EXPECT_TRUE(out_msg.get() == NULL); |
1875 EXPECT_EQ("", username); | 1875 EXPECT_EQ("", username); |
1876 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 1876 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
1877 } | 1877 } |
1878 | 1878 |
1879 // Test handling STUN messages with missing or malformed M-I. | 1879 // Test handling STUN messages with missing or malformed M-I. |
1880 TEST_F(PortTest, TestHandleStunMessageBadMessageIntegrity) { | 1880 TEST_F(PortTest, TestHandleStunMessageBadMessageIntegrity) { |
1881 // Our port will act as the "remote" port. | 1881 // Our port will act as the "remote" port. |
1882 rtc::scoped_ptr<TestPort> port( | 1882 rtc::scoped_ptr<TestPort> port( |
1883 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 1883 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
1884 | 1884 |
1885 rtc::scoped_ptr<IceMessage> in_msg, out_msg; | 1885 rtc::scoped_ptr<IceMessage> in_msg, out_msg; |
1886 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); | 1886 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); |
1887 rtc::SocketAddress addr(kLocalAddr1); | 1887 rtc::SocketAddress addr(kLocalAddr1); |
1888 std::string username; | 1888 std::string username; |
1889 | 1889 |
1890 // BINDING-REQUEST from local to remote with valid ICE username and | 1890 // BINDING-REQUEST from local to remote with valid ICE username and |
1891 // FINGERPRINT, but no MESSAGE-INTEGRITY. | 1891 // FINGERPRINT, but no MESSAGE-INTEGRITY. |
1892 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 1892 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
1893 "rfrag:lfrag")); | 1893 "rfrag:lfrag")); |
1894 in_msg->AddFingerprint(); | 1894 in_msg->AddFingerprint(); |
1895 WriteStunMessage(in_msg.get(), buf.get()); | 1895 WriteStunMessage(in_msg.get(), buf.get()); |
1896 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1896 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1897 out_msg.accept(), &username)); | 1897 &username)); |
1898 EXPECT_TRUE(out_msg.get() == NULL); | 1898 EXPECT_TRUE(out_msg.get() == NULL); |
1899 EXPECT_EQ("", username); | 1899 EXPECT_EQ("", username); |
1900 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); | 1900 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); |
1901 | 1901 |
1902 // BINDING-REQUEST from local to remote with valid ICE username and | 1902 // BINDING-REQUEST from local to remote with valid ICE username and |
1903 // FINGERPRINT, but invalid MESSAGE-INTEGRITY. | 1903 // FINGERPRINT, but invalid MESSAGE-INTEGRITY. |
1904 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 1904 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
1905 "rfrag:lfrag")); | 1905 "rfrag:lfrag")); |
1906 in_msg->AddMessageIntegrity("invalid"); | 1906 in_msg->AddMessageIntegrity("invalid"); |
1907 in_msg->AddFingerprint(); | 1907 in_msg->AddFingerprint(); |
1908 WriteStunMessage(in_msg.get(), buf.get()); | 1908 WriteStunMessage(in_msg.get(), buf.get()); |
1909 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1909 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1910 out_msg.accept(), &username)); | 1910 &username)); |
1911 EXPECT_TRUE(out_msg.get() == NULL); | 1911 EXPECT_TRUE(out_msg.get() == NULL); |
1912 EXPECT_EQ("", username); | 1912 EXPECT_EQ("", username); |
1913 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); | 1913 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); |
1914 | 1914 |
1915 // TODO: BINDING-RESPONSES and BINDING-ERROR-RESPONSES are checked | 1915 // TODO: BINDING-RESPONSES and BINDING-ERROR-RESPONSES are checked |
1916 // by the Connection, not the Port, since they require the remote username. | 1916 // by the Connection, not the Port, since they require the remote username. |
1917 // Change this test to pass in data via Connection::OnReadPacket instead. | 1917 // Change this test to pass in data via Connection::OnReadPacket instead. |
1918 } | 1918 } |
1919 | 1919 |
1920 // Test handling STUN messages with missing or malformed FINGERPRINT. | 1920 // Test handling STUN messages with missing or malformed FINGERPRINT. |
1921 TEST_F(PortTest, TestHandleStunMessageBadFingerprint) { | 1921 TEST_F(PortTest, TestHandleStunMessageBadFingerprint) { |
1922 // Our port will act as the "remote" port. | 1922 // Our port will act as the "remote" port. |
1923 rtc::scoped_ptr<TestPort> port( | 1923 rtc::scoped_ptr<TestPort> port( |
1924 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 1924 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
1925 | 1925 |
1926 rtc::scoped_ptr<IceMessage> in_msg, out_msg; | 1926 rtc::scoped_ptr<IceMessage> in_msg, out_msg; |
1927 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); | 1927 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); |
1928 rtc::SocketAddress addr(kLocalAddr1); | 1928 rtc::SocketAddress addr(kLocalAddr1); |
1929 std::string username; | 1929 std::string username; |
1930 | 1930 |
1931 // BINDING-REQUEST from local to remote with valid ICE username and | 1931 // BINDING-REQUEST from local to remote with valid ICE username and |
1932 // MESSAGE-INTEGRITY, but no FINGERPRINT; GetStunMessage should fail. | 1932 // MESSAGE-INTEGRITY, but no FINGERPRINT; GetStunMessage should fail. |
1933 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, | 1933 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, |
1934 "rfrag:lfrag")); | 1934 "rfrag:lfrag")); |
1935 in_msg->AddMessageIntegrity("rpass"); | 1935 in_msg->AddMessageIntegrity("rpass"); |
1936 WriteStunMessage(in_msg.get(), buf.get()); | 1936 WriteStunMessage(in_msg.get(), buf.get()); |
1937 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1937 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1938 out_msg.accept(), &username)); | 1938 &username)); |
1939 EXPECT_EQ(0, port->last_stun_error_code()); | 1939 EXPECT_EQ(0, port->last_stun_error_code()); |
1940 | 1940 |
1941 // Now, add a fingerprint, but munge the message so it's not valid. | 1941 // Now, add a fingerprint, but munge the message so it's not valid. |
1942 in_msg->AddFingerprint(); | 1942 in_msg->AddFingerprint(); |
1943 in_msg->SetTransactionID("TESTTESTBADD"); | 1943 in_msg->SetTransactionID("TESTTESTBADD"); |
1944 WriteStunMessage(in_msg.get(), buf.get()); | 1944 WriteStunMessage(in_msg.get(), buf.get()); |
1945 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1945 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1946 out_msg.accept(), &username)); | 1946 &username)); |
1947 EXPECT_EQ(0, port->last_stun_error_code()); | 1947 EXPECT_EQ(0, port->last_stun_error_code()); |
1948 | 1948 |
1949 // Valid BINDING-RESPONSE, except no FINGERPRINT. | 1949 // Valid BINDING-RESPONSE, except no FINGERPRINT. |
1950 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE)); | 1950 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE)); |
1951 in_msg->AddAttribute( | 1951 in_msg->AddAttribute( |
1952 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2)); | 1952 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2)); |
1953 in_msg->AddMessageIntegrity("rpass"); | 1953 in_msg->AddMessageIntegrity("rpass"); |
1954 WriteStunMessage(in_msg.get(), buf.get()); | 1954 WriteStunMessage(in_msg.get(), buf.get()); |
1955 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1955 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1956 out_msg.accept(), &username)); | 1956 &username)); |
1957 EXPECT_EQ(0, port->last_stun_error_code()); | 1957 EXPECT_EQ(0, port->last_stun_error_code()); |
1958 | 1958 |
1959 // Now, add a fingerprint, but munge the message so it's not valid. | 1959 // Now, add a fingerprint, but munge the message so it's not valid. |
1960 in_msg->AddFingerprint(); | 1960 in_msg->AddFingerprint(); |
1961 in_msg->SetTransactionID("TESTTESTBADD"); | 1961 in_msg->SetTransactionID("TESTTESTBADD"); |
1962 WriteStunMessage(in_msg.get(), buf.get()); | 1962 WriteStunMessage(in_msg.get(), buf.get()); |
1963 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1963 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1964 out_msg.accept(), &username)); | 1964 &username)); |
1965 EXPECT_EQ(0, port->last_stun_error_code()); | 1965 EXPECT_EQ(0, port->last_stun_error_code()); |
1966 | 1966 |
1967 // Valid BINDING-ERROR-RESPONSE, except no FINGERPRINT. | 1967 // Valid BINDING-ERROR-RESPONSE, except no FINGERPRINT. |
1968 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE)); | 1968 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE)); |
1969 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE, | 1969 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE, |
1970 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); | 1970 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); |
1971 in_msg->AddMessageIntegrity("rpass"); | 1971 in_msg->AddMessageIntegrity("rpass"); |
1972 WriteStunMessage(in_msg.get(), buf.get()); | 1972 WriteStunMessage(in_msg.get(), buf.get()); |
1973 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1973 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1974 out_msg.accept(), &username)); | 1974 &username)); |
1975 EXPECT_EQ(0, port->last_stun_error_code()); | 1975 EXPECT_EQ(0, port->last_stun_error_code()); |
1976 | 1976 |
1977 // Now, add a fingerprint, but munge the message so it's not valid. | 1977 // Now, add a fingerprint, but munge the message so it's not valid. |
1978 in_msg->AddFingerprint(); | 1978 in_msg->AddFingerprint(); |
1979 in_msg->SetTransactionID("TESTTESTBADD"); | 1979 in_msg->SetTransactionID("TESTTESTBADD"); |
1980 WriteStunMessage(in_msg.get(), buf.get()); | 1980 WriteStunMessage(in_msg.get(), buf.get()); |
1981 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, | 1981 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
1982 out_msg.accept(), &username)); | 1982 &username)); |
1983 EXPECT_EQ(0, port->last_stun_error_code()); | 1983 EXPECT_EQ(0, port->last_stun_error_code()); |
1984 } | 1984 } |
1985 | 1985 |
1986 // Test handling of STUN binding indication messages . STUN binding | 1986 // Test handling of STUN binding indication messages . STUN binding |
1987 // indications are allowed only to the connection which is in read mode. | 1987 // indications are allowed only to the connection which is in read mode. |
1988 TEST_F(PortTest, TestHandleStunBindingIndication) { | 1988 TEST_F(PortTest, TestHandleStunBindingIndication) { |
1989 rtc::scoped_ptr<TestPort> lport( | 1989 rtc::scoped_ptr<TestPort> lport( |
1990 CreateTestPort(kLocalAddr2, "lfrag", "lpass")); | 1990 CreateTestPort(kLocalAddr2, "lfrag", "lpass")); |
1991 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); | 1991 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); |
1992 lport->SetIceTiebreaker(kTiebreaker1); | 1992 lport->SetIceTiebreaker(kTiebreaker1); |
1993 | 1993 |
1994 // Verifying encoding and decoding STUN indication message. | 1994 // Verifying encoding and decoding STUN indication message. |
1995 rtc::scoped_ptr<IceMessage> in_msg, out_msg; | 1995 rtc::scoped_ptr<IceMessage> in_msg, out_msg; |
1996 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); | 1996 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); |
1997 rtc::SocketAddress addr(kLocalAddr1); | 1997 rtc::SocketAddress addr(kLocalAddr1); |
1998 std::string username; | 1998 std::string username; |
1999 | 1999 |
2000 in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION)); | 2000 in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION)); |
2001 in_msg->AddFingerprint(); | 2001 in_msg->AddFingerprint(); |
2002 WriteStunMessage(in_msg.get(), buf.get()); | 2002 WriteStunMessage(in_msg.get(), buf.get()); |
2003 EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr, | 2003 EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, |
2004 out_msg.accept(), &username)); | 2004 &username)); |
2005 EXPECT_TRUE(out_msg.get() != NULL); | 2005 EXPECT_TRUE(out_msg.get() != NULL); |
2006 EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION); | 2006 EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION); |
2007 EXPECT_EQ("", username); | 2007 EXPECT_EQ("", username); |
2008 | 2008 |
2009 // Verify connection can handle STUN indication and updates | 2009 // Verify connection can handle STUN indication and updates |
2010 // last_ping_received. | 2010 // last_ping_received. |
2011 rtc::scoped_ptr<TestPort> rport( | 2011 rtc::scoped_ptr<TestPort> rport( |
2012 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); | 2012 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); |
2013 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); | 2013 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); |
2014 rport->SetIceTiebreaker(kTiebreaker2); | 2014 rport->SetIceTiebreaker(kTiebreaker2); |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2536 rtc::scoped_ptr<Port> tcp_port(CreateTcpPort(kLocalAddr1)); | 2536 rtc::scoped_ptr<Port> tcp_port(CreateTcpPort(kLocalAddr1)); |
2537 EXPECT_TRUE(tcp_port->SupportsProtocol(TCP_PROTOCOL_NAME)); | 2537 EXPECT_TRUE(tcp_port->SupportsProtocol(TCP_PROTOCOL_NAME)); |
2538 EXPECT_TRUE(tcp_port->SupportsProtocol(SSLTCP_PROTOCOL_NAME)); | 2538 EXPECT_TRUE(tcp_port->SupportsProtocol(SSLTCP_PROTOCOL_NAME)); |
2539 EXPECT_FALSE(tcp_port->SupportsProtocol(UDP_PROTOCOL_NAME)); | 2539 EXPECT_FALSE(tcp_port->SupportsProtocol(UDP_PROTOCOL_NAME)); |
2540 | 2540 |
2541 rtc::scoped_ptr<Port> turn_port( | 2541 rtc::scoped_ptr<Port> turn_port( |
2542 CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP)); | 2542 CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP)); |
2543 EXPECT_TRUE(turn_port->SupportsProtocol(UDP_PROTOCOL_NAME)); | 2543 EXPECT_TRUE(turn_port->SupportsProtocol(UDP_PROTOCOL_NAME)); |
2544 EXPECT_FALSE(turn_port->SupportsProtocol(TCP_PROTOCOL_NAME)); | 2544 EXPECT_FALSE(turn_port->SupportsProtocol(TCP_PROTOCOL_NAME)); |
2545 } | 2545 } |
OLD | NEW |