1 #include "mock_user_mgr.hpp"
2 #include <xyz/openbmc_project/User/Common/error.hpp>
3 #include <xyz/openbmc_project/Common/error.hpp>
4 #include <gtest/gtest.h>
5 #include <exception>
6 
7 namespace phosphor
8 {
9 namespace user
10 {
11 
12 using ::testing::Return;
13 
14 using InternalFailure =
15     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
16 
17 class TestUserMgr : public testing::Test
18 {
19   public:
20     sdbusplus::bus::bus bus;
21     MockManager mockManager;
22 
23     TestUserMgr() :
24         bus(sdbusplus::bus::new_default()), mockManager(bus, objpath)
25     {
26     }
27 
28     void createLocalUser(const std::string &userName,
29                          std::vector<std::string> groupNames,
30                          const std::string &priv, bool enabled)
31     {
32         std::string userObj = std::string(usersObjPath) + "/" + userName;
33         mockManager.usersList.emplace(
34             userName, std::move(std::make_unique<phosphor::user::Users>(
35                           mockManager.bus, userObj.c_str(), groupNames, priv,
36                           enabled, mockManager)));
37     }
38 
39     DbusUserObj createPrivilegeMapperDbusObject(void)
40     {
41         DbusUserObj object;
42         DbusUserObjValue objValue;
43         DbusUserObjPath object_path("/xyz/openbmc_project/user/ldap");
44         DbusUserPropVariant group("ldapGroup");
45         DbusUserPropVariant priv("priv-admin");
46         DbusUserObjProperties properties = {std::make_pair("GroupName", group),
47                                             std::make_pair("Privilege", priv)};
48         std::string interface = "xyz.openbmc_project.User.PrivilegeMapperEntry";
49 
50         objValue.emplace(interface, properties);
51         object.emplace(object_path, objValue);
52 
53         return object;
54     }
55 };
56 
57 TEST_F(TestUserMgr, ldapEntryDoesNotExist)
58 {
59     std::string userName = "user";
60     UserInfoMap userInfo;
61 
62     EXPECT_CALL(mockManager, getLdapGroupName(userName))
63         .WillRepeatedly(Return(""));
64     EXPECT_THROW(userInfo = mockManager.getUserInfo(userName), InternalFailure);
65 }
66 
67 TEST_F(TestUserMgr, localUser)
68 {
69     UserInfoMap userInfo;
70     std::string userName = "testUser";
71     std::string privilege = "priv-admin";
72     std::vector<std::string> groups{"testGroup"};
73     // Create local user
74     createLocalUser(userName, groups, privilege, true);
75     EXPECT_CALL(mockManager, userLockedForFailedAttempt(userName)).Times(1);
76     userInfo = mockManager.getUserInfo(userName);
77 
78     EXPECT_EQ(privilege, std::get<std::string>(userInfo["UserPrivilege"]));
79     EXPECT_EQ(groups,
80               std::get<std::vector<std::string>>(userInfo["UserGroups"]));
81     EXPECT_EQ(true, std::get<bool>(userInfo["UserEnabled"]));
82     EXPECT_EQ(false, std::get<bool>(userInfo["UserLockedForFailedAttempt"]));
83     EXPECT_EQ(false, std::get<bool>(userInfo["RemoteUser"]));
84 }
85 
86 TEST_F(TestUserMgr, ldapUserWithPrivMapper)
87 {
88     UserInfoMap userInfo;
89     std::string userName = "ldapUser";
90     std::string ldapGroup = "ldapGroup";
91 
92     EXPECT_CALL(mockManager, getLdapGroupName(userName))
93         .WillRepeatedly(Return(ldapGroup));
94     // Create privilege mapper dbus object
95     DbusUserObj object = createPrivilegeMapperDbusObject();
96     EXPECT_CALL(mockManager, getPrivilegeMapperObject())
97         .WillRepeatedly(Return(object));
98     userInfo = mockManager.getUserInfo(userName);
99     EXPECT_EQ(true, std::get<bool>(userInfo["RemoteUser"]));
100     EXPECT_EQ("priv-admin", std::get<std::string>(userInfo["UserPrivilege"]));
101 }
102 
103 TEST_F(TestUserMgr, ldapUserWithoutPrivMapper)
104 {
105     UserInfoMap userInfo;
106     std::string userName = "ldapUser";
107     std::string ldapGroup = "ldapGroup";
108     DbusUserObj object;
109 
110     EXPECT_CALL(mockManager, getLdapGroupName(userName))
111         .WillRepeatedly(Return(ldapGroup));
112     EXPECT_CALL(mockManager, getPrivilegeMapperObject())
113         .WillRepeatedly(Return(object));
114     userInfo = mockManager.getUserInfo(userName);
115     EXPECT_EQ(true, std::get<bool>(userInfo["RemoteUser"]));
116     EXPECT_EQ("", std::get<std::string>(userInfo["UserPrivilege"]));
117 }
118 } // namespace user
119 } // namespace phosphor
120