This is an automated email from the ASF dual-hosted git repository.

zixuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new e8be56d0c08 [fix][test] Fix UnfinishedStubbing issue in AuthZTests 
(#24165)
e8be56d0c08 is described below

commit e8be56d0c08dec07d291af48c00a5bd5e04c5ade
Author: Lari Hotari <[email protected]>
AuthorDate: Thu Apr 10 05:52:22 2025 +0300

    [fix][test] Fix UnfinishedStubbing issue in AuthZTests (#24165)
---
 .../org/apache/pulsar/broker/admin/AuthZTest.java  | 54 +++++++++++++++-------
 .../pulsar/broker/admin/NamespaceAuthZTest.java    | 46 ++++++++++++------
 .../admin/TransactionAndSchemaAuthZTest.java       | 18 --------
 3 files changed, 70 insertions(+), 48 deletions(-)

diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AuthZTest.java 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AuthZTest.java
index 3816b9a7a7e..d09ffe268d1 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AuthZTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AuthZTest.java
@@ -18,22 +18,25 @@
  */
 package org.apache.pulsar.broker.admin;
 
+import static org.mockito.Mockito.doReturn;
 import io.jsonwebtoken.Jwts;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
 import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.pulsar.broker.BrokerTestUtil;
 import org.apache.pulsar.broker.authorization.AuthorizationService;
 import org.apache.pulsar.client.admin.PulsarAdmin;
 import org.apache.pulsar.common.policies.data.NamespaceOperation;
 import org.apache.pulsar.common.policies.data.TopicOperation;
 import org.apache.pulsar.security.MockedPulsarStandalone;
 import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
 import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
-import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
-import static org.mockito.Mockito.doReturn;
 
-public class AuthZTest extends MockedPulsarStandalone {
+public abstract class AuthZTest extends MockedPulsarStandalone {
 
     protected PulsarAdmin superUserAdmin;
 
@@ -47,6 +50,9 @@ public class AuthZTest extends MockedPulsarStandalone {
     protected static final String TENANT_ADMIN_TOKEN = Jwts.builder()
             .claim("sub", TENANT_ADMIN_SUBJECT).signWith(SECRET_KEY).compact();
 
+    private volatile Consumer<InvocationOnMock> 
allowTopicOperationAsyncHandler;
+    private volatile Consumer<InvocationOnMock> 
allowNamespaceOperationAsyncHandler;
+
     @Override
     public void close() throws Exception {
         if (superUserAdmin != null) {
@@ -65,48 +71,62 @@ public class AuthZTest extends MockedPulsarStandalone {
     @BeforeMethod(alwaysRun = true)
     public void before() throws IllegalAccessException {
         orignalAuthorizationService = 
getPulsarService().getBrokerService().getAuthorizationService();
-        authorizationService = Mockito.spy(orignalAuthorizationService);
+        authorizationService = 
BrokerTestUtil.spyWithoutRecordingInvocations(orignalAuthorizationService);
         FieldUtils.writeField(getPulsarService().getBrokerService(), 
"authorizationService",
                 authorizationService, true);
+        Mockito.doAnswer(invocationOnMock -> {
+            Consumer<InvocationOnMock> localAllowTopicOperationAsyncHandler =
+                    allowTopicOperationAsyncHandler;
+            if (localAllowTopicOperationAsyncHandler != null) {
+                localAllowTopicOperationAsyncHandler.accept(invocationOnMock);
+            }
+            return invocationOnMock.callRealMethod();
+        }).when(authorizationService).allowTopicOperationAsync(Mockito.any(), 
Mockito.any(), Mockito.any(),
+                Mockito.any(), Mockito.any());
+        doReturn(true)
+                
.when(authorizationService).isValidOriginalPrincipal(Mockito.any(), 
Mockito.any(), Mockito.any());
+        Mockito.doAnswer(invocationOnMock -> {
+            Consumer<InvocationOnMock> 
localAllowNamespaceOperationAsyncHandler =
+                    allowNamespaceOperationAsyncHandler;
+            if (localAllowNamespaceOperationAsyncHandler != null) {
+                
localAllowNamespaceOperationAsyncHandler.accept(invocationOnMock);
+            }
+            return invocationOnMock.callRealMethod();
+        
}).when(authorizationService).allowNamespaceOperationAsync(Mockito.any(), 
Mockito.any(), Mockito.any(),
+                Mockito.any(), Mockito.any());
     }
 
     @AfterMethod(alwaysRun = true)
     public void after() throws IllegalAccessException {
         FieldUtils.writeField(getPulsarService().getBrokerService(), 
"authorizationService",
                 orignalAuthorizationService, true);
+        allowNamespaceOperationAsyncHandler = null;
+        allowTopicOperationAsyncHandler = null;
     }
 
     protected AtomicBoolean setAuthorizationTopicOperationChecker(String role, 
Object operation) {
         AtomicBoolean execFlag = new AtomicBoolean(false);
         if (operation instanceof TopicOperation) {
-            Mockito.doAnswer(invocationOnMock -> {
+            allowTopicOperationAsyncHandler = invocationOnMock -> {
                 String role_ = invocationOnMock.getArgument(2);
                 if (role.equals(role_)) {
                     TopicOperation operation_ = 
invocationOnMock.getArgument(1);
                     Assert.assertEquals(operation_, operation);
                 }
                 execFlag.set(true);
-                return invocationOnMock.callRealMethod();
-            
}).when(authorizationService).allowTopicOperationAsync(Mockito.any(), 
Mockito.any(), Mockito.any(),
-                    Mockito.any(), Mockito.any());
+            };
         } else if (operation instanceof NamespaceOperation) {
-            doReturn(true)
-                    
.when(authorizationService).isValidOriginalPrincipal(Mockito.any(), 
Mockito.any(), Mockito.any());
-            Mockito.doAnswer(invocationOnMock -> {
+            allowNamespaceOperationAsyncHandler = invocationOnMock -> {
                 String role_ = invocationOnMock.getArgument(2);
                 if (role.equals(role_)) {
                     TopicOperation operation_ = 
invocationOnMock.getArgument(1);
                     Assert.assertEquals(operation_, operation);
                 }
                 execFlag.set(true);
-                return invocationOnMock.callRealMethod();
-            
}).when(authorizationService).allowNamespaceOperationAsync(Mockito.any(), 
Mockito.any(), Mockito.any(),
-                    Mockito.any(), Mockito.any());
+            };
         } else {
             throw new IllegalArgumentException("");
         }
-
-
         return execFlag;
     }
 
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespaceAuthZTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespaceAuthZTest.java
index 66e13ef59f0..8a9e38d166f 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespaceAuthZTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespaceAuthZTest.java
@@ -36,10 +36,12 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
 import lombok.Cleanup;
 import lombok.SneakyThrows;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.pulsar.broker.BrokerTestUtil;
 import org.apache.pulsar.broker.authorization.AuthorizationService;
 import org.apache.pulsar.broker.service.Topic;
 import org.apache.pulsar.client.admin.PulsarAdmin;
@@ -96,6 +98,9 @@ public class NamespaceAuthZTest extends 
MockedPulsarStandalone {
     private static final String TENANT_ADMIN_TOKEN = Jwts.builder()
             .claim("sub", TENANT_ADMIN_SUBJECT).signWith(SECRET_KEY).compact();
 
+    private volatile Consumer<InvocationOnMock> 
allowNamespacePolicyOperationAsyncHandler;
+    private volatile Consumer<InvocationOnMock> 
allowNamespaceOperationAsyncHandler;
+
     @SneakyThrows
     @BeforeClass
     public void setup() {
@@ -118,9 +123,28 @@ public class NamespaceAuthZTest extends 
MockedPulsarStandalone {
                 .authentication(new AuthenticationToken(TENANT_ADMIN_TOKEN))
                 .build();
         this.pulsarClient = super.getPulsarService().getClient();
-        this.authorizationService = 
Mockito.spy(getPulsarService().getBrokerService().getAuthorizationService());
+        this.authorizationService = 
BrokerTestUtil.spyWithoutRecordingInvocations(
+                
getPulsarService().getBrokerService().getAuthorizationService());
         FieldUtils.writeField(getPulsarService().getBrokerService(), 
"authorizationService",
                 authorizationService, true);
+        Mockito.doAnswer(invocationOnMock -> {
+            Consumer<InvocationOnMock> 
localAllowNamespacePolicyOperationAsyncHandler =
+                    allowNamespacePolicyOperationAsyncHandler;
+            if (localAllowNamespacePolicyOperationAsyncHandler != null) {
+                
localAllowNamespacePolicyOperationAsyncHandler.accept(invocationOnMock);
+            }
+            return invocationOnMock.callRealMethod();
+        
}).when(authorizationService).allowNamespacePolicyOperationAsync(Mockito.any(), 
Mockito.any(), Mockito.any(),
+                Mockito.any(), Mockito.any());
+        Mockito.doAnswer(invocationOnMock -> {
+            Consumer<InvocationOnMock> 
localAllowNamespaceOperationAsyncHandler =
+                    allowNamespaceOperationAsyncHandler;
+            if (localAllowNamespaceOperationAsyncHandler != null) {
+                
localAllowNamespaceOperationAsyncHandler.accept(invocationOnMock);
+            }
+            return invocationOnMock.callRealMethod();
+        
}).when(authorizationService).allowNamespaceOperationAsync(Mockito.any(), 
Mockito.any(), Mockito.any(),
+                Mockito.any());
     }
 
 
@@ -144,33 +168,31 @@ public class NamespaceAuthZTest extends 
MockedPulsarStandalone {
     public void after() throws Exception {
         deleteNamespaceWithRetry("public/default", true, superUserAdmin);
         superUserAdmin.namespaces().createNamespace("public/default");
+        allowNamespacePolicyOperationAsyncHandler = null;
+        allowNamespaceOperationAsyncHandler = null;
     }
 
     private AtomicBoolean setAuthorizationOperationChecker(String role, 
NamespaceOperation operation) {
         AtomicBoolean execFlag = new AtomicBoolean(false);
-        Mockito.doAnswer(invocationOnMock -> {
+        allowNamespaceOperationAsyncHandler = invocationOnMock -> {
             String role_ = invocationOnMock.getArgument(2);
             if (role.equals(role_)) {
                 NamespaceOperation operation_ = 
invocationOnMock.getArgument(1);
                 Assert.assertEquals(operation_, operation);
             }
             execFlag.set(true);
-            return invocationOnMock.callRealMethod();
-        
}).when(authorizationService).allowNamespaceOperationAsync(Mockito.any(), 
Mockito.any(), Mockito.any(),
-                Mockito.any());
-         return execFlag;
+        };
+        return execFlag;
     }
 
     private void clearAuthorizationOperationChecker() {
-        
Mockito.doAnswer(InvocationOnMock::callRealMethod).when(authorizationService)
-                .allowNamespaceOperationAsync(Mockito.any(), Mockito.any(), 
Mockito.any(),
-                        Mockito.any());
+        allowNamespaceOperationAsyncHandler = null;
     }
 
     private AtomicBoolean setAuthorizationPolicyOperationChecker(String role, 
Object policyName, Object operation) {
         AtomicBoolean execFlag = new AtomicBoolean(false);
         if (operation instanceof PolicyOperation) {
-            Mockito.doAnswer(invocationOnMock -> {
+            allowNamespacePolicyOperationAsyncHandler = invocationOnMock -> {
                 String role_ = invocationOnMock.getArgument(3);
                 if (role.equals(role_)) {
                     PolicyName policyName_ = invocationOnMock.getArgument(1);
@@ -179,9 +201,7 @@ public class NamespaceAuthZTest extends 
MockedPulsarStandalone {
                     assertEquals(policyName_, policyName);
                 }
                 execFlag.set(true);
-                return invocationOnMock.callRealMethod();
-            
}).when(authorizationService).allowNamespacePolicyOperationAsync(Mockito.any(), 
Mockito.any(), Mockito.any(),
-                    Mockito.any(), Mockito.any());
+            };
         } else {
             throw new IllegalArgumentException("");
         }
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TransactionAndSchemaAuthZTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TransactionAndSchemaAuthZTest.java
index f52d6dae9bb..deaa7c237ff 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TransactionAndSchemaAuthZTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/TransactionAndSchemaAuthZTest.java
@@ -25,7 +25,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import lombok.Cleanup;
 import lombok.SneakyThrows;
-import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.pulsar.client.admin.PulsarAdmin;
 import org.apache.pulsar.client.admin.PulsarAdminException;
 import org.apache.pulsar.client.api.Consumer;
@@ -43,12 +42,9 @@ import org.apache.pulsar.common.policies.data.TopicOperation;
 import org.apache.pulsar.common.schema.SchemaInfo;
 import org.apache.pulsar.common.schema.SchemaType;
 import org.apache.pulsar.metadata.api.MetadataStoreException;
-import org.mockito.Mockito;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -85,20 +81,6 @@ public class TransactionAndSchemaAuthZTest extends AuthZTest 
{
         close();
     }
 
-    @BeforeMethod
-    public void before() throws IllegalAccessException {
-        orignalAuthorizationService = 
getPulsarService().getBrokerService().getAuthorizationService();
-        authorizationService = Mockito.spy(orignalAuthorizationService);
-        FieldUtils.writeField(getPulsarService().getBrokerService(), 
"authorizationService",
-                authorizationService, true);
-    }
-
-    @AfterMethod
-    public void after() throws IllegalAccessException {
-        FieldUtils.writeField(getPulsarService().getBrokerService(), 
"authorizationService",
-                orignalAuthorizationService, true);
-    }
-
     protected void createTransactionCoordinatorAssign(int numPartitionsOfTC) 
throws MetadataStoreException {
         getPulsarService().getPulsarResources()
                 .getNamespaceResources()

Reply via email to