| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 #include <iostream> | 6 #include <iostream> |
| 7 | 7 |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "net/spdy/spdy_framer.h" | 9 #include "net/spdy/spdy_framer.h" |
| 10 #include "net/spdy/spdy_protocol.h" | 10 #include "net/spdy/spdy_protocol.h" |
| (...skipping 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1512 } | 1512 } |
| 1513 } | 1513 } |
| 1514 | 1514 |
| 1515 TEST_F(SpdyFramerTest, CreateCredential) { | 1515 TEST_F(SpdyFramerTest, CreateCredential) { |
| 1516 SpdyFramer framer; | 1516 SpdyFramer framer; |
| 1517 | 1517 |
| 1518 { | 1518 { |
| 1519 const char kDescription[] = "CREDENTIAL frame"; | 1519 const char kDescription[] = "CREDENTIAL frame"; |
| 1520 const unsigned char kFrameData[] = { | 1520 const unsigned char kFrameData[] = { |
| 1521 0x80, 0x02, 0x00, 0x0A, | 1521 0x80, 0x02, 0x00, 0x0A, |
| 1522 0x00, 0x00, 0x00, 0x3F, | 1522 0x00, 0x00, 0x00, 0x33, |
| 1523 0x00, 0x03, 0x00, 0x0A, | 1523 0x00, 0x03, 0x00, 0x00, |
| 1524 'g', 'o', 'o', 'g', | |
| 1525 'l', 'e', '.', 'c', | |
| 1526 'o', 'm', 0x00, 0x00, | |
| 1527 0x00, 0x05, 'p', 'r', | 1524 0x00, 0x05, 'p', 'r', |
| 1528 'o', 'o', 'f', 0x00, | 1525 'o', 'o', 'f', 0x00, |
| 1529 0x00, 0x00, 0x06, 'a', | 1526 0x00, 0x00, 0x06, 'a', |
| 1530 ' ', 'c', 'e', 'r', | 1527 ' ', 'c', 'e', 'r', |
| 1531 't', 0x00, 0x00, 0x00, | 1528 't', 0x00, 0x00, 0x00, |
| 1532 0x0C, 'a', 'n', 'o', | 1529 0x0C, 'a', 'n', 'o', |
| 1533 't', 'h', 'e', 'r', | 1530 't', 'h', 'e', 'r', |
| 1534 ' ', 'c', 'e', 'r', | 1531 ' ', 'c', 'e', 'r', |
| 1535 't', 0x00, 0x00, 0x00, | 1532 't', 0x00, 0x00, 0x00, |
| 1536 0x0A, 'f', 'i', 'n', | 1533 0x0A, 'f', 'i', 'n', |
| 1537 'a', 'l', ' ', 'c', | 1534 'a', 'l', ' ', 'c', |
| 1538 'e', 'r', 't', | 1535 'e', 'r', 't', |
| 1539 }; | 1536 }; |
| 1540 SpdyCredential credential; | 1537 SpdyCredential credential; |
| 1541 credential.slot = 3; | 1538 credential.slot = 3; |
| 1542 credential.origin = "google.com"; | |
| 1543 credential.proof = "proof"; | 1539 credential.proof = "proof"; |
| 1544 credential.certs.push_back("a cert"); | 1540 credential.certs.push_back("a cert"); |
| 1545 credential.certs.push_back("another cert"); | 1541 credential.certs.push_back("another cert"); |
| 1546 credential.certs.push_back("final cert"); | 1542 credential.certs.push_back("final cert"); |
| 1547 scoped_ptr<SpdyFrame> frame(framer.CreateCredentialFrame(credential)); | 1543 scoped_ptr<SpdyFrame> frame(framer.CreateCredentialFrame(credential)); |
| 1548 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | 1544 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
| 1549 } | 1545 } |
| 1550 } | 1546 } |
| 1551 | 1547 |
| 1552 TEST_F(SpdyFramerTest, ParseCredentialFrame) { | 1548 TEST_F(SpdyFramerTest, ParseCredentialFrame) { |
| 1553 SpdyFramer framer; | 1549 SpdyFramer framer; |
| 1554 | 1550 |
| 1555 { | 1551 { |
| 1556 unsigned char kFrameData[] = { | 1552 unsigned char kFrameData[] = { |
| 1557 0x80, 0x02, 0x00, 0x0A, | 1553 0x80, 0x02, 0x00, 0x0A, |
| 1558 0x00, 0x00, 0x00, 0x3F, | 1554 0x00, 0x00, 0x00, 0x33, |
| 1559 0x00, 0x03, 0x00, 0x0A, | 1555 0x00, 0x03, 0x00, 0x00, |
| 1560 'g', 'o', 'o', 'g', | |
| 1561 'l', 'e', '.', 'c', | |
| 1562 'o', 'm', 0x00, 0x00, | |
| 1563 0x00, 0x05, 'p', 'r', | 1556 0x00, 0x05, 'p', 'r', |
| 1564 'o', 'o', 'f', 0x00, | 1557 'o', 'o', 'f', 0x00, |
| 1565 0x00, 0x00, 0x06, 'a', | 1558 0x00, 0x00, 0x06, 'a', |
| 1566 ' ', 'c', 'e', 'r', | 1559 ' ', 'c', 'e', 'r', |
| 1567 't', 0x00, 0x00, 0x00, | 1560 't', 0x00, 0x00, 0x00, |
| 1568 0x0C, 'a', 'n', 'o', | 1561 0x0C, 'a', 'n', 'o', |
| 1569 't', 'h', 'e', 'r', | 1562 't', 'h', 'e', 'r', |
| 1570 ' ', 'c', 'e', 'r', | 1563 ' ', 'c', 'e', 'r', |
| 1571 't', 0x00, 0x00, 0x00, | 1564 't', 0x00, 0x00, 0x00, |
| 1572 0x0A, 'f', 'i', 'n', | 1565 0x0A, 'f', 'i', 'n', |
| 1573 'a', 'l', ' ', 'c', | 1566 'a', 'l', ' ', 'c', |
| 1574 'e', 'r', 't', | 1567 'e', 'r', 't', |
| 1575 }; | 1568 }; |
| 1576 SpdyCredentialControlFrame frame(reinterpret_cast<char*>(kFrameData), | 1569 SpdyCredentialControlFrame frame(reinterpret_cast<char*>(kFrameData), |
| 1577 false); | 1570 false); |
| 1578 SpdyCredential credential; | 1571 SpdyCredential credential; |
| 1579 EXPECT_TRUE(SpdyFramer::ParseCredentialData(frame.payload(), | 1572 EXPECT_TRUE(SpdyFramer::ParseCredentialData(frame.payload(), |
| 1580 frame.length(), | 1573 frame.length(), |
| 1581 &credential)); | 1574 &credential)); |
| 1582 EXPECT_EQ(3u, credential.slot); | 1575 EXPECT_EQ(3u, credential.slot); |
| 1583 EXPECT_EQ("google.com", credential.origin); | |
| 1584 EXPECT_EQ("proof", credential.proof); | 1576 EXPECT_EQ("proof", credential.proof); |
| 1585 EXPECT_EQ("a cert", credential.certs.front()); | 1577 EXPECT_EQ("a cert", credential.certs.front()); |
| 1586 credential.certs.erase(credential.certs.begin()); | 1578 credential.certs.erase(credential.certs.begin()); |
| 1587 EXPECT_EQ("another cert", credential.certs.front()); | 1579 EXPECT_EQ("another cert", credential.certs.front()); |
| 1588 credential.certs.erase(credential.certs.begin()); | 1580 credential.certs.erase(credential.certs.begin()); |
| 1589 EXPECT_EQ("final cert", credential.certs.front()); | 1581 EXPECT_EQ("final cert", credential.certs.front()); |
| 1590 credential.certs.erase(credential.certs.begin()); | 1582 credential.certs.erase(credential.certs.begin()); |
| 1591 EXPECT_TRUE(credential.certs.empty()); | 1583 EXPECT_TRUE(credential.certs.empty()); |
| 1592 } | 1584 } |
| 1593 } | 1585 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1639 visitor.SimulateInFramer( | 1631 visitor.SimulateInFramer( |
| 1640 reinterpret_cast<unsigned char*>(template_frame.get()->data()), | 1632 reinterpret_cast<unsigned char*>(template_frame.get()->data()), |
| 1641 template_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 1633 template_frame.get()->length() + SpdyControlFrame::kHeaderSize); |
| 1642 EXPECT_EQ(1, visitor.syn_frame_count_); | 1634 EXPECT_EQ(1, visitor.syn_frame_count_); |
| 1643 } | 1635 } |
| 1644 } | 1636 } |
| 1645 | 1637 |
| 1646 TEST_F(SpdyFramerTest, ReadCredentialFrame) { | 1638 TEST_F(SpdyFramerTest, ReadCredentialFrame) { |
| 1647 SpdyCredential credential; | 1639 SpdyCredential credential; |
| 1648 credential.slot = 3; | 1640 credential.slot = 3; |
| 1649 credential.origin = "google.com"; | |
| 1650 credential.proof = "proof"; | 1641 credential.proof = "proof"; |
| 1651 credential.certs.push_back("a cert"); | 1642 credential.certs.push_back("a cert"); |
| 1652 credential.certs.push_back("another cert"); | 1643 credential.certs.push_back("another cert"); |
| 1653 credential.certs.push_back("final cert"); | 1644 credential.certs.push_back("final cert"); |
| 1654 SpdyFramer framer; | 1645 SpdyFramer framer; |
| 1655 scoped_ptr<SpdyFrame> control_frame( | 1646 scoped_ptr<SpdyFrame> control_frame( |
| 1656 framer.CreateCredentialFrame(credential)); | 1647 framer.CreateCredentialFrame(credential)); |
| 1657 EXPECT_TRUE(control_frame.get() != NULL); | 1648 EXPECT_TRUE(control_frame.get() != NULL); |
| 1658 TestSpdyVisitor visitor; | 1649 TestSpdyVisitor visitor; |
| 1659 visitor.use_compression_ = false; | 1650 visitor.use_compression_ = false; |
| 1660 visitor.SimulateInFramer( | 1651 visitor.SimulateInFramer( |
| 1661 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 1652 reinterpret_cast<unsigned char*>(control_frame.get()->data()), |
| 1662 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 1653 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); |
| 1663 EXPECT_EQ(0, visitor.error_count_); | 1654 EXPECT_EQ(0, visitor.error_count_); |
| 1664 EXPECT_EQ(1, visitor.credential_count_); | 1655 EXPECT_EQ(1, visitor.credential_count_); |
| 1665 EXPECT_EQ(control_frame->length(), visitor.credential_buffer_length_); | 1656 EXPECT_EQ(control_frame->length(), visitor.credential_buffer_length_); |
| 1666 EXPECT_EQ(credential.slot, visitor.credential_.slot); | 1657 EXPECT_EQ(credential.slot, visitor.credential_.slot); |
| 1667 EXPECT_EQ(credential.origin, visitor.credential_.origin); | |
| 1668 EXPECT_EQ(credential.proof, visitor.credential_.proof); | 1658 EXPECT_EQ(credential.proof, visitor.credential_.proof); |
| 1669 EXPECT_EQ(credential.certs.size(), visitor.credential_.certs.size()); | 1659 EXPECT_EQ(credential.certs.size(), visitor.credential_.certs.size()); |
| 1670 for (size_t i = 0; i < credential.certs.size(); i++) { | 1660 for (size_t i = 0; i < credential.certs.size(); i++) { |
| 1671 EXPECT_EQ(credential.certs[i], visitor.credential_.certs[i]); | 1661 EXPECT_EQ(credential.certs[i], visitor.credential_.certs[i]); |
| 1672 } | 1662 } |
| 1673 } | 1663 } |
| 1674 | 1664 |
| 1675 TEST_F(SpdyFramerTest, ReadCredentialFrameWithCorruptOrigin) { | |
| 1676 SpdyCredential credential; | |
| 1677 credential.slot = 3; | |
| 1678 credential.origin = "google.com"; | |
| 1679 credential.proof = "proof"; | |
| 1680 credential.certs.push_back("a cert"); | |
| 1681 credential.certs.push_back("another cert"); | |
| 1682 credential.certs.push_back("final cert"); | |
| 1683 SpdyFramer framer; | |
| 1684 scoped_ptr<SpdyFrame> control_frame( | |
| 1685 framer.CreateCredentialFrame(credential)); | |
| 1686 EXPECT_TRUE(control_frame.get() != NULL); | |
| 1687 TestSpdyVisitor visitor; | |
| 1688 visitor.use_compression_ = false; | |
| 1689 unsigned char* data = | |
| 1690 reinterpret_cast<unsigned char*>(control_frame.get()->data()); | |
| 1691 // Origin length is past the end of the frame | |
| 1692 data[SpdyControlFrame::kHeaderSize + 2] = 0xFF; | |
| 1693 visitor.SimulateInFramer( | |
| 1694 data, control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | |
| 1695 EXPECT_EQ(1, visitor.error_count_); | |
| 1696 } | |
| 1697 | |
| 1698 TEST_F(SpdyFramerTest, ReadCredentialFrameWithCorruptProof) { | 1665 TEST_F(SpdyFramerTest, ReadCredentialFrameWithCorruptProof) { |
| 1699 SpdyCredential credential; | 1666 SpdyCredential credential; |
| 1700 credential.slot = 3; | 1667 credential.slot = 3; |
| 1701 credential.origin = "google.com"; | |
| 1702 credential.proof = "proof"; | 1668 credential.proof = "proof"; |
| 1703 credential.certs.push_back("a cert"); | 1669 credential.certs.push_back("a cert"); |
| 1704 credential.certs.push_back("another cert"); | 1670 credential.certs.push_back("another cert"); |
| 1705 credential.certs.push_back("final cert"); | 1671 credential.certs.push_back("final cert"); |
| 1706 SpdyFramer framer; | 1672 SpdyFramer framer; |
| 1707 scoped_ptr<SpdyFrame> control_frame( | 1673 scoped_ptr<SpdyFrame> control_frame( |
| 1708 framer.CreateCredentialFrame(credential)); | 1674 framer.CreateCredentialFrame(credential)); |
| 1709 EXPECT_TRUE(control_frame.get() != NULL); | 1675 EXPECT_TRUE(control_frame.get() != NULL); |
| 1710 TestSpdyVisitor visitor; | 1676 TestSpdyVisitor visitor; |
| 1711 visitor.use_compression_ = false; | 1677 visitor.use_compression_ = false; |
| 1712 unsigned char* data = | 1678 unsigned char* data = |
| 1713 reinterpret_cast<unsigned char*>(control_frame.get()->data()); | 1679 reinterpret_cast<unsigned char*>(control_frame.get()->data()); |
| 1714 size_t offset = SpdyControlFrame::kHeaderSize + 4 + | 1680 size_t offset = SpdyControlFrame::kHeaderSize + 4; |
| 1715 credential.origin.length(); | |
| 1716 data[offset] = 0xFF; // Proof length is past the end of the frame | 1681 data[offset] = 0xFF; // Proof length is past the end of the frame |
| 1717 visitor.SimulateInFramer( | 1682 visitor.SimulateInFramer( |
| 1718 data, control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 1683 data, control_frame.get()->length() + SpdyControlFrame::kHeaderSize); |
| 1719 EXPECT_EQ(1, visitor.error_count_); | 1684 EXPECT_EQ(1, visitor.error_count_); |
| 1720 } | 1685 } |
| 1721 | 1686 |
| 1722 TEST_F(SpdyFramerTest, ReadCredentialFrameWithCorruptCertificate) { | 1687 TEST_F(SpdyFramerTest, ReadCredentialFrameWithCorruptCertificate) { |
| 1723 SpdyCredential credential; | 1688 SpdyCredential credential; |
| 1724 credential.slot = 3; | 1689 credential.slot = 3; |
| 1725 credential.origin = "google.com"; | |
| 1726 credential.proof = "proof"; | 1690 credential.proof = "proof"; |
| 1727 credential.certs.push_back("a cert"); | 1691 credential.certs.push_back("a cert"); |
| 1728 credential.certs.push_back("another cert"); | 1692 credential.certs.push_back("another cert"); |
| 1729 credential.certs.push_back("final cert"); | 1693 credential.certs.push_back("final cert"); |
| 1730 SpdyFramer framer; | 1694 SpdyFramer framer; |
| 1731 scoped_ptr<SpdyFrame> control_frame( | 1695 scoped_ptr<SpdyFrame> control_frame( |
| 1732 framer.CreateCredentialFrame(credential)); | 1696 framer.CreateCredentialFrame(credential)); |
| 1733 EXPECT_TRUE(control_frame.get() != NULL); | 1697 EXPECT_TRUE(control_frame.get() != NULL); |
| 1734 TestSpdyVisitor visitor; | 1698 TestSpdyVisitor visitor; |
| 1735 visitor.use_compression_ = false; | 1699 visitor.use_compression_ = false; |
| 1736 unsigned char* data = | 1700 unsigned char* data = |
| 1737 reinterpret_cast<unsigned char*>(control_frame.get()->data()); | 1701 reinterpret_cast<unsigned char*>(control_frame.get()->data()); |
| 1738 size_t offset = SpdyControlFrame::kHeaderSize + 4 + | 1702 size_t offset = SpdyControlFrame::kHeaderSize + credential.proof.length(); |
| 1739 credential.origin.length() + 4 + credential.proof.length(); | |
| 1740 data[offset] = 0xFF; // Certificate length is past the end of the frame | 1703 data[offset] = 0xFF; // Certificate length is past the end of the frame |
| 1741 visitor.SimulateInFramer( | 1704 visitor.SimulateInFramer( |
| 1742 data, control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 1705 data, control_frame.get()->length() + SpdyControlFrame::kHeaderSize); |
| 1743 EXPECT_EQ(1, visitor.error_count_); | 1706 EXPECT_EQ(1, visitor.error_count_); |
| 1744 } | 1707 } |
| 1745 | 1708 |
| 1746 TEST_F(SpdyFramerTest, ReadGarbage) { | 1709 TEST_F(SpdyFramerTest, ReadGarbage) { |
| 1747 SpdyFramer framer; | 1710 SpdyFramer framer; |
| 1748 unsigned char garbage_frame[256]; | 1711 unsigned char garbage_frame[256]; |
| 1749 memset(garbage_frame, ~0, sizeof(garbage_frame)); | 1712 memset(garbage_frame, ~0, sizeof(garbage_frame)); |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1899 } | 1862 } |
| 1900 | 1863 |
| 1901 std::string RandomString(int length) { | 1864 std::string RandomString(int length) { |
| 1902 std::string rv; | 1865 std::string rv; |
| 1903 for (int index = 0; index < length; index++) | 1866 for (int index = 0; index < length; index++) |
| 1904 rv += static_cast<char>('a' + (rand() % 26)); | 1867 rv += static_cast<char>('a' + (rand() % 26)); |
| 1905 return rv; | 1868 return rv; |
| 1906 } | 1869 } |
| 1907 | 1870 |
| 1908 } // namespace | 1871 } // namespace |
| OLD | NEW |