This is an automated email from the ASF dual-hosted git repository.
dhavalshah9131 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/master by this push:
new 7cb5c9ce0 RANGER-5304: Add Unit Tests for
org.apache.ranger.patch.cliutil Package in Security Admin Module (#649)
7cb5c9ce0 is described below
commit 7cb5c9ce0487cd3d4d96f961a6a554cfd03d0ce3
Author: Rakesh Gupta <[email protected]>
AuthorDate: Fri Sep 12 17:27:51 2025 +0530
RANGER-5304: Add Unit Tests for org.apache.ranger.patch.cliutil Package in
Security Admin Module (#649)
---
.../patch/cliutil/TestChangePasswordUtil.java | 859 +++++++++++++++++++++
.../patch/cliutil/TestChangeUserNameUtil.java | 276 +++++++
.../patch/cliutil/TestDbToSolrMigrationUtil.java | 380 +++++++++
.../ranger/patch/cliutil/TestMetricUtil.java | 233 ++++++
.../patch/cliutil/TestRoleBasedUserSearchUtil.java | 665 +++++++++++++++-
.../patch/cliutil/TestTrxLogV2MigrationUtil.java | 132 ++++
.../cliutil/TestUpdateUserAndGroupNamesInJson.java | 132 ++++
7 files changed, 2663 insertions(+), 14 deletions(-)
diff --git
a/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestChangePasswordUtil.java
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestChangePasswordUtil.java
new file mode 100644
index 000000000..0164dd992
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestChangePasswordUtil.java
@@ -0,0 +1,859 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ranger.patch.cliutil;
+
+import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
+import org.apache.ranger.biz.UserMgr;
+import org.apache.ranger.common.MessageEnums;
+import org.apache.ranger.common.RESTErrorUtil;
+import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.db.XXPortalUserDao;
+import org.apache.ranger.entity.XXPortalUser;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.security.Permission;
+
+/**
+ * @generated by Cursor
+ * @description <Unit Test for ChangePasswordUtil class>
+ */
+@ExtendWith(MockitoExtension.class)
+@TestMethodOrder(MethodOrderer.MethodName.class)
+public class TestChangePasswordUtil {
+ @Mock
+ RangerDaoManager daoMgr;
+ @Mock
+ UserMgr userMgr;
+ @Mock
+ RESTErrorUtil restErrorUtil;
+ @Mock
+ XXPortalUserDao xXPortalUserDao;
+
+ @InjectMocks
+ private ChangePasswordUtil util = new ChangePasswordUtil();
+
+ @Test
+ public void testPrintStats() {
+ util.printStats();
+ }
+
+ @Test
+ public void testInit() throws Exception {
+ util.init();
+ }
+
+ @Test
+ public void testExecLoad_nonFips_adminPath() throws Exception {
+ ChangePasswordUtil.userLoginId = "admin";
+ ChangePasswordUtil.currentPassword = "Admin#123";
+ ChangePasswordUtil.newPassword = "Admin#234";
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+ ChangePasswordUtil.userPwdArgs = new String[] {"admin", "Admin#123",
"Admin#234"};
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("admin");
+ user.setPassword("enc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("admin")).thenReturn(user);
+ Mockito.when(userMgr.encrypt("admin", "Admin#123")).thenReturn("enc");
+
+ util.execLoad();
+ Mockito.verify(userMgr).updatePasswordInSHA256("admin", "Admin#234",
true);
+ }
+
+ @Test
+ public void testExecLoad_defaultPasswordBranch_md5() throws Exception {
+ ChangePasswordUtil.userLoginId = "admin";
+ ChangePasswordUtil.currentPassword = "Admin#123";
+ ChangePasswordUtil.newPassword = "Admin#234";
+ ChangePasswordUtil.defaultPwdChangeRequest = true;
+ ChangePasswordUtil.userPwdArgs = new String[] {"admin", "Admin#123",
"Admin#234", "-default"};
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("admin");
+ user.setPassword("md5");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("admin")).thenReturn(user);
+ Mockito.when(userMgr.encrypt("admin",
"Admin#123")).thenReturn("not-md5");
+ Mockito.when(userMgr.encryptWithOlderAlgo("admin",
"Admin#123")).thenReturn("md5");
+
+ util.execLoad();
+ Mockito.verify(userMgr).updatePasswordInSHA256("admin", "Admin#234",
true);
+ }
+
+ @Test
+ public void testMain_invokesExit() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ ChangePasswordUtil.main(new String[] {"admin", "Admin#123",
"Admin#234"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testValidatePassword_blank_throws() {
+ Mockito.when(restErrorUtil.createRESTException(Mockito.anyString(),
Mockito.any(MessageEnums.class),
+ Mockito.isNull(), Mockito.anyString(), Mockito.isNull()))
+ .thenThrow(new RuntimeException("bad password"));
+
+ try {
+ Method m =
ChangePasswordUtil.class.getDeclaredMethod("validatePassword", String.class);
+ m.setAccessible(true);
+ m.invoke(util, new Object[] {null});
+ } catch (Exception ignored) {
+ }
+ }
+
+ @Test
+ public void testValidatePassword_invalidPattern_throws() throws Exception {
+ Mockito.when(restErrorUtil.createRESTException(Mockito.anyString(),
Mockito.any(MessageEnums.class),
+ Mockito.isNull(), Mockito.anyString(), Mockito.isNull()))
+ .thenThrow(new RuntimeException("bad password"));
+
+ try {
+ Method m =
ChangePasswordUtil.class.getDeclaredMethod("validatePassword", String.class);
+ m.setAccessible(true);
+ m.invoke(util, "short");
+ } catch (Exception ignored) {
+ }
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_validPath() throws Exception {
+ ChangePasswordUtil.userPwdArgs = new String[] {"bob", "Bob#1234",
"Bob#2345", "carol", "Carol#1234", "Carol#2345"};
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser bob = new XXPortalUser();
+ bob.setLoginId("bob");
+ bob.setPassword("encB");
+ XXPortalUser carol = new XXPortalUser();
+ carol.setLoginId("carol");
+ carol.setPassword("encC");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("bob")).thenReturn(bob);
+ Mockito.when(xXPortalUserDao.findByLoginId("carol")).thenReturn(carol);
+ Mockito.when(userMgr.encrypt("bob", "Bob#1234")).thenReturn("encB");
+ Mockito.when(userMgr.encrypt("carol",
"Carol#1234")).thenReturn("encC");
+
+ util.updateMultiplePasswords();
+
+ Mockito.verify(userMgr).updatePasswordInSHA256("bob", "Bob#2345",
true);
+ Mockito.verify(userMgr).updatePasswordInSHA256("carol", "Carol#2345",
true);
+ }
+
+ @Test
+ public void testValidatePassword_valid_ok() throws Exception {
+ Method m =
ChangePasswordUtil.class.getDeclaredMethod("validatePassword", String.class);
+ m.setAccessible(true);
+ m.invoke(util, "ValidPass1");
+ }
+
+ @Test
+ public void testUpdateAdminPassword_userNotFound_exits() {
+ ChangePasswordUtil.userLoginId = "ghost";
+ ChangePasswordUtil.currentPassword = "Some#123";
+ ChangePasswordUtil.newPassword = "Some#234";
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("ghost")).thenReturn(null);
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ util.updateAdminPassword();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testUpdateAdminPassword_encryptMismatch_nonDefault_exits() {
+ ChangePasswordUtil.userLoginId = "alice";
+ ChangePasswordUtil.currentPassword = "Alice#123";
+ ChangePasswordUtil.newPassword = "Alice#234";
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("alice");
+ user.setPassword("encDb");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("alice")).thenReturn(user);
+ Mockito.when(userMgr.encrypt("alice",
"Alice#123")).thenReturn("differentEnc");
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ util.updateAdminPassword();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_defaultMismatch_exits() {
+ ChangePasswordUtil.userPwdArgs = new String[] {"bob", "Bob#1234",
"Bob#2345", "-default"};
+ ChangePasswordUtil.defaultPwdChangeRequest = true;
+
+ XXPortalUser bob = new XXPortalUser();
+ bob.setLoginId("bob");
+ bob.setPassword("encB");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("bob")).thenReturn(bob);
+ Mockito.when(userMgr.encrypt("bob",
"Bob#1234")).thenReturn("encOther");
+ Mockito.lenient().when(userMgr.encryptWithOlderAlgo("bob",
"Bob#1234")).thenReturn("notEncB");
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ util.updateMultiplePasswords();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_incorrectArgs_exits() {
+ Integer status = runAndCaptureExitCode(() ->
ChangePasswordUtil.main(new String[] {"onlyTwo", "args"}));
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testUpdateAdminPassword_nonFips_valid_updates() throws
Exception {
+ ChangePasswordUtil.userLoginId = "dave";
+ ChangePasswordUtil.currentPassword = "Dave#123";
+ ChangePasswordUtil.newPassword = "Dave#234";
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("dave");
+ user.setPassword("dbEnc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("dave")).thenReturn(user);
+ Mockito.when(userMgr.encrypt("dave", "Dave#123")).thenReturn("dbEnc");
+
+ util.updateAdminPassword();
+
+ Mockito.verify(userMgr).updatePasswordInSHA256("dave", "Dave#234",
true);
+ }
+
+ @Test
+ public void testUpdateAdminPassword_fips_default_mismatch_exits() {
+ ChangePasswordUtil.userLoginId = "erin";
+ ChangePasswordUtil.currentPassword = "Erin#123";
+ ChangePasswordUtil.newPassword = "Erin#234";
+ ChangePasswordUtil.defaultPwdChangeRequest = true;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("erin");
+ user.setPassword("dbEnc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("erin")).thenReturn(user);
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ util.updateAdminPassword();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_invalidArgs_exits() {
+ ChangePasswordUtil.userPwdArgs = new String[] {"", "c", "n"};
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ util.updateMultiplePasswords();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_missingNewPassword_exits() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ ChangePasswordUtil.main(new String[] {"u", "p", ""});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_withDefaultFlag_runs() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ ChangePasswordUtil.main(new String[] {"u", "p1", "p2",
"-default"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_moreThanFourArgs_withDefaultFlag_runs() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ ChangePasswordUtil.main(new String[] {"u1", "p1", "n1", "u2",
"p2", "n2", "-default"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testUpdateAdminPassword_fips_default_matches_updates() throws
Exception {
+ ChangePasswordUtil.userLoginId = "fips";
+ ChangePasswordUtil.currentPassword = "Old#1234";
+ ChangePasswordUtil.newPassword = "New#1234";
+ ChangePasswordUtil.defaultPwdChangeRequest = true;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("fips");
+ user.setPassword("md5enc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("fips")).thenReturn(user);
+ Mockito.when(userMgr.encrypt("fips",
"Old#1234")).thenReturn("otherEnc");
+ // Simulate FIPS enabled path via isPasswordValid not used in default
path
+ Mockito.when(userMgr.encryptWithOlderAlgo("fips",
"Old#1234")).thenReturn("md5enc");
+
+ util.updateAdminPassword();
+
+ Mockito.verify(userMgr).updatePasswordInSHA256("fips", "New#1234",
true);
+ }
+
+ @Test
+ public void testMain_blankNewPassword_exits() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ ChangePasswordUtil.main(new String[] {"u", "p", ""});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_blankLogin_exits() {
+ Integer status = runAndCaptureExitCode(() ->
ChangePasswordUtil.main(new String[] {"", "p", "n"}));
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testMain_blankCurrent_exits() {
+ Integer status = runAndCaptureExitCode(() ->
ChangePasswordUtil.main(new String[] {"u", "", "n"}));
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_skipDefaultToken_noExit() {
+ ChangePasswordUtil.userPwdArgs = new String[] {"-default", "ignored1",
"ignored2"};
+ util.updateMultiplePasswords();
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_emptyCurrent_exits() {
+ ChangePasswordUtil.userPwdArgs = new String[] {"u", "", "n"};
+ Integer status = runAndCaptureExitCode(() ->
util.updateMultiplePasswords());
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testMain_fourArgs_nonDefault_runs() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ ChangePasswordUtil.main(new String[] {"u", "p1", "p2",
"someFlag"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_moreThanFourArgs_withoutDefault_runs() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ ChangePasswordUtil.main(new String[] {"u1", "p1", "n1", "u2",
"p2", "n2"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_emptyNew_exits() {
+ ChangePasswordUtil.userPwdArgs = new String[] {"u", "c", ""};
+ Integer status = runAndCaptureExitCode(() ->
util.updateMultiplePasswords());
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_userNotFound_exits() {
+ ChangePasswordUtil.userPwdArgs = new String[] {"nouser", "c", "n"};
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("nouser")).thenReturn(null);
+ Integer status = runAndCaptureExitCode(() ->
util.updateMultiplePasswords());
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_mismatchNonDefault_exits() {
+ ChangePasswordUtil.userPwdArgs = new String[] {"user", "cur", "new"};
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("user");
+ user.setPassword("dbEnc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("user")).thenReturn(user);
+ Mockito.when(userMgr.encrypt("user", "cur")).thenReturn("notDbEnc");
+
+ Integer status = runAndCaptureExitCode(() ->
util.updateMultiplePasswords());
+ Assertions.assertEquals(1, status);
+ }
+
+ private static Integer runAndCaptureExitCode(Runnable r) {
+ class ExitException extends SecurityException {
+ final int code;
+
+ ExitException(int code) {
+ this.code = code;
+ }
+ }
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new ExitException(status);
+ }
+ });
+ try {
+ r.run();
+ } catch (ExitException e) {
+ return e.code;
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ return null;
+ }
+
+ @Test
+ public void
testUpdateAdminPassword_fips_nonDefault_isPasswordValid_updates() throws
Exception {
+ ChangePasswordUtil.userLoginId = "fipsUser";
+ ChangePasswordUtil.currentPassword = "Old#1234";
+ ChangePasswordUtil.newPassword = "New#1234";
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("fipsUser");
+ user.setPassword("dbHash");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("fipsUser")).thenReturn(user);
+
+ RangerAdminConfig cfg = Mockito.mock(RangerAdminConfig.class);
+ Mockito.when(cfg.isFipsEnabled()).thenReturn(true);
+ Field f = util.getClass().getSuperclass().getDeclaredField("config");
+ f.setAccessible(true);
+ f.set(util, cfg);
+
+ Mockito.when(userMgr.isPasswordValid("fipsUser", "dbHash",
"Old#1234")).thenReturn(true);
+
+ util.updateAdminPassword();
+
+ Mockito.verify(userMgr).updatePasswordInSHA256("fipsUser", "New#1234",
true);
+ }
+
+ @Test
+ public void
testUpdateMultiplePasswords_fips_nonDefault_isPasswordValid_updates() throws
Exception {
+ ChangePasswordUtil.userPwdArgs = new String[] {"fipsMulti",
"Old#1234", "New#1234"};
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("fipsMulti");
+ user.setPassword("dbHash");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("fipsMulti")).thenReturn(user);
+
+ RangerAdminConfig cfg = Mockito.mock(RangerAdminConfig.class);
+ Mockito.when(cfg.isFipsEnabled()).thenReturn(true);
+ Field f = util.getClass().getSuperclass().getDeclaredField("config");
+ f.setAccessible(true);
+ f.set(util, cfg);
+
+ Mockito.when(userMgr.isPasswordValid("fipsMulti", "dbHash",
"Old#1234")).thenReturn(true);
+
+ util.updateMultiplePasswords();
+
+ Mockito.verify(userMgr).updatePasswordInSHA256("fipsMulti",
"New#1234", true);
+ }
+
+ @Test
+ public void
testUpdateAdminPassword_fipsDefault_matches_updates_withFipsConfig() throws
Exception {
+ Mockito.reset(userMgr);
+ ChangePasswordUtil.userLoginId = "fipsAdmin";
+ ChangePasswordUtil.currentPassword = "Old#1234";
+ ChangePasswordUtil.newPassword = "New#1234";
+ ChangePasswordUtil.defaultPwdChangeRequest = true;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("fipsAdmin");
+ user.setPassword("md5hash");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("fipsAdmin")).thenReturn(user);
+
+ RangerAdminConfig cfg = Mockito.mock(RangerAdminConfig.class);
+ Mockito.when(cfg.isFipsEnabled()).thenReturn(true);
+ Field f = util.getClass().getSuperclass().getDeclaredField("config");
+ f.setAccessible(true);
+ f.set(util, cfg);
+
+ Mockito.when(userMgr.encryptWithOlderAlgo("fipsAdmin",
"Old#1234")).thenReturn("md5hash");
+
+ util.updateAdminPassword();
+
+ Mockito.verify(userMgr).updatePasswordInSHA256("fipsAdmin",
"New#1234", true);
+ }
+
+ @Test
+ public void
testUpdateAdminPassword_fipsDefault_mismatch_exits_withFipsConfig() throws
Exception {
+ ChangePasswordUtil.userLoginId = "fipsAdmin2";
+ ChangePasswordUtil.currentPassword = "Old#1234";
+ ChangePasswordUtil.newPassword = "New#1234";
+ ChangePasswordUtil.defaultPwdChangeRequest = true;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("fipsAdmin2");
+ user.setPassword("dbHash");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("fipsAdmin2")).thenReturn(user);
+
+ RangerAdminConfig cfg = Mockito.mock(RangerAdminConfig.class);
+ Mockito.when(cfg.isFipsEnabled()).thenReturn(true);
+ Field f = util.getClass().getSuperclass().getDeclaredField("config");
+ f.setAccessible(true);
+ f.set(util, cfg);
+
+ Mockito.when(userMgr.encryptWithOlderAlgo("fipsAdmin2",
"Old#1234")).thenReturn("notDbHash");
+
+ Integer status = runAndCaptureExitCode(() ->
util.updateAdminPassword());
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testUpdateAdminPassword_fips_nonDefault_invalid_noUpdate()
throws Exception {
+ Mockito.reset(userMgr);
+ ChangePasswordUtil.userLoginId = "fipsNoUpdate";
+ ChangePasswordUtil.currentPassword = "Old#1234";
+ ChangePasswordUtil.newPassword = "New#1234";
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("fipsNoUpdate");
+ user.setPassword("dbHash");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("fipsNoUpdate")).thenReturn(user);
+
+ RangerAdminConfig cfg = Mockito.mock(RangerAdminConfig.class);
+ Mockito.when(cfg.isFipsEnabled()).thenReturn(true);
+ Field f = util.getClass().getSuperclass().getDeclaredField("config");
+ f.setAccessible(true);
+ f.set(util, cfg);
+
+ Mockito.when(userMgr.isPasswordValid("fipsNoUpdate", "dbHash",
"Old#1234")).thenReturn(false);
+
+ util.updateAdminPassword();
+
+ Mockito.verify(userMgr,
Mockito.never()).updatePasswordInSHA256(Mockito.anyString(),
Mockito.anyString(),
+ Mockito.anyBoolean());
+ }
+
+ @Test
+ public void testUpdateAdminPassword_exception_exits() {
+ ChangePasswordUtil.userLoginId = "exAdmin";
+ ChangePasswordUtil.currentPassword = "Old#1234";
+ ChangePasswordUtil.newPassword = "New#1234";
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("exAdmin");
+ user.setPassword("dbEnc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("exAdmin")).thenReturn(user);
+ Mockito.when(userMgr.encrypt("exAdmin", "Old#1234")).thenThrow(new
RuntimeException("boom"));
+
+ Integer status = runAndCaptureExitCode(() ->
util.updateAdminPassword());
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_fips_default_matches_updates()
throws Exception {
+ Mockito.reset(userMgr);
+ ChangePasswordUtil.userPwdArgs = new String[] {"fipsMultiDef",
"Old#1234", "New#1234"};
+ ChangePasswordUtil.defaultPwdChangeRequest = true;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("fipsMultiDef");
+ user.setPassword("md5hash");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("fipsMultiDef")).thenReturn(user);
+
+ RangerAdminConfig cfg = Mockito.mock(RangerAdminConfig.class);
+ Mockito.when(cfg.isFipsEnabled()).thenReturn(true);
+ Field f = util.getClass().getSuperclass().getDeclaredField("config");
+ f.setAccessible(true);
+ f.set(util, cfg);
+
+ Mockito.when(userMgr.encryptWithOlderAlgo("fipsMultiDef",
"Old#1234")).thenReturn("md5hash");
+
+ util.updateMultiplePasswords();
+
+ Mockito.verify(userMgr).updatePasswordInSHA256("fipsMultiDef",
"New#1234", true);
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_fips_default_mismatch_exits()
throws Exception {
+ ChangePasswordUtil.userPwdArgs = new String[] {"fipsMultiDef2",
"Old#1234", "New#1234"};
+ ChangePasswordUtil.defaultPwdChangeRequest = true;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("fipsMultiDef2");
+ user.setPassword("dbHash");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("fipsMultiDef2")).thenReturn(user);
+
+ RangerAdminConfig cfg = Mockito.mock(RangerAdminConfig.class);
+ Mockito.when(cfg.isFipsEnabled()).thenReturn(true);
+ Field f = util.getClass().getSuperclass().getDeclaredField("config");
+ f.setAccessible(true);
+ f.set(util, cfg);
+
+ Mockito.when(userMgr.encryptWithOlderAlgo("fipsMultiDef2",
"Old#1234")).thenReturn("notDbHash");
+
+ Integer status = runAndCaptureExitCode(() ->
util.updateMultiplePasswords());
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_fips_nonDefault_invalid_noUpdate()
throws Exception {
+ Mockito.reset(userMgr);
+ ChangePasswordUtil.userPwdArgs = new String[] {"fipsNoUpd",
"Old#1234", "New#1234"};
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("fipsNoUpd");
+ user.setPassword("dbHash");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("fipsNoUpd")).thenReturn(user);
+
+ RangerAdminConfig cfg = Mockito.mock(RangerAdminConfig.class);
+ Mockito.when(cfg.isFipsEnabled()).thenReturn(true);
+ Field f = util.getClass().getSuperclass().getDeclaredField("config");
+ f.setAccessible(true);
+ f.set(util, cfg);
+
+ Mockito.when(userMgr.isPasswordValid("fipsNoUpd", "dbHash",
"Old#1234")).thenReturn(false);
+
+ util.updateMultiplePasswords();
+
+ Mockito.verify(userMgr,
Mockito.never()).updatePasswordInSHA256(Mockito.anyString(),
Mockito.anyString(),
+ Mockito.anyBoolean());
+ }
+
+ @Test
+ public void testUpdateMultiplePasswords_exception_exits() {
+ ChangePasswordUtil.userPwdArgs = new String[] {"exMulti", "Old#1234",
"New#1234"};
+ ChangePasswordUtil.defaultPwdChangeRequest = false;
+
+ XXPortalUser user = new XXPortalUser();
+ user.setLoginId("exMulti");
+ user.setPassword("dbEnc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("exMulti")).thenReturn(user);
+ Mockito.when(userMgr.encrypt("exMulti", "Old#1234")).thenThrow(new
RuntimeException("boom"));
+
+ Integer status = runAndCaptureExitCode(() ->
util.updateMultiplePasswords());
+ Assertions.assertEquals(1, status);
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestChangeUserNameUtil.java
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestChangeUserNameUtil.java
new file mode 100644
index 000000000..c6a495898
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestChangeUserNameUtil.java
@@ -0,0 +1,276 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ranger.patch.cliutil;
+
+import org.apache.ranger.biz.UserMgr;
+import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.db.XXPortalUserDao;
+import org.apache.ranger.entity.XXPortalUser;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.security.Permission;
+
+/**
+ * @generated by Cursor
+ * @description <Unit Test for ChangeUserNameUtil class>
+ */
+@ExtendWith(MockitoExtension.class)
+@TestMethodOrder(MethodOrderer.MethodName.class)
+public class TestChangeUserNameUtil {
+ @Mock
+ RangerDaoManager daoMgr;
+ @Mock
+ UserMgr userMgr;
+ @Mock
+ XXPortalUserDao xXPortalUserDao;
+
+ @InjectMocks
+ private ChangeUserNameUtil util = new ChangeUserNameUtil();
+
+ @Test
+ public void testUpdateUserName_success() throws Exception {
+ ChangeUserNameUtil.userLoginId = "alice";
+ ChangeUserNameUtil.currentPassword = "Pass#123";
+ ChangeUserNameUtil.newUserName = "alice2";
+
+ XXPortalUser existing = new XXPortalUser();
+ existing.setLoginId("alice");
+ existing.setPassword("enc");
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("alice2")).thenReturn(null);
+
Mockito.when(xXPortalUserDao.findByLoginId("alice")).thenReturn(existing);
+ Mockito.when(userMgr.encrypt("alice", "Pass#123")).thenReturn("enc");
+
+ util.updateUserName();
+
+ Mockito.verify(userMgr).updateOldUserName("alice", "alice2",
"Pass#123");
+ }
+
+ @Test
+ public void testUpdateUserName_duplicateNewUserName() {
+ ChangeUserNameUtil.userLoginId = "bob";
+ ChangeUserNameUtil.currentPassword = "Pass#123";
+ ChangeUserNameUtil.newUserName = "existing";
+
+ XXPortalUser dup = new XXPortalUser();
+ dup.setLoginId("existing");
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("existing")).thenReturn(dup);
+
+ runIgnoringSystemExit(() -> util.updateUserName());
+
+ Mockito.verify(userMgr,
Mockito.never()).updateOldUserName(Mockito.anyString(), Mockito.anyString(),
+ Mockito.anyString());
+ }
+
+ @Test
+ public void testUpdateUserName_userNotFound_exit() {
+ ChangeUserNameUtil.userLoginId = "nouser";
+ ChangeUserNameUtil.currentPassword = "Pass#123";
+ ChangeUserNameUtil.newUserName = "newname";
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("newname")).thenReturn(null);
+ Mockito.when(xXPortalUserDao.findByLoginId("nouser")).thenReturn(null);
+
+ runIgnoringSystemExit(() -> util.updateUserName());
+
+ Mockito.verify(userMgr,
Mockito.never()).updateOldUserName(Mockito.anyString(), Mockito.anyString(),
+ Mockito.anyString());
+ }
+
+ @Test
+ public void testUpdateUserName_invalidPassword_exit() throws Exception {
+ ChangeUserNameUtil.userLoginId = "charlie";
+ ChangeUserNameUtil.currentPassword = "wrong";
+ ChangeUserNameUtil.newUserName = "charlie2";
+
+ XXPortalUser existing = new XXPortalUser();
+ existing.setLoginId("charlie");
+ existing.setPassword("enc1");
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("charlie2")).thenReturn(null);
+
Mockito.when(xXPortalUserDao.findByLoginId("charlie")).thenReturn(existing);
+ Mockito.when(userMgr.encrypt("charlie", "wrong")).thenReturn("enc2");
+
+ runIgnoringSystemExit(() -> util.updateUserName());
+
+ Mockito.verify(userMgr,
Mockito.never()).updateOldUserName(Mockito.anyString(), Mockito.anyString(),
+ Mockito.anyString());
+ }
+
+ @Test
+ public void testPrintStats() {
+ util.printStats();
+ }
+
+ @Test
+ public void testInit() throws Exception {
+ util.init();
+ }
+
+ @Test
+ public void testExecLoad_invokesUpdateUserName() {
+ ChangeUserNameUtil.userLoginId = "u1";
+ ChangeUserNameUtil.currentPassword = "p1";
+ ChangeUserNameUtil.newUserName = "u2";
+
+ // Prepare minimal stubs for a successful path
+ XXPortalUser existing = new XXPortalUser();
+ existing.setLoginId("u1");
+ existing.setPassword("enc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+ Mockito.when(xXPortalUserDao.findByLoginId("u2")).thenReturn(null);
+ Mockito.when(xXPortalUserDao.findByLoginId("u1")).thenReturn(existing);
+ Mockito.when(userMgr.encrypt("u1", "p1")).thenReturn("enc");
+
+ util.execLoad();
+
+ Mockito.verify(userMgr).updateOldUserName("u1", "u2", "p1");
+ }
+
+ @Test
+ public void testMain_incorrectArgs_exits() {
+ Integer status = runAndCaptureExitCode(() ->
ChangeUserNameUtil.main(new String[] {"only", "two"}));
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testMain_validArgs_runs() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ ChangeUserNameUtil.main(new String[] {"u", "p", "n"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_blankLogin_exits() {
+ Integer status = runAndCaptureExitCode(() ->
ChangeUserNameUtil.main(new String[] {"", "p", "n"}));
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testMain_blankCurrent_exits() {
+ Integer status = runAndCaptureExitCode(() ->
ChangeUserNameUtil.main(new String[] {"u", "", "n"}));
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testMain_blankNewUsername_exits() {
+ Integer status = runAndCaptureExitCode(() ->
ChangeUserNameUtil.main(new String[] {"u", "p", ""}));
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testMain_zeroArgs_exits() {
+ Integer status = runAndCaptureExitCode(() ->
ChangeUserNameUtil.main(new String[] {}));
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testMain_fourArgs_exits() {
+ Integer status = runAndCaptureExitCode(() ->
ChangeUserNameUtil.main(new String[] {"a", "b", "c", "d"}));
+ Assertions.assertEquals(1, status);
+ }
+
+ @Test
+ public void testMain_validArgs_exit_withoutSpringContext() {
+ Integer status = runAndCaptureExitCode(() ->
ChangeUserNameUtil.main(new String[] {"u", "p", "n"}));
+ Assertions.assertEquals(1, status);
+ }
+
+ private static void runIgnoringSystemExit(Runnable r) {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ r.run();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ private static Integer runAndCaptureExitCode(Runnable r) {
+ class ExitException extends SecurityException {
+ final int code;
+
+ ExitException(int code) {
+ this.code = code;
+ }
+ }
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new ExitException(status);
+ }
+ });
+ try {
+ r.run();
+ } catch (ExitException e) {
+ return e.code;
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ return null;
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestDbToSolrMigrationUtil.java
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestDbToSolrMigrationUtil.java
new file mode 100644
index 000000000..f25b08cde
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestDbToSolrMigrationUtil.java
@@ -0,0 +1,380 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ranger.patch.cliutil;
+
+import org.apache.ranger.common.PropertiesUtil;
+import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.db.XXAccessAuditDao;
+import org.apache.ranger.entity.XXAccessAudit;
+import org.apache.ranger.entity.XXAccessAuditV4;
+import org.apache.ranger.entity.XXAccessAuditV5;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.response.UpdateResponse;
+import org.apache.solr.common.SolrInputDocument;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.lang.reflect.Method;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.Permission;
+import java.util.Arrays;
+import java.util.Collections;
+
+/**
+ * @generated by Cursor
+ * @description <Unit Test for DbToSolrMigrationUtil class>
+ */
+@ExtendWith(MockitoExtension.class)
+@TestMethodOrder(MethodOrderer.MethodName.class)
+public class TestDbToSolrMigrationUtil {
+ @Mock
+ RangerDaoManager daoManager;
+ @Mock
+ XXAccessAuditDao xxAccessAuditDao;
+ @Mock
+ SolrClient solrClient;
+ @Mock
+ UpdateResponse updateResponse;
+
+ @InjectMocks
+ private DbToSolrMigrationUtil util = new DbToSolrMigrationUtil();
+
+ @Test
+ public void testSend2solr_v4AndV5AndV6() throws Throwable {
+ DbToSolrMigrationUtil.solrClient = solrClient;
+ Mockito.when(updateResponse.getStatus()).thenReturn(0);
+
Mockito.when(solrClient.add(Mockito.any(SolrInputDocument.class))).thenReturn(updateResponse);
+
+ XXAccessAuditV4 v4 = new XXAccessAuditV4();
+ v4.setId(1L);
+ util.send2solr(v4);
+
+ XXAccessAuditV5 v5 = new XXAccessAuditV5();
+ v5.setId(2L);
+ util.send2solr(v5);
+
+ XXAccessAudit v6 = new XXAccessAudit();
+ v6.setId(3L);
+ util.send2solr(v6);
+
+ Mockito.verify(solrClient,
Mockito.times(3)).add(Mockito.any(SolrInputDocument.class));
+ }
+
+ @Test
+ public void testPrintStats() {
+ util.printStats();
+ }
+
+ @Test
+ public void testInit_noProperties_noThrow() throws Exception {
+ util.init();
+ }
+
+ @Test
+ public void testExecLoad_earlyReturn() {
+
Mockito.when(daoManager.getXXAccessAudit()).thenReturn(xxAccessAuditDao);
+
Mockito.when(xxAccessAuditDao.getMaxIdOfXXAccessAudit()).thenReturn(0L);
+
+ util.execLoad();
+
+ Mockito.verify(xxAccessAuditDao).getMaxIdOfXXAccessAudit();
+ }
+
+ @Test
+ public void testRegisterSolrClientJAAS_viaReflection() throws Exception {
+ Method m =
DbToSolrMigrationUtil.class.getDeclaredMethod("registerSolrClientJAAS");
+ m.setAccessible(true);
+ m.invoke(util);
+ }
+
+ @Test
+ public void testMain_invokesExit() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ DbToSolrMigrationUtil.main(new String[] {});
+ } catch (SecurityException ignored) {
+ }
+ } catch (Exception ignored) {
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testWriteAndReadMigrationStatusFile_viaReflection() throws
Exception {
+ Path tmp = Files.createTempFile("ranger-mig-", ".txt");
+ Method write =
DbToSolrMigrationUtil.class.getDeclaredMethod("writeMigrationStatusFile",
Long.class,
+ String.class);
+ write.setAccessible(true);
+ write.invoke(util, 123L, tmp.toString());
+
+ Method read =
DbToSolrMigrationUtil.class.getDeclaredMethod("readMigrationStatusFile",
String.class);
+ read.setAccessible(true);
+ Object val = read.invoke(util, tmp.toString());
+
+ Assertions.assertEquals(123L, ((Long) val).longValue());
+ }
+
+ @Test
+ public void testMigrateAuditDbLogsToSolr_earlyReturn() {
+
Mockito.when(daoManager.getXXAccessAudit()).thenReturn(xxAccessAuditDao);
+
Mockito.when(xxAccessAuditDao.getMaxIdOfXXAccessAudit()).thenReturn(0L);
+
+ util.migrateAuditDbLogsToSolr();
+
+ Mockito.verify(xxAccessAuditDao).getMaxIdOfXXAccessAudit();
+ }
+
+ @Test
+ public void testCreateSolrClient_withZkHosts_attemptsCloudPath() throws
Exception {
+ try {
+
PropertiesUtil.getPropertiesMap().put(DbToSolrMigrationUtil.SOLR_ZK_HOSTS,
"host1:2181,host2:2181");
+
PropertiesUtil.getPropertiesMap().put(DbToSolrMigrationUtil.SOLR_COLLECTION_NAME,
"ranger_audits");
+
+ Method m =
DbToSolrMigrationUtil.class.getDeclaredMethod("createSolrClient");
+ m.setAccessible(true);
+ Assertions.assertThrows(Exception.class, () -> {
+ try {
+ m.invoke(util);
+ } catch (Throwable t) {
+ if (t instanceof Exception) {
+ throw (Exception) t;
+ }
+ throw new RuntimeException(t);
+ }
+ });
+ } finally {
+
PropertiesUtil.getPropertiesMap().remove(DbToSolrMigrationUtil.SOLR_ZK_HOSTS);
+
PropertiesUtil.getPropertiesMap().remove(DbToSolrMigrationUtil.SOLR_COLLECTION_NAME);
+ }
+ }
+
+ @Test
+ public void testCreateSolrClient_withUrl_returnsHttp() throws Exception {
+ try {
+
PropertiesUtil.getPropertiesMap().put(DbToSolrMigrationUtil.SOLR_URLS_PROP,
"http://localhost:8983/solr");
+
+ Method m =
DbToSolrMigrationUtil.class.getDeclaredMethod("createSolrClient");
+ m.setAccessible(true);
+ Object client = m.invoke(util);
+
+ Assertions.assertTrue(client instanceof HttpSolrClient);
+ } finally {
+
PropertiesUtil.getPropertiesMap().remove(DbToSolrMigrationUtil.SOLR_URLS_PROP);
+ }
+ }
+
+ @Test
+ public void testReadMigrationStatusFile_nonexistent_returnsZero() throws
Exception {
+ Method read =
DbToSolrMigrationUtil.class.getDeclaredMethod("readMigrationStatusFile",
String.class);
+ read.setAccessible(true);
+ Object val = read.invoke(util, Paths.get("nonexistent-file-" +
System.nanoTime()).toString());
+ Assertions.assertEquals(0L, ((Long) val).longValue());
+ }
+
+ @Test
+ public void testReadMigrationStatusFile_invalidContent_returnsZero()
throws Exception {
+ Path tmp = Files.createTempFile("ranger-mig-invalid-", ".txt");
+ Files.write(tmp, Arrays.asList("abc"));
+ Method read =
DbToSolrMigrationUtil.class.getDeclaredMethod("readMigrationStatusFile",
String.class);
+ read.setAccessible(true);
+ Object val = read.invoke(util, tmp.toString());
+ Assertions.assertEquals(0L, ((Long) val).longValue());
+ }
+
+ @Test
+ public void testSend2solr_v4_nonzeroStatus_throws() throws Exception {
+ DbToSolrMigrationUtil.solrClient = solrClient;
+ Mockito.when(updateResponse.getStatus()).thenReturn(1);
+
Mockito.when(solrClient.add(Mockito.any(SolrInputDocument.class))).thenReturn(updateResponse);
+ XXAccessAuditV4 v4 = new XXAccessAuditV4();
+ v4.setId(11L);
+ Assertions.assertThrows(Exception.class, () -> {
+ try {
+ util.send2solr(v4);
+ } catch (Throwable t) {
+ if (t instanceof Exception) {
+ throw (Exception) t;
+ }
+ throw new RuntimeException(t);
+ }
+ });
+ }
+
+ @Test
+ public void testSend2solr_v5_nonzeroStatus_throws() throws Exception {
+ DbToSolrMigrationUtil.solrClient = solrClient;
+ Mockito.when(updateResponse.getStatus()).thenReturn(1);
+
Mockito.when(solrClient.add(Mockito.any(SolrInputDocument.class))).thenReturn(updateResponse);
+ XXAccessAuditV5 v5 = new XXAccessAuditV5();
+ v5.setId(12L);
+ Assertions.assertThrows(Exception.class, () -> {
+ try {
+ util.send2solr(v5);
+ } catch (Throwable t) {
+ if (t instanceof Exception) {
+ throw (Exception) t;
+ }
+ throw new RuntimeException(t);
+ }
+ });
+ }
+
+ @Test
+ public void testSend2solr_v6_nonzeroStatus_throws() throws Exception {
+ DbToSolrMigrationUtil.solrClient = solrClient;
+ Mockito.when(updateResponse.getStatus()).thenReturn(1);
+
Mockito.when(solrClient.add(Mockito.any(SolrInputDocument.class))).thenReturn(updateResponse);
+ XXAccessAudit v6 = new XXAccessAudit();
+ v6.setId(13L);
+ Assertions.assertThrows(Exception.class, () -> {
+ try {
+ util.send2solr(v6);
+ } catch (Throwable t) {
+ if (t instanceof Exception) {
+ throw (Exception) t;
+ }
+ throw new RuntimeException(t);
+ }
+ });
+ }
+
+ @Test
+ public void testMigrateAuditDbLogsToSolr_v4_success_closesClient() throws
Exception {
+ DbToSolrMigrationUtil.solrClient = solrClient;
+
Mockito.when(daoManager.getXXAccessAudit()).thenReturn(xxAccessAuditDao);
+
Mockito.when(xxAccessAuditDao.getMaxIdOfXXAccessAudit()).thenReturn(1L);
+
Mockito.when(xxAccessAuditDao.getColumnNames(Mockito.anyString())).thenReturn(Collections.emptyList());
+ XXAccessAuditV4 rec = new XXAccessAuditV4();
+ rec.setId(1L);
+ Mockito.when(xxAccessAuditDao.getByIdRangeV4(Mockito.anyLong(),
Mockito.anyLong()))
+ .thenReturn(Collections.singletonList(rec));
+ Mockito.when(updateResponse.getStatus()).thenReturn(0);
+
Mockito.when(solrClient.add(Mockito.any(SolrInputDocument.class))).thenReturn(updateResponse);
+
+ util.migrateAuditDbLogsToSolr();
+
+ Mockito.verify(solrClient,
Mockito.times(1)).add(Mockito.any(SolrInputDocument.class));
+ Mockito.verify(solrClient, Mockito.times(1)).close();
+ Assertions.assertNull(DbToSolrMigrationUtil.solrClient);
+ Files.deleteIfExists(Paths.get("migration_check_file.txt"));
+ }
+
+ @Test
+ public void testMigrateAuditDbLogsToSolr_v4_failure_doesNotCloseClient()
throws Exception {
+ DbToSolrMigrationUtil.solrClient = solrClient;
+
Mockito.when(daoManager.getXXAccessAudit()).thenReturn(xxAccessAuditDao);
+
Mockito.when(xxAccessAuditDao.getMaxIdOfXXAccessAudit()).thenReturn(1L);
+
Mockito.when(xxAccessAuditDao.getColumnNames(Mockito.anyString())).thenReturn(Collections.emptyList());
+ XXAccessAuditV4 rec = new XXAccessAuditV4();
+ rec.setId(1L);
+ Mockito.when(xxAccessAuditDao.getByIdRangeV4(Mockito.anyLong(),
Mockito.anyLong()))
+ .thenReturn(Collections.singletonList(rec));
+ Mockito.when(updateResponse.getStatus()).thenReturn(1);
+
Mockito.when(solrClient.add(Mockito.any(SolrInputDocument.class))).thenReturn(updateResponse);
+
+ util.migrateAuditDbLogsToSolr();
+
+ Mockito.verify(solrClient,
Mockito.times(1)).add(Mockito.any(SolrInputDocument.class));
+ Mockito.verify(solrClient, Mockito.never()).close();
+ Assertions.assertNotNull(DbToSolrMigrationUtil.solrClient);
+ Files.deleteIfExists(Paths.get("migration_check_file.txt"));
+ }
+
+ @Test
+ public void testMigrateAuditDbLogsToSolr_v5_success_closesClient() throws
Exception {
+ DbToSolrMigrationUtil.solrClient = solrClient;
+
Mockito.when(daoManager.getXXAccessAudit()).thenReturn(xxAccessAuditDao);
+
Mockito.when(xxAccessAuditDao.getMaxIdOfXXAccessAudit()).thenReturn(1L);
+ Mockito.when(xxAccessAuditDao.getColumnNames(Mockito.anyString()))
+ .thenReturn(Arrays.asList("seq_num", "event_count",
"event_dur_ms"));
+
+ XXAccessAuditV5 rec = new XXAccessAuditV5();
+ rec.setId(1L);
+ Mockito.when(xxAccessAuditDao.getByIdRangeV5(Mockito.anyLong(),
Mockito.anyLong()))
+ .thenReturn(Collections.singletonList(rec));
+ Mockito.when(updateResponse.getStatus()).thenReturn(0);
+
Mockito.when(solrClient.add(Mockito.any(SolrInputDocument.class))).thenReturn(updateResponse);
+
+ util.migrateAuditDbLogsToSolr();
+
+ Mockito.verify(solrClient,
Mockito.times(1)).add(Mockito.any(SolrInputDocument.class));
+ Mockito.verify(solrClient, Mockito.times(1)).close();
+ Assertions.assertNull(DbToSolrMigrationUtil.solrClient);
+ Files.deleteIfExists(Paths.get("migration_check_file.txt"));
+ }
+
+ @Test
+ public void testMigrateAuditDbLogsToSolr_v6_success_closesClient() throws
Exception {
+ DbToSolrMigrationUtil.solrClient = solrClient;
+
Mockito.when(daoManager.getXXAccessAudit()).thenReturn(xxAccessAuditDao);
+
Mockito.when(xxAccessAuditDao.getMaxIdOfXXAccessAudit()).thenReturn(1L);
+
Mockito.when(xxAccessAuditDao.getColumnNames(Mockito.anyString())).thenReturn(Arrays.asList("tags"));
+
+ XXAccessAudit rec = new XXAccessAudit();
+ rec.setId(1L);
+ Mockito.when(xxAccessAuditDao.getByIdRangeV6(Mockito.anyLong(),
Mockito.anyLong()))
+ .thenReturn(Collections.singletonList(rec));
+ Mockito.when(updateResponse.getStatus()).thenReturn(0);
+
Mockito.when(solrClient.add(Mockito.any(SolrInputDocument.class))).thenReturn(updateResponse);
+
+ util.migrateAuditDbLogsToSolr();
+
+ Mockito.verify(solrClient,
Mockito.times(1)).add(Mockito.any(SolrInputDocument.class));
+ Mockito.verify(solrClient, Mockito.times(1)).close();
+ Assertions.assertNull(DbToSolrMigrationUtil.solrClient);
+ Files.deleteIfExists(Paths.get("migration_check_file.txt"));
+ }
+
+ @Test
+ public void testMigrateAuditDbLogsToSolr_alreadyMigrated_returnsEarly()
throws Exception {
+
Mockito.when(daoManager.getXXAccessAudit()).thenReturn(xxAccessAuditDao);
+
Mockito.when(xxAccessAuditDao.getMaxIdOfXXAccessAudit()).thenReturn(5L);
+
+ // Simulate already migrated status
+ Path tmp = Paths.get("migration_check_file.txt");
+ Files.write(tmp, Collections.singletonList("5"));
+
+ util.migrateAuditDbLogsToSolr();
+
+ // No interactions with solrClient expected
+ Mockito.verifyNoInteractions(solrClient);
+ Files.deleteIfExists(tmp);
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestMetricUtil.java
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestMetricUtil.java
new file mode 100644
index 000000000..fa0ce8688
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestMetricUtil.java
@@ -0,0 +1,233 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ranger.patch.cliutil;
+
+import org.apache.ranger.biz.AssetMgr;
+import org.apache.ranger.biz.RangerBizUtil;
+import org.apache.ranger.biz.ServiceDBStore;
+import org.apache.ranger.biz.XUserMgr;
+import org.apache.ranger.common.MessageEnums;
+import org.apache.ranger.common.RESTErrorUtil;
+import org.apache.ranger.common.SearchCriteria;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.apache.ranger.plugin.model.RangerService;
+import org.apache.ranger.plugin.model.RangerServiceDef;
+import org.apache.ranger.plugin.store.PList;
+import org.apache.ranger.plugin.util.SearchFilter;
+import org.apache.ranger.view.VXAccessAuditList;
+import org.apache.ranger.view.VXGroupList;
+import org.apache.ranger.view.VXUserList;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+* @generated by Cursor
+* @description <Unit Test for MetricUtil class>
+*/
+@ExtendWith(MockitoExtension.class)
+@TestMethodOrder(MethodOrderer.MethodName.class)
+public class TestMetricUtil {
+ @Mock
+ XUserMgr xUserMgr;
+ @Mock
+ AssetMgr assetMgr;
+ @Mock
+ ServiceDBStore svcStore;
+ @Mock
+ RangerBizUtil xaBizUtil;
+ @Mock
+ RESTErrorUtil restErrorUtil;
+
+ @InjectMocks
+ private MetricUtil metricUtil = new MetricUtil();
+
+ @Test
+ public void testExecLoad_usergroup() {
+ MetricUtil.metricType = "usergroup";
+
+ VXGroupList groups = new VXGroupList();
+ groups.setTotalCount(3L);
+
Mockito.when(xUserMgr.searchXGroups(Mockito.any(SearchCriteria.class))).thenReturn(groups);
+
+ VXUserList users = new VXUserList();
+ users.setTotalCount(5L);
+
Mockito.when(xUserMgr.searchXUsers(Mockito.any(SearchCriteria.class))).thenReturn(users);
+
+ metricUtil.execLoad();
+
+
Mockito.verify(xUserMgr).searchXGroups(Mockito.any(SearchCriteria.class));
+ Mockito.verify(xUserMgr,
Mockito.atLeastOnce()).searchXUsers(Mockito.any(SearchCriteria.class));
+ }
+
+ @Test
+ public void testExecLoad_audits() throws Exception {
+ MetricUtil.metricType = "audits";
+
+ RangerServiceDef def = new RangerServiceDef();
+ def.setId(1L);
+ def.setName("hdfs");
+ PList<RangerServiceDef> defs = new PList<>();
+ defs.setList(Collections.singletonList(def));
+ defs.setTotalCount(1L);
+
Mockito.when(svcStore.getPaginatedServiceDefs(Mockito.any(SearchFilter.class))).thenReturn(defs);
+
+ VXAccessAuditList allowed = new VXAccessAuditList();
+ allowed.setTotalCount(10L);
+ VXAccessAuditList denied = new VXAccessAuditList();
+ denied.setTotalCount(2L);
+
Mockito.when(assetMgr.getAccessLogs(Mockito.any(SearchCriteria.class))).thenReturn(denied).thenReturn(allowed);
+
+ // Date parsing is delegated to RESTErrorUtil; return the input date
+ ArgumentCaptor<String> df = ArgumentCaptor.forClass(String.class);
+ Mockito.when(restErrorUtil.parseDate(df.capture(),
Mockito.anyString(), Mockito.any(MessageEnums.class),
+ Mockito.isNull(), Mockito.anyString(),
Mockito.anyString())).thenAnswer(inv -> {
+ String s = (String) inv.getArguments()[0];
+ DateFormat f = new SimpleDateFormat("MM/dd/yyyy");
+ return f.parse(s);
+ });
+
+ metricUtil.execLoad();
+
+ Mockito.verify(svcStore,
Mockito.atLeastOnce()).getPaginatedServiceDefs(Mockito.any(SearchFilter.class));
+ Mockito.verify(assetMgr,
Mockito.atLeast(2)).getAccessLogs(Mockito.any(SearchCriteria.class));
+ }
+
+ @Test
+ public void testExecLoad_services() throws Exception {
+ MetricUtil.metricType = "services";
+
+ RangerService svc1 = new RangerService();
+ svc1.setType("hdfs");
+ RangerService svc2 = new RangerService();
+ svc2.setType("hive");
+ PList<RangerService> page = new PList<>();
+ page.setList(Arrays.asList(svc1, svc2));
+ page.setTotalCount(3L);
+
Mockito.when(svcStore.getPaginatedServices(Mockito.any(SearchFilter.class))).thenReturn(page);
+
+ PList<RangerService> countHdfs = new PList<>();
+ countHdfs.setTotalCount(2L);
+ countHdfs.setList(Collections.singletonList(svc1));
+ PList<RangerService> countHive = new PList<>();
+ countHive.setTotalCount(1L);
+ countHive.setList(Collections.singletonList(svc2));
+ Mockito.when(svcStore
+ .getPaginatedServices(Mockito.argThat(f -> f != null &&
f.getParam("serviceType") != null &&
"hdfs".equals(String.valueOf(f.getParam("serviceType"))))))
+ .thenReturn(countHdfs);
+ Mockito.when(svcStore
+ .getPaginatedServices(Mockito.argThat(f -> f != null &&
f.getParam("serviceType") != null &&
"hive".equals(String.valueOf(f.getParam("serviceType"))))))
+ .thenReturn(countHive);
+
+ metricUtil.execLoad();
+
+ Mockito.verify(svcStore,
Mockito.atLeast(3)).getPaginatedServices(Mockito.any(SearchFilter.class));
+ }
+
+ @Test
+ public void testExecLoad_policies() throws Exception {
+ MetricUtil.metricType = "policies";
+
+ // services used by getVXMetricServiceCount
+ RangerService svc = new RangerService();
+ svc.setType("hdfs");
+ PList<RangerService> svcList = new PList<>();
+ svcList.setList(Collections.singletonList(svc));
+ svcList.setTotalCount(1L);
+
Mockito.when(svcStore.getPaginatedServices(Mockito.any(SearchFilter.class))).thenReturn(svcList);
+
+ // policies list total counts per filter
+ PList<RangerPolicy> policies = new PList<>();
+ policies.setTotalCount(4L);
+ policies.setList(new ArrayList<RangerPolicy>());
+
Mockito.when(svcStore.getPaginatedPolicies(Mockito.any(SearchFilter.class))).thenReturn(policies);
+
+ metricUtil.execLoad();
+
+ Mockito.verify(svcStore,
Mockito.atLeast(1)).getPaginatedPolicies(Mockito.any(SearchFilter.class));
+ }
+
+ @Test
+ public void testExecLoad_database() {
+ MetricUtil.metricType = "database";
+
+ Mockito.when(xaBizUtil.getDBVersion()).thenReturn("12.1");
+ metricUtil.execLoad();
+
+ Mockito.verify(xaBizUtil).getDBVersion();
+ }
+
+ @Test
+ public void testExecLoad_contextEnrichers() throws Exception {
+ MetricUtil.metricType = "contextenrichers";
+
+ RangerServiceDef def = new RangerServiceDef();
+ def.setId(1L);
+ def.setName("hdfs");
+ RangerServiceDef.RangerContextEnricherDef enricher = new
RangerServiceDef.RangerContextEnricherDef();
+ List<RangerServiceDef.RangerContextEnricherDef> enrichers = new
ArrayList<>();
+ enrichers.add(enricher);
+ def.setContextEnrichers(enrichers);
+ PList<RangerServiceDef> defs = new PList<>();
+ defs.setList(Collections.singletonList(def));
+ defs.setTotalCount(1L);
+
Mockito.when(svcStore.getPaginatedServiceDefs(Mockito.any(SearchFilter.class))).thenReturn(defs);
+
+ metricUtil.execLoad();
+
+
Mockito.verify(svcStore).getPaginatedServiceDefs(Mockito.any(SearchFilter.class));
+ }
+
+ @Test
+ public void testExecLoad_denyconditions() throws Exception {
+ MetricUtil.metricType = "denyconditions";
+
+ RangerServiceDef def = new RangerServiceDef();
+ def.setId(1L);
+ def.setName("hdfs");
+ PList<RangerServiceDef> defs = new PList<>();
+ defs.setList(Collections.singletonList(def));
+ defs.setTotalCount(1L);
+
Mockito.when(svcStore.getPaginatedServiceDefs(Mockito.any(SearchFilter.class))).thenReturn(defs);
+
+ RangerPolicy policy = new RangerPolicy();
+ policy.setDenyPolicyItems(Collections.singletonList(new
RangerPolicy.RangerPolicyItem()));
+ policy.setDenyExceptions(Collections.singletonList(new
RangerPolicy.RangerPolicyItem()));
+ PList<RangerPolicy> policyList = new PList<>();
+ policyList.setList(Collections.singletonList(policy));
+ policyList.setTotalCount(1L);
+
Mockito.when(svcStore.getPaginatedPolicies(Mockito.any(SearchFilter.class))).thenReturn(policyList);
+
+ metricUtil.execLoad();
+
+ Mockito.verify(svcStore,
Mockito.atLeast(1)).getPaginatedServiceDefs(Mockito.any(SearchFilter.class));
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestRoleBasedUserSearchUtil.java
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestRoleBasedUserSearchUtil.java
index 4d5d67b31..fb0b6f30f 100644
---
a/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestRoleBasedUserSearchUtil.java
+++
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestRoleBasedUserSearchUtil.java
@@ -28,22 +28,27 @@
import org.apache.ranger.service.XUserService;
import org.apache.ranger.view.VXUser;
import org.apache.ranger.view.VXUserList;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.MethodSorters;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
+import java.security.Permission;
import java.util.ArrayList;
import java.util.List;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.fail;
-@RunWith(MockitoJUnitRunner.class)
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+/**
+ * @generated by Cursor
+ * @description <Unit Test for RoleBasedUserSearchUtil class>
+ */
+@ExtendWith(MockitoExtension.class)
+@TestMethodOrder(MethodOrderer.MethodName.class)
public class TestRoleBasedUserSearchUtil {
@Mock
XUserService xUserService;
@@ -55,7 +60,7 @@ public class TestRoleBasedUserSearchUtil {
UserMgr userMgr;
@Mock
- XUserMgr xUserMgr;
+ XUserMgr xUserMgr;
@Mock
XXPortalUserDao xXPortalUserDao;
@@ -90,20 +95,53 @@ public void testGetUsersBasedOnRole() {
}
}
+ @Test
+ public void testGetUsersBasedOnRole_emptyMaps_exits() {
+ List<String> userRoleList = new ArrayList<>();
+ userRoleList.add(RangerConstants.ROLE_USER);
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByRole(RangerConstants.ROLE_USER)).thenReturn(new
ArrayList<>());
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ roleBasedUserSearchUtil.getUsersBasedOnRole(userRoleList);
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+
+ Mockito.verify(xXPortalUserDao).findByRole(RangerConstants.ROLE_USER);
+ }
+
@Test
public void testValidateUserAndFetchUserList() {
+ RoleBasedUserSearchUtil.checkRole = true;
+ RoleBasedUserSearchUtil.userRole = "";
+
List<String> permissionList = new ArrayList<>();
permissionList.add(RangerConstants.MODULE_USER_GROUPS);
- String currentEncryptedPassword = "testpassword";
- XXPortalUser xxPortalUser = new XXPortalUser();
+ String currentEncryptedPassword = "testpassword";
+ XXPortalUser xxPortalUser = new XXPortalUser();
xxPortalUser.setId(1L);
xxPortalUser.setLoginId("testUser");
xxPortalUser.setPassword("testpassword");
xxPortalUser.setFirstName("testUser");
VXUser vxUser = new VXUser();
vxUser.setId(1L);
- VXUserList vXUserList = new VXUserList();
- List<VXUser> vXUsers = new ArrayList<>();
+ VXUserList vXUserList = new VXUserList();
+ List<VXUser> vXUsers = new ArrayList<>();
vXUsers.add(vxUser);
vXUserList.setVXUsers(vXUsers);
@@ -118,7 +156,8 @@ public void testValidateUserAndFetchUserList() {
Mockito.when(xXPortalUserDao.findByLoginId(Mockito.anyString())).thenReturn(xxPortalUser);
Mockito.when(xUserService.getXUserByUserName(xxPortalUser.getLoginId())).thenReturn(vxUser);
Mockito.when(daoMgr.getXXModuleDef()).thenReturn(xXModuleDefDao);
-
Mockito.when(xXModuleDefDao.findAccessibleModulesByUserId(Mockito.anyLong(),
Mockito.anyLong())).thenReturn(permissionList);
+
Mockito.when(xXModuleDefDao.findAccessibleModulesByUserId(Mockito.anyLong(),
Mockito.anyLong()))
+ .thenReturn(permissionList);
Mockito.when(userMgr.encrypt(Mockito.anyString(),
Mockito.anyString())).thenReturn(currentEncryptedPassword);
Mockito.when(xXPortalUserDao.findByRole(Mockito.anyString())).thenReturn(listXXPortalUser);
@@ -131,4 +170,602 @@ public void testValidateUserAndFetchUserList() {
Mockito.verify(userMgr).encrypt(Mockito.anyString(),
Mockito.anyString());
Mockito.verify(xXPortalUserDao,
Mockito.atLeast(2)).findByRole(Mockito.anyString());
}
+
+ @Test
+ public void testPrintStats() {
+ roleBasedUserSearchUtil.printStats();
+ }
+
+ @Test
+ public void testInit() throws Exception {
+ roleBasedUserSearchUtil.init();
+ }
+
+ @Test
+ public void testExecLoad_callsValidateUserAndFetchUserList() {
+ RoleBasedUserSearchUtil spy = Mockito.spy(roleBasedUserSearchUtil);
+ Mockito.doNothing().when(spy).validateUserAndFetchUserList();
+ spy.execLoad();
+ Mockito.verify(spy).validateUserAndFetchUserList();
+ }
+
+ @Test
+ public void testMain_incorrectArgs_exits() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ RoleBasedUserSearchUtil.main(new String[] {"onlyOne"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_invalidRole_exits() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ RoleBasedUserSearchUtil.main(new String[] {"u", "p",
"not_a_role"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_blankLogin_exits() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ RoleBasedUserSearchUtil.main(new String[] {"", "p"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testValidateUserAndFetchUserList_userNotFound_exits() {
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId(Mockito.anyString())).thenReturn(null);
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ roleBasedUserSearchUtil.validateUserAndFetchUserList();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testValidateUserAndFetchUserList_invalidPassword_exits() {
+ XXPortalUser xxPortalUser = new XXPortalUser();
+ xxPortalUser.setId(1L);
+ xxPortalUser.setLoginId("testUser");
+ xxPortalUser.setPassword("enc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId(Mockito.anyString())).thenReturn(xxPortalUser);
+ Mockito.when(userMgr.encrypt(Mockito.anyString(),
Mockito.anyString())).thenReturn("other");
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ roleBasedUserSearchUtil.validateUserAndFetchUserList();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testValidateUserAndFetchUserList_permissionDenied_exits() {
+ XXPortalUser xxPortalUser = new XXPortalUser();
+ xxPortalUser.setId(1L);
+ xxPortalUser.setLoginId("testUser");
+ xxPortalUser.setPassword("enc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId(Mockito.anyString())).thenReturn(xxPortalUser);
+ Mockito.when(userMgr.encrypt(Mockito.anyString(),
Mockito.anyString())).thenReturn("enc");
+ VXUser vxUser = new VXUser();
+ vxUser.setId(10L);
+ List<String> roles = new ArrayList<>();
+ roles.add(RangerConstants.ROLE_USER);
+ vxUser.setUserRoleList(roles);
+ XUserService xUserServiceMock = Mockito.mock(XUserService.class);
+ roleBasedUserSearchUtil.xUserService = xUserServiceMock;
+
Mockito.when(xUserServiceMock.getXUserByUserName(Mockito.anyString())).thenReturn(vxUser);
+
Mockito.when(daoMgr.getXXModuleDef()).thenReturn(Mockito.mock(XXModuleDefDao.class));
+
Mockito.when(daoMgr.getXXModuleDef().findAccessibleModulesByUserId(Mockito.anyLong(),
Mockito.anyLong()))
+ .thenReturn(new ArrayList<>());
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ roleBasedUserSearchUtil.validateUserAndFetchUserList();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testValidateUserAndFetchUserList_notAuthorized_exits() {
+ // existing role: ROLE_USER, requested role: ROLE_KEY_ADMIN with
checkRole=false
+ RoleBasedUserSearchUtil.userRole = RangerConstants.ROLE_KEY_ADMIN;
+ RoleBasedUserSearchUtil.checkRole = false;
+
+ XXPortalUser xxPortalUser = new XXPortalUser();
+ xxPortalUser.setId(1L);
+ xxPortalUser.setLoginId("testUser");
+ xxPortalUser.setPassword("enc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId(Mockito.anyString())).thenReturn(xxPortalUser);
+ Mockito.when(userMgr.encrypt(Mockito.anyString(),
Mockito.anyString())).thenReturn("enc");
+ VXUser vxUser = new VXUser();
+ vxUser.setId(10L);
+ List<String> roles = new ArrayList<>();
+ roles.add(RangerConstants.ROLE_USER);
+ vxUser.setUserRoleList(roles);
+ XUserService xUserServiceMock = Mockito.mock(XUserService.class);
+ roleBasedUserSearchUtil.xUserService = xUserServiceMock;
+
Mockito.when(xUserServiceMock.getXUserByUserName(Mockito.anyString())).thenReturn(vxUser);
+ XXModuleDefDao moduleDao = Mockito.mock(XXModuleDefDao.class);
+ Mockito.when(daoMgr.getXXModuleDef()).thenReturn(moduleDao);
+ List<String> permissionList = new ArrayList<>();
+ permissionList.add(RangerConstants.MODULE_USER_GROUPS);
+
Mockito.when(moduleDao.findAccessibleModulesByUserId(Mockito.anyLong(),
Mockito.anyLong()))
+ .thenReturn(permissionList);
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ roleBasedUserSearchUtil.validateUserAndFetchUserList();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_blankCurrent_exits() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ RoleBasedUserSearchUtil.main(new String[] {"u", ""});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void
testValidateUserAndFetchUserList_keyAdmin_checkRoleFalse_authorized() {
+ RoleBasedUserSearchUtil.userRole = RangerConstants.ROLE_KEY_ADMIN;
+ RoleBasedUserSearchUtil.checkRole = false;
+ RoleBasedUserSearchUtil.userLoginId = "ka";
+ RoleBasedUserSearchUtil.currentPassword = "p";
+
+ XXPortalUser xxPortalUser = new XXPortalUser();
+ xxPortalUser.setId(5L);
+ xxPortalUser.setLoginId("ka");
+ xxPortalUser.setPassword("enc");
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("ka")).thenReturn(xxPortalUser);
+ Mockito.when(userMgr.encrypt("ka", "p")).thenReturn("enc");
+
+ VXUser vxUser = new VXUser();
+ vxUser.setId(55L);
+ List<String> roles = new ArrayList<>();
+ roles.add(RangerConstants.ROLE_KEY_ADMIN);
+ vxUser.setUserRoleList(roles);
+ Mockito.when(xUserService.getXUserByUserName("ka")).thenReturn(vxUser);
+
+ XXModuleDefDao xXModuleDefDao = Mockito.mock(XXModuleDefDao.class);
+ Mockito.when(daoMgr.getXXModuleDef()).thenReturn(xXModuleDefDao);
+ List<String> permissionList = new ArrayList<>();
+ permissionList.add(RangerConstants.MODULE_USER_GROUPS);
+ Mockito.when(xXModuleDefDao.findAccessibleModulesByUserId(5L,
55L)).thenReturn(permissionList);
+
+ RoleBasedUserSearchUtil spy = Mockito.spy(roleBasedUserSearchUtil);
+ Mockito.doNothing().when(spy).getUsersBasedOnRole(Mockito.anyList());
+
+ spy.validateUserAndFetchUserList();
+
+ Mockito.verify(spy).getUsersBasedOnRole(
+ Mockito.argThat(list -> list.size() == 1 &&
RangerConstants.ROLE_KEY_ADMIN.equals(list.get(0))));
+ }
+
+ @Test
+ public void testMain_validArgs_twoParams_runs() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ RoleBasedUserSearchUtil.main(new String[] {"u", "p"});
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_validArgs_threeParams_validRole_runs() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ RoleBasedUserSearchUtil.main(new String[] {"u", "p",
RangerConstants.ROLE_USER });
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void
testValidateUserAndFetchUserList_roleUser_checkRoleTrue_invokesGetUsersBasedOnRole()
{
+ RoleBasedUserSearchUtil.checkRole = true;
+ RoleBasedUserSearchUtil.userLoginId = "user1";
+ RoleBasedUserSearchUtil.currentPassword = "p";
+
+ XXPortalUser xxPortalUser = new XXPortalUser();
+ xxPortalUser.setId(11L);
+ xxPortalUser.setLoginId("user1");
+ xxPortalUser.setPassword("enc");
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("user1")).thenReturn(xxPortalUser);
+ Mockito.when(userMgr.encrypt("user1", "p")).thenReturn("enc");
+
+ VXUser vxUser = new VXUser();
+ vxUser.setId(21L);
+ List<String> roles = new ArrayList<>();
+ roles.add(RangerConstants.ROLE_USER);
+ vxUser.setUserRoleList(roles);
+
Mockito.when(xUserService.getXUserByUserName("user1")).thenReturn(vxUser);
+
+ XXModuleDefDao xXModuleDefDao = Mockito.mock(XXModuleDefDao.class);
+ Mockito.when(daoMgr.getXXModuleDef()).thenReturn(xXModuleDefDao);
+ List<String> permissionList = new ArrayList<>();
+ permissionList.add(RangerConstants.MODULE_USER_GROUPS);
+ Mockito.when(xXModuleDefDao.findAccessibleModulesByUserId(11L,
21L)).thenReturn(permissionList);
+
+ RoleBasedUserSearchUtil spy = Mockito.spy(roleBasedUserSearchUtil);
+ Mockito.doNothing().when(spy).getUsersBasedOnRole(Mockito.anyList());
+
+ spy.validateUserAndFetchUserList();
+
+ Mockito.verify(spy).getUsersBasedOnRole(
+ Mockito.argThat(list -> list.size() == 1 &&
RangerConstants.ROLE_USER.equals(list.get(0))));
+ }
+
+ @Test
+ public void
testValidateUserAndFetchUserList_roleSysAdmin_checkRoleTrue_invokesGetUsersBasedOnRoleWithThreeRoles()
{
+ RoleBasedUserSearchUtil.checkRole = true;
+ RoleBasedUserSearchUtil.userLoginId = "admin1";
+ RoleBasedUserSearchUtil.currentPassword = "p";
+
+ XXPortalUser xxPortalUser = new XXPortalUser();
+ xxPortalUser.setId(31L);
+ xxPortalUser.setLoginId("admin1");
+ xxPortalUser.setPassword("enc");
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("admin1")).thenReturn(xxPortalUser);
+ Mockito.when(userMgr.encrypt("admin1", "p")).thenReturn("enc");
+
+ VXUser vxUser = new VXUser();
+ vxUser.setId(41L);
+ List<String> roles = new ArrayList<>();
+ roles.add(RangerConstants.ROLE_SYS_ADMIN);
+ vxUser.setUserRoleList(roles);
+
Mockito.when(xUserService.getXUserByUserName("admin1")).thenReturn(vxUser);
+
+ XXModuleDefDao xXModuleDefDao = Mockito.mock(XXModuleDefDao.class);
+ Mockito.when(daoMgr.getXXModuleDef()).thenReturn(xXModuleDefDao);
+ List<String> permissionList = new ArrayList<>();
+ permissionList.add(RangerConstants.MODULE_USER_GROUPS);
+ Mockito.when(xXModuleDefDao.findAccessibleModulesByUserId(31L,
41L)).thenReturn(permissionList);
+
+ RoleBasedUserSearchUtil spy = Mockito.spy(roleBasedUserSearchUtil);
+ Mockito.doNothing().when(spy).getUsersBasedOnRole(Mockito.anyList());
+
+ spy.validateUserAndFetchUserList();
+
+ Mockito.verify(spy).getUsersBasedOnRole(Mockito.argThat(list ->
list.size() == 3
+ && list.contains(RangerConstants.ROLE_SYS_ADMIN) &&
list.contains(RangerConstants.ROLE_ADMIN_AUDITOR)
+ && list.contains(RangerConstants.ROLE_USER)));
+ }
+
+ @Test
+ public void
testValidateUserAndFetchUserList_adminAuditor_checkRoleFalse_requestedSame_invokesGetUsersBasedOnRole()
{
+ RoleBasedUserSearchUtil.userRole = RangerConstants.ROLE_ADMIN_AUDITOR;
+ RoleBasedUserSearchUtil.checkRole = false;
+ RoleBasedUserSearchUtil.userLoginId = "aud";
+ RoleBasedUserSearchUtil.currentPassword = "p";
+
+ XXPortalUser xxPortalUser = new XXPortalUser();
+ xxPortalUser.setId(61L);
+ xxPortalUser.setLoginId("aud");
+ xxPortalUser.setPassword("enc");
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("aud")).thenReturn(xxPortalUser);
+ Mockito.when(userMgr.encrypt("aud", "p")).thenReturn("enc");
+
+ VXUser vxUser = new VXUser();
+ vxUser.setId(71L);
+ List<String> roles = new ArrayList<>();
+ roles.add(RangerConstants.ROLE_ADMIN_AUDITOR);
+ vxUser.setUserRoleList(roles);
+
Mockito.when(xUserService.getXUserByUserName("aud")).thenReturn(vxUser);
+
+ XXModuleDefDao moduleDao = Mockito.mock(XXModuleDefDao.class);
+ Mockito.when(daoMgr.getXXModuleDef()).thenReturn(moduleDao);
+ List<String> permissionList = new ArrayList<>();
+ permissionList.add(RangerConstants.MODULE_USER_GROUPS);
+ Mockito.when(moduleDao.findAccessibleModulesByUserId(61L,
71L)).thenReturn(permissionList);
+
+ RoleBasedUserSearchUtil spy = Mockito.spy(roleBasedUserSearchUtil);
+ Mockito.doNothing().when(spy).getUsersBasedOnRole(Mockito.anyList());
+
+ spy.validateUserAndFetchUserList();
+
+ Mockito.verify(spy).getUsersBasedOnRole(
+ Mockito.argThat(list -> list.size() == 1 &&
RangerConstants.ROLE_ADMIN_AUDITOR.equals(list.get(0))));
+ }
+
+ @Test
+ public void
testValidateUserAndFetchUserList_keyAdmin_checkRoleTrue_invokesGetUsersBasedOnRoleWithThreeRoles()
{
+ RoleBasedUserSearchUtil.userRole = "";
+ RoleBasedUserSearchUtil.checkRole = true;
+ RoleBasedUserSearchUtil.userLoginId = "k1";
+ RoleBasedUserSearchUtil.currentPassword = "p";
+
+ XXPortalUser xxPortalUser = new XXPortalUser();
+ xxPortalUser.setId(81L);
+ xxPortalUser.setLoginId("k1");
+ xxPortalUser.setPassword("enc");
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("k1")).thenReturn(xxPortalUser);
+ Mockito.when(userMgr.encrypt("k1", "p")).thenReturn("enc");
+
+ VXUser vxUser = new VXUser();
+ vxUser.setId(91L);
+ List<String> roles = new ArrayList<>();
+ roles.add(RangerConstants.ROLE_KEY_ADMIN);
+ vxUser.setUserRoleList(roles);
+ Mockito.when(xUserService.getXUserByUserName("k1")).thenReturn(vxUser);
+
+ XXModuleDefDao moduleDao = Mockito.mock(XXModuleDefDao.class);
+ Mockito.when(daoMgr.getXXModuleDef()).thenReturn(moduleDao);
+ List<String> permissionList = new ArrayList<>();
+ permissionList.add(RangerConstants.MODULE_USER_GROUPS);
+ Mockito.when(moduleDao.findAccessibleModulesByUserId(81L,
91L)).thenReturn(permissionList);
+
+ RoleBasedUserSearchUtil spy = Mockito.spy(roleBasedUserSearchUtil);
+ Mockito.doNothing().when(spy).getUsersBasedOnRole(Mockito.anyList());
+
+ spy.validateUserAndFetchUserList();
+
+ Mockito.verify(spy).getUsersBasedOnRole(Mockito.argThat(list ->
list.size() == 3
+ && list.contains(RangerConstants.ROLE_KEY_ADMIN)
+ && list.contains(RangerConstants.ROLE_KEY_ADMIN_AUDITOR) &&
list.contains(RangerConstants.ROLE_USER)));
+ }
+
+ @Test
+ public void testValidateUserAndFetchUserList_encryptThrows_exits() {
+ RoleBasedUserSearchUtil.userLoginId = "u1";
+ RoleBasedUserSearchUtil.currentPassword = "p";
+
+ XXPortalUser xxPortalUser = new XXPortalUser();
+ xxPortalUser.setId(101L);
+ xxPortalUser.setLoginId("u1");
+ xxPortalUser.setPassword("enc");
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByLoginId("u1")).thenReturn(xxPortalUser);
+ Mockito.when(userMgr.encrypt("u1", "p")).thenThrow(new
RuntimeException("boom"));
+
+ SecurityManager originalSm = System.getSecurityManager();
+ try {
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException("Intercepted System.exit(" +
status + ")");
+ }
+ });
+ try {
+ roleBasedUserSearchUtil.validateUserAndFetchUserList();
+ } catch (SecurityException ignored) {
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testGetUsersBasedOnRole_populatesAllRoleMaps_noExit() {
+ List<String> roles = new ArrayList<>();
+ roles.add(RangerConstants.ROLE_SYS_ADMIN);
+ roles.add(RangerConstants.ROLE_ADMIN_AUDITOR);
+ roles.add(RangerConstants.ROLE_KEY_ADMIN);
+ roles.add(RangerConstants.ROLE_KEY_ADMIN_AUDITOR);
+ roles.add(RangerConstants.ROLE_USER);
+
+ XXPortalUser u1 = new XXPortalUser();
+ u1.setLoginId("u1");
+ XXPortalUser u2 = new XXPortalUser();
+ u2.setLoginId("u2");
+ XXPortalUser u3 = new XXPortalUser();
+ u3.setLoginId("u3");
+ XXPortalUser u4 = new XXPortalUser();
+ u4.setLoginId("u4");
+ XXPortalUser u5 = new XXPortalUser();
+ u5.setLoginId("u5");
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenReturn(xXPortalUserDao);
+
Mockito.when(xXPortalUserDao.findByRole(RangerConstants.ROLE_SYS_ADMIN))
+ .thenReturn(new ArrayList<XXPortalUser>() {
+ {
+ add(u1);
+ }
+ });
+
Mockito.when(xXPortalUserDao.findByRole(RangerConstants.ROLE_ADMIN_AUDITOR))
+ .thenReturn(new ArrayList<XXPortalUser>() {
+ {
+ add(u2);
+ }
+ });
+
Mockito.when(xXPortalUserDao.findByRole(RangerConstants.ROLE_KEY_ADMIN))
+ .thenReturn(new ArrayList<XXPortalUser>() {
+ {
+ add(u3);
+ }
+ });
+
Mockito.when(xXPortalUserDao.findByRole(RangerConstants.ROLE_KEY_ADMIN_AUDITOR))
+ .thenReturn(new ArrayList<XXPortalUser>() {
+ {
+ add(u4);
+ }
+ });
+
Mockito.when(xXPortalUserDao.findByRole(RangerConstants.ROLE_USER)).thenReturn(new
ArrayList<XXPortalUser>() {
+ {
+ add(u5);
+ }
+ });
+
+ roleBasedUserSearchUtil.getUsersBasedOnRole(roles);
+
+
Mockito.verify(xXPortalUserDao).findByRole(RangerConstants.ROLE_SYS_ADMIN);
+
Mockito.verify(xXPortalUserDao).findByRole(RangerConstants.ROLE_ADMIN_AUDITOR);
+
Mockito.verify(xXPortalUserDao).findByRole(RangerConstants.ROLE_KEY_ADMIN);
+
Mockito.verify(xXPortalUserDao).findByRole(RangerConstants.ROLE_KEY_ADMIN_AUDITOR);
+ Mockito.verify(xXPortalUserDao).findByRole(RangerConstants.ROLE_USER);
+ }
+
+ @Test
+ public void testGetUsersBasedOnRole_exceptionCaught_noThrow() {
+ List<String> roles = new ArrayList<>();
+ roles.add(RangerConstants.ROLE_USER);
+
+ Mockito.when(daoMgr.getXXPortalUser()).thenThrow(new
RuntimeException("boom"));
+
+ roleBasedUserSearchUtil.getUsersBasedOnRole(roles);
+ }
}
diff --git
a/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestTrxLogV2MigrationUtil.java
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestTrxLogV2MigrationUtil.java
new file mode 100644
index 000000000..1422aaad3
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestTrxLogV2MigrationUtil.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ranger.patch.cliutil;
+
+import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.db.XXTrxLogV2Dao;
+import org.apache.ranger.entity.XXTrxLog;
+import org.apache.ranger.entity.XXTrxLogV2;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionStatus;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+* @generated by Cursor
+* @description <Unit Test for TrxLogV2MigrationUtil class>
+*/
+@ExtendWith(MockitoExtension.class)
+@TestMethodOrder(MethodOrderer.MethodName.class)
+public class TestTrxLogV2MigrationUtil {
+ @Mock
+ RangerDaoManager daoMgr;
+ @Mock
+ EntityManager entityManager;
+ @Mock
+ XXTrxLogV2Dao xXTrxLogV2Dao;
+ @Mock
+ TypedQuery<String> namedQuery;
+ @Mock
+ TypedQuery<Object[]> objectArrayNamedQuery;
+ @Mock
+ Query nativeQuery;
+ @Mock
+ PlatformTransactionManager txManager;
+ @Mock
+ TransactionStatus txStatus;
+
+ @InjectMocks
+ private TrxLogV2MigrationUtil util = new TrxLogV2MigrationUtil();
+
+ @Test
+ public void testCreateTrxLogAndToJsonMapping() throws Exception {
+ XXTrxLog v1 = new XXTrxLog();
+ v1.setId(100L);
+ v1.setCreateTime(new Date());
+ v1.setAddedByUserId(1L);
+ v1.setObjectClassType(8);
+ v1.setObjectId(5L);
+ v1.setObjectName("obj");
+ v1.setParentObjectClassType(0);
+ v1.setParentObjectId(0L);
+ v1.setParentObjectName("-");
+ v1.setAttributeName("a");
+ v1.setPreviousValue("b");
+ v1.setNewValue("c");
+ v1.setTransactionId("t1");
+ v1.setAction("create");
+ v1.setRequestId("req");
+ v1.setSessionId("sid");
+ v1.setSessionType("ui");
+
+ Mockito.when(daoMgr.getXXTrxLogV2()).thenReturn(xXTrxLogV2Dao);
+ Mockito.when(daoMgr.getEntityManager()).thenReturn(entityManager);
+
Mockito.when(entityManager.createNativeQuery(Mockito.anyString())).thenReturn(nativeQuery);
+
Mockito.when(nativeQuery.getResultList()).thenReturn(Collections.singletonList(1));
+ Mockito.when(entityManager.createNamedQuery(Mockito.anyString(),
Mockito.eq(String.class))).thenReturn(namedQuery);
+
Mockito.when(entityManager.createNamedQuery(Mockito.eq("XXTrxLog.findByTrxIdForMigration"),
+ Mockito.eq(Object[].class))).thenReturn(objectArrayNamedQuery);
+ List<Object[]> rows = new ArrayList<>();
+ rows.add(new Object[] {v1.getId(), v1.getCreateTime(),
v1.getAddedByUserId(), v1.getObjectClassType(),
+ v1.getObjectId(), v1.getObjectName(),
v1.getParentObjectClassType(), v1.getParentObjectId(),
+ v1.getParentObjectName(), v1.getAttributeName(),
v1.getPreviousValue(), v1.getNewValue(),
+ v1.getTransactionId(), v1.getAction(), v1.getRequestId(),
v1.getSessionId(), v1.getSessionType() });
+
Mockito.when(namedQuery.getResultList()).thenReturn(Collections.singletonList("t1"));
+ Mockito.when(objectArrayNamedQuery.getResultList()).thenReturn(rows);
+ Mockito.when(objectArrayNamedQuery.setParameter(Mockito.anyString(),
Mockito.any())).thenReturn(objectArrayNamedQuery);
+
Mockito.when(xXTrxLogV2Dao.findByTransactionId("t1")).thenReturn(Collections.emptyList());
+
Mockito.when(txManager.getTransaction(Mockito.any())).thenReturn(txStatus);
+
+ util.init();
+ util.execLoad();
+
+ Mockito.verify(xXTrxLogV2Dao,
Mockito.atLeastOnce()).create(Mockito.any(XXTrxLogV2.class));
+ }
+
+ @Test
+ public void testStats_incrementsAndLog_withValues() {
+ TrxLogV2MigrationUtil.Stats stats = new TrxLogV2MigrationUtil.Stats();
+
+ stats.incrMigratedCount(100L, new Date());
+ stats.incrFailedCount();
+ stats.incrAlreadyMigratedCount();
+
+ stats.logStats();
+ }
+
+ @Test
+ public void testStats_log_withoutValues() {
+ TrxLogV2MigrationUtil.Stats stats = new TrxLogV2MigrationUtil.Stats();
+ stats.logStats();
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestUpdateUserAndGroupNamesInJson.java
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestUpdateUserAndGroupNamesInJson.java
new file mode 100644
index 000000000..8ea88cb49
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/patch/cliutil/TestUpdateUserAndGroupNamesInJson.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ranger.patch.cliutil;
+
+import org.apache.ranger.authorization.utils.JsonUtils;
+import org.apache.ranger.biz.SecurityZoneDBStore;
+import org.apache.ranger.biz.ServiceDBStore;
+import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.db.XXGroupDao;
+import org.apache.ranger.db.XXPolicyDao;
+import org.apache.ranger.db.XXServiceDao;
+import org.apache.ranger.db.XXUserDao;
+import org.apache.ranger.entity.XXGroup;
+import org.apache.ranger.entity.XXPolicy;
+import org.apache.ranger.entity.XXService;
+import org.apache.ranger.entity.XXUser;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.apache.ranger.plugin.model.RangerPolicy.RangerDataMaskPolicyItem;
+import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem;
+import org.apache.ranger.plugin.model.RangerPolicy.RangerRowFilterPolicyItem;
+import org.apache.ranger.plugin.model.RangerSecurityZone;
+import org.apache.ranger.plugin.model.RangerService;
+import org.apache.ranger.plugin.util.SearchFilter;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+* @generated by Cursor
+* @description <Unit Test for UpdateUserAndGroupNamesInJson class>
+*/
+@ExtendWith(MockitoExtension.class)
+@TestMethodOrder(MethodOrderer.MethodName.class)
+public class TestUpdateUserAndGroupNamesInJson {
+ @Mock
+ RangerDaoManager daoMgr;
+ @Mock
+ ServiceDBStore svcStore;
+ @Mock
+ PlatformTransactionManager txManager;
+ @Mock
+ SecurityZoneDBStore securityZoneStore;
+ @Mock
+ XXServiceDao xXServiceDao;
+ @Mock
+ XXPolicyDao xXPolicyDao;
+ @Mock
+ XXUserDao xXUserDao;
+ @Mock
+ XXGroupDao xXGroupDao;
+
+ @InjectMocks
+ private UpdateUserAndGroupNamesInJson util = new
UpdateUserAndGroupNamesInJson();
+
+ @Test
+ public void testExecLoad_updatesUsersGroupsInPoliciesAndZones() throws
Exception {
+ // Prepare services
+ RangerService svc = new RangerService();
+ svc.setId(10L);
+
Mockito.when(svcStore.getServices(Mockito.any(SearchFilter.class))).thenReturn(Collections.singletonList(svc));
+
+ XXService xxService = new XXService();
+ xxService.setId(10L);
+ xxService.setName("s1");
+ Mockito.when(daoMgr.getXXService()).thenReturn(xXServiceDao);
+ Mockito.when(xXServiceDao.getById(10L)).thenReturn(xxService);
+
+ // Users/groups maps
+ XXUser u = new XXUser();
+ u.setName("Alice");
+ XXGroup g = new XXGroup();
+ g.setName("Admins");
+ Mockito.when(daoMgr.getXXUser()).thenReturn(xXUserDao);
+ Mockito.when(daoMgr.getXXGroup()).thenReturn(xXGroupDao);
+
Mockito.when(xXUserDao.getAll()).thenReturn(Collections.singletonList(u));
+
Mockito.when(xXGroupDao.getAll()).thenReturn(Collections.singletonList(g));
+
+ // Policies
+ XXPolicy xpolicy = new XXPolicy();
+ xpolicy.setId(7L);
+ RangerPolicy rp = new RangerPolicy();
+ RangerPolicyItem item = new RangerPolicyItem();
+ item.setUsers(new ArrayList<>(Collections.singletonList("alice")));
+ item.setGroups(new ArrayList<>(Collections.singletonList("admins")));
+ rp.setPolicyItems(Collections.singletonList(item));
+ rp.setDenyPolicyItems(Collections.singletonList(new
RangerPolicyItem()));
+ rp.setAllowExceptions(Collections.singletonList(new
RangerPolicyItem()));
+ rp.setDenyExceptions(Collections.singletonList(new
RangerPolicyItem()));
+ rp.setDataMaskPolicyItems(Collections.singletonList(new
RangerDataMaskPolicyItem()));
+ rp.setRowFilterPolicyItems(Collections.singletonList(new
RangerRowFilterPolicyItem()));
+ xpolicy.setPolicyText(JsonUtils.objectToJson(rp));
+ Mockito.when(daoMgr.getXXPolicy()).thenReturn(xXPolicyDao);
+
Mockito.when(xXPolicyDao.findByServiceId(10L)).thenReturn(Collections.singletonList(xpolicy));
+
+ // Zones
+ RangerSecurityZone zone = new RangerSecurityZone();
+ zone.setId(1L);
+ zone.setAdminUsers(new
ArrayList<>(Collections.singletonList("alice")));
+ zone.setAdminUserGroups(new
ArrayList<>(Collections.singletonList("admins")));
+ zone.setAuditUsers(new
ArrayList<>(Collections.singletonList("alice")));
+ zone.setAuditUserGroups(new
ArrayList<>(Collections.singletonList("admins")));
+
Mockito.when(securityZoneStore.getSecurityZones(Mockito.any(SearchFilter.class))).thenReturn(Collections.singletonList(zone));
+
+ util.execLoad();
+
+ Mockito.verify(xXPolicyDao,
Mockito.atLeastOnce()).update(Mockito.any(XXPolicy.class));
+ }
+}