| // Copyright 2018 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 "portier/group_manager.h" |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include <base/stl_util.h> |
| #include <gtest/gtest.h> |
| #include <shill/net/ip_address.h> |
| |
| #include "portier/mock_group.h" |
| |
| namespace portier { |
| |
| using std::shared_ptr; |
| using std::weak_ptr; |
| using std::string; |
| using std::vector; |
| |
| using Code = Status::Code; |
| |
| using MockGroupManager = GroupManager<MockGroupMember>; |
| |
| using MockGroupMemberPtr = shared_ptr<MockGroupMember>; |
| |
| // Testing data. |
| namespace { |
| |
| constexpr char kGroupAName[] = "ethernet"; |
| constexpr char kGroupBName[] = "wifi"; |
| constexpr char kGroupCName[] = "lte"; |
| |
| } // namespace |
| |
| TEST(GroupManagerTest, GrouplessManager) { |
| MockGroupManager manager; |
| |
| auto group_list = manager.GetGroupNames(); |
| EXPECT_EQ(group_list.size(), 0); |
| |
| EXPECT_FALSE(manager.HasGroup(kGroupAName)); |
| EXPECT_FALSE(manager.HasGroup(kGroupBName)); |
| EXPECT_FALSE(manager.HasGroup(kGroupCName)); |
| |
| EXPECT_EQ(manager.ReleaseGroup(kGroupAName).code(), Code::DOES_NOT_EXIST); |
| EXPECT_EQ(manager.ReleaseGroup(kGroupBName).code(), Code::DOES_NOT_EXIST); |
| EXPECT_EQ(manager.ReleaseGroup(kGroupCName).code(), Code::DOES_NOT_EXIST); |
| } |
| |
| TEST(GroupManagerTest, SingleGroupInsertion) { |
| MockGroupManager manager; |
| |
| // Create group and add some interfaces with an upstream. |
| EXPECT_TRUE(manager.CreateGroup(kGroupAName)); |
| |
| // Verify groups existence. |
| EXPECT_TRUE(manager.HasGroup(kGroupAName)); |
| auto group_a = manager.GetGroup(kGroupAName); |
| EXPECT_TRUE(group_a); |
| |
| const auto group_list = manager.GetGroups(); |
| EXPECT_EQ(group_list.size(), 1); |
| EXPECT_EQ(group_list.at(0), group_a); |
| const auto group_name_list = manager.GetGroupNames(); |
| EXPECT_EQ(group_name_list.size(), 1); |
| EXPECT_EQ(group_name_list.at(0), kGroupAName); |
| } |
| |
| TEST(GroupManagerTest, SingleGroupDestroy) { |
| MockGroupManager manager; |
| |
| // Create group and add some interfaces with an upstream. |
| EXPECT_TRUE(manager.CreateGroup(kGroupAName)); |
| |
| auto group_ptr = manager.GetGroup(kGroupAName); |
| |
| auto mem_ptr = MockGroupMemberPtr(new MockGroupMember()); |
| |
| EXPECT_CALL(*mem_ptr, PostJoinGroup()).Times(1); |
| EXPECT_CALL(*mem_ptr, PostLeaveGroup()).Times(0); |
| EXPECT_TRUE(group_ptr->AddMember(mem_ptr)); |
| |
| EXPECT_TRUE(mem_ptr->HasGroup()); |
| |
| // Remove group. |
| EXPECT_CALL(*mem_ptr, PostLeaveGroup()).Times(1); |
| EXPECT_TRUE(manager.ReleaseGroup(kGroupAName)); |
| |
| // Verify removal. |
| EXPECT_FALSE(manager.HasGroup(kGroupAName)); |
| EXPECT_FALSE(mem_ptr->HasGroup()); |
| } |
| |
| TEST(GroupManagerTest, MultiGroup) { |
| MockGroupManager manager; |
| |
| // Create groups. |
| EXPECT_TRUE(manager.CreateGroup(kGroupAName)); |
| EXPECT_TRUE(manager.CreateGroup(kGroupBName)); |
| |
| // Verify groups. |
| auto group_a_ptr = manager.GetGroup(kGroupAName); |
| EXPECT_TRUE(group_a_ptr); |
| auto group_b_ptr = manager.GetGroup(kGroupBName); |
| EXPECT_TRUE(group_b_ptr); |
| |
| const auto group_list = manager.GetGroupNames(); |
| EXPECT_EQ(group_list.size(), 2); |
| EXPECT_TRUE(base::ContainsValue(group_list, kGroupAName)); |
| EXPECT_TRUE(base::ContainsValue(group_list, kGroupBName)); |
| EXPECT_TRUE(manager.HasGroup(kGroupAName)); |
| EXPECT_TRUE(manager.HasGroup(kGroupBName)); |
| EXPECT_FALSE(manager.HasGroup(kGroupCName)); |
| |
| // Remove group A and verify removal of members. |
| EXPECT_TRUE(manager.ReleaseGroup(kGroupAName)); |
| EXPECT_FALSE(manager.HasGroup(kGroupAName)); |
| |
| // Verify that the other groups are still around. |
| EXPECT_TRUE(manager.HasGroup(kGroupBName)); |
| } |
| |
| TEST(GroupManagerTest, BadGroupManipulation) { |
| MockGroupManager manager; |
| |
| // Create group twice. |
| EXPECT_TRUE(manager.CreateGroup(kGroupAName)); |
| EXPECT_EQ(manager.CreateGroup(kGroupAName).code(), Code::ALREADY_EXISTS); |
| |
| EXPECT_TRUE(manager.CreateGroup(kGroupBName)); |
| EXPECT_EQ(manager.CreateGroup(kGroupBName).code(), Code::ALREADY_EXISTS); |
| |
| // Destroy group twice. |
| EXPECT_TRUE(manager.ReleaseGroup(kGroupAName)); |
| EXPECT_EQ(manager.ReleaseGroup(kGroupAName).code(), Code::DOES_NOT_EXIST); |
| |
| EXPECT_TRUE(manager.ReleaseGroup(kGroupBName)); |
| EXPECT_EQ(manager.ReleaseGroup(kGroupBName).code(), Code::DOES_NOT_EXIST); |
| |
| // Destroy unknown. |
| EXPECT_EQ(manager.ReleaseGroup(kGroupCName).code(), Code::DOES_NOT_EXIST); |
| } |
| |
| } // namespace portier |