Unit Test: Adding unit test cases UsrMgr

This changes set will add needed unit test cases for User Manager

Change-Id: I848cdbde528d41c2a09abcf35527044b6084f023
Signed-off-by: Abhilash Raju <abhilash.kollam@gmail.com>
diff --git a/test/mock_user_mgr.hpp b/test/mock_user_mgr.hpp
index 99f2b37..b301ba7 100644
--- a/test/mock_user_mgr.hpp
+++ b/test/mock_user_mgr.hpp
@@ -25,6 +25,15 @@
 
     friend class TestUserMgr;
 };
-
+class MockUser : public Users
+{
+  public:
+    MockUser(sdbusplus::bus::bus& bus, const char* objPath,
+             std::vector<std::string> groupNames, const std::string& priv,
+             bool enabled, UserMgr& parent) :
+        Users(bus, objPath, groupNames, priv, enabled, parent)
+    {}
+    MOCK_METHOD0(createSecretKey, std::string());
+};
 } // namespace user
 } // namespace phosphor
diff --git a/test/user_mgr_test.cpp b/test/user_mgr_test.cpp
index 9dd799a..bb84e6d 100644
--- a/test/user_mgr_test.cpp
+++ b/test/user_mgr_test.cpp
@@ -55,9 +55,9 @@
                 .WillByDefault(testing::Return(false));
         }
         mockManager.usersList.emplace(
-            userName, std::make_unique<phosphor::user::Users>(
-                          mockManager.bus, userObj.c_str(), groupNames, priv,
-                          enabled, mockManager));
+            userName,
+            std::make_unique<MockUser>(mockManager.bus, userObj.c_str(),
+                                       groupNames, priv, enabled, mockManager));
     }
 
     DbusUserObj createPrivilegeMapperDbusObject(void)
@@ -131,6 +131,59 @@
     EXPECT_EQ(false, std::get<bool>(userInfo["UserPasswordExpired"]));
     EXPECT_EQ(false, std::get<bool>(userInfo["RemoteUser"]));
 }
+TEST_F(TestUserMgr, mfaEnabled)
+{
+    auto ret =
+        mockManager.enabled(MultiFactorAuthType::GoogleAuthenticator, false);
+    EXPECT_EQ(ret, MultiFactorAuthType::GoogleAuthenticator);
+    EXPECT_EQ(ret, mockManager.enabled());
+
+    ret = mockManager.enabled(MultiFactorAuthType::None, false);
+    EXPECT_EQ(ret, MultiFactorAuthType::None);
+    EXPECT_EQ(ret, mockManager.enabled());
+}
+TEST_F(TestUserMgr, mfaDefaultUser)
+{
+    std::string userName = "testUser";
+    std::string privilege = "priv-admin";
+    std::vector<std::string> groups{"testGroup"};
+    // Create local user
+    createLocalUser(userName, groups, privilege, true);
+    auto user = mockManager.getUserObject(userName);
+    EXPECT_EQ(user->secretKeyIsValid(), false);
+}
+TEST_F(TestUserMgr, mfaCreateSecretKeyEnableMFA)
+{
+    std::string userName = "testUser";
+    std::string privilege = "priv-admin";
+    std::vector<std::string> groups{"testGroup"};
+    // Create local user
+    createLocalUser(userName, groups, privilege, true);
+    MockUser* user =
+        static_cast<MockUser*>(mockManager.getUserObject(userName));
+    EXPECT_EQ(user->secretKeyIsValid(), false);
+    auto ret =
+        mockManager.enabled(MultiFactorAuthType::GoogleAuthenticator, true);
+    EXPECT_EQ(ret, MultiFactorAuthType::GoogleAuthenticator);
+    ON_CALL(*user, createSecretKey).WillByDefault(testing::Return("SKJDY&@H"));
+    user->createSecretKey();
+    EXPECT_EQ(user->secretKeyIsValid(), false);
+}
+TEST_F(TestUserMgr, bypassMFA)
+{
+    std::string userName = "testUser";
+    std::string privilege = "priv-admin";
+    std::vector<std::string> groups{"testGroup"};
+    // Create local user
+    createLocalUser(userName, groups, privilege, true);
+    MockUser* user =
+        static_cast<MockUser*>(mockManager.getUserObject(userName));
+    mockManager.enabled(MultiFactorAuthType::GoogleAuthenticator, true);
+    user->bypassedProtocol(MultiFactorAuthType::GoogleAuthenticator, false);
+    EXPECT_EQ(user->secretKeyGenerationRequired(), false);
+    user->bypassedProtocol(MultiFactorAuthType::None, false);
+    EXPECT_EQ(user->secretKeyGenerationRequired(), true);
+}
 
 TEST_F(TestUserMgr, ldapUserWithPrivMapper)
 {
diff --git a/user_mgr.hpp b/user_mgr.hpp
index b69cb87..752d72e 100644
--- a/user_mgr.hpp
+++ b/user_mgr.hpp
@@ -271,6 +271,12 @@
     void createGroup(std::string groupName) override;
 
     void deleteGroup(std::string groupName) override;
+
+    phosphor::user::Users* getUserObject(const std::string& userName)
+    {
+        return usersList[userName].get();
+    }
+
     MultiFactorAuthType enabled() const override
     {
         return MultiFactorAuthConfigurationIface::enabled();