| // Copyright 2015 The Chromium OS 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 "leaderd/manager.h" |
| |
| #include <string> |
| |
| #include <base/run_loop.h> |
| #include <base/message_loop/message_loop.h> |
| #include <dbus/bus.h> |
| #include <dbus/mock_bus.h> |
| #include <dbus/mock_exported_object.h> |
| #include <dbus/mock_object_manager.h> |
| #include <dbus/mock_object_proxy.h> |
| #include <dbus/object_path.h> |
| #include <gtest/gtest.h> |
| #include "leaderd/mock_peerd_client.h" |
| |
| using dbus::MockBus; |
| using dbus::MockExportedObject; |
| using dbus::ObjectPath; |
| using chromeos::dbus_utils::ExportedObjectManager; |
| using testing::AnyNumber; |
| using testing::Property; |
| using testing::Return; |
| using testing::_; |
| |
| namespace leaderd { |
| |
| namespace { |
| const char kGroupName[] = "ABC"; |
| const char kMyUUID[] = "456"; |
| const char kDbusSource[] = "a.dbus.connection.id"; |
| |
| } // namespace |
| |
| class ManagerTest : public testing::Test { |
| public: |
| void SetUp() override { |
| LOG(INFO) << "Start setup"; |
| // Ignore threading concerns. |
| EXPECT_CALL(*mock_bus_, AssertOnOriginThread()).Times(AnyNumber()); |
| EXPECT_CALL(*mock_bus_, AssertOnDBusThread()).Times(AnyNumber()); |
| EXPECT_CALL(*mock_bus_.get(), GetDBusTaskRunner()) |
| .WillRepeatedly(Return(message_loop_.message_loop_proxy().get())); |
| |
| ObjectPath group_path("/org/chromium/leaderd/groups/1"); |
| group_object_ = new dbus::MockExportedObject(mock_bus_.get(), group_path); |
| EXPECT_CALL(*mock_bus_, GetExportedObject(group_path)) |
| .Times(AnyNumber()) |
| .WillRepeatedly(Return(group_object_.get())); |
| |
| EXPECT_CALL(*group_object_, ExportMethod(_, _, _, _)).Times(AnyNumber()); |
| |
| LOG(INFO) << "Before create peerd"; |
| std::unique_ptr<MockPeerdClient> peerd_client(new MockPeerdClient()); |
| peerd_manager_.reset(new MockManagerInterface()); |
| |
| EXPECT_CALL(*peerd_client, GetManagerProxy()) |
| .WillRepeatedly(Return(peerd_manager_.get())); |
| EXPECT_CALL(*peerd_manager_, StartMonitoring(_, _, _, _, _)) |
| .WillRepeatedly(Return(true)); |
| EXPECT_CALL(*peerd_manager_, ExposeService(_, _, _, _, _)) |
| .WillRepeatedly(Return(true)); |
| |
| LOG(INFO) << "Before create manager"; |
| manager_.reset( |
| new Manager{mock_bus_, object_manager_.get(), std::move(peerd_client)}); |
| LOG(INFO) << "after create manager"; |
| manager_->uuid_ = kMyUUID; |
| } |
| |
| bool JoinGroup(chromeos::ErrorPtr* error, const std::string& dbus_client, |
| const std::string& in_group_id, |
| const std::map<std::string, chromeos::Any>& options, |
| dbus::ObjectPath* object_path) { |
| LOG(INFO) << "Call join"; |
| dbus::MethodCall method_call{"org.chromium.leaderd.Manager", "JoinGroup"}; |
| method_call.SetSender(dbus_client); |
| LOG(INFO) << "Before call " << manager_.get(); |
| return manager_->JoinGroup(error, &method_call, in_group_id, options, |
| object_path); |
| } |
| |
| base::MessageLoop message_loop_; |
| scoped_refptr<MockBus> mock_bus_{new MockBus{dbus::Bus::Options{}}}; |
| std::unique_ptr<ExportedObjectManager> object_manager_; |
| std::unique_ptr<MockManagerInterface> peerd_manager_; |
| scoped_refptr<dbus::MockExportedObject> group_object_; |
| std::unique_ptr<Manager> manager_; |
| }; |
| |
| TEST_F(ManagerTest, JoinGroup_RejectEmptyGroup) { |
| chromeos::ErrorPtr error; |
| dbus::ObjectPath group_path; |
| EXPECT_FALSE(JoinGroup(&error, kDbusSource, "", {}, &group_path)); |
| EXPECT_FALSE(group_path.IsValid()); |
| EXPECT_NE(nullptr, error.get()); |
| } |
| |
| TEST_F(ManagerTest, JoinGroup_ShouldAcceptName) { |
| chromeos::ErrorPtr error; |
| dbus::ObjectPath group_path; |
| EXPECT_TRUE(JoinGroup(&error, kDbusSource, kGroupName, {}, &group_path)); |
| EXPECT_TRUE(group_path.IsValid()); |
| EXPECT_EQ(nullptr, error.get()); |
| } |
| |
| TEST_F(ManagerTest, JoinGroup_HandlesMultipleJoins) { |
| chromeos::ErrorPtr error; |
| dbus::ObjectPath group_path; |
| dbus::ObjectPath group_path_second; |
| EXPECT_TRUE(JoinGroup(&error, kDbusSource, kGroupName, {}, &group_path)); |
| EXPECT_TRUE(group_path.IsValid()); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_TRUE( |
| JoinGroup(&error, kDbusSource, kGroupName, {}, &group_path_second)); |
| EXPECT_EQ(nullptr, error.get()); |
| EXPECT_EQ(group_path, group_path_second); |
| } |
| |
| TEST_F(ManagerTest, JoinGroup_LeaderChallengeUnknownGroup) { |
| std::string out_leader; |
| std::string out_uuid; |
| EXPECT_FALSE(manager_->HandleLeaderChallenge(kGroupName, "a peer id", |
| 100, &out_leader, &out_uuid)); |
| } |
| |
| } // namespace leaderd |