Skip to content

Commit

Permalink
WFLY-5646 Stabilize SingletonServiceTestCase.
Browse files Browse the repository at this point in the history
  • Loading branch information
pferraro committed Nov 6, 2015
1 parent bf847d4 commit 1ba60a8
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 46 deletions.
Expand Up @@ -22,7 +22,6 @@
package org.jboss.as.test.clustering.cluster.singleton;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;

Expand Down Expand Up @@ -84,25 +83,16 @@ public void testSingletonService(
// Needed to be able to inject ArquillianResource
stop(CONTAINER_2);

// URLs look like "http://IP:PORT/singleton/service"
URI defaultURI1 = MyServiceServlet.createURI(baseURL1, MyService.DEFAULT_SERVICE_NAME);
URI defaultURI2 = MyServiceServlet.createURI(baseURL2, MyService.DEFAULT_SERVICE_NAME);

log.info("URLs are: " + defaultURI1 + ", " + defaultURI2);

URI quorumURI1 = MyServiceServlet.createURI(baseURL1, MyService.QUORUM_SERVICE_NAME);
URI quorumURI2 = MyServiceServlet.createURI(baseURL2, MyService.QUORUM_SERVICE_NAME);

try (CloseableHttpClient client = TestHttpClientUtils.promiscuousCookieHttpClient()) {
HttpResponse response = client.execute(new HttpGet(defaultURI1));
HttpResponse response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.DEFAULT_SERVICE_NAME, NODE_1)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(NODE_1, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(quorumURI1));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.QUORUM_SERVICE_NAME)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertNull(response.getFirstHeader("node"));
Expand All @@ -112,49 +102,49 @@ public void testSingletonService(

start(CONTAINER_2);

response = client.execute(new HttpGet(defaultURI1));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.DEFAULT_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(quorumURI1));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.QUORUM_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(defaultURI2));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL2, MyService.DEFAULT_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(quorumURI2));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL2, MyService.QUORUM_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

stop(CONTAINER_2);

response = client.execute(new HttpGet(defaultURI1));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.DEFAULT_SERVICE_NAME, NODE_1)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(NODE_1, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(quorumURI1));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.QUORUM_SERVICE_NAME)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertNull(response.getFirstHeader("node"));
Expand All @@ -164,49 +154,49 @@ public void testSingletonService(

start(CONTAINER_2);

response = client.execute(new HttpGet(defaultURI1));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.DEFAULT_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(quorumURI1));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.QUORUM_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(defaultURI2));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL2, MyService.DEFAULT_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(quorumURI2));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL2, MyService.QUORUM_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

stop(CONTAINER_1);

response = client.execute(new HttpGet(defaultURI2));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL2, MyService.DEFAULT_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(quorumURI2));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL2, MyService.QUORUM_SERVICE_NAME)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertNull(response.getFirstHeader("node"));
Expand All @@ -216,34 +206,34 @@ public void testSingletonService(

start(CONTAINER_1);

response = client.execute(new HttpGet(defaultURI1));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.DEFAULT_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(quorumURI1));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL1, MyService.QUORUM_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(defaultURI2));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL2, MyService.DEFAULT_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}

response = client.execute(new HttpGet(quorumURI2));
response = client.execute(new HttpGet(MyServiceServlet.createURI(baseURL2, MyService.QUORUM_SERVICE_NAME, NODE_2)));
try {
Assert.assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());
Assert.assertEquals(MyServiceActivator.PREFERRED_NODE, response.getFirstHeader("node").getValue());
Assert.assertEquals(NODE_2, response.getFirstHeader("node").getValue());
} finally {
HttpClientUtils.closeQuietly(response);
}
Expand Down
Expand Up @@ -33,6 +33,7 @@
import javax.servlet.http.HttpServletResponse;

import org.jboss.as.server.CurrentServiceContainer;
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceName;

@WebServlet(urlPatterns = { MyServiceServlet.SERVLET_PATH })
Expand All @@ -41,22 +42,47 @@ public class MyServiceServlet extends HttpServlet {
private static final String SERVLET_NAME = "service";
static final String SERVLET_PATH = "/" + SERVLET_NAME;
private static final String SERVICE = "service";
private static final String EXPECTED = "expected";
private static final int RETRIES = 10;

public static URI createURI(URL baseURL, ServiceName serviceName) throws URISyntaxException {
return baseURL.toURI().resolve(new StringBuilder(SERVLET_NAME).append('?').append(SERVICE).append('=').append(serviceName.getCanonicalName()).toString());
return baseURL.toURI().resolve(buildQuery(serviceName).toString());
}

public static URI createURI(URL baseURL, ServiceName serviceName, String expected) throws URISyntaxException {
return baseURL.toURI().resolve(buildQuery(serviceName).append('&').append(EXPECTED).append('=').append(expected).toString());
}

private static StringBuilder buildQuery(ServiceName serviceName) {
return new StringBuilder(SERVLET_NAME).append('?').append(SERVICE).append('=').append(serviceName.getCanonicalName());
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String service = req.getParameter(SERVICE);
if (service == null) {
throw new ServletException(String.format("No %s specified", SERVICE));
String serviceName = getRequiredParameter(req, SERVICE);
String expected = req.getParameter(EXPECTED);
this.log(String.format("Received request for %s, expecting %s", serviceName, expected));
@SuppressWarnings("unchecked")
ServiceController<Environment> service = (ServiceController<Environment>) CurrentServiceContainer.getServiceContainer().getService(ServiceName.parse(serviceName));
Environment env = service.getValue();
if (expected != null) {
for (int i = 0; i < RETRIES; ++i) {
if ((env != null) && expected.equals(env.getNodeName())) break;
Thread.yield();
env = service.getValue();
}
}
this.log(String.format("Received request for %s", service));
Environment env = (Environment) CurrentServiceContainer.getServiceContainer().getService(ServiceName.parse(service)).getValue();
if (env != null) {
resp.setHeader("node", env.getNodeName());
}
resp.getWriter().write("Success");
}

private static String getRequiredParameter(HttpServletRequest req, String name) throws ServletException {
String value = req.getParameter(name);
if (value == null) {
throw new ServletException(String.format("No %s specified", name));
}
return value;
}
}

0 comments on commit 1ba60a8

Please sign in to comment.