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

Side by Side Diff: extensions/browser/api/cast_channel/cast_socket_unittest.cc

Issue 505453002: Create dedicated class for handling wire message formatting and parsing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Code review feedback Created 6 years, 3 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "extensions/browser/api/cast_channel/cast_socket.h" 5 #include "extensions/browser/api/cast_channel/cast_socket.h"
6 6
7 #include <vector>
8
7 #include "base/memory/weak_ptr.h" 9 #include "base/memory/weak_ptr.h"
8 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
9 #include "base/run_loop.h" 11 #include "base/run_loop.h"
10 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
11 #include "base/sys_byteorder.h" 13 #include "base/sys_byteorder.h"
12 #include "base/test/simple_test_tick_clock.h" 14 #include "base/test/simple_test_tick_clock.h"
13 #include "base/timer/mock_timer.h" 15 #include "base/timer/mock_timer.h"
14 #include "extensions/browser/api/cast_channel/cast_channel.pb.h" 16 #include "extensions/browser/api/cast_channel/cast_channel.pb.h"
15 #include "extensions/browser/api/cast_channel/cast_message_util.h" 17 #include "extensions/browser/api/cast_channel/cast_message_util.h"
16 #include "extensions/browser/api/cast_channel/logger.h" 18 #include "extensions/browser/api/cast_channel/logger.h"
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 net::IPAddressNumber number; 193 net::IPAddressNumber number;
192 number.push_back(192); 194 number.push_back(192);
193 number.push_back(0); 195 number.push_back(0);
194 number.push_back(0); 196 number.push_back(0);
195 number.push_back(1); 197 number.push_back(1);
196 return net::IPEndPoint(number, 8009); 198 return net::IPEndPoint(number, 8009);
197 } 199 }
198 200
199 // Returns the size of the body (in bytes) of the given serialized message. 201 // Returns the size of the body (in bytes) of the given serialized message.
200 static size_t ComputeBodySize(const std::string& msg) { 202 static size_t ComputeBodySize(const std::string& msg) {
201 return msg.length() - CastSocket::MessageHeader::header_size(); 203 return msg.length() - MessageFramer::MessageHeader::header_size();
202 } 204 }
203 205
204 virtual ~TestCastSocket() { 206 virtual ~TestCastSocket() {
205 } 207 }
206 208
207 // Helpers to set mock results for various operations. 209 // Helpers to set mock results for various operations.
208 void SetupTcp1Connect(net::IoMode mode, int result) { 210 void SetupTcp1Connect(net::IoMode mode, int result) {
209 tcp_connect_data_[0].reset(new net::MockConnect(mode, result)); 211 tcp_connect_data_[0].reset(new net::MockConnect(mode, result));
210 } 212 }
211 void SetupSsl1Connect(net::IoMode mode, int result) { 213 void SetupSsl1Connect(net::IoMode mode, int result) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 } 247 }
246 void AddReadResult(net::IoMode mode, int result) { 248 void AddReadResult(net::IoMode mode, int result) {
247 AddReadResult(net::MockRead(mode, result)); 249 AddReadResult(net::MockRead(mode, result));
248 } 250 }
249 void AddReadResult(net::IoMode mode, const char* data, int data_len) { 251 void AddReadResult(net::IoMode mode, const char* data, int data_len) {
250 AddReadResult(net::MockRead(mode, data, data_len)); 252 AddReadResult(net::MockRead(mode, data, data_len));
251 } 253 }
252 void AddReadResultForMessage(net::IoMode mode, const std::string& msg) { 254 void AddReadResultForMessage(net::IoMode mode, const std::string& msg) {
253 size_t body_size = ComputeBodySize(msg); 255 size_t body_size = ComputeBodySize(msg);
254 const char* data = msg.c_str(); 256 const char* data = msg.c_str();
255 AddReadResult(mode, data, MessageHeader::header_size()); 257 AddReadResult(mode, data, MessageFramer::MessageHeader::header_size());
256 AddReadResult(mode, data + MessageHeader::header_size(), body_size); 258 AddReadResult(
259 mode, data + MessageFramer::MessageHeader::header_size(), body_size);
257 } 260 }
258 void AddReadResultForMessage(net::IoMode mode, 261 void AddReadResultForMessage(net::IoMode mode,
259 const std::string& msg, 262 const std::string& msg,
260 size_t ch_size) { 263 size_t ch_size) {
261 size_t msg_size = msg.size(); 264 size_t msg_size = msg.size();
262 const char* data = msg.c_str(); 265 const char* data = msg.c_str();
263 for (size_t offset = 0; offset < msg_size; offset += ch_size) { 266 for (size_t offset = 0; offset < msg_size; offset += ch_size) {
264 if (offset + ch_size > msg_size) 267 if (offset + ch_size > msg_size)
265 ch_size = msg_size - offset; 268 ch_size = msg_size - offset;
266 AddReadResult(mode, data + offset, ch_size); 269 AddReadResult(mode, data + offset, ch_size);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 base::TimeTicks())) {} 353 base::TimeTicks())) {}
351 virtual ~CastSocketTest() {} 354 virtual ~CastSocketTest() {}
352 355
353 virtual void SetUp() OVERRIDE { 356 virtual void SetUp() OVERRIDE {
354 // Create a few test messages 357 // Create a few test messages
355 for (size_t i = 0; i < arraysize(test_messages_); i++) { 358 for (size_t i = 0; i < arraysize(test_messages_); i++) {
356 CreateStringMessage("urn:cast", "1", "2", kTestData[i], 359 CreateStringMessage("urn:cast", "1", "2", kTestData[i],
357 &test_messages_[i]); 360 &test_messages_[i]);
358 ASSERT_TRUE(MessageInfoToCastMessage( 361 ASSERT_TRUE(MessageInfoToCastMessage(
359 test_messages_[i], &test_protos_[i])); 362 test_messages_[i], &test_protos_[i]));
360 ASSERT_TRUE(CastSocket::Serialize(test_protos_[i], &test_proto_strs_[i])); 363 ASSERT_TRUE(
364 MessageFramer::Serialize(test_protos_[i], &test_proto_strs_[i]));
361 } 365 }
362 } 366 }
363 367
364 virtual void TearDown() OVERRIDE { 368 virtual void TearDown() OVERRIDE {
365 EXPECT_CALL(handler_, OnCloseComplete(net::OK)); 369 if (socket_.get()) {
366 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete, 370 EXPECT_CALL(handler_, OnCloseComplete(net::OK));
367 base::Unretained(&handler_))); 371 socket_->Close(base::Bind(&CompleteHandler::OnCloseComplete,
372 base::Unretained(&handler_)));
373 }
368 } 374 }
369 375
370 // The caller can specify non-standard namespaces by setting "auth_namespace" 376 // The caller can specify non-standard namespaces by setting "auth_namespace"
371 // (useful for negative test cases.) 377 // (useful for negative test cases.)
372 void SetupAuthMessage( 378 void SetupAuthMessage(
373 const char* auth_namespace = "urn:x-cast:com.google.cast.tp.deviceauth") { 379 const char* auth_namespace = "urn:x-cast:com.google.cast.tp.deviceauth") {
374 // Create a test auth request. 380 // Create a test auth request.
375 CastMessage request; 381 CastMessage request;
376 CreateAuthChallengeMessage(&request); 382 CreateAuthChallengeMessage(&request);
377 ASSERT_TRUE(CastSocket::Serialize(request, &auth_request_)); 383 ASSERT_TRUE(MessageFramer::Serialize(request, &auth_request_));
378 384
379 // Create a test auth reply. 385 // Create a test auth reply.
380 MessageInfo reply; 386 MessageInfo reply;
381 CreateBinaryMessage( 387 CreateBinaryMessage(
382 auth_namespace, "sender-0", "receiver-0", "abcd", &reply); 388 auth_namespace, "sender-0", "receiver-0", "abcd", &reply);
383 CastMessage reply_msg; 389 CastMessage reply_msg;
384 ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg)); 390 ASSERT_TRUE(MessageInfoToCastMessage(reply, &reply_msg));
385 ASSERT_TRUE(CastSocket::Serialize(reply_msg, &auth_reply_)); 391 ASSERT_TRUE(MessageFramer::Serialize(reply_msg, &auth_reply_));
386 } 392 }
387 393
388 void CreateCastSocket() { 394 void CreateCastSocket() {
389 socket_ = TestCastSocket::Create(&mock_delegate_, logger_.get()); 395 socket_ = TestCastSocket::Create(&mock_delegate_, logger_.get());
390 } 396 }
391 397
392 void CreateCastSocketSecure() { 398 void CreateCastSocketSecure() {
393 socket_ = TestCastSocket::CreateSecure(&mock_delegate_, logger_.get()); 399 socket_ = TestCastSocket::CreateSecure(&mock_delegate_, logger_.get());
394 } 400 }
395 401
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 944 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
939 } 945 }
940 946
941 // Test write error - very large message 947 // Test write error - very large message
942 TEST_F(CastSocketTest, TestWriteErrorLargeMessage) { 948 TEST_F(CastSocketTest, TestWriteErrorLargeMessage) {
943 CreateCastSocket(); 949 CreateCastSocket();
944 ConnectHelper(); 950 ConnectHelper();
945 SetupAuthMessage(); 951 SetupAuthMessage();
946 952
947 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED)); 953 EXPECT_CALL(handler_, OnWriteComplete(net::ERR_FAILED));
948 size_t size = CastSocket::MessageHeader::max_message_size() + 1; 954 size_t size = MessageFramer::MessageHeader::max_message_size() + 1;
949 test_messages_[0].data.reset( 955 test_messages_[0].data.reset(
950 new base::StringValue(std::string(size, 'a'))); 956 new base::StringValue(std::string(size, 'a')));
951 socket_->SendMessage(test_messages_[0], 957 socket_->SendMessage(test_messages_[0],
952 base::Bind(&CompleteHandler::OnWriteComplete, 958 base::Bind(&CompleteHandler::OnWriteComplete,
953 base::Unretained(&handler_))); 959 base::Unretained(&handler_)));
954 960
955 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state()); 961 EXPECT_EQ(cast_channel::READY_STATE_OPEN, socket_->ready_state());
956 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state()); 962 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, socket_->error_state());
957 } 963 }
958 964
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1156 ConnectHelper(); 1162 ConnectHelper();
1157 1163
1158 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 1164 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
1159 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state()); 1165 EXPECT_EQ(cast_channel::CHANNEL_ERROR_SOCKET_ERROR, socket_->error_state());
1160 } 1166 }
1161 1167
1162 // Test read error - header parse error 1168 // Test read error - header parse error
1163 TEST_F(CastSocketTest, TestReadHeaderParseError) { 1169 TEST_F(CastSocketTest, TestReadHeaderParseError) {
1164 CreateCastSocket(); 1170 CreateCastSocket();
1165 SetupAuthMessage(); 1171 SetupAuthMessage();
1166 uint32 body_size = base::HostToNet32( 1172
1167 CastSocket::MessageHeader::max_message_size() + 1); 1173 uint32 body_size =
1174 base::HostToNet32(MessageFramer::MessageHeader::max_message_size() + 1);
1168 // TODO(munjal): Add a method to cast_message_util.h to serialize messages 1175 // TODO(munjal): Add a method to cast_message_util.h to serialize messages
1169 char header[sizeof(body_size)]; 1176 char header[sizeof(body_size)];
1170 memcpy(&header, &body_size, arraysize(header)); 1177 memcpy(&header, &body_size, arraysize(header));
1171 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header)); 1178 socket_->AddReadResult(net::SYNCHRONOUS, header, arraysize(header));
1172 EXPECT_CALL(mock_delegate_, 1179 EXPECT_CALL(mock_delegate_,
1173 OnError(socket_.get(), 1180 OnError(socket_.get(),
1174 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, 1181 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE,
1175 A<const LastErrors&>())); 1182 A<const LastErrors&>()));
1176 ConnectHelper(); 1183 ConnectHelper();
1177 1184
(...skipping 16 matching lines...) Expand all
1194 OnError(socket_.get(), 1201 OnError(socket_.get(),
1195 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, 1202 cast_channel::CHANNEL_ERROR_INVALID_MESSAGE,
1196 A<const LastErrors&>())); 1203 A<const LastErrors&>()));
1197 ConnectHelper(); 1204 ConnectHelper();
1198 1205
1199 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state()); 1206 EXPECT_EQ(cast_channel::READY_STATE_CLOSED, socket_->ready_state());
1200 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE, 1207 EXPECT_EQ(cast_channel::CHANNEL_ERROR_INVALID_MESSAGE,
1201 socket_->error_state()); 1208 socket_->error_state());
1202 } 1209 }
1203 1210
1211 TEST_F(CastSocketTest, TestMessageFramerCompleteMessage) {
1212 scoped_refptr<net::GrowableIOBuffer> buffer(new net::GrowableIOBuffer);
1213 MessageFramer framer(buffer);
1214 ChannelError error;
1215 size_t message_length;
1216
1217 buffer->SetCapacity(MessageFramer::MessageHeader::max_message_size());
1218 uint32 packet_len = test_proto_strs_[0].size();
1219 memcpy(buffer->StartOfBuffer(), test_proto_strs_[0].data(), packet_len);
1220
1221 // Receive 1 byte of the header, framer demands 3 more bytes.
1222 EXPECT_EQ(4u, framer.BytesRequested());
1223 EXPECT_EQ(NULL, framer.Ingest(1, &message_length, &error).get());
1224 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, error);
1225 EXPECT_EQ(3u, framer.BytesRequested());
1226
1227 // Ingest remaining 3, expect that the framer has moved on to requesting the
1228 // body contents.
1229 EXPECT_EQ(NULL, framer.Ingest(3, &message_length, &error).get());
1230 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, error);
1231 EXPECT_EQ(packet_len - MessageFramer::MessageHeader::header_size(),
1232 framer.BytesRequested());
1233
1234 // Remainder of packet sent over the wire.
1235 scoped_ptr<CastMessage> message;
1236 message = framer.Ingest(framer.BytesRequested(), &message_length, &error);
1237 EXPECT_NE(static_cast<CastMessage*>(NULL), message.get());
1238 EXPECT_EQ(cast_channel::CHANNEL_ERROR_NONE, error);
1239 EXPECT_EQ(message->SerializeAsString(), test_protos_[0].SerializeAsString());
1240 EXPECT_EQ(4u, framer.BytesRequested());
1241 EXPECT_EQ(message->SerializeAsString().size(), message_length);
1242 }
1204 } // namespace cast_channel 1243 } // namespace cast_channel
1205 } // namespace core_api 1244 } // namespace core_api
1206 } // namespace extensions 1245 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698