blob: 994d8988401bce6fcbfdda1ce48b123ecfb25771 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2017 xored software, Inc. and others.
*
* 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:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.debug.dbgp.tests.service;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.dltk.dbgp.DbgpServer;
import org.eclipse.dltk.dbgp.IDbgpSession;
import org.eclipse.dltk.debug.core.DLTKDebugPreferenceConstants;
import org.eclipse.dltk.internal.debug.core.model.DbgpService;
import org.junit.After;
import org.junit.Before;
public class AbstractDbgpServiceTests {
protected static final int ANY_PORT = DLTKDebugPreferenceConstants.DBGP_AVAILABLE_PORT;
/**
* Timeout for the connection operations
*/
private static final int TIMEOUT = 5000;
protected static final int MIN_PORT = 0x8000;
protected static final int MAX_PORT = 0xFFFF;
/**
* Creates socket and connects it to the specified port. If connection could
* not be performed the error is thrown. Successfully connected socket is
* added to the {@link #sockets} and closed in {@link #tearDown()}
*
* @param port
* @return con
* @throws IOException
*/
protected Socket connect(final int port) throws IOException {
final Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(port), TIMEOUT);
} catch (IOException e) {
closeQuietly(socket);
throw e;
}
sockets.add(socket);
return socket;
}
/**
* {@link #connect(int)}s socket and performs operation on it.
*
* @param port
* @param operation
* @return
* @throws IOException
*/
protected Socket performOperation(final int port, ISocketOperation operation) throws IOException {
final Socket socket = connect(port);
operation.execute(socket);
return socket;
}
/**
* Find some available port in the specified range. The returned values is
* checked, so users should not perform addtitional checks.
*
* @param minPort
* @param maxPort
* @return
*/
protected static int findAvailablePort(int minPort, int maxPort) {
final int port = DbgpServer.findAvailablePort(minPort, maxPort);
assertTrue(port > 0);
return port;
}
/**
* Active sockets - list is cleared in {@link #tearDown()}. We do not want
* to close sockets as the corresponding {@link IDbgpSession} could be
* terminated before we processed the connection.
*/
private final List<Socket> sockets = new ArrayList<>();
@Before
public void setUp() throws Exception {
sockets.clear();
}
/**
* Closes all sockets opened by {@link #connect(int)}
*
*/
@After
public void tearDown() {
for (Iterator<Socket> i = sockets.iterator(); i.hasNext();) {
closeQuietly(i.next());
}
sockets.clear();
}
/**
* Closes the specified socket and catch possible errors. So it could be
* safely used in finally statements and keep original exception if any.
*
* @param socket
*/
protected void closeQuietly(final Socket socket) {
try {
socket.close();
} catch (Exception e) {
// ignore
}
}
protected DbgpService createService(int port1) {
final DbgpService service = new DbgpService(port1);
assertTrue(service.waitStarted());
return service;
}
}