/*
|
* Copyright 2013 akquinet tech@spree GmbH
|
*
|
* Licensed 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 de.akquinet.devops;
|
|
import java.net.InetAddress;
|
import java.net.ServerSocket;
|
|
import com.gitblit.tests.GitBlitSuite;
|
|
/**
|
* This is a runnable implementation, that is used to run a gitblit server in a
|
* separate thread (e.g. alongside test cases)
|
*
|
* @author saheba
|
*
|
*/
|
public class GitblitRunnable implements Runnable {
|
|
private int httpPort, httpsPort, shutdownPort;
|
private String userPropertiesPath, gitblitPropertiesPath;
|
private boolean startFailed = false;
|
|
/**
|
* constructor with reduced set of start params
|
*
|
* @param httpPort
|
* @param httpsPort
|
* @param shutdownPort
|
* @param gitblitPropertiesPath
|
* @param userPropertiesPath
|
*/
|
public GitblitRunnable(int httpPort, int httpsPort, int shutdownPort,
|
String gitblitPropertiesPath, String userPropertiesPath) {
|
this.httpPort = httpPort;
|
this.httpsPort = httpsPort;
|
this.shutdownPort = shutdownPort;
|
this.userPropertiesPath = userPropertiesPath;
|
this.gitblitPropertiesPath = gitblitPropertiesPath;
|
}
|
|
/*
|
* (non-Javadoc)
|
*
|
* @see java.lang.Runnable#run()
|
*/
|
public void run() {
|
boolean portsFree = false;
|
long lastRun = -1;
|
while (!portsFree) {
|
long current = System.currentTimeMillis();
|
if (lastRun == -1 || lastRun + 100 < current) {
|
portsFree = areAllPortsFree(new int[] { httpPort, httpsPort,
|
shutdownPort }, "127.0.0.1");
|
}
|
lastRun = current;
|
|
}
|
try {
|
GitBlitServer4UITests.main("--httpPort", "" + httpPort, "--httpsPort", ""
|
+ httpsPort, "--shutdownPort", "" + shutdownPort,
|
"--repositoriesFolder",
|
"\"" + GitBlitSuite.REPOSITORIES.getAbsolutePath() + "\"",
|
"--userService", userPropertiesPath, "--settings",
|
gitblitPropertiesPath);
|
setStartFailed(false);
|
} catch (Exception iex) {
|
System.out.println("Gitblit server start failed");
|
setStartFailed(true);
|
}
|
}
|
|
/**
|
* Method used to ensure that all ports are free, if the runnable is used
|
* JUnit test classes. Be aware that JUnit's setUpClass and tearDownClass
|
* methods, which are executed before and after a test class (consisting of
|
* several test cases), may be executed parallely if they are part of a test
|
* suite consisting of several test classes. Therefore the run method of
|
* this class calls areAllPortsFree to check port availability before
|
* starting another gitblit instance.
|
*
|
* @param ports
|
* @param inetAddress
|
* @return
|
*/
|
public static boolean areAllPortsFree(int[] ports, String inetAddress) {
|
System.out
|
.println("\n"
|
+ System.currentTimeMillis()
|
+ " ----------------------------------- testing if all ports are free ...");
|
String blockedPorts = "";
|
for (int i = 0; i < ports.length; i++) {
|
ServerSocket s;
|
try {
|
s = new ServerSocket(ports[i], 1,
|
InetAddress.getByName(inetAddress));
|
s.close();
|
} catch (Exception e) {
|
if (!blockedPorts.equals("")) {
|
blockedPorts += ", ";
|
}
|
}
|
}
|
if (blockedPorts.equals("")) {
|
System.out
|
.println(" ----------------------------------- ... verified");
|
return true;
|
}
|
System.out.println(" ----------------------------------- ... "
|
+ blockedPorts + " are still blocked");
|
return false;
|
}
|
|
private void setStartFailed(boolean startFailed) {
|
this.startFailed = startFailed;
|
}
|
|
public boolean isStartFailed() {
|
return startFailed;
|
}
|
}
|