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

penghui 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 2c2ac1af68d [improve][test] Improve NamespacesTest to reduce the 
execution time (#17875)
2c2ac1af68d is described below

commit 2c2ac1af68d1e662f9c8cea62868c215bd272eea
Author: fengyubiao <[email protected]>
AuthorDate: Wed Nov 2 09:43:01 2022 +0800

    [improve][test] Improve NamespacesTest to reduce the execution time (#17875)
---
 .../apache/pulsar/broker/admin/NamespacesTest.java | 118 ++++++++++++++++++---
 1 file changed, 101 insertions(+), 17 deletions(-)

diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java
index 4f9c3b27766..307c8447674 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java
@@ -39,16 +39,21 @@ import java.net.URL;
 import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.ClientErrorException;
 import javax.ws.rs.WebApplicationException;
@@ -61,6 +66,7 @@ import org.apache.bookkeeper.client.api.ReadHandle;
 import org.apache.bookkeeper.mledger.LedgerOffloader;
 import org.apache.bookkeeper.mledger.ManagedLedgerConfig;
 import org.apache.bookkeeper.util.ZkUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.pulsar.broker.BrokerTestUtil;
 import org.apache.pulsar.broker.admin.v1.Namespaces;
 import org.apache.pulsar.broker.admin.v1.PersistentTopics;
@@ -76,6 +82,7 @@ import org.apache.pulsar.broker.web.RestException;
 import org.apache.pulsar.client.admin.PulsarAdminException;
 import org.apache.pulsar.client.admin.PulsarAdminException.NotFoundException;
 import org.apache.pulsar.client.admin.internal.BaseResource;
+import org.apache.pulsar.client.api.ClientBuilder;
 import org.apache.pulsar.client.api.Consumer;
 import org.apache.pulsar.client.api.ConsumerBuilder;
 import org.apache.pulsar.client.api.Producer;
@@ -112,9 +119,9 @@ import org.mockito.ArgumentMatcher;
 import org.mockito.Mockito;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterClass;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 @Test(groups = "broker-admin")
@@ -139,8 +146,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         super();
     }
 
+    @Override
     @BeforeClass
-    public void initNamespace() throws Exception {
+    public void setup() throws Exception {
         testLocalNamespaces = new ArrayList<>();
         testGlobalNamespaces = new ArrayList<>();
 
@@ -154,11 +162,37 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         uriField = PulsarWebResource.class.getDeclaredField("uri");
         uriField.setAccessible(true);
         uriInfo = mock(UriInfo.class);
+
+        initAndStartBroker();
     }
 
     @Override
-    @BeforeMethod
-    public void setup() throws Exception {
+    @AfterClass(alwaysRun = true)
+    public void cleanup() throws Exception {
+        super.internalCleanup();
+        conf.setClusterName(testLocalCluster);
+    }
+
+    @AfterMethod(alwaysRun = true)
+    public void cleanupAfterMethod() throws Exception{
+        // cleanup.
+        Set<String> existsNsSetAferSetup = 
Stream.concat(testLocalNamespaces.stream(), testGlobalNamespaces.stream())
+                .map(Objects::toString).collect(Collectors.toSet());
+        cleanupNamespaceByPredicate(this.testTenant, v -> 
!existsNsSetAferSetup.contains(v));
+        cleanupNamespaceByPredicate(this.testOtherTenant, v -> 
!existsNsSetAferSetup.contains(v));
+    }
+
+    protected void customizeNewPulsarClientBuilder(ClientBuilder 
clientBuilder) {
+        // Make method "testMaxTopicsPerNamespace" run faster.
+        clientBuilder.operationTimeout(1, TimeUnit.SECONDS);
+    }
+
+    private void resetBroker() throws Exception {
+        cleanup();
+        initAndStartBroker();
+    }
+
+    private void initAndStartBroker() throws Exception {
         conf.setTopicLevelPoliciesEnabled(false);
         conf.setSystemTopicEnabled(false);
         conf.setClusterName(testLocalCluster);
@@ -207,13 +241,6 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         nsSvc = pulsar.getNamespaceService();
     }
 
-    @Override
-    @AfterMethod(alwaysRun = true)
-    public void cleanup() throws Exception {
-        super.internalCleanup();
-        conf.setClusterName(testLocalCluster);
-    }
-
     @Test
     public void testCreateNamespaces() throws Exception {
         try {
@@ -646,6 +673,8 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
             assertEquals(e.getResponse().getStatus(), 
Status.PRECONDITION_FAILED.getStatusCode());
         }
 
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -723,6 +752,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         assertEquals(captor.getValue().getResponse().getStatus(), 
Status.TEMPORARY_REDIRECT.getStatusCode());
         assertEquals(captor.getValue().getResponse().getLocation().toString(),
                 
UriBuilder.fromUri(uri).host("broker-usc.com").port(8080).toString());
+
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -802,6 +834,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         responseCaptor = ArgumentCaptor.forClass(Response.class);
         verify(response, 
timeout(5000).times(1)).resume(responseCaptor.capture());
         assertEquals(responseCaptor.getValue().getStatus(), 
Status.NO_CONTENT.getStatusCode());
+
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -882,6 +917,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         ArgumentCaptor<Response> captor2 = 
ArgumentCaptor.forClass(Response.class);
         verify(response, timeout(5000).times(1)).resume(captor2.capture());
         assertEquals(captor2.getValue().getStatus(), 
Status.NO_CONTENT.getStatusCode());
+
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -901,6 +939,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         ArgumentCaptor<Response> captor = 
ArgumentCaptor.forClass(Response.class);
         verify(response, timeout(5000).times(1)).resume(captor.capture());
         assertEquals(captor.getValue().getStatus(), 
Status.NO_CONTENT.getStatusCode());
+
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -940,6 +981,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         } catch (RestException re) {
             assertEquals(re.getResponse().getStatus(), 
Status.PRECONDITION_FAILED.getStatusCode());
         }
+
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -967,6 +1011,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
                 "0x08375b1a_0x08375b1b", false, false, null);
         ArgumentCaptor<Response> captor = 
ArgumentCaptor.forClass(Response.class);
         verify(response, 
timeout(5000).times(1)).resume(any(RestException.class));
+
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -998,6 +1045,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         namespaces.unloadNamespaceBundle(response, testTenant, 
testLocalCluster, bundledNsLocal, "0x00000000_0x80000000",
                 false);
         verify(response, 
timeout(5000).times(1)).resume(any(RestException.class));
+
+        // cleanup
+        resetBroker();
     }
 
     private void createBundledTestNamespaces(String property, String cluster, 
String namespace, BundlesData bundle)
@@ -1061,6 +1111,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         } catch (RestException e) {
             fail("ValidateNamespaceOwnershipWithBundles failed");
         }
