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 "chromeos/dbus/gsm_sms_client.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_bus.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/mock_object_proxy.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/values_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A mock SmsReceivedHandler. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockSmsReceivedHandler { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(Run, void(uint32 index, bool complete)); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A mock DeleteCallback. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockDeleteCallback { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(Run, void()); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A mock GetCallback. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGetCallback { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(Run, void(const base::DictionaryValue& sms)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A mock ListCallback. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockListCallback { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(Run, void(const base::ListValue& result)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// D-Bus service name used by test. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kServiceName[] = "service.name"; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// D-Bus object path used by test. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kObjectPath[] = "/object/path"; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keys of SMS dictionary. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNumberKey[] = "number"; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTextKey[] = "text"; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example values of SMS dictionary. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExampleNumber[] = "00012345678"; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExampleText[] = "Hello."; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GsmSMSClientTest : public testing::Test { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GsmSMSClientTest() : expected_index_(0), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_(NULL), 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_result_(NULL) {} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a mock bus. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Bus::Options options; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options.bus_type = dbus::Bus::SYSTEM; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_bus_ = new dbus::MockBus(options); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a mock proxy. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kServiceName, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(kObjectPath)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set an expectation so mock_proxy's ConnectToSignal() will use 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnConnectToSignal() to run the callback. 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_CALL(*mock_proxy_.get(), 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ConnectToSignal(modemmanager::kModemManagerSMSInterface, 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) modemmanager::kSMSReceivedSignal, 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) _, 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) _)) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Invoke(this, &GsmSMSClientTest::OnConnectToSignal)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set an expectation so mock_bus's GetObjectProxy() for the given 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // service name and the object path will return mock_proxy_. 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_CALL(*mock_bus_.get(), 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetObjectProxy(kServiceName, dbus::ObjectPath(kObjectPath))) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(mock_proxy_.get())); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ShutdownAndBlock() will be called in TearDown(). 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_CALL(*mock_bus_.get(), ShutdownAndBlock()).WillOnce(Return()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a client with the mock bus. 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) client_.reset(GsmSMSClient::Create()); 103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) client_->Init(mock_bus_.get()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_bus_->ShutdownAndBlock(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles Delete method call. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDelete(dbus::MethodCall* method_call, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout_ms, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectProxy::ResponseCallback& callback) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(modemmanager::kModemManagerSMSInterface, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_call->GetInterface()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(modemmanager::kSMSDeleteFunction, method_call->GetMember()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 index = 0; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageReader reader(method_call); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader.PopUint32(&index)); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_index_, index); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader.HasMoreData()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles Get method call. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnGet(dbus::MethodCall* method_call, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout_ms, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectProxy::ResponseCallback& callback) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(modemmanager::kModemManagerSMSInterface, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_call->GetInterface()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(modemmanager::kSMSGetFunction, method_call->GetMember()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 index = 0; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageReader reader(method_call); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader.PopUint32(&index)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_index_, index); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader.HasMoreData()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles List method call. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnList(dbus::MethodCall* method_call, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout_ms, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectProxy::ResponseCallback& callback) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(modemmanager::kModemManagerSMSInterface, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_call->GetInterface()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(modemmanager::kSMSListFunction, method_call->GetMember()); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageReader reader(method_call); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader.HasMoreData()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks the results of Get and List. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckResult(const base::Value& result) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result.Equals(expected_result_)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The client to be tested. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<GsmSMSClient> client_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A message loop to emulate asynchronous behavior. 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop message_loop_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The mock bus. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<dbus::MockBus> mock_bus_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The mock object proxy. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_proxy_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The SmsReceived signal handler given by the tested client. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectProxy::SignalCallback sms_received_callback_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected argument for Delete and Get methods. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 expected_index_; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Response returned by mock methods. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Response* response_; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result of Get and List methods. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* expected_result_; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to implement the mock proxy. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnConnectToSignal( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& interface_name, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal_name, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectProxy::SignalCallback& signal_callback, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectProxy::OnConnectedCallback& on_connected_callback) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sms_received_callback_ = signal_callback; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool success = true; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.PostTask(FROM_HERE, base::Bind(on_connected_callback, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interface_name, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) signal_name, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GsmSMSClientTest, SmsReceived) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set expectations. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kIndex = 42; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool kComplete = true; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSmsReceivedHandler handler; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(handler, Run(kIndex, kComplete)).Times(1); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set handler. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_->SetSmsReceivedHandler(kServiceName, dbus::ObjectPath(kObjectPath), 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockSmsReceivedHandler::Run, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&handler))); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the message loop to run the signal connection result callback. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send signal. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::Signal signal(modemmanager::kModemManagerSMSInterface, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modemmanager::kSMSReceivedSignal); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(&signal); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendUint32(kIndex); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.AppendBool(kComplete); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(sms_received_callback_.is_null()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sms_received_callback_.Run(&signal); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset handler. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_->ResetSmsReceivedHandler(kServiceName, dbus::ObjectPath(kObjectPath)); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send signal again. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sms_received_callback_.Run(&signal); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GsmSMSClientTest, Delete) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set expectations. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kIndex = 42; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_index_ = kIndex; 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_CALL(*mock_proxy_.get(), CallMethod(_, _, _)) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(this, &GsmSMSClientTest::OnDelete)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockDeleteCallback callback; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(callback, Run()).Times(1); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create response. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_ = response.get(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call Delete. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_->Delete(kServiceName, dbus::ObjectPath(kObjectPath), kIndex, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockDeleteCallback::Run, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&callback))); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the message loop. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GsmSMSClientTest, Get) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set expectations. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kIndex = 42; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_index_ = kIndex; 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_CALL(*mock_proxy_.get(), CallMethod(_, _, _)) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(this, &GsmSMSClientTest::OnGet)); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGetCallback callback; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(callback, Run(_)) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(this, &GsmSMSClientTest::CheckResult)); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create response. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(response.get()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter array_writer(NULL); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.OpenArray("{sv}", &array_writer); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter entry_writer(NULL); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) array_writer.OpenDictEntry(&entry_writer); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_writer.AppendString(kNumberKey); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_writer.AppendVariantOfString(kExampleNumber); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) array_writer.CloseContainer(&entry_writer); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) array_writer.OpenDictEntry(&entry_writer); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_writer.AppendString(kTextKey); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_writer.AppendVariantOfString(kExampleText); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) array_writer.CloseContainer(&entry_writer); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.CloseContainer(&array_writer); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_ = response.get(); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create expected result. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue expected_result; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_result.SetWithoutPathExpansion( 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kNumberKey, new base::StringValue(kExampleNumber)); 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_result.SetWithoutPathExpansion(kTextKey, 272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new base::StringValue(kExampleText)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_result_ = &expected_result; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call Delete. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_->Get(kServiceName, dbus::ObjectPath(kObjectPath), kIndex, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockGetCallback::Run, base::Unretained(&callback))); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the message loop. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GsmSMSClientTest, List) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set expectations. 2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_CALL(*mock_proxy_.get(), CallMethod(_, _, _)) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(this, &GsmSMSClientTest::OnList)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockListCallback callback; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(callback, Run(_)) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(this, &GsmSMSClientTest::CheckResult)); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create response. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter writer(response.get()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter array_writer(NULL); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.OpenArray("a{sv}", &array_writer); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter sub_array_writer(NULL); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) array_writer.OpenArray("{sv}", &sub_array_writer); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::MessageWriter entry_writer(NULL); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sub_array_writer.OpenDictEntry(&entry_writer); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_writer.AppendString(kNumberKey); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_writer.AppendVariantOfString(kExampleNumber); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sub_array_writer.CloseContainer(&entry_writer); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sub_array_writer.OpenDictEntry(&entry_writer); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_writer.AppendString(kTextKey); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_writer.AppendVariantOfString(kExampleText); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sub_array_writer.CloseContainer(&entry_writer); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) array_writer.CloseContainer(&sub_array_writer); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.CloseContainer(&array_writer); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_ = response.get(); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create expected result. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue expected_result; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* sms = new base::DictionaryValue; 311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch sms->SetWithoutPathExpansion(kNumberKey, 312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new base::StringValue(kExampleNumber)); 313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch sms->SetWithoutPathExpansion(kTextKey, new base::StringValue(kExampleText)); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_result.Append(sms); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_result_ = &expected_result; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call List. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client_->List(kServiceName, dbus::ObjectPath(kObjectPath), 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MockListCallback::Run, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&callback))); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the message loop. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_.RunUntilIdle(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 326