userEnable: fix bug and add unit test
This commit adds unit tests for the |userEnable| function. To make it
happen, a new overload of |executeUserModify| is introduced. The idea
is the same as previous commits where we add sudo in unit tests.
Thanks to this unit test, this commit fixes an existing bug where the
corresponding user's |userEnabled| attribute isn't updated.
Tested: unit test passed
Coverage:
lines......: 81.3% (1918 of 2359 lines)
functions..: 93.9% (400 of 426 functions)
branches...: 32.0% (3029 of 9469 branches)
Signed-off-by: Nan Zhou <nanzhoumails@gmail.com>
Change-Id: I89752e5fcfc1aabb4090b0b2e8faf5f1b5ee5e76
diff --git a/test/user_mgr_test.cpp b/test/user_mgr_test.cpp
index 693f18c..f613f9e 100644
--- a/test/user_mgr_test.cpp
+++ b/test/user_mgr_test.cpp
@@ -264,6 +264,9 @@
ON_CALL(*this, executeUserModify(testing::_, testing::_, testing::_))
.WillByDefault(testing::Return());
+
+ ON_CALL(*this, executeUserModifyUserEnable)
+ .WillByDefault(testing::Return());
}
~UserMgrInTest() override
@@ -284,6 +287,9 @@
MOCK_METHOD(void, executeUserModify, (const char*, const char*, bool),
(override));
+ MOCK_METHOD(void, executeUserModifyUserEnable, (const char*, bool),
+ (override));
+
protected:
static sdbusplus::bus_t busInTest;
std::string tempPamConfigFile;
@@ -671,5 +677,44 @@
EXPECT_EQ(AccountPolicyIface::accountUnlockTimeout(), 3);
}
+TEST_F(UserMgrInTest, UserEnableOnSuccess)
+{
+ std::string username = "user001";
+ EXPECT_NO_THROW(
+ UserMgr::createUser(username, {"redfish", "ssh"}, "priv-user", true));
+ UserInfoMap userInfo = getUserInfo(username);
+ EXPECT_EQ(std::get<UserEnabled>(userInfo["UserEnabled"]), true);
+
+ EXPECT_NO_THROW(userEnable(username, false));
+
+ userInfo = getUserInfo(username);
+ EXPECT_EQ(std::get<UserEnabled>(userInfo["UserEnabled"]), false);
+
+ EXPECT_NO_THROW(UserMgr::deleteUser(username));
+}
+
+TEST_F(UserMgrInTest, UserEnableThrowsInternalFailureIfExecuteUserModifyFail)
+{
+ std::string username = "user001";
+ EXPECT_NO_THROW(
+ UserMgr::createUser(username, {"redfish", "ssh"}, "priv-user", true));
+ UserInfoMap userInfo = getUserInfo(username);
+ EXPECT_EQ(std::get<UserEnabled>(userInfo["UserEnabled"]), true);
+
+ EXPECT_CALL(*this, executeUserModifyUserEnable(testing::StrEq(username),
+ testing::Eq(false)))
+ .WillOnce(testing::Throw(
+ sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure()));
+ EXPECT_THROW(
+ userEnable(username, false),
+ sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure);
+
+ userInfo = getUserInfo(username);
+ // Stay unchanged
+ EXPECT_EQ(std::get<UserEnabled>(userInfo["UserEnabled"]), true);
+
+ EXPECT_NO_THROW(UserMgr::deleteUser(username));
+}
+
} // namespace user
} // namespace phosphor