From 5458ec0aaa15e2601855d4ac08fe147337865b6d Mon Sep 17 00:00:00 2001 From: Eron Wright Date: Thu, 16 Sep 2021 15:16:51 -0700 Subject: [PATCH 1/7] [Issue 12040][web] Topic Lookup - Listener Header --- .../apache/pulsar/broker/lookup/v2/TopicLookup.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java index 031fe486d8997..aaaf768d1336c 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java @@ -23,6 +23,7 @@ import javax.ws.rs.DefaultValue; import javax.ws.rs.Encoded; import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @@ -30,12 +31,15 @@ import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; +import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.lookup.TopicLookupBase; import org.apache.pulsar.common.naming.TopicName; @Path("/v2/topic") public class TopicLookup extends TopicLookupBase { + static final String LISTENERNAME_HEADER = "X-Pulsar-ListenerName"; + @GET @Path("{topic-domain}/{tenant}/{namespace}/{topic}") @Produces(MediaType.APPLICATION_JSON) @@ -45,8 +49,12 @@ public void lookupTopicAsync(@PathParam("topic-domain") String topicDomain, @Pat @PathParam("namespace") String namespace, @PathParam("topic") @Encoded String encodedTopic, @QueryParam("authoritative") @DefaultValue("false") boolean authoritative, @Suspended AsyncResponse asyncResponse, - @QueryParam("listenerName") String listenerName) { + @QueryParam("listenerName") String listenerName, + @HeaderParam(LISTENERNAME_HEADER) String listenerNameHeader) { TopicName topicName = getTopicName(topicDomain, tenant, namespace, encodedTopic); + if (StringUtils.isEmpty(listenerName)) { + listenerName = listenerNameHeader; + } internalLookupTopicAsync(topicName, authoritative, asyncResponse, listenerName); } From 5cefc5300378ffe7df8ebb5c422e6fc5d4ba56e8 Mon Sep 17 00:00:00 2001 From: Eron Wright Date: Thu, 16 Sep 2021 17:51:35 -0700 Subject: [PATCH 2/7] [Issue 12040][web] Topic Lookup - Listener Header --- .../apache/pulsar/broker/lookup/v1/TopicLookup.java | 10 +++++++++- .../apache/pulsar/broker/lookup/v2/TopicLookup.java | 2 +- .../broker/lookup/http/HttpTopicLookupv2Test.java | 8 ++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v1/TopicLookup.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v1/TopicLookup.java index 2b0b300634bfd..a2a2659a0fe4d 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v1/TopicLookup.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v1/TopicLookup.java @@ -23,6 +23,7 @@ import javax.ws.rs.DefaultValue; import javax.ws.rs.Encoded; import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @@ -30,6 +31,7 @@ import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; +import org.apache.commons.lang3.StringUtils; import org.apache.pulsar.broker.lookup.TopicLookupBase; import org.apache.pulsar.broker.web.NoSwaggerDocumentation; import org.apache.pulsar.common.naming.TopicName; @@ -48,6 +50,8 @@ @NoSwaggerDocumentation public class TopicLookup extends TopicLookupBase { + static final String LISTENERNAME_HEADER = "X-Pulsar-ListenerName"; + @GET @Path("{topic-domain}/{property}/{cluster}/{namespace}/{topic}") @Produces(MediaType.APPLICATION_JSON) @@ -58,8 +62,12 @@ public void lookupTopicAsync(@PathParam("topic-domain") String topicDomain, @Pat @PathParam("topic") @Encoded String encodedTopic, @QueryParam("authoritative") @DefaultValue("false") boolean authoritative, @Suspended AsyncResponse asyncResponse, - @QueryParam("listenerName") String listenerName) { + @QueryParam("listenerName") String listenerName, + @HeaderParam(LISTENERNAME_HEADER) String listenerNameHeader) { TopicName topicName = getTopicName(topicDomain, property, cluster, namespace, encodedTopic); + if (StringUtils.isEmpty(listenerName) && StringUtils.isNotEmpty(listenerNameHeader)) { + listenerName = listenerNameHeader; + } internalLookupTopicAsync(topicName, authoritative, asyncResponse, listenerName); } diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java index aaaf768d1336c..0ac74cf782b90 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/lookup/v2/TopicLookup.java @@ -52,7 +52,7 @@ public void lookupTopicAsync(@PathParam("topic-domain") String topicDomain, @Pat @QueryParam("listenerName") String listenerName, @HeaderParam(LISTENERNAME_HEADER) String listenerNameHeader) { TopicName topicName = getTopicName(topicDomain, tenant, namespace, encodedTopic); - if (StringUtils.isEmpty(listenerName)) { + if (StringUtils.isEmpty(listenerName) && StringUtils.isNotEmpty(listenerNameHeader)) { listenerName = listenerNameHeader; } internalLookupTopicAsync(topicName, authoritative, asyncResponse, listenerName); diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/HttpTopicLookupv2Test.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/HttpTopicLookupv2Test.java index 0f2977e71f80f..da0c79da5cac3 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/HttpTopicLookupv2Test.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/HttpTopicLookupv2Test.java @@ -133,7 +133,7 @@ public void crossColoLookup() throws Exception { AsyncResponse asyncResponse = mock(AsyncResponse.class); destLookup.lookupTopicAsync(TopicDomain.persistent.value(), "myprop", "usc", "ns2", "topic1", false, - asyncResponse, null); + asyncResponse, null, null); ArgumentCaptor arg = ArgumentCaptor.forClass(Throwable.class); verify(asyncResponse).resume(arg.capture()); @@ -163,7 +163,7 @@ public void testNotEnoughLookupPermits() throws Exception { AsyncResponse asyncResponse1 = mock(AsyncResponse.class); destLookup.lookupTopicAsync(TopicDomain.persistent.value(), "myprop", "usc", "ns2", "topic1", false, - asyncResponse1, null); + asyncResponse1, null, null); ArgumentCaptor arg = ArgumentCaptor.forClass(Throwable.class); verify(asyncResponse1).resume(arg.capture()); @@ -199,7 +199,7 @@ public void testValidateReplicationSettingsOnNamespace() throws Exception { AsyncResponse asyncResponse = mock(AsyncResponse.class); destLookup.lookupTopicAsync(TopicDomain.persistent.value(), property, cluster, ns1, "empty-cluster", - false, asyncResponse, null); + false, asyncResponse, null, null); ArgumentCaptor arg = ArgumentCaptor.forClass(Throwable.class); verify(asyncResponse).resume(arg.capture()); @@ -207,7 +207,7 @@ public void testValidateReplicationSettingsOnNamespace() throws Exception { AsyncResponse asyncResponse2 = mock(AsyncResponse.class); destLookup.lookupTopicAsync(TopicDomain.persistent.value(), property, cluster, ns2, - "invalid-localCluster", false, asyncResponse2, null); + "invalid-localCluster", false, asyncResponse2, null, null); ArgumentCaptor arg2 = ArgumentCaptor.forClass(Throwable.class); verify(asyncResponse2).resume(arg2.capture()); From 1af5dd740bd0c6947143102e344cce7c1a461329 Mon Sep 17 00:00:00 2001 From: Eron Wright Date: Tue, 21 Sep 2021 12:22:18 -0700 Subject: [PATCH 3/7] [Issue 12040][web] Topic Lookup - Listener Header - add tests --- pulsar-broker/pom.xml | 14 +++ .../lookup/http/v2/TopicLookupTest.java | 79 ++++++++++++++++ .../broker/web/PulsarWebResourceTest.java | 90 +++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java create mode 100644 pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java diff --git a/pulsar-broker/pom.xml b/pulsar-broker/pom.xml index 34a4e0b74f708..16a016c660c91 100644 --- a/pulsar-broker/pom.xml +++ b/pulsar-broker/pom.xml @@ -214,6 +214,20 @@ jersey-media-json-jackson + + org.glassfish.jersey.test-framework + jersey-test-framework-core + test + ${jersey.version} + + + + org.glassfish.jersey.test-framework.providers + jersey-test-framework-provider-grizzly2 + test + ${jersey.version} + + jakarta.activation jakarta.activation-api diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java new file mode 100644 index 0000000000000..7ea6c92971c61 --- /dev/null +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java @@ -0,0 +1,79 @@ +/** + * 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.pulsar.broker.lookup.http.v2; + +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.core.Response; +import org.apache.pulsar.broker.lookup.v2.TopicLookup; +import org.apache.pulsar.broker.web.PulsarWebResourceTest; +import org.apache.pulsar.common.lookup.data.LookupData; +import org.apache.pulsar.common.naming.TopicName; +import org.glassfish.jersey.server.ResourceConfig; +import org.testng.annotations.Test; + +import static org.mockito.Mockito.spy; +import static org.testng.Assert.assertEquals; + +/** + * TopicLookup V2 API unit tests. + */ +@Test(groups = "broker") +public class TopicLookupTest extends PulsarWebResourceTest { + + private static final String TOPIC_PATH = "/v2/topic/persistent/public/testns/testtopic"; + + private TestableTopicLookup resource; + + @Override + protected ResourceConfig configure() { + resource = spy(new TestableTopicLookup()); + return new ResourceConfig().register(resource); + } + + @Test + public void testListenerName() { + Response response; + // verify query param + response = target(TOPIC_PATH).queryParam("listenerName", "query").request().get(); + assertEquals(response.getStatus(), 200); + assertEquals(resource.actualListenerName, "query"); + + // verify header param + response = target(TOPIC_PATH).request().header("X-Pulsar-ListenerName", "header").get(); + assertEquals(response.getStatus(), 200); + assertEquals(resource.actualListenerName, "header"); + + // verify that query param supersedes the header param + response = target(TOPIC_PATH).queryParam("listenerName", "query") + .request().header("X-Pulsar-ListenerName", "header").get(); + assertEquals(response.getStatus(), 200); + assertEquals(resource.actualListenerName, "query"); + } + + private static class TestableTopicLookup extends TopicLookup { + private String actualListenerName; + + @Override + protected void internalLookupTopicAsync(TopicName topicName, boolean authoritative, AsyncResponse asyncResponse, + String listenerName) { + this.actualListenerName = listenerName; + asyncResponse.resume(new LookupData()); + } + } +} diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java new file mode 100644 index 0000000000000..db2dfacc67387 --- /dev/null +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java @@ -0,0 +1,90 @@ +/** + * 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.pulsar.broker.web; + +import javax.servlet.ServletContext; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Feature; +import javax.ws.rs.core.FeatureContext; +import org.apache.pulsar.broker.PulsarService; +import org.apache.pulsar.broker.ServiceConfiguration; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.servlet.ServletContainer; +import org.glassfish.jersey.test.DeploymentContext; +import org.glassfish.jersey.test.JerseyTestNg; +import org.glassfish.jersey.test.ServletDeploymentContext; +import org.glassfish.jersey.test.TestProperties; +import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory; +import org.glassfish.jersey.test.spi.TestContainerException; +import org.glassfish.jersey.test.spi.TestContainerFactory; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +/** + * A base class for testing subclasses of {@link PulsarWebResource}. + */ +public abstract class PulsarWebResourceTest extends JerseyTestNg.ContainerPerMethodTest { + + protected ServiceConfiguration config; + protected PulsarService pulsar; + + protected PulsarWebResourceTest() { + config = new ServiceConfiguration(); + + pulsar = mock(PulsarService.class); + doReturn(config).when(pulsar).getConfig(); + doReturn(config).when(pulsar).getConfiguration(); + + set(TestProperties.CONTAINER_PORT, 0); + } + + /** + * Creates a JAX-RS resource configuration for test purposes. + */ + @Override + protected abstract ResourceConfig configure(); + + /** + * Creates a test container factory with servlet support. + */ + @Override + protected TestContainerFactory getTestContainerFactory() throws TestContainerException { + return new GrizzlyWebTestContainerFactory(); + } + + /** + * Configures a deployment context for JAX-RS. + */ + @Override + protected DeploymentContext configureDeployment() { + ResourceConfig app = configure(); + app.register(new Feature() { + @Context + ServletContext servletContext; + + @Override + public boolean configure(FeatureContext context) { + servletContext.setAttribute(WebService.ATTRIBUTE_PULSAR_NAME, pulsar); + return true; + } + }); + return ServletDeploymentContext.forServlet(new ServletContainer(app)).build(); + } +} From 43b4fe377eab330740bd2e103a7f224c100ab5d0 Mon Sep 17 00:00:00 2001 From: Eron Wright Date: Mon, 11 Oct 2021 19:28:41 -0700 Subject: [PATCH 4/7] [Issue 12040][web] Topic Lookup - Listener Header - ensure that setup/teardown runs when `-Dgroup=broker` --- .../pulsar/broker/web/PulsarWebResourceTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java index db2dfacc67387..f3166d6686481 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java @@ -33,6 +33,8 @@ import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory; import org.glassfish.jersey.test.spi.TestContainerException; import org.glassfish.jersey.test.spi.TestContainerFactory; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -55,6 +57,18 @@ protected PulsarWebResourceTest() { set(TestProperties.CONTAINER_PORT, 0); } + @BeforeMethod(alwaysRun = true) + @Override + public void setUp() throws Exception { + super.setUp(); + } + + @AfterMethod(alwaysRun = true) + @Override + public void tearDown() throws Exception { + super.tearDown(); + } + /** * Creates a JAX-RS resource configuration for test purposes. */ From 5d4d4474dc3cf1ddd4eacf4bb6b908e4b7414bb5 Mon Sep 17 00:00:00 2001 From: Eron Wright Date: Mon, 11 Oct 2021 19:57:42 -0700 Subject: [PATCH 5/7] [Issue 12040][web] Topic Lookup - Listener Header - ensure that setup/teardown runs when `-Dgroup=broker` --- .../broker/lookup/http/v2/TopicLookupTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java index 7ea6c92971c61..54323061473dc 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java @@ -25,6 +25,8 @@ import org.apache.pulsar.common.lookup.data.LookupData; import org.apache.pulsar.common.naming.TopicName; import org.glassfish.jersey.server.ResourceConfig; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static org.mockito.Mockito.spy; @@ -40,6 +42,18 @@ public class TopicLookupTest extends PulsarWebResourceTest { private TestableTopicLookup resource; + @BeforeMethod(alwaysRun = true) + @Override + public void setUp() throws Exception { + super.setUp(); + } + + @AfterMethod(alwaysRun = true) + @Override + public void tearDown() throws Exception { + super.tearDown(); + } + @Override protected ResourceConfig configure() { resource = spy(new TestableTopicLookup()); From debcf71605d5144cd44f5ddbc117106aea219775 Mon Sep 17 00:00:00 2001 From: Eron Wright Date: Tue, 12 Oct 2021 09:14:07 -0700 Subject: [PATCH 6/7] [Issue 12040][web] Topic Lookup - Listener Header - add logging statements --- .../broker/lookup/http/v2/TopicLookupTest.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java index 54323061473dc..1b810639a0c92 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java @@ -25,6 +25,8 @@ import org.apache.pulsar.common.lookup.data.LookupData; import org.apache.pulsar.common.naming.TopicName; import org.glassfish.jersey.server.ResourceConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -38,30 +40,37 @@ @Test(groups = "broker") public class TopicLookupTest extends PulsarWebResourceTest { + private static final Logger log = LoggerFactory.getLogger(TopicLookupTest.class); + private static final String TOPIC_PATH = "/v2/topic/persistent/public/testns/testtopic"; private TestableTopicLookup resource; - @BeforeMethod(alwaysRun = true) + @BeforeMethod(alwaysRun = true, groups = "broker") @Override public void setUp() throws Exception { super.setUp(); + log.info("TopicLookupTest::setUp called"); } - @AfterMethod(alwaysRun = true) + @AfterMethod(alwaysRun = true, groups = "broker") @Override public void tearDown() throws Exception { + log.info("TopicLookupTest::tearDown called"); super.tearDown(); } @Override protected ResourceConfig configure() { + log.info("TopicLookupTest::configure called"); resource = spy(new TestableTopicLookup()); return new ResourceConfig().register(resource); } @Test public void testListenerName() { + log.info("TopicLookupTest::testListenerName called, client={}", client()); + Response response; // verify query param response = target(TOPIC_PATH).queryParam("listenerName", "query").request().get(); From 93a84b390df42394d9bee0478e6c019e662a8068 Mon Sep 17 00:00:00 2001 From: Eron Wright Date: Tue, 12 Oct 2021 11:46:07 -0700 Subject: [PATCH 7/7] [Issue 12040][web] Topic Lookup - Listener Header - use setup-per-class not setup-per-method --- .../lookup/http/v2/TopicLookupTest.java | 19 ------------------- .../broker/web/PulsarWebResourceTest.java | 10 +++++----- 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java index 1b810639a0c92..317b320a9a4d4 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/lookup/http/v2/TopicLookupTest.java @@ -40,37 +40,18 @@ @Test(groups = "broker") public class TopicLookupTest extends PulsarWebResourceTest { - private static final Logger log = LoggerFactory.getLogger(TopicLookupTest.class); - private static final String TOPIC_PATH = "/v2/topic/persistent/public/testns/testtopic"; private TestableTopicLookup resource; - @BeforeMethod(alwaysRun = true, groups = "broker") - @Override - public void setUp() throws Exception { - super.setUp(); - log.info("TopicLookupTest::setUp called"); - } - - @AfterMethod(alwaysRun = true, groups = "broker") - @Override - public void tearDown() throws Exception { - log.info("TopicLookupTest::tearDown called"); - super.tearDown(); - } - @Override protected ResourceConfig configure() { - log.info("TopicLookupTest::configure called"); resource = spy(new TestableTopicLookup()); return new ResourceConfig().register(resource); } @Test public void testListenerName() { - log.info("TopicLookupTest::testListenerName called, client={}", client()); - Response response; // verify query param response = target(TOPIC_PATH).queryParam("listenerName", "query").request().get(); diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java index f3166d6686481..18e3e9613708c 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/web/PulsarWebResourceTest.java @@ -33,8 +33,8 @@ import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory; import org.glassfish.jersey.test.spi.TestContainerException; import org.glassfish.jersey.test.spi.TestContainerFactory; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -42,7 +42,7 @@ /** * A base class for testing subclasses of {@link PulsarWebResource}. */ -public abstract class PulsarWebResourceTest extends JerseyTestNg.ContainerPerMethodTest { +public abstract class PulsarWebResourceTest extends JerseyTestNg.ContainerPerClassTest { protected ServiceConfiguration config; protected PulsarService pulsar; @@ -57,13 +57,13 @@ protected PulsarWebResourceTest() { set(TestProperties.CONTAINER_PORT, 0); } - @BeforeMethod(alwaysRun = true) + @BeforeClass(alwaysRun = true) @Override public void setUp() throws Exception { super.setUp(); } - @AfterMethod(alwaysRun = true) + @AfterClass(alwaysRun = true) @Override public void tearDown() throws Exception { super.tearDown();