/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.kie.server.router.client;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import com.github.tomakehurst.wiremock.WireMockServer;
import org.junit.After;
import org.junit.Test;
import org.kie.server.api.model.KieContainerResource;
import org.kie.server.api.model.KieContainerResourceFilter;
import org.kie.server.api.model.KieContainerResourceList;
import org.kie.server.api.model.KieContainerStatus;
import org.kie.server.api.model.KieScannerResource;
import org.kie.server.api.model.KieServerInfo;
import org.kie.server.api.model.KieServerStateInfo;
import org.kie.server.api.model.Message;
import org.kie.server.api.model.ReleaseId;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.services.api.KieContainerInstance;
import org.kie.server.services.api.KieServer;
import org.kie.server.services.impl.KieContainerInstanceImpl;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static org.junit.Assert.assertFalse;
public class KieServerRouterEventListenerRetryTest {
private WireMockServer wireMockServer = null;
private KieServerRouterEventListener client = null;
private KieContainerInstance containerInstance = new KieContainerInstanceImpl("test-container", KieContainerStatus.STARTED, null, new ReleaseId("org.test", "test-kjar", "1.0"));
public static int findFreePort() {
int port = 0;
try {
ServerSocket server = new ServerSocket( 0 );
port = server.getLocalPort();
server.close();
} catch ( IOException e ) {
// failed to dynamically allocate port, try to use hard coded one
port = 9789;
}
return port;
}
@After
public void cleanup() {
if (client != null) {
client.close();
}
if (wireMockServer != null) {
wireMockServer.stop();
}
}
@Test(timeout = 10000)
public void testRouterContainerStartedRetry() throws Exception {
final CountDownLatch failureLatch = new CountDownLatch(2);
final CountDownLatch successLatch = new CountDownLatch(1);
int routerPort = findFreePort();
client = new KieServerRouterEventListener("test-server", "http://localhost:8080/kie-server", "http://localhost:" + routerPort, 2);
client.setObserver(new KieServerRouterEventListener.RouterConnectionObserver(){
@Override
public void onSuccess(String url) {
successLatch.countDown();
}
@Override
public void onFailure(String url) {
failureLatch.countDown();
}
});
wireMockServer = createMockServer(routerPort, "/admin/add");
client.afterContainerStarted(null, containerInstance);
failureLatch.await();
wireMockServer.start();
successLatch.await();
wireMockServer.verify(1, postRequestedFor(urlEqualTo("/admin/add")));
}
@Test(timeout = 10000)
public void testRouterContainerStoppedRetry() throws Exception {
final CountDownLatch failureLatch = new CountDownLatch(2);
final CountDownLatch successLatch = new CountDownLatch(1);
int routerPort = findFreePort();
client = new KieServerRouterEventListener("test-server", "http://localhost:8080/kie-server", "http://localhost:" + routerPort, 2);
client.setObserver(new KieServerRouterEventListener.RouterConnectionObserver(){
@Override
public void onSuccess(String url) {
successLatch.countDown();
}
@Override
public void onFailure(String url) {
failureLatch.countDown();
}
});
wireMockServer = createMockServer(routerPort, "/admin/remove");
client.afterContainerStopped(null, containerInstance);
failureLatch.await();
wireMockServer.start();
successLatch.await();
wireMockServer.verify(1, postRequestedFor(urlEqualTo("/admin/remove")));
}
@Test(timeout = 10000)
public void testRouterServerStoppedRetry() throws Exception {
final CountDownLatch failureLatch = new CountDownLatch(1);
final CountDownLatch successLatch = new CountDownLatch(1);
int routerPort = findFreePort();
client = new KieServerRouterEventListener("test-server", "http://localhost:8080/kie-server", "http://localhost:" + routerPort, 2);
client.setObserver(new KieServerRouterEventListener.RouterConnectionObserver(){
@Override
public void onSuccess(String url) {
successLatch.countDown();
}
@Override
public void onFailure(String url) {
failureLatch.countDown();
}
});
wireMockServer = createMockServer(routerPort, "/admin/remove");
client.beforeServerStopped(new KieServer() {
@Override
public ServiceResponse<KieServerInfo> getInfo() {
return null;
}
@Override
public ServiceResponse<KieContainerResource> createContainer(String containerId, KieContainerResource container) {
return null;
}
@Override
public ServiceResponse<KieContainerResourceList> listContainers(KieContainerResourceFilter containerFilter) {
KieContainerResource containerResource = new KieContainerResource(containerInstance.getContainerId(), containerInstance.getResource().getReleaseId(), containerInstance.getStatus());
List<KieContainerResource> containers = new ArrayList<KieContainerResource>();
containers.add(containerResource);
KieContainerResourceList list = new KieContainerResourceList(containers);
return new ServiceResponse<KieContainerResourceList>(ServiceResponse.ResponseType.SUCCESS, "", list);
}
@Override
public ServiceResponse<KieContainerResource> getContainerInfo(String id) {
return null;
}
@Override
public ServiceResponse<Void> disposeContainer(String containerId) {
return null;
}
@Override
public ServiceResponse<KieScannerResource> getScannerInfo(String id) {
return null;
}
@Override
public ServiceResponse<KieScannerResource> updateScanner(String id, KieScannerResource resource) {
return null;
}
@Override
public ServiceResponse<ReleaseId> getContainerReleaseId(String id) {
return null;
}
@Override
public ServiceResponse<ReleaseId> updateContainerReleaseId(String id, ReleaseId releaseId) {
return null;
}
@Override
public ServiceResponse<KieServerStateInfo> getServerState() {
return null;
}
@Override
public void addServerMessage(Message message) {
}
@Override
public void addContainerMessage(String containerId, Message message) {
}
});
failureLatch.await();
wireMockServer.start();
boolean met = successLatch.await(4L, TimeUnit.SECONDS);
assertFalse("On success should not be invoked", met);
wireMockServer.verify(0, postRequestedFor(urlEqualTo("/admin/remove")));
}
protected WireMockServer createMockServer(int port, String url) {
WireMockServer wireMockServer = new WireMockServer(port);
wireMockServer.stubFor(post(urlEqualTo(url))
.withHeader("Accept", equalTo("application/json"))
.willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "application/json")
.withBody("")));
return wireMockServer;
}
}