Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "google_apis/gcm/engine/connection_handler_impl.h" | 5 #include "google_apis/gcm/engine/connection_handler_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 | 129 |
| 130 private: | 130 private: |
| 131 void ReadContinuation(ScopedMessage* dst_proto, ScopedMessage new_proto); | 131 void ReadContinuation(ScopedMessage* dst_proto, ScopedMessage new_proto); |
| 132 void WriteContinuation(); | 132 void WriteContinuation(); |
| 133 void ConnectionContinuation(int error); | 133 void ConnectionContinuation(int error); |
| 134 | 134 |
| 135 // SocketStreams and their data provider. | 135 // SocketStreams and their data provider. |
| 136 ReadList mock_reads_; | 136 ReadList mock_reads_; |
| 137 WriteList mock_writes_; | 137 WriteList mock_writes_; |
| 138 scoped_ptr<net::DelayedSocketData> data_provider_; | 138 scoped_ptr<net::DelayedSocketData> data_provider_; |
| 139 scoped_ptr<SocketInputStream> socket_input_stream_; | |
| 140 scoped_ptr<SocketOutputStream> socket_output_stream_; | |
| 141 | 139 |
| 142 // The connection handler being tested. | 140 // The connection handler being tested. |
| 143 scoped_ptr<ConnectionHandlerImpl> connection_handler_; | 141 scoped_ptr<ConnectionHandlerImpl> connection_handler_; |
| 144 | 142 |
| 145 // The last connection error received. | 143 // The last connection error received. |
| 146 int last_error_; | 144 int last_error_; |
| 147 | 145 |
| 148 // net:: components. | 146 // net:: components. |
| 149 scoped_ptr<net::StreamSocket> socket_; | 147 scoped_ptr<net::StreamSocket> socket_; |
| 150 net::MockClientSocketFactory socket_factory_; | 148 net::MockClientSocketFactory socket_factory_; |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 667 data_message.set_from(kDataMsgFrom); | 665 data_message.set_from(kDataMsgFrom); |
| 668 data_message.set_category(kDataMsgCategory); | 666 data_message.set_category(kDataMsgCategory); |
| 669 connection_handler()->SendMessage(data_message); | 667 connection_handler()->SendMessage(data_message); |
| 670 EXPECT_FALSE(connection_handler()->CanSendMessage()); | 668 EXPECT_FALSE(connection_handler()->CanSendMessage()); |
| 671 WaitForMessage(); // The message send. Should result in an error | 669 WaitForMessage(); // The message send. Should result in an error |
| 672 EXPECT_FALSE(connection_handler()->CanSendMessage()); | 670 EXPECT_FALSE(connection_handler()->CanSendMessage()); |
| 673 EXPECT_EQ(net::ERR_CONNECTION_CLOSED, last_error()); | 671 EXPECT_EQ(net::ERR_CONNECTION_CLOSED, last_error()); |
| 674 } | 672 } |
| 675 | 673 |
| 676 // Receive a message whose size field was corrupted and is larger than the | 674 // Receive a message whose size field was corrupted and is larger than the |
| 677 // socket's buffer. Should fail gracefully. | 675 // socket's buffer. Should fail gracefully with a size error. |
| 678 TEST_F(GCMConnectionHandlerImplTest, CorruptedSize) { | 676 TEST_F(GCMConnectionHandlerImplTest, OutOfBuffer) { |
| 679 std::string handshake_request = EncodeHandshakeRequest(); | 677 std::string handshake_request = EncodeHandshakeRequest(); |
| 680 WriteList write_list(1, net::MockWrite(net::ASYNC, | 678 WriteList write_list(1, net::MockWrite(net::ASYNC, |
| 681 handshake_request.c_str(), | 679 handshake_request.c_str(), |
| 682 handshake_request.size())); | 680 handshake_request.size())); |
| 683 std::string handshake_response = EncodeHandshakeResponse(); | 681 std::string handshake_response = EncodeHandshakeResponse(); |
| 684 | 682 |
| 685 // Fill a string with 9000 character zero. | 683 // Fill a string with 9000 character zero. |
| 686 std::string data_message_proto(9000, '0'); | 684 std::string data_message_proto(9000, '0'); |
| 687 std::string data_message_pkt = | 685 std::string data_message_pkt = |
| 688 EncodePacket(kDataMessageStanzaTag, data_message_proto); | 686 EncodePacket(kDataMessageStanzaTag, data_message_proto); |
| 689 ReadList read_list; | 687 ReadList read_list; |
| 690 read_list.push_back(net::MockRead(net::ASYNC, | 688 read_list.push_back(net::MockRead(net::ASYNC, |
| 691 handshake_response.c_str(), | 689 handshake_response.c_str(), |
| 692 handshake_response.size())); | 690 handshake_response.size())); |
| 693 read_list.push_back(net::MockRead(net::ASYNC, | 691 read_list.push_back(net::MockRead(net::ASYNC, |
| 694 data_message_pkt.c_str(), | 692 data_message_pkt.c_str(), |
| 695 data_message_pkt.size())); | 693 data_message_pkt.size())); |
| 696 BuildSocket(read_list, write_list); | 694 BuildSocket(read_list, write_list); |
| 697 | 695 |
| 698 ScopedMessage received_message; | 696 ScopedMessage received_message; |
| 699 Connect(&received_message); | 697 Connect(&received_message); |
| 700 WaitForMessage(); // The login send. | 698 WaitForMessage(); // The login send. |
| 701 WaitForMessage(); // The login response. | 699 WaitForMessage(); // The login response. |
| 702 received_message.reset(); | 700 received_message.reset(); |
| 703 WaitForMessage(); // The data message. | 701 WaitForMessage(); // The data message. |
| 704 EXPECT_FALSE(received_message.get()); | 702 EXPECT_FALSE(received_message.get()); |
| 705 EXPECT_EQ(net::ERR_FILE_TOO_BIG, last_error()); | 703 EXPECT_EQ(net::ERR_FILE_TOO_BIG, last_error()); |
| 706 } | 704 } |
| 707 | 705 |
| 706 // Receive a message whose size field was corrupted and takes more than two | |
| 707 // bytes to encode. Should fail gracefully with a size error. | |
| 708 TEST_F(GCMConnectionHandlerImplTest, InvalidSizePacket) { | |
| 709 std::string handshake_request = EncodeHandshakeRequest(); | |
| 710 WriteList write_list(1, net::MockWrite(net::ASYNC, | |
| 711 handshake_request.c_str(), | |
| 712 handshake_request.size())); | |
| 713 std::string handshake_response = EncodeHandshakeResponse(); | |
| 714 | |
| 715 // Fill a string with 20000 character zero (which uses more than 2 bytes to | |
| 716 // encode the size packet). | |
| 717 std::string data_message_proto(20000, '0'); | |
| 718 std::string data_message_pkt = | |
| 719 EncodePacket(kDataMessageStanzaTag, data_message_proto); | |
| 720 ReadList read_list; | |
| 721 read_list.push_back(net::MockRead(net::ASYNC, | |
| 722 handshake_response.c_str(), | |
| 723 handshake_response.size())); | |
| 724 read_list.push_back(net::MockRead(net::ASYNC, | |
| 725 data_message_pkt.c_str(), | |
| 726 data_message_pkt.size())); | |
| 727 BuildSocket(read_list, write_list); | |
| 728 | |
| 729 ScopedMessage received_message; | |
| 730 Connect(&received_message); | |
| 731 WaitForMessage(); // The login send. | |
| 732 WaitForMessage(); // The login response. | |
| 733 received_message.reset(); | |
| 734 WaitForMessage(); // The data message. | |
| 735 EXPECT_FALSE(received_message.get()); | |
| 736 EXPECT_EQ(net::ERR_FILE_TOO_BIG, last_error()); | |
| 737 } | |
| 738 | |
| 739 // Make sure a message with an invalid tag is handled gracefully and resets | |
| 740 // the connection with an invalid argument error. | |
| 741 TEST_F(GCMConnectionHandlerImplTest, InvalidTag) { | |
| 742 std::string handshake_request = EncodeHandshakeRequest(); | |
| 743 WriteList write_list(1, net::MockWrite(net::ASYNC, | |
| 744 handshake_request.c_str(), | |
| 745 handshake_request.size())); | |
| 746 std::string handshake_response = EncodeHandshakeResponse(); | |
| 747 | |
| 748 std::string invalid_message = "0"; | |
| 749 std::string invalid_message_pkt = | |
| 750 EncodePacket(100, invalid_message); | |
|
fgorski
2014/10/20 22:11:55
nit: could you name that value? could be a const i
Nicolas Zea
2014/10/21 00:02:54
Done.
| |
| 751 ReadList read_list; | |
| 752 read_list.push_back(net::MockRead(net::ASYNC, | |
| 753 handshake_response.c_str(), | |
| 754 handshake_response.size())); | |
| 755 read_list.push_back(net::MockRead(net::ASYNC, | |
| 756 invalid_message_pkt.c_str(), | |
| 757 invalid_message_pkt.size())); | |
| 758 BuildSocket(read_list, write_list); | |
| 759 | |
| 760 ScopedMessage received_message; | |
| 761 Connect(&received_message); | |
| 762 WaitForMessage(); // The login send. | |
| 763 WaitForMessage(); // The login response. | |
| 764 received_message.reset(); | |
| 765 WaitForMessage(); // The invalid message. | |
| 766 EXPECT_FALSE(received_message.get()); | |
| 767 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, last_error()); | |
| 768 } | |
| 769 | |
| 770 // Receive a message where the size field spans two socket reads. | |
|
fgorski
2014/10/20 22:11:55
nit: pleas call out that it is byte 2 and 3 explic
Nicolas Zea
2014/10/21 00:02:54
Done.
| |
| 771 TEST_F(GCMConnectionHandlerImplTest, RecvMsgSplitSize) { | |
| 772 std::string handshake_request = EncodeHandshakeRequest(); | |
| 773 WriteList write_list(1, net::MockWrite(net::ASYNC, | |
| 774 handshake_request.c_str(), | |
| 775 handshake_request.size())); | |
| 776 std::string handshake_response = EncodeHandshakeResponse(); | |
| 777 | |
| 778 std::string data_message_proto = | |
| 779 BuildDataMessage(kDataMsgFromLong, kDataMsgCategoryLong); | |
| 780 std::string data_message_pkt = | |
| 781 EncodePacket(kDataMessageStanzaTag, data_message_proto); | |
| 782 DCHECK_GT(data_message_pkt.size(), 128U); | |
| 783 ReadList read_list; | |
| 784 read_list.push_back(net::MockRead(net::ASYNC, | |
| 785 handshake_response.c_str(), | |
| 786 handshake_response.size())); | |
| 787 read_list.push_back(net::MockRead(net::ASYNC, | |
| 788 data_message_pkt.c_str(), | |
| 789 2)); | |
| 790 read_list.push_back(net::MockRead(net::ASYNC, | |
| 791 data_message_pkt.c_str() + 2, | |
| 792 data_message_pkt.size() - 2)); | |
| 793 BuildSocket(read_list, write_list); | |
| 794 | |
| 795 ScopedMessage received_message; | |
| 796 Connect(&received_message); | |
| 797 WaitForMessage(); // The login send. | |
| 798 WaitForMessage(); // The login response. | |
| 799 WaitForMessage(); // The data message. | |
| 800 ASSERT_TRUE(received_message.get()); | |
| 801 EXPECT_EQ(data_message_proto, received_message->SerializeAsString()); | |
| 802 EXPECT_EQ(net::OK, last_error()); | |
| 803 } | |
| 804 | |
| 708 } // namespace | 805 } // namespace |
| 709 } // namespace gcm | 806 } // namespace gcm |
| OLD | NEW |