diff options
author | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-04 21:35:56 +0000 |
---|---|---|
committer | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-04 21:35:56 +0000 |
commit | 2c140502fee5f037a2c36169ddb08dac52cf842d (patch) | |
tree | 6b1cda3ab2bad27e1c162bdc26904723da9d02dc | |
parent | b71ae4d211f9c911b3d6f6c051c8375f62794ca6 (diff) | |
download | chromium_src-2c140502fee5f037a2c36169ddb08dac52cf842d.zip chromium_src-2c140502fee5f037a2c36169ddb08dac52cf842d.tar.gz chromium_src-2c140502fee5f037a2c36169ddb08dac52cf842d.tar.bz2 |
Add FlimflamNetworkClientTest
Add chromeos::FlimflamClientUnittestBase
TEST=unit_tests --gtest_filter="FlimflamNetworkClientTest.*"
BUG=chromium-os:16557
Review URL: https://chromiumcodereview.appspot.com/9965028
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130739 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/chromeos/dbus/flimflam_client_unittest_base.cc | 173 | ||||
-rw-r--r-- | chrome/browser/chromeos/dbus/flimflam_client_unittest_base.h | 123 | ||||
-rw-r--r-- | chrome/browser/chromeos/dbus/flimflam_network_client_unittest.cc | 124 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 3 |
4 files changed, 423 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/dbus/flimflam_client_unittest_base.cc b/chrome/browser/chromeos/dbus/flimflam_client_unittest_base.cc new file mode 100644 index 0000000..981ded3 --- /dev/null +++ b/chrome/browser/chromeos/dbus/flimflam_client_unittest_base.cc @@ -0,0 +1,173 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/dbus/flimflam_client_unittest_base.h" + +#include "base/bind.h" +#include "dbus/message.h" +#include "dbus/object_path.h" +#include "dbus/values_util.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/cros_system_api/dbus/service_constants.h" + +using ::testing::_; +using ::testing::Invoke; +using ::testing::Return; + +namespace chromeos { + +FlimflamClientUnittestBase::FlimflamClientUnittestBase( + const std::string& interface_name) : interface_name_(interface_name) { +} + +FlimflamClientUnittestBase::~FlimflamClientUnittestBase() { +} + +void FlimflamClientUnittestBase::SetUp() { + // Create a mock bus. + dbus::Bus::Options options; + options.bus_type = dbus::Bus::SYSTEM; + mock_bus_ = new dbus::MockBus(options); + + // Create a mock proxy. + mock_proxy_ = new dbus::MockObjectProxy( + mock_bus_.get(), + flimflam::kFlimflamServiceName, + dbus::ObjectPath(flimflam::kFlimflamServicePath)); + + // Set an expectation so mock_proxy's CallMethod() will use OnCallMethod() + // to return responses. + EXPECT_CALL(*mock_proxy_, CallMethod(_, _, _)) + .WillRepeatedly(Invoke(this, &FlimflamClientUnittestBase::OnCallMethod)); + + // Set an expectation so mock_proxy's ConnectToSignal() will use + // OnConnectToSignal() to run the callback. + EXPECT_CALL(*mock_proxy_, ConnectToSignal( + interface_name_, + flimflam::kMonitorPropertyChanged, _, _)) + .WillRepeatedly(Invoke(this, + &FlimflamClientUnittestBase::OnConnectToSignal)); + + // Set an expectation so mock_bus's GetObjectProxy() for the given + // service name and the object path will return mock_proxy_. + EXPECT_CALL(*mock_bus_, GetObjectProxy( + flimflam::kFlimflamServiceName, + dbus::ObjectPath(flimflam::kFlimflamServicePath))) + .WillOnce(Return(mock_proxy_.get())); + + // ShutdownAndBlock() will be called in TearDown(). + EXPECT_CALL(*mock_bus_, ShutdownAndBlock()).WillOnce(Return()); +} + +void FlimflamClientUnittestBase::TearDown() { + mock_bus_->ShutdownAndBlock(); +} + +void FlimflamClientUnittestBase::PrepareForMethodCall( + const std::string& method_name, + ArgumentCheckCallback argument_checker, + dbus::Response* response) { + expected_method_name_ = method_name; + argument_checker_ = argument_checker; + response_ = response; +} + +void FlimflamClientUnittestBase::SendPropertyChangedSignal( + dbus::Signal* signal) { + ASSERT_FALSE(property_changed_handler_.is_null()); + property_changed_handler_.Run(signal); +} + +// static +void FlimflamClientUnittestBase::ExpectPropertyChanged( + const std::string& expected_name, + const base::Value* expected_value, + const std::string& name, + const base::Value& value) { + EXPECT_EQ(expected_name, name); + EXPECT_TRUE(expected_value->Equals(&value)); +} + +// static +void FlimflamClientUnittestBase::ExpectNoArgument(dbus::MessageReader* reader) { + EXPECT_FALSE(reader->HasMoreData()); +} + +// static +void FlimflamClientUnittestBase::ExpectStringArgument( + const std::string& expected_string, + dbus::MessageReader* reader) { + std::string str; + ASSERT_TRUE(reader->PopString(&str)); + EXPECT_EQ(expected_string, str); + EXPECT_FALSE(reader->HasMoreData()); +} + +// static +void FlimflamClientUnittestBase::ExpectValueArgument( + const base::Value* expected_value, + dbus::MessageReader* reader) { + scoped_ptr<base::Value> value(dbus::PopDataAsValue(reader)); + ASSERT_TRUE(value.get()); + EXPECT_TRUE(value->Equals(expected_value)); + EXPECT_FALSE(reader->HasMoreData()); +} + +// static +void FlimflamClientUnittestBase::ExpectStringAndValueArguments( + const std::string& expected_string, + const base::Value* expected_value, + dbus::MessageReader* reader) { + std::string str; + ASSERT_TRUE(reader->PopString(&str)); + EXPECT_EQ(expected_string, str); + scoped_ptr<base::Value> value(dbus::PopDataAsValue(reader)); + ASSERT_TRUE(value.get()); + EXPECT_TRUE(value->Equals(expected_value)); + EXPECT_FALSE(reader->HasMoreData()); +} + +// static +void FlimflamClientUnittestBase::ExpectNoResultValue( + DBusMethodCallStatus call_status) { + EXPECT_EQ(DBUS_METHOD_CALL_SUCCESS, call_status); +} + +// static +void FlimflamClientUnittestBase::ExpectDictionaryValueResult( + const base::DictionaryValue* expected_result, + DBusMethodCallStatus call_status, + const base::DictionaryValue& result) { + EXPECT_EQ(DBUS_METHOD_CALL_SUCCESS, call_status); + EXPECT_TRUE(expected_result->Equals(&result)); +} + +void FlimflamClientUnittestBase::OnConnectToSignal( + const std::string& interface_name, + const std::string& signal_name, + dbus::ObjectProxy::SignalCallback signal_callback, + dbus::ObjectProxy::OnConnectedCallback on_connected_callback) { + property_changed_handler_ = signal_callback; + const bool success = true; + message_loop_.PostTask(FROM_HERE, + base::Bind(on_connected_callback, + interface_name, + signal_name, + success)); +} + +void FlimflamClientUnittestBase::OnCallMethod( + dbus::MethodCall* method_call, + int timeout_ms, + dbus::ObjectProxy::ResponseCallback response_callback) { + EXPECT_EQ(interface_name_, method_call->GetInterface()); + EXPECT_EQ(expected_method_name_, method_call->GetMember()); + dbus::MessageReader reader(method_call); + argument_checker_.Run(&reader); + message_loop_.PostTask(FROM_HERE, + base::Bind(response_callback, response_)); +} + +} // namespace chromeos diff --git a/chrome/browser/chromeos/dbus/flimflam_client_unittest_base.h b/chrome/browser/chromeos/dbus/flimflam_client_unittest_base.h new file mode 100644 index 0000000..cf59bb1 --- /dev/null +++ b/chrome/browser/chromeos/dbus/flimflam_client_unittest_base.h @@ -0,0 +1,123 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_DBUS_FLIMFLAM_CLIENT_UNITTEST_BASE_H_ +#define CHROME_BROWSER_CHROMEOS_DBUS_FLIMFLAM_CLIENT_UNITTEST_BASE_H_ + +#include <string> + +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/message_loop.h" +#include "chrome/browser/chromeos/dbus/dbus_method_call_status.h" +#include "dbus/mock_bus.h" +#include "dbus/mock_object_proxy.h" +#include "dbus/object_proxy.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace base { + +class Value; +class DictionaryValue; + +} // namespace base + +namespace dbus { + +class MessageReader; + +} // namespace dbus + +namespace chromeos { + +// A class to provide functionalities needed for testing Flimflam D-Bus clients. +class FlimflamClientUnittestBase : public testing::Test { + public: + explicit FlimflamClientUnittestBase(const std::string& interface_name); + virtual ~FlimflamClientUnittestBase(); + + virtual void SetUp() OVERRIDE; + virtual void TearDown() OVERRIDE; + + protected: + // A callback to intercept and check the method call arguments. + typedef base::Callback<void( + dbus::MessageReader* reader)> ArgumentCheckCallback; + + // Sets expectations for called method name and arguments, and sets response. + void PrepareForMethodCall(const std::string& method_name, + ArgumentCheckCallback argument_checker, + dbus::Response* response); + + // Sends property changed signal to the tested client. + void SendPropertyChangedSignal(dbus::Signal* signal); + + // Checks the name and the value which are sent by PropertyChanged signal. + static void ExpectPropertyChanged(const std::string& expected_name, + const base::Value* expected_value, + const std::string& name, + const base::Value& value); + + // Expects the reader to be empty. + static void ExpectNoArgument(dbus::MessageReader* reader); + + // Expects the reader to have a string. + static void ExpectStringArgument(const std::string& expected_string, + dbus::MessageReader* reader); + + // Expects the reader to have a Value. + static void ExpectValueArgument(const base::Value* expected_value, + dbus::MessageReader* reader); + + // Expects the reader to have a string and a Value. + static void ExpectStringAndValueArguments(const std::string& expected_string, + const base::Value* expected_value, + dbus::MessageReader* reader); + + // Expects the call status to be SUCCESS. + static void ExpectNoResultValue(DBusMethodCallStatus call_status); + + // Checks the result and expects the call status to be SUCCESS. + static void ExpectDictionaryValueResult( + const base::DictionaryValue* expected_result, + DBusMethodCallStatus call_status, + const base::DictionaryValue& result); + + // A message loop to emulate asynchronous behavior. + MessageLoop message_loop_; + // The mock bus. + scoped_refptr<dbus::MockBus> mock_bus_; + + private: + // Checks the requested interface name and signal name. + // Used to implement the mock proxy. + void OnConnectToSignal( + const std::string& interface_name, + const std::string& signal_name, + dbus::ObjectProxy::SignalCallback signal_callback, + dbus::ObjectProxy::OnConnectedCallback on_connected_callback); + + // Checks the content of the method call and returns the response. + // Used to implement the mock proxy. + void OnCallMethod(dbus::MethodCall* method_call, + int timeout_ms, + dbus::ObjectProxy::ResponseCallback response_callback); + + // The interface name. + const std::string interface_name_; + // The mock object proxy. + scoped_refptr<dbus::MockObjectProxy> mock_proxy_; + // The PropertyChanged signal handler given by the tested client. + dbus::ObjectProxy::SignalCallback property_changed_handler_; + // The name of the method which is expected to be called. + std::string expected_method_name_; + // The response which the mock object proxy returns. + dbus::Response* response_; + // A callback to intercept and check the method call arguments. + ArgumentCheckCallback argument_checker_; +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_DBUS_FLIMFLAM_CLIENT_UNITTEST_BASE_H_ diff --git a/chrome/browser/chromeos/dbus/flimflam_network_client_unittest.cc b/chrome/browser/chromeos/dbus/flimflam_network_client_unittest.cc new file mode 100644 index 0000000..8b9b4ef1 --- /dev/null +++ b/chrome/browser/chromeos/dbus/flimflam_network_client_unittest.cc @@ -0,0 +1,124 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/bind.h" +#include "chrome/browser/chromeos/dbus/flimflam_client_unittest_base.h" +#include "chrome/browser/chromeos/dbus/flimflam_network_client.h" +#include "dbus/message.h" +#include "dbus/values_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/cros_system_api/dbus/service_constants.h" + +namespace chromeos { + +class FlimflamNetworkClientTest : public FlimflamClientUnittestBase { + public: + FlimflamNetworkClientTest() + : FlimflamClientUnittestBase(flimflam::kFlimflamNetworkInterface) { + } + + virtual void SetUp() { + FlimflamClientUnittestBase::SetUp(); + // Create a client with the mock bus. + client_.reset(FlimflamNetworkClient::Create(REAL_DBUS_CLIENT_IMPLEMENTATION, + mock_bus_)); + // Run the message loop to run the signal connection result callback. + message_loop_.RunAllPending(); + } + + virtual void TearDown() { + FlimflamClientUnittestBase::TearDown(); + } + + protected: + scoped_ptr<FlimflamNetworkClient> client_; +}; + +TEST_F(FlimflamNetworkClientTest, PropertyChanged) { + // Create a signal. + const base::FundamentalValue kConnected(true); + dbus::Signal signal(flimflam::kFlimflamNetworkInterface, + flimflam::kMonitorPropertyChanged); + dbus::MessageWriter writer(&signal); + writer.AppendString(flimflam::kConnectedProperty); + dbus::AppendBasicTypeValueDataAsVariant(&writer, kConnected); + + // Set expectations. + client_->SetPropertyChangedHandler(base::Bind(&ExpectPropertyChanged, + flimflam::kConnectedProperty, + &kConnected)); + // Run the signal callback. + SendPropertyChangedSignal(&signal); + + // Reset the handler. + client_->ResetPropertyChangedHandler(); +} + +TEST_F(FlimflamNetworkClientTest, GetProperties) { + const char kAddress[] = "address"; + const char kName[] = "name"; + const uint8 kSignalStrength = 1; + const uint32 kWifiChannel = 1; + const bool kConnected = true; + + // Create response. + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); + dbus::MessageWriter writer(response.get()); + dbus::MessageWriter array_writer(NULL); + writer.OpenArray("{sv}", &array_writer); + dbus::MessageWriter entry_writer(NULL); + // Append address. + array_writer.OpenDictEntry(&entry_writer); + entry_writer.AppendString(flimflam::kAddressProperty); + entry_writer.AppendVariantOfString(kAddress); + array_writer.CloseContainer(&entry_writer); + // Append name. + array_writer.OpenDictEntry(&entry_writer); + entry_writer.AppendString(flimflam::kNameProperty); + entry_writer.AppendVariantOfString(kName); + array_writer.CloseContainer(&entry_writer); + // Append signal strength. + array_writer.OpenDictEntry(&entry_writer); + entry_writer.AppendString(flimflam::kSignalStrengthProperty); + entry_writer.AppendVariantOfByte(kSignalStrength); + array_writer.CloseContainer(&entry_writer); + // Append Wifi channel. + array_writer.OpenDictEntry(&entry_writer); + entry_writer.AppendString(flimflam::kWifiChannelProperty); + entry_writer.AppendVariantOfUint32(kWifiChannel); + array_writer.CloseContainer(&entry_writer); + // Append connected. + array_writer.OpenDictEntry(&entry_writer); + entry_writer.AppendString(flimflam::kConnectedProperty); + entry_writer.AppendVariantOfBool(kConnected); + array_writer.CloseContainer(&entry_writer); + writer.CloseContainer(&array_writer); + + // Create the expected value. + base::DictionaryValue value; + value.SetWithoutPathExpansion(flimflam::kAddressProperty, + base::Value::CreateStringValue(kAddress)); + value.SetWithoutPathExpansion(flimflam::kNameProperty, + base::Value::CreateStringValue(kName)); + value.SetWithoutPathExpansion( + flimflam::kSignalStrengthProperty, + base::Value::CreateIntegerValue(kSignalStrength)); + // WiFi.Channel is set as a double because uint32 is larger than int32. + value.SetWithoutPathExpansion(flimflam::kWifiChannelProperty, + base::Value::CreateDoubleValue(kWifiChannel)); + value.SetWithoutPathExpansion(flimflam::kConnectedProperty, + base::Value::CreateBooleanValue(kConnected)); + + // Set expectations. + PrepareForMethodCall(flimflam::kGetPropertiesFunction, + base::Bind(&ExpectNoArgument), + response.get()); + // Call method. + client_->GetProperties(base::Bind(&ExpectDictionaryValueResult, + &value)); + // Run the message loop. + message_loop_.RunAllPending(); +} + +} // namespace chromeos diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 66ef68b..7beaa2b 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1321,6 +1321,9 @@ 'browser/chromeos/customization_document_unittest.cc', 'browser/chromeos/dbus/blocking_method_caller_unittest.cc', 'browser/chromeos/dbus/cros_dbus_service_unittest.cc', + 'browser/chromeos/dbus/flimflam_client_unittest_base.cc', + 'browser/chromeos/dbus/flimflam_client_unittest_base.h', + 'browser/chromeos/dbus/flimflam_network_client_unittest.cc', 'browser/chromeos/dbus/introspect_util_unittest.cc', 'browser/chromeos/dbus/proxy_resolution_service_provider_unittest.cc', 'browser/chromeos/extensions/file_browser_notifications_unittest.cc', |