+
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -1133,6 +1186,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         topics.validateTopicName(topicName.getTenant(), topicName.getCluster(),
                 topicName.getNamespacePortion(), 
topicName.getEncodedLocalName());
         topics.validateAdminOperationOnTopic(false);
+
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -1566,7 +1622,7 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
     public void testMaxTopicsPerNamespace() throws Exception {
         cleanup();
         conf.setMaxTopicsPerNamespace(15);
-        setup();
+        initAndStartBroker();
 
         String namespace = BrokerTestUtil.newUniqueName("testTenant/ns1");
         TenantInfoImpl tenantInfo = new TenantInfoImpl(Set.of("role1", 
"role2"),
@@ -1618,7 +1674,7 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         conf.setMaxTopicsPerNamespace(0);
         conf.setDefaultNumPartitions(3);
         conf.setAllowAutoTopicCreationType("partitioned");
-        setup();
+        initAndStartBroker();
 
         admin.tenants().createTenant("testTenant", tenantInfo);
         admin.namespaces().createNamespace(namespace, Set.of("use"));
@@ -1647,7 +1703,7 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         conf.setMaxTopicsPerNamespace(0);
         conf.setDefaultNumPartitions(1);
         conf.setAllowAutoTopicCreationType("non-partitioned");
-        setup();
+        initAndStartBroker();
 
         admin.tenants().createTenant("testTenant", tenantInfo);
         admin.namespaces().createNamespace(namespace, Set.of("use"));
@@ -1682,9 +1738,8 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
             pulsarClient.newConsumer().topic(topic + "_c" + 
i).subscriptionName("test_sub").subscribe().close();
         }
 
-        conf.setMaxTopicsPerNamespace(0);
-        conf.setDefaultNumPartitions(1);
-        conf.setAllowAutoTopicCreationType("non-partitioned");
+        // cleanup
+        resetBroker();
     }
 
     private void assertInvalidRetentionPolicy(String namespace, int 
retentionTimeInMinutes, int retentionSizeInMB) {
@@ -1876,6 +1931,9 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
         }
         BundlesData bundles = admin.namespaces().getBundles(namespace);
         assertEquals(bundles.getNumBundles(), 14);
+
+        // cleanup
+        resetBroker();
     }
 
     @Test
@@ -1913,5 +1971,31 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
             assertEquals(e.getResponse().getStatus(), 
Status.NOT_FOUND.getStatusCode());
         }
     }
+    /**
+     * see {@link #cleanupNamespaceByNsCollection(Collection)}
+     */
+    private void cleanupNamespaceByPredicate(String tenant, Predicate<String> 
predicate) throws Exception{
+        
cleanupNamespaceByNsCollection(admin.namespaces().getNamespaces(tenant).stream()
+                .filter(predicate).collect(Collectors.toSet()));
+    }
+
+    /**
+     * Remove namespaces.
+     */
+    private void cleanupNamespaceByNsCollection(Collection<String> namespaces)
+            throws Exception{
+        if (namespaces == null){
+            return;
+        }
+        boolean forceDeleteNamespaceAllowedOriginalValue = 
pulsar.getConfiguration().isForceDeleteNamespaceAllowed();
+        pulsar.getConfiguration().setForceDeleteNamespaceAllowed(true);
+        for (String ns : namespaces){
+            if (StringUtils.isEmpty(ns)){
+                continue;
+            }
+            deleteNamespaceGraceFully(ns, true);
+        }
+        
pulsar.getConfiguration().setForceDeleteNamespaceAllowed(forceDeleteNamespaceAllowedOriginalValue);
+    }
 
 }

Reply via email to