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 04450e7ba RANGER-5292: Add Unit Tests for Ranger Metrics Package in
Security Admin Module (#640)
04450e7ba is described below
commit 04450e7ba90e13ec7c7e3d6e530b507d4267d423
Author: Rakesh Gupta <[email protected]>
AuthorDate: Wed Sep 10 12:55:08 2025 +0530
RANGER-5292: Add Unit Tests for Ranger Metrics Package in Security Admin
Module (#640)
---
.../metrics/TestRangerAdminMetricsWrapper.java | 184 ++++++++++++
.../ranger/metrics/TestRangerMetricsFetcher.java | 224 +++++++++++++++
.../source/TestRangerAdminMetricsSourceBase.java | 308 +++++++++++++++++++++
...estRangerAdminMetricsSourceContextEnricher.java | 87 ++++++
...TestRangerAdminMetricsSourceDenyConditions.java | 88 ++++++
.../TestRangerAdminMetricsSourcePolicyMasking.java | 89 ++++++
...ngerAdminMetricsSourcePolicyResourceAccess.java | 89 ++++++
...RangerAdminMetricsSourcePolicyRowFiltering.java | 89 ++++++
.../TestRangerAdminMetricsSourceService.java | 86 ++++++
.../TestRangerAdminMetricsSourceUserGroup.java | 101 +++++++
10 files changed, 1345 insertions(+)
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/TestRangerAdminMetricsWrapper.java
b/security-admin/src/test/java/org/apache/ranger/metrics/TestRangerAdminMetricsWrapper.java
new file mode 100644
index 000000000..963e5b582
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/TestRangerAdminMetricsWrapper.java
@@ -0,0 +1,184 @@
+/*
+ * 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.metrics;
+
+import
org.apache.ranger.metrics.source.RangerAdminMetricsSourceContextEnricher;
+import org.apache.ranger.metrics.source.RangerAdminMetricsSourceDenyConditions;
+import org.apache.ranger.metrics.source.RangerAdminMetricsSourcePolicyMasking;
+import
org.apache.ranger.metrics.source.RangerAdminMetricsSourcePolicyResourceAccess;
+import
org.apache.ranger.metrics.source.RangerAdminMetricsSourcePolicyRowFiltering;
+import org.apache.ranger.metrics.source.RangerAdminMetricsSourceService;
+import org.apache.ranger.metrics.source.RangerAdminMetricsSourceUserGroup;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.anyList;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerAdminMetricsWrapper {
+ @InjectMocks
+ RangerAdminMetricsWrapper metricsWrapper;
+
+ @Mock
+ RangerAdminMetricsSourceUserGroup userGroupSource;
+
+ @Mock
+ RangerAdminMetricsSourceService serviceSource;
+
+ @Mock
+ RangerAdminMetricsSourcePolicyResourceAccess policyResourceAccessSource;
+
+ @Mock
+ RangerAdminMetricsSourcePolicyRowFiltering policyRowFilteringSource;
+
+ @Mock
+ RangerAdminMetricsSourcePolicyMasking policyMaskingSource;
+
+ @Mock
+ RangerAdminMetricsSourceContextEnricher contextEnricherSource;
+
+ @Mock
+ RangerAdminMetricsSourceDenyConditions denyConditionSource;
+
+ @Mock
+ RangerMetricsSystemWrapper metricsSystemWrapper;
+
+ @BeforeEach
+ public void setUp() throws Exception {
+ Field field =
RangerAdminMetricsWrapper.class.getDeclaredField("rangerMetricsSystemWrapper");
+ field.setAccessible(true);
+ field.set(metricsWrapper, metricsSystemWrapper);
+ }
+
+ @Test
+ public void testInit() {
+ metricsWrapper.init();
+
+ verify(metricsSystemWrapper).init(eq("admin"), anyList(),
eq(Collections.emptyList()));
+ }
+
+ @Test
+ public void testInitWithException() throws Exception {
+ doThrow(new RuntimeException("Exception occured while initializing
Metric Starter")).when(metricsSystemWrapper).init(anyString(), anyList(),
anyList());
+
+ metricsWrapper.init();
+
+ verify(metricsSystemWrapper).init(anyString(), anyList(), anyList());
+ }
+
+ @Test
+ public void testGetRangerMetricsInPrometheusFormat() throws Exception {
+ String mockOutput = "mock_prometheus_metrics";
+
when(metricsSystemWrapper.getRangerMetricsInPrometheusFormat()).thenReturn(mockOutput);
+
+ String result = metricsWrapper.getRangerMetricsInPrometheusFormat();
+
+ assertEquals(mockOutput, result);
+ verify(metricsSystemWrapper).getRangerMetricsInPrometheusFormat();
+ }
+
+ @Test
+ public void testGetRangerMetricsInPrometheusFormatWithException() throws
Exception {
+
when(metricsSystemWrapper.getRangerMetricsInPrometheusFormat()).thenThrow(new
IOException("Exception occurred while getting metric."));
+
+ IOException exception = assertThrows(IOException.class, () -> {
+ metricsWrapper.getRangerMetricsInPrometheusFormat();
+ });
+
+ assertEquals("Exception occurred while getting metric.",
exception.getMessage());
+ verify(metricsSystemWrapper).getRangerMetricsInPrometheusFormat();
+ }
+
+ @Test
+ public void testGetRangerMetricsInPrometheusFormat_NullReturn() throws
Exception {
+
when(metricsSystemWrapper.getRangerMetricsInPrometheusFormat()).thenReturn(null);
+
+ String result = metricsWrapper.getRangerMetricsInPrometheusFormat();
+
+ assertNull(result);
+ verify(metricsSystemWrapper).getRangerMetricsInPrometheusFormat();
+ }
+
+ @Test
+ public void testGetRangerMetrics() {
+ Map<String, Map<String, Object>> mockMetrics = new HashMap<>();
+ Map<String, Object> userGroupMetrics = new HashMap<>();
+ userGroupMetrics.put("total_users", 100);
+ userGroupMetrics.put("total_groups", 20);
+ mockMetrics.put("UserGroup", userGroupMetrics);
+
+ Map<String, Object> serviceMetrics = new HashMap<>();
+ serviceMetrics.put("total_services", 5);
+ serviceMetrics.put("active_services", 4);
+ mockMetrics.put("Service", serviceMetrics);
+
+ when(metricsSystemWrapper.getRangerMetrics()).thenReturn(mockMetrics);
+
+ Map<String, Map<String, Object>> result =
metricsWrapper.getRangerMetrics();
+
+ assertNotNull(result);
+ assertEquals(mockMetrics, result);
+ assertEquals(2, result.size());
+ assertTrue(result.containsKey("UserGroup"));
+ assertTrue(result.containsKey("Service"));
+ assertEquals(100, result.get("UserGroup").get("total_users"));
+ assertEquals(5, result.get("Service").get("total_services"));
+ verify(metricsSystemWrapper).getRangerMetrics();
+ }
+
+ @Test
+ public void testGetRangerMetricsWithEmptyResult() {
+ when(metricsSystemWrapper.getRangerMetrics()).thenReturn(new
HashMap<>());
+
+ Map<String, Map<String, Object>> result =
metricsWrapper.getRangerMetrics();
+
+ assertNotNull(result);
+ assertTrue(result.isEmpty());
+ verify(metricsSystemWrapper).getRangerMetrics();
+ }
+
+ @Test
+ public void testGetRangerMetricsWithNullResult() {
+ when(metricsSystemWrapper.getRangerMetrics()).thenReturn(null);
+
+ Map<String, Map<String, Object>> result =
metricsWrapper.getRangerMetrics();
+
+ assertNull(result);
+ verify(metricsSystemWrapper).getRangerMetrics();
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/TestRangerMetricsFetcher.java
b/security-admin/src/test/java/org/apache/ranger/metrics/TestRangerMetricsFetcher.java
new file mode 100644
index 000000000..f84dfaa5b
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/TestRangerMetricsFetcher.java
@@ -0,0 +1,224 @@
+/*
+ * 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.metrics;
+
+import org.apache.ranger.biz.ServiceDBStore;
+import org.apache.ranger.biz.XUserMgr;
+import org.apache.ranger.common.RangerConstants;
+import org.apache.ranger.service.XGroupService;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerMetricsFetcher {
+ @InjectMocks
+ RangerMetricsFetcher metricsFetcher;
+
+ @Mock
+ XUserMgr xUserMgr;
+
+ @Mock
+ ServiceDBStore svcStore;
+
+ @Mock
+ XGroupService groupService;
+
+ @Test
+ public void testGetGroupCount() {
+ when(groupService.getAllGroupCount()).thenReturn(5L);
+ Long result = metricsFetcher.getGroupCount();
+
+ assertEquals(5L, result);
+ verify(groupService).getAllGroupCount();
+ }
+
+ @Test
+ public void testGetGroupCount_NullReturn() {
+ when(groupService.getAllGroupCount()).thenReturn(null);
+
+ Long result = metricsFetcher.getGroupCount();
+
+ assertNull(result);
+ verify(groupService).getAllGroupCount();
+ }
+
+ @Test
+ public void testGetUserMetrics() {
+ Map<String, Long> mockData = new HashMap<>();
+ mockData.put(RangerConstants.ROLE_SYS_ADMIN, 2L);
+ mockData.put(RangerConstants.ROLE_ADMIN_AUDITOR, 3L);
+ mockData.put(RangerConstants.ROLE_KEY_ADMIN, 4L);
+ mockData.put(RangerConstants.ROLE_KEY_ADMIN_AUDITOR, 5L);
+ mockData.put(RangerConstants.ROLE_USER, 6L);
+ mockData.put("INVALID_ROLE", 1L);
+
+ when(xUserMgr.getUserCountByRole()).thenReturn(mockData);
+
+ Map<String, Long> result = metricsFetcher.getUserMetrics();
+
+ assertEquals(2L, result.get("SysAdmin"));
+ assertEquals(3L, result.get("AdminAuditor"));
+ assertEquals(4L, result.get("KeyAdmin"));
+ assertEquals(5L, result.get("KeyAdminAuditor"));
+ assertEquals(6L, result.get("User"));
+ assertEquals(21L, result.get("Total"));
+
+ assertFalse(result.containsKey("INVALID_ROLE"));
+ verify(xUserMgr).getUserCountByRole();
+ }
+
+ @Test
+ public void testGetUserMetrics_WithNullMap() {
+ when(xUserMgr.getUserCountByRole()).thenReturn(null);
+
+ assertThrows(NullPointerException.class, () -> {
+ metricsFetcher.getUserMetrics();
+ });
+ }
+
+ @Test
+ public void testGetRangerServiceMetrics() {
+ Map<String, Long> mockData = new HashMap<>();
+ mockData.put("hdfs", 2L);
+ mockData.put("hive", 3L);
+
+ when(svcStore.getServiceCountByType()).thenReturn(mockData);
+
+ Map<String, Long> result = metricsFetcher.getRangerServiceMetrics();
+
+ assertEquals(2L, result.get("hdfs"));
+ assertEquals(3L, result.get("hive"));
+ assertEquals(5L, result.get("Total"));
+ verify(svcStore).getServiceCountByType();
+ }
+
+ @Test
+ public void testGetRangerServiceMetrics_EmptyMap() {
+ when(svcStore.getServiceCountByType()).thenReturn(new HashMap<>());
+
+ Map<String, Long> result = metricsFetcher.getRangerServiceMetrics();
+
+ assertNotNull(result);
+ assertEquals(0L, result.get("Total"));
+ }
+
+ @Test
+ public void testGetPolicyMetrics() {
+ int policyType = 0;
+ Map<String, Long> mockData = new HashMap<>();
+ mockData.put("hdfs", 4L);
+ mockData.put("hive", 6L);
+
+
when(svcStore.getPolicyCountByTypeAndServiceType(policyType)).thenReturn(mockData);
+
+ Map<String, Long> result = metricsFetcher.getPolicyMetrics(policyType);
+
+ assertEquals(4L, result.get("hdfs"));
+ assertEquals(6L, result.get("hive"));
+ assertEquals(10L, result.get("Total"));
+ verify(svcStore).getPolicyCountByTypeAndServiceType(policyType);
+ }
+
+ @Test
+ public void testGetPolicyMetrics_EmptyData() {
+ int policyType = 0;
+
when(svcStore.getPolicyCountByTypeAndServiceType(policyType)).thenReturn(new
HashMap<>());
+
+ Map<String, Long> result = metricsFetcher.getPolicyMetrics(policyType);
+
+ assertNotNull(result);
+ assertEquals(0L, result.get("Total"));
+ }
+
+ @Test
+ public void testGetPolicyMetrics_NullType_ThrowsException() {
+ NullPointerException ex = assertThrows(NullPointerException.class, ()
-> {
+ metricsFetcher.getPolicyMetrics(null);
+ });
+
+ assertEquals("Policy type must not be null to get policy metrics.",
ex.getMessage());
+ }
+
+ @Test
+ public void testGetDenyConditionsMetrics() {
+ Map<String, Long> mockData = new HashMap<>();
+ mockData.put("hdfs", 2L);
+ mockData.put("hive", 3L);
+
+
when(svcStore.getPolicyCountByDenyConditionsAndServiceDef()).thenReturn(mockData);
+
+ Map<String, Long> result = metricsFetcher.getDenyConditionsMetrics();
+
+ assertEquals(5L, result.get("Total"));
+ verify(svcStore).getPolicyCountByDenyConditionsAndServiceDef();
+ }
+
+ @Test
+ public void testGetDenyConditionsMetrics_NullMap() {
+
when(svcStore.getPolicyCountByDenyConditionsAndServiceDef()).thenReturn(null);
+
+ assertThrows(NullPointerException.class, () -> {
+ metricsFetcher.getDenyConditionsMetrics();
+ });
+ }
+
+ @Test
+ public void testGetContextEnrichersMetrics() {
+ List<String> serviceDefs = Arrays.asList("hdfs", "hive", "kafka");
+
+
when(svcStore.findAllServiceDefNamesHavingContextEnrichers()).thenReturn(serviceDefs);
+
+ Map<String, Long> result = metricsFetcher.getContextEnrichersMetrics();
+
+ assertEquals(1L, result.get("hdfs"));
+ assertEquals(1L, result.get("hive"));
+ assertEquals(1L, result.get("kafka"));
+ assertEquals(3L, result.get("Total"));
+ verify(svcStore).findAllServiceDefNamesHavingContextEnrichers();
+ }
+
+ @Test
+ public void testGetContextEnrichersMetrics_EmptyList() {
+
when(svcStore.findAllServiceDefNamesHavingContextEnrichers()).thenReturn(Collections.emptyList());
+
+ Map<String, Long> result = metricsFetcher.getContextEnrichersMetrics();
+
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertTrue(result.containsKey("Total"));
+ assertEquals(0L, result.get("Total"));
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceBase.java
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceBase.java
new file mode 100644
index 000000000..e7803d2c6
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceBase.java
@@ -0,0 +1,308 @@
+/*
+ * 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.metrics.source;
+
+import org.apache.hadoop.metrics2.MetricsCollector;
+import org.apache.hadoop.metrics2.MetricsRecordBuilder;
+import org.apache.ranger.metrics.RangerMetricsInfo;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerAdminMetricsSourceBase {
+ private static final String TEST_CONTEXT = "test-context";
+ private static final String TEST_RECORD = "test-record";
+
+ @Mock
+ MetricsCollector metricsCollector;
+
+ @Mock
+ MetricsRecordBuilder metricsRecordBuilder;
+
+ private TestableRangerAdminMetricsSourceBase metricsSource;
+
+ private static class TestableRangerAdminMetricsSourceBase extends
RangerAdminMetricsSourceBase {
+ public TestableRangerAdminMetricsSourceBase(String context, String
record) {
+ super(context, record);
+ }
+
+ @Override
+ protected void refresh() {
+ // No-op for testing
+ }
+
+ public void testAddMetricEntry(String prefix, String suffix, Long
value) {
+ addMetricEntry(prefix, suffix, value);
+ }
+
+ public void testAddMetricEntries(String prefix, Map<String, Long>
metrics) {
+ addMetricEntries(prefix, metrics);
+ }
+
+ public Map<String, Long> getMetricsMap() {
+ return metricsMap;
+ }
+
+ public String getContext() {
+ return context;
+ }
+
+ public String getRecord() {
+ return record;
+ }
+ }
+
+ @BeforeEach
+ public void setUp() {
+ metricsSource = new TestableRangerAdminMetricsSourceBase(TEST_CONTEXT,
TEST_RECORD);
+ }
+
+ @Test
+ public void testConstructor() {
+ assertEquals(TEST_CONTEXT, metricsSource.getContext());
+ assertEquals(TEST_RECORD, metricsSource.getRecord());
+ assertNotNull(metricsSource.getMetricsMap());
+ assertTrue(metricsSource.getMetricsMap().isEmpty());
+ }
+
+ @Test
+ public void testAddMetricEntry_WithNormalPrefixAndSuffix() {
+ String prefix = "TestMetric";
+ String suffix = "Count";
+ Long value = 100L;
+
+ metricsSource.testAddMetricEntry(prefix, suffix, value);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertEquals(1, metricsMap.size());
+ assertEquals(value, metricsMap.get("TestMetricCOUNT"));
+ }
+
+ @Test
+ public void testAddMetricEntry_WithNullSuffix() {
+ String prefix = "TestMetric";
+ String suffix = null;
+ Long value = 200L;
+
+ metricsSource.testAddMetricEntry(prefix, suffix, value);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertEquals(1, metricsMap.size());
+ assertEquals(value, metricsMap.get("TestMetric"));
+ }
+
+ @Test
+ public void testAddMetricEntry_WithEmptySuffix() {
+ String prefix = "TestMetric";
+ String suffix = "";
+ Long value = 300L;
+
+ metricsSource.testAddMetricEntry(prefix, suffix, value);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertEquals(1, metricsMap.size());
+ assertEquals(value, metricsMap.get("TestMetric"));
+ }
+
+ @Test
+ public void testAddMetricEntry_WithTotalSuffix() {
+ String prefix = "TestMetric";
+ String suffix = "Total";
+ Long value = 400L;
+
+ metricsSource.testAddMetricEntry(prefix, suffix, value);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertEquals(1, metricsMap.size());
+ assertEquals(value, metricsMap.get("TestMetric"));
+ }
+
+ @Test
+ public void testAddMetricEntry_WithTotalSuffixCaseInsensitive() {
+ String prefix = "TestMetric";
+ String suffix = "total";
+ Long value = 500L;
+
+ metricsSource.testAddMetricEntry(prefix, suffix, value);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertEquals(1, metricsMap.size());
+ assertEquals(value, metricsMap.get("TestMetric"));
+ }
+
+ @Test
+ public void testAddMetricEntry_WithNullPrefix() {
+ String prefix = null;
+ String suffix = "Count";
+ Long value = 600L;
+
+ metricsSource.testAddMetricEntry(prefix, suffix, value);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertTrue(metricsMap.isEmpty());
+ }
+
+ @Test
+ public void testAddMetricEntry_WithNullValue() {
+ String prefix = "TestMetric";
+ String suffix = "Count";
+ Long value = null;
+
+ metricsSource.testAddMetricEntry(prefix, suffix, value);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertEquals(1, metricsMap.size());
+ assertNull(metricsMap.get("TestMetricCOUNT"));
+ }
+
+ @Test
+ public void testAddMetricEntry_MultipleEntries() {
+ metricsSource.testAddMetricEntry("Metric1", "Count", 10L);
+ metricsSource.testAddMetricEntry("Metric2", "Size", 20L);
+ metricsSource.testAddMetricEntry("Metric3", null, 30L);
+ metricsSource.testAddMetricEntry("Metric4", "Total", 40L);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertEquals(4, metricsMap.size());
+ assertEquals(10L, metricsMap.get("Metric1COUNT"));
+ assertEquals(20L, metricsMap.get("Metric2SIZE"));
+ assertEquals(30L, metricsMap.get("Metric3"));
+ assertEquals(40L, metricsMap.get("Metric4"));
+ }
+
+ @Test
+ public void testAddMetricEntries_WithValidMap() {
+ Map<String, Long> metrics = new HashMap<>();
+ metrics.put("User", 10L);
+ metrics.put("Admin", 5L);
+ metrics.put("Total", 15L);
+
+ metricsSource.testAddMetricEntries("Count", metrics);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertTrue(metricsMap.containsKey("CountUSER"));
+ assertTrue(metricsMap.containsKey("CountADMIN"));
+ assertTrue(metricsMap.containsKey("Count"));
+ assertEquals(3, metricsMap.size());
+ assertEquals(10L, metricsMap.get("CountUSER"));
+ assertEquals(5L, metricsMap.get("CountADMIN"));
+ assertEquals(15L, metricsMap.get("Count"));
+ }
+
+ @Test
+ public void testAddMetricEntries_WithEmptyMap() {
+ Map<String, Long> metrics = new HashMap<>();
+
+ metricsSource.testAddMetricEntries("Count", metrics);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+ assertTrue(metricsMap.isEmpty());
+ }
+
+ @Test
+ public void testAddMetricEntries_WithNullMap() {
+ assertThrows(NullPointerException.class, () -> {
+ metricsSource.testAddMetricEntries("Count", null);
+ });
+ }
+
+ @Test
+ public void testAddMetricEntries_WithNullPrefix() {
+ Map<String, Long> metrics = new HashMap<>();
+ metrics.put("User", 10L);
+
+ metricsSource.testAddMetricEntries(null, metrics);
+
+ Map<String, Long> metricsMap = metricsSource.getMetricsMap();
+
+ assertTrue(metricsMap.isEmpty());
+ }
+
+ @Test
+ public void testUpdate_WithMetrics() {
+ metricsSource.testAddMetricEntry("TestMetric1", "Count", 100L);
+ metricsSource.testAddMetricEntry("TestMetric2", "Size", 200L);
+
+
when(metricsCollector.addRecord(TEST_RECORD)).thenReturn(metricsRecordBuilder);
+
when(metricsRecordBuilder.setContext(TEST_CONTEXT)).thenReturn(metricsRecordBuilder);
+ when(metricsRecordBuilder.addGauge(any(RangerMetricsInfo.class),
any(Long.class))).thenReturn(metricsRecordBuilder);
+
+ metricsSource.update(metricsCollector, true);
+
+ verify(metricsCollector).addRecord(TEST_RECORD);
+ verify(metricsRecordBuilder).setContext(TEST_CONTEXT);
+ verify(metricsRecordBuilder,
times(2)).addGauge(any(RangerMetricsInfo.class), any(Long.class));
+
+ ArgumentCaptor<RangerMetricsInfo> infoCaptor =
ArgumentCaptor.forClass(RangerMetricsInfo.class);
+ ArgumentCaptor<Long> valueCaptor = ArgumentCaptor.forClass(Long.class);
+ verify(metricsRecordBuilder, times(2)).addGauge(infoCaptor.capture(),
valueCaptor.capture());
+ assertTrue(infoCaptor.getAllValues().stream().anyMatch(info ->
"TestMetric1COUNT".equals(info.name())));
+ assertTrue(infoCaptor.getAllValues().stream().anyMatch(info ->
"TestMetric2SIZE".equals(info.name())));
+ assertTrue(valueCaptor.getAllValues().contains(100L));
+ assertTrue(valueCaptor.getAllValues().contains(200L));
+ }
+
+ @Test
+ public void testUpdate_WithEmptyMetrics() {
+
when(metricsCollector.addRecord(TEST_RECORD)).thenReturn(metricsRecordBuilder);
+
when(metricsRecordBuilder.setContext(TEST_CONTEXT)).thenReturn(metricsRecordBuilder);
+
+ metricsSource.update(metricsCollector, false);
+
+ verify(metricsCollector).addRecord(TEST_RECORD);
+ verify(metricsRecordBuilder).setContext(TEST_CONTEXT);
+ verify(metricsRecordBuilder,
never()).addGauge(any(RangerMetricsInfo.class), any(Long.class));
+ }
+
+ @Test
+ public void testUpdate_BooleanParameterIgnored() {
+ metricsSource.testAddMetricEntry("TestMetric", "Count", 50L);
+
+
when(metricsCollector.addRecord(TEST_RECORD)).thenReturn(metricsRecordBuilder);
+
when(metricsRecordBuilder.setContext(TEST_CONTEXT)).thenReturn(metricsRecordBuilder);
+ when(metricsRecordBuilder.addGauge(any(RangerMetricsInfo.class),
any(Long.class))).thenReturn(metricsRecordBuilder);
+
+ metricsSource.update(metricsCollector, true);
+ metricsSource.update(metricsCollector, false);
+
+ verify(metricsCollector, times(2)).addRecord(TEST_RECORD);
+ verify(metricsRecordBuilder, times(2)).setContext(TEST_CONTEXT);
+ verify(metricsRecordBuilder,
times(2)).addGauge(any(RangerMetricsInfo.class), eq(50L));
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceContextEnricher.java
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceContextEnricher.java
new file mode 100644
index 000000000..12619905a
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceContextEnricher.java
@@ -0,0 +1,87 @@
+/*
+ * 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.metrics.source;
+
+import org.apache.ranger.metrics.RangerMetricsFetcher;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerAdminMetricsSourceContextEnricher {
+ private static final String EXPECTED_METRIC_PREFIX =
"ContextEnricherCount";
+
+ @InjectMocks
+ RangerAdminMetricsSourceContextEnricher contextEnricherSource;
+
+ @Mock
+ RangerMetricsFetcher rangerMetricsFetcher;
+
+ @Test
+ public void testRefresh_WithValidMetrics() {
+ RangerAdminMetricsSourceContextEnricher spyContextEnricherSource =
spy(contextEnricherSource);
+
+ Map<String, Long> mockMetrics = new HashMap<>();
+ mockMetrics.put("hdfs", 3L);
+ mockMetrics.put("hive", 2L);
+ mockMetrics.put("total", 5L);
+
+
when(rangerMetricsFetcher.getContextEnrichersMetrics()).thenReturn(mockMetrics);
+
+ spyContextEnricherSource.refresh();
+
+
verify(spyContextEnricherSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
mockMetrics);
+ verify(rangerMetricsFetcher).getContextEnrichersMetrics();
+ }
+
+ @Test
+ public void testRefresh_WithEmptyMetrics() {
+ RangerAdminMetricsSourceContextEnricher spyContextEnricherSource =
spy(contextEnricherSource);
+
+ Map<String, Long> emptyMetrics = new HashMap<>();
+
when(rangerMetricsFetcher.getContextEnrichersMetrics()).thenReturn(emptyMetrics);
+
+ spyContextEnricherSource.refresh();
+
+
verify(spyContextEnricherSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
emptyMetrics);
+ verify(rangerMetricsFetcher).getContextEnrichersMetrics();
+ }
+
+ @Test
+ public void testRefresh_WithNullMetrics() {
+
when(rangerMetricsFetcher.getContextEnrichersMetrics()).thenReturn(null);
+
+ assertThrows(NullPointerException.class, () -> {
+ contextEnricherSource.refresh();
+ });
+
+ verify(rangerMetricsFetcher).getContextEnrichersMetrics();
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceDenyConditions.java
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceDenyConditions.java
new file mode 100644
index 000000000..bb936e468
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceDenyConditions.java
@@ -0,0 +1,88 @@
+/*
+ * 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.metrics.source;
+
+import org.apache.ranger.metrics.RangerMetricsFetcher;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerAdminMetricsSourceDenyConditions {
+ private static final String EXPECTED_METRIC_PREFIX = "DenyConditionCount";
+
+ @InjectMocks
+ RangerAdminMetricsSourceDenyConditions denyConditionsSource;
+
+ @Mock
+ RangerMetricsFetcher rangerMetricsFetcher;
+
+ @Test
+ public void testRefresh_WithValidMetrics() {
+ RangerAdminMetricsSourceDenyConditions spyDenyConditionsSource =
spy(denyConditionsSource);
+
+ Map<String, Long> mockMetrics = new HashMap<>();
+ mockMetrics.put("hdfs", 3L);
+ mockMetrics.put("hive", 2L);
+ mockMetrics.put("total", 5L);
+
+
when(rangerMetricsFetcher.getDenyConditionsMetrics()).thenReturn(mockMetrics);
+
+ spyDenyConditionsSource.refresh();
+
+
verify(spyDenyConditionsSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
mockMetrics);
+ verify(rangerMetricsFetcher).getDenyConditionsMetrics();
+ }
+
+ @Test
+ public void testRefresh_WithEmptyMetrics() {
+ RangerAdminMetricsSourceDenyConditions spyDenyConditionsSource =
spy(denyConditionsSource);
+
+ Map<String, Long> emptyMetrics = new HashMap<>();
+
+
when(rangerMetricsFetcher.getDenyConditionsMetrics()).thenReturn(emptyMetrics);
+
+ spyDenyConditionsSource.refresh();
+
+
verify(spyDenyConditionsSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
emptyMetrics);
+ verify(rangerMetricsFetcher).getDenyConditionsMetrics();
+ }
+
+ @Test
+ public void testRefresh_WithNullMetrics() {
+ when(rangerMetricsFetcher.getDenyConditionsMetrics()).thenReturn(null);
+
+ assertThrows(NullPointerException.class, () -> {
+ denyConditionsSource.refresh();
+ });
+
+ verify(rangerMetricsFetcher).getDenyConditionsMetrics();
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourcePolicyMasking.java
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourcePolicyMasking.java
new file mode 100644
index 000000000..2d9d2ec4c
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourcePolicyMasking.java
@@ -0,0 +1,89 @@
+/*
+ * 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.metrics.source;
+
+import org.apache.ranger.metrics.RangerMetricsFetcher;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerAdminMetricsSourcePolicyMasking {
+ private static final String EXPECTED_METRIC_PREFIX = "MaskingCount";
+
+ @InjectMocks
+ RangerAdminMetricsSourcePolicyMasking policyMaskingSource;
+
+ @Mock
+ RangerMetricsFetcher rangerMetricsFetcher;
+
+ @Test
+ public void testRefresh_WithValidMetrics() {
+ RangerAdminMetricsSourcePolicyMasking spyPolicyMaskingSource =
spy(policyMaskingSource);
+
+ Map<String, Long> mockMetrics = new HashMap<>();
+ mockMetrics.put("hdfs", 3L);
+ mockMetrics.put("hive", 2L);
+ mockMetrics.put("total", 5L);
+
+
when(rangerMetricsFetcher.getPolicyMetrics(RangerPolicy.POLICY_TYPE_DATAMASK)).thenReturn(mockMetrics);
+
+ spyPolicyMaskingSource.refresh();
+
+
verify(spyPolicyMaskingSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
mockMetrics);
+
verify(rangerMetricsFetcher).getPolicyMetrics(RangerPolicy.POLICY_TYPE_DATAMASK);
+ }
+
+ @Test
+ public void testRefresh_WithEmptyMetrics() {
+ RangerAdminMetricsSourcePolicyMasking spyPolicyMaskingSource =
spy(policyMaskingSource);
+
+ Map<String, Long> emptyMetrics = new HashMap<>();
+
+
when(rangerMetricsFetcher.getPolicyMetrics(RangerPolicy.POLICY_TYPE_DATAMASK)).thenReturn(emptyMetrics);
+
+ spyPolicyMaskingSource.refresh();
+
+
verify(spyPolicyMaskingSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
emptyMetrics);
+
verify(rangerMetricsFetcher).getPolicyMetrics(RangerPolicy.POLICY_TYPE_DATAMASK);
+ }
+
+ @Test
+ public void testRefresh_WithNullMetrics() {
+
when(rangerMetricsFetcher.getPolicyMetrics(RangerPolicy.POLICY_TYPE_DATAMASK)).thenReturn(null);
+
+ assertThrows(NullPointerException.class, () -> {
+ policyMaskingSource.refresh();
+ });
+
+
verify(rangerMetricsFetcher).getPolicyMetrics(RangerPolicy.POLICY_TYPE_DATAMASK);
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourcePolicyResourceAccess.java
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourcePolicyResourceAccess.java
new file mode 100644
index 000000000..2e1114eb3
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourcePolicyResourceAccess.java
@@ -0,0 +1,89 @@
+/*
+ * 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.metrics.source;
+
+import org.apache.ranger.metrics.RangerMetricsFetcher;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerAdminMetricsSourcePolicyResourceAccess {
+ private static final String EXPECTED_METRIC_PREFIX = "ResourceAccessCount";
+
+ @InjectMocks
+ RangerAdminMetricsSourcePolicyResourceAccess resourceAccessSource;
+
+ @Mock
+ RangerMetricsFetcher rangerMetricsFetcher;
+
+ @Test
+ public void testRefresh_WithValidMetrics() {
+ RangerAdminMetricsSourcePolicyResourceAccess spyResourceAccessSource =
spy(resourceAccessSource);
+
+ Map<String, Long> mockMetrics = new HashMap<>();
+ mockMetrics.put("hdfs", 3L);
+ mockMetrics.put("hive", 2L);
+ mockMetrics.put("total", 5L);
+
+
when(rangerMetricsFetcher.getPolicyMetrics(RangerPolicy.POLICY_TYPE_ACCESS)).thenReturn(mockMetrics);
+
+ spyResourceAccessSource.refresh();
+
+
verify(spyResourceAccessSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
mockMetrics);
+
verify(rangerMetricsFetcher).getPolicyMetrics(RangerPolicy.POLICY_TYPE_ACCESS);
+ }
+
+ @Test
+ public void testRefresh_WithEmptyMetrics() {
+ RangerAdminMetricsSourcePolicyResourceAccess spyResourceAccessSource =
spy(resourceAccessSource);
+
+ Map<String, Long> emptyMetrics = new HashMap<>();
+
+
when(rangerMetricsFetcher.getPolicyMetrics(RangerPolicy.POLICY_TYPE_ACCESS)).thenReturn(emptyMetrics);
+
+ spyResourceAccessSource.refresh();
+
+
verify(spyResourceAccessSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
emptyMetrics);
+
verify(rangerMetricsFetcher).getPolicyMetrics(RangerPolicy.POLICY_TYPE_ACCESS);
+ }
+
+ @Test
+ public void testRefresh_WithNullMetrics() {
+
when(rangerMetricsFetcher.getPolicyMetrics(RangerPolicy.POLICY_TYPE_ACCESS)).thenReturn(null);
+
+ assertThrows(NullPointerException.class, () -> {
+ resourceAccessSource.refresh();
+ });
+
+
verify(rangerMetricsFetcher).getPolicyMetrics(RangerPolicy.POLICY_TYPE_ACCESS);
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourcePolicyRowFiltering.java
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourcePolicyRowFiltering.java
new file mode 100644
index 000000000..e8cfc9523
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourcePolicyRowFiltering.java
@@ -0,0 +1,89 @@
+/*
+ * 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.metrics.source;
+
+import org.apache.ranger.metrics.RangerMetricsFetcher;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerAdminMetricsSourcePolicyRowFiltering {
+ private static final String EXPECTED_METRIC_PREFIX = "RowFilteringCount";
+
+ @InjectMocks
+ RangerAdminMetricsSourcePolicyRowFiltering rowFilteringSource;
+
+ @Mock
+ RangerMetricsFetcher rangerMetricsFetcher;
+
+ @Test
+ public void testRefresh_WithValidMetrics() {
+ RangerAdminMetricsSourcePolicyRowFiltering spyRowFilteringSource =
spy(rowFilteringSource);
+
+ Map<String, Long> mockMetrics = new HashMap<>();
+ mockMetrics.put("hdfs", 3L);
+ mockMetrics.put("hive", 2L);
+ mockMetrics.put("total", 5L);
+
+
when(rangerMetricsFetcher.getPolicyMetrics(RangerPolicy.POLICY_TYPE_ROWFILTER)).thenReturn(mockMetrics);
+
+ spyRowFilteringSource.refresh();
+
+ verify(spyRowFilteringSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
mockMetrics);
+
verify(rangerMetricsFetcher).getPolicyMetrics(RangerPolicy.POLICY_TYPE_ROWFILTER);
+ }
+
+ @Test
+ public void testRefresh_WithEmptyMetrics() {
+ RangerAdminMetricsSourcePolicyRowFiltering spyRowFilteringSource =
spy(rowFilteringSource);
+
+ Map<String, Long> emptyMetrics = new HashMap<>();
+
+
when(rangerMetricsFetcher.getPolicyMetrics(RangerPolicy.POLICY_TYPE_ROWFILTER)).thenReturn(emptyMetrics);
+
+ spyRowFilteringSource.refresh();
+
+ verify(spyRowFilteringSource).addMetricEntries(EXPECTED_METRIC_PREFIX,
emptyMetrics);
+
verify(rangerMetricsFetcher).getPolicyMetrics(RangerPolicy.POLICY_TYPE_ROWFILTER);
+ }
+
+ @Test
+ public void testRefresh_WithNullMetrics() {
+
when(rangerMetricsFetcher.getPolicyMetrics(RangerPolicy.POLICY_TYPE_ROWFILTER)).thenReturn(null);
+
+ assertThrows(NullPointerException.class, () -> {
+ rowFilteringSource.refresh();
+ });
+
+
verify(rangerMetricsFetcher).getPolicyMetrics(RangerPolicy.POLICY_TYPE_ROWFILTER);
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceService.java
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceService.java
new file mode 100644
index 000000000..a766f1d13
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceService.java
@@ -0,0 +1,86 @@
+/*
+ * 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.metrics.source;
+
+import org.apache.ranger.metrics.RangerMetricsFetcher;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerAdminMetricsSourceService {
+ private static final String EXPECTED_METRIC_PREFIX = "ServiceCount";
+
+ @InjectMocks
+ RangerAdminMetricsSourceService serviceSource;
+
+ @Mock
+ RangerMetricsFetcher rangerMetricsFetcher;
+
+ @Test
+ public void testRefresh_WithValidMetrics() {
+ RangerAdminMetricsSourceService spyService = spy(serviceSource);
+
+ Map<String, Long> mockMetrics = new HashMap<>();
+ mockMetrics.put("hdfs", 3L);
+ mockMetrics.put("hive", 2L);
+ mockMetrics.put("total", 5L);
+
+
when(rangerMetricsFetcher.getRangerServiceMetrics()).thenReturn(mockMetrics);
+
+ spyService.refresh();
+
+ verify(spyService).addMetricEntries(EXPECTED_METRIC_PREFIX,
mockMetrics);
+ verify(rangerMetricsFetcher).getRangerServiceMetrics();
+ }
+
+ @Test
+ public void testRefresh_WithEmptyMetrics() {
+ RangerAdminMetricsSourceService spyService = spy(serviceSource);
+
+ Map<String, Long> emptyMetrics = new HashMap<>();
+ when(rangerMetricsFetcher.getRangerServiceMetrics()).thenReturn(new
HashMap<>());
+
+ spyService.refresh();
+
+ verify(spyService).addMetricEntries(EXPECTED_METRIC_PREFIX,
emptyMetrics);
+ verify(rangerMetricsFetcher).getRangerServiceMetrics();
+ }
+
+ @Test
+ public void testRefresh_WithNullMetrics() {
+ when(rangerMetricsFetcher.getRangerServiceMetrics()).thenReturn(null);
+
+ assertThrows(NullPointerException.class, () -> {
+ serviceSource.refresh();
+ });
+ verify(rangerMetricsFetcher).getRangerServiceMetrics();
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceUserGroup.java
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceUserGroup.java
new file mode 100644
index 000000000..5ee88ce7f
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/metrics/source/TestRangerAdminMetricsSourceUserGroup.java
@@ -0,0 +1,101 @@
+/*
+ * 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.metrics.source;
+
+import org.apache.ranger.metrics.RangerMetricsFetcher;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+public class TestRangerAdminMetricsSourceUserGroup {
+ private static final String USER_COUNT_METRIC_PREFIX = "UserCount";
+ private static final String GROUP_COUNT_METRIC_NAME = "GroupCount";
+
+ @InjectMocks
+ RangerAdminMetricsSourceUserGroup userGroupSource;
+
+ @Mock
+ RangerMetricsFetcher rangerMetricsFetcher;
+
+ @Test
+ public void testRefresh_WithValidUserGroupMetrics() {
+ RangerAdminMetricsSourceUserGroup spyUserGroupSource =
spy(userGroupSource);
+
+ Map<String, Long> mockUserMetrics = new HashMap<>();
+ mockUserMetrics.put("admin", 3L);
+ mockUserMetrics.put("user", 2L);
+ mockUserMetrics.put("total", 5L);
+
+ long mockGroupCount = 7L;
+
+
when(rangerMetricsFetcher.getUserMetrics()).thenReturn(mockUserMetrics);
+ when(rangerMetricsFetcher.getGroupCount()).thenReturn(mockGroupCount);
+
+ spyUserGroupSource.refresh();
+
+ verify(spyUserGroupSource).addMetricEntries(USER_COUNT_METRIC_PREFIX,
mockUserMetrics);
+ verify(spyUserGroupSource).addMetricEntry(GROUP_COUNT_METRIC_NAME, "",
mockGroupCount);
+ verify(rangerMetricsFetcher).getUserMetrics();
+ verify(rangerMetricsFetcher).getGroupCount();
+ }
+
+ @Test
+ public void testRefresh_WithEmptyMetrics() {
+ RangerAdminMetricsSourceUserGroup spyUserGroupSource =
spy(userGroupSource);
+
+ Map<String, Long> mockUserMetrics = new HashMap<>();
+
+ long mockGroupCount = 7L;
+
+
when(rangerMetricsFetcher.getUserMetrics()).thenReturn(mockUserMetrics);
+ when(rangerMetricsFetcher.getGroupCount()).thenReturn(mockGroupCount);
+
+ spyUserGroupSource.refresh();
+
+ verify(spyUserGroupSource).addMetricEntries(USER_COUNT_METRIC_PREFIX,
mockUserMetrics);
+ verify(spyUserGroupSource).addMetricEntry(GROUP_COUNT_METRIC_NAME, "",
mockGroupCount);
+ verify(rangerMetricsFetcher).getUserMetrics();
+ verify(rangerMetricsFetcher).getGroupCount();
+ }
+
+ @Test
+ public void testRefresh_WithNullUserMetrics() {
+ when(rangerMetricsFetcher.getUserMetrics()).thenReturn(null);
+
+ assertThrows(NullPointerException.class, () -> {
+ userGroupSource.refresh();
+ });
+
+ verify(rangerMetricsFetcher).getUserMetrics();
+ verify(rangerMetricsFetcher, never()).getGroupCount();
+ }
+}