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