/*******************************************************************************
* Copyright (c) 2012-2015 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.runner;
import org.eclipse.che.api.core.rest.shared.dto.Link;
import org.eclipse.che.api.core.rest.shared.dto.ServiceDescriptor;
import org.eclipse.che.api.project.shared.dto.RunnerEnvironment;
import org.eclipse.che.api.runner.dto.RunnerDescriptor;
import org.eclipse.che.api.runner.dto.RunnerServer;
import org.eclipse.che.api.runner.dto.ServerState;
import org.eclipse.che.api.runner.internal.Constants;
import org.eclipse.che.dto.server.DtoFactory;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.testng.MockitoTestNGListener;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.List;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
/**
* @author andrew00x
*/
@Listeners(value = {MockitoTestNGListener.class})
public class RunnerAdminServiceTest {
private DtoFactory dtoFactory = DtoFactory.getInstance();
@Mock
private RunQueue runQueue;
@InjectMocks
private RunnerAdminService service;
@BeforeMethod
public void beforeMethod() {
doNothing().when(runQueue).checkStarted();
}
@AfterMethod
public void afterMethod() {
}
@Test
public void testGetServers() throws Exception {
String serverUrl = "http://localhost:8080/server1";
List<RemoteRunnerServer> servers = new ArrayList<>(1);
RemoteRunnerServer server1 = mock(RemoteRunnerServer.class);
doReturn(serverUrl).when(server1).getBaseUrl();
doReturn(dto(ServiceDescriptor.class)).when(server1).getServiceDescriptor();
servers.add(server1);
List<RunnerDescriptor> runners = new ArrayList<>(1);
RunnerDescriptor runner1 = dto(RunnerDescriptor.class).withName("java/web");
runner1.getEnvironments().add(dto(RunnerEnvironment.class).withId("tomcat7"));
runner1.getEnvironments().add(dto(RunnerEnvironment.class).withId("jboss7"));
runners.add(runner1);
doReturn(runners).when(server1).getRunnerDescriptors();
doReturn(servers).when(runQueue).getRegisterRunnerServers();
List<RunnerServer> _servers = service.getRegisteredServers();
assertEquals(_servers.size(), 1);
RunnerServer _server = _servers.get(0);
assertEquals(_server.getUrl(), serverUrl);
}
@Test
public void testGetServersIfOneServerUnavailable() throws Exception {
String serverUrl1 = "http://localhost:8080/server1";
List<RemoteRunnerServer> servers = new ArrayList<>(1);
RemoteRunnerServer server1 = mock(RemoteRunnerServer.class);
doReturn(serverUrl1).when(server1).getBaseUrl();
ServiceDescriptor serviceDescriptor = dto(ServiceDescriptor.class);
Link availableLink = dto(Link.class).withRel(Constants.LINK_REL_AVAILABLE_RUNNERS).withMethod("GET").withHref(
serverUrl1 + "/available");
Link serverStateLink = dto(Link.class).withRel(Constants.LINK_REL_SERVER_STATE).withMethod("GET").withHref(
serverUrl1 + "/server-state");
Link runnerStateLink = dto(Link.class).withRel(Constants.LINK_REL_RUNNER_STATE).withMethod("GET").withHref(serverUrl1 + "/state");
serviceDescriptor.getLinks().add(availableLink);
serviceDescriptor.getLinks().add(serverStateLink);
serviceDescriptor.getLinks().add(runnerStateLink);
doReturn(serviceDescriptor).when(server1).getServiceDescriptor();
doReturn(availableLink).when(server1).getLink(eq(Constants.LINK_REL_AVAILABLE_RUNNERS));
doReturn(serverStateLink).when(server1).getLink(eq(Constants.LINK_REL_SERVER_STATE));
doReturn(runnerStateLink).when(server1).getLink(eq(Constants.LINK_REL_RUNNER_STATE));
doReturn(dto(ServerState.class)).when(server1).getServerState();
servers.add(server1);
List<RunnerDescriptor> runners = new ArrayList<>(1);
RunnerDescriptor runner1 = dto(RunnerDescriptor.class).withName("java/web");
runner1.getEnvironments().add(dto(RunnerEnvironment.class).withId("tomcat7"));
runner1.getEnvironments().add(dto(RunnerEnvironment.class).withId("jboss7"));
runners.add(runner1);
doReturn(runners).when(server1).getRunnerDescriptors();
RemoteRunnerServer server2 = mock(RemoteRunnerServer.class);
String serverUrl2 = "http://localhost:8080/server2";
doReturn(serverUrl2).when(server2).getBaseUrl();
doThrow(new RunnerException("Connection refused")).when(server2).getRunnerDescriptors();
doThrow(new RunnerException("Connection refused")).when(server2).getServiceDescriptor();
doThrow(new RunnerException("Connection refused")).when(server2).getServerState();
servers.add(server2);
doReturn(servers).when(runQueue).getRegisterRunnerServers();
List<RunnerServer> _servers = service.getRegisteredServers();
assertEquals(_servers.size(), 2);
RunnerServer _server1 = _servers.get(0);
assertEquals(_server1.getUrl(), serverUrl1);
assertNotNull(_server1.getServerState());
assertEquals(_server1.getLinks().size(), 3);
// provide minimal info when something wrong with server
RunnerServer _server2 = _servers.get(1);
assertEquals(_server2.getUrl(), serverUrl2);
assertNull(_server2.getServerState());
assertTrue(_server2.getLinks().isEmpty());
}
private <T> T dto(Class<T> type) {
return dtoFactory.createDto(type);
}
}