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 3 // found in the LICENSE file. 4 5 #include "google_apis/gcm/engine/fake_connection_handler.h" 6 7 #include "base/logging.h" 8 #include "google_apis/gcm/base/mcs_util.h" 9 #include "net/socket/stream_socket.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 namespace gcm { 13 14 namespace { 15 16 // Build a basic login response. 17 scoped_ptr<google::protobuf::MessageLite> BuildLoginResponse(bool fail_login) { 18 scoped_ptr<mcs_proto::LoginResponse> login_response( 19 new mcs_proto::LoginResponse()); 20 login_response->set_id("id"); 21 if (fail_login) 22 login_response->mutable_error()->set_code(1); 23 return login_response.PassAs<google::protobuf::MessageLite>(); 24 } 25 26 } // namespace 27 28 FakeConnectionHandler::FakeConnectionHandler( 29 const ConnectionHandler::ProtoReceivedCallback& read_callback, 30 const ConnectionHandler::ProtoSentCallback& write_callback) 31 : read_callback_(read_callback), 32 write_callback_(write_callback), 33 fail_login_(false), 34 fail_send_(false), 35 initialized_(false) { 36 } 37 38 FakeConnectionHandler::~FakeConnectionHandler() { 39 } 40 41 void FakeConnectionHandler::Init(const mcs_proto::LoginRequest& login_request, 42 scoped_ptr<net::StreamSocket> socket) { 43 EXPECT_EQ(expected_outgoing_messages_.front().SerializeAsString(), 44 login_request.SerializeAsString()); 45 expected_outgoing_messages_.pop_front(); 46 DVLOG(1) << "Received init call."; 47 read_callback_.Run(BuildLoginResponse(fail_login_)); 48 initialized_ = !fail_login_; 49 } 50 51 bool FakeConnectionHandler::CanSendMessage() const { 52 return initialized_; 53 } 54 55 void FakeConnectionHandler::SendMessage( 56 const google::protobuf::MessageLite& message) { 57 if (expected_outgoing_messages_.empty()) 58 FAIL() << "Unexpected message sent."; 59 EXPECT_EQ(expected_outgoing_messages_.front().SerializeAsString(), 60 message.SerializeAsString()); 61 expected_outgoing_messages_.pop_front(); 62 DVLOG(1) << "Received message, " 63 << (fail_send_ ? " failing send." : "calling back."); 64 if (!fail_send_) 65 write_callback_.Run(); 66 else 67 initialized_ = false; // Prevent future messages until reconnect. 68 } 69 70 void FakeConnectionHandler::ExpectOutgoingMessage(const MCSMessage& message) { 71 expected_outgoing_messages_.push_back(message); 72 } 73 74 void FakeConnectionHandler::ResetOutgoingMessageExpectations() { 75 expected_outgoing_messages_.clear(); 76 } 77 78 bool FakeConnectionHandler::AllOutgoingMessagesReceived() const { 79 return expected_outgoing_messages_.empty(); 80 } 81 82 void FakeConnectionHandler::ReceiveMessage(const MCSMessage& message) { 83 read_callback_.Run(message.CloneProtobuf()); 84 } 85 86 } // namespace gcm 87