15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/connection_tester.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/stream_socket.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StreamConnectionTester::StreamConnectionTester(net::StreamSocket* client_socket, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::StreamSocket* host_socket, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int message_size, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int message_count) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : message_loop_(base::MessageLoop::current()), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_socket_(host_socket), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_socket_(client_socket), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_size_(message_size), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_size_(message_size * message_count), 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_(false), 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_errors_(0), 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_errors_(0) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StreamConnectionTester::~StreamConnectionTester() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::Start() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitBuffers(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoRead(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoWrite(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::CheckResults() { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, write_errors_); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, read_errors_); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(test_data_size_, input_buffer_->offset()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_buffer_->SetOffset(0); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(test_data_size_, output_buffer_->size()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(output_buffer_->data(), 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_buffer_->StartOfBuffer(), test_data_size_)); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::Done() { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_ = true; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::InitBuffers() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_buffer_ = new net::DrainableIOBuffer( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new net::IOBuffer(test_data_size_), test_data_size_); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < test_data_size_; ++i) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_buffer_->data()[i] = static_cast<char>(i); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_buffer_ = new net::GrowableIOBuffer(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::DoWrite() { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = 1; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (result > 0) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output_buffer_->BytesRemaining() == 0) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_to_write = std::min(output_buffer_->BytesRemaining(), 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_size_); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = client_socket_->Write( 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) output_buffer_.get(), 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bytes_to_write, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&StreamConnectionTester::OnWritten, base::Unretained(this))); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleWriteResult(result); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::OnWritten(int result) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleWriteResult(result); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoWrite(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::HandleWriteResult(int result) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result <= 0 && result != net::ERR_IO_PENDING) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Received error " << result << " when trying to write"; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_errors_++; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Done(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (result > 0) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_buffer_->DidConsume(result); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::DoRead() { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = 1; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (result > 0) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_buffer_->SetCapacity(input_buffer_->offset() + message_size_); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = host_socket_->Read( 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) input_buffer_.get(), 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) message_size_, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&StreamConnectionTester::OnRead, base::Unretained(this))); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleReadResult(result); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::OnRead(int result) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleReadResult(result); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!done_) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoRead(); // Don't try to read again when we are done reading. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void StreamConnectionTester::HandleReadResult(int result) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result <= 0 && result != net::ERR_IO_PENDING) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Received error " << result << " when trying to read"; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_errors_++; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Done(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (result > 0) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allocate memory for the next read. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_buffer_->set_offset(input_buffer_->offset() + result); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_buffer_->offset() == test_data_size_) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Done(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DatagramConnectionTester::DatagramConnectionTester(net::Socket* client_socket, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::Socket* host_socket, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int message_size, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int message_count, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delay_ms) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : message_loop_(base::MessageLoop::current()), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_socket_(host_socket), 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_socket_(client_socket), 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_size_(message_size), 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_count_(message_count), 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delay_ms_(delay_ms), 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_(false), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_errors_(0), 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_errors_(0), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packets_sent_(0), 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packets_received_(0), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bad_packets_received_(0) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_packets_.resize(message_count_); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DatagramConnectionTester::~DatagramConnectionTester() { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DatagramConnectionTester::Start() { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoRead(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoWrite(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DatagramConnectionTester::CheckResults() { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, write_errors_); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, read_errors_); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, bad_packets_received_); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that we've received at least one packet. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(packets_received_, 0); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "Received " << packets_received_ << " packets out of " 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << message_count_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DatagramConnectionTester::Done() { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_ = true; 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DatagramConnectionTester::DoWrite() { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (packets_sent_ >= message_count_) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Done(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> packet(new net::IOBuffer(message_size_)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < message_size_; ++i) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packet->data()[i] = static_cast<char>(i); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_packets_[packets_sent_] = packet; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put index of this packet in the beginning of the packet body. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(packet->data(), &packets_sent_, sizeof(packets_sent_)); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = client_socket_->Write( 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) packet.get(), 191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) message_size_, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DatagramConnectionTester::OnWritten, base::Unretained(this))); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleWriteResult(result); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DatagramConnectionTester::OnWritten(int result) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleWriteResult(result); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DatagramConnectionTester::HandleWriteResult(int result) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result <= 0 && result != net::ERR_IO_PENDING) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Received error " << result << " when trying to write"; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_errors_++; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Done(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (result > 0) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(message_size_, result); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packets_sent_++; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_->PostDelayedTask( 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DatagramConnectionTester::DoWrite, base::Unretained(this)), 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(delay_ms_)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DatagramConnectionTester::DoRead() { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = 1; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (result > 0) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int kReadSize = message_size_ * 2; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_buffer_ = new net::IOBuffer(kReadSize); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = host_socket_->Read( 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) read_buffer_.get(), 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) kReadSize, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DatagramConnectionTester::OnRead, base::Unretained(this))); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleReadResult(result); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DatagramConnectionTester::OnRead(int result) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleReadResult(result); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoRead(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DatagramConnectionTester::HandleReadResult(int result) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result <= 0 && result != net::ERR_IO_PENDING) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error will be received after the socket is closed. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Received error " << result << " when trying to read"; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_errors_++; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Done(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (result > 0) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packets_received_++; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (message_size_ != result) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid packet size; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bad_packets_received_++; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate packet body. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int packet_id; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&packet_id, read_buffer_->data(), sizeof(packet_id)); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (packet_id < 0 || packet_id >= message_count_) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bad_packets_received_++; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (memcmp(read_buffer_->data(), sent_packets_[packet_id]->data(), 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_size_) != 0) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bad_packets_received_++; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protocol 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 262