You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ja...@apache.org on 2013/10/04 14:26:17 UTC
svn commit: r1529142 - in /ace/trunk:
org.apache.ace.repository.itest/src/org/apache/ace/it/repository/
org.apache.ace.test/src/org/apache/ace/it/
Author: jawi
Date: Fri Oct 4 12:26:17 2013
New Revision: 1529142
URL: http://svn.apache.org/r1529142
Log:
Yet some more fixes to improve itest stability.
Modified:
ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/RepositoryTest.java
ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/Utils.java
ace/trunk/org.apache.ace.test/src/org/apache/ace/it/IntegrationTestBase.java
Modified: ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/RepositoryTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/RepositoryTest.java?rev=1529142&r1=1529141&r2=1529142&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/RepositoryTest.java (original)
+++ ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/RepositoryTest.java Fri Oct 4 12:26:17 2013
@@ -35,22 +35,23 @@ import java.util.concurrent.TimeUnit;
import org.apache.ace.http.listener.constants.HttpConstants;
import org.apache.ace.it.IntegrationTestBase;
import org.apache.ace.repository.Repository;
-import org.apache.ace.repository.impl.constants.RepositoryConstants;
import org.apache.ace.test.constants.TestConstants;
-import org.apache.felix.dm.Component;
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.util.tracker.ServiceTracker;
/**
* Integration test for our repositories, and the replication thereof.
*/
public class RepositoryTest extends IntegrationTestBase {
-
- private volatile ConfigurationAdmin m_configAdmin;
+ private static final String REPOSITORY_NAME = "name";
+ private static final String REPOSITORY_CUSTOMER = "customer";
+ private static final String REPOSITORY_MASTER = "master";
+ private static final String REPOSITORY_INITIAL_CONTENT = "initial";
+ private static final String REPOSITORY_BASE_DIR = "basedir";
+ private static final String REPOSITORY_FILE_EXTENSION = "fileextension";
private URL m_host;
@@ -145,7 +146,7 @@ public class RepositoryTest extends Inte
}
public void testGetAndPutWithCustomBasedirAndFileExtenions() throws Exception {
-
+
File tmpFile = File.createTempFile("repo", "");
tmpFile.delete();
tmpFile.mkdir();
@@ -209,15 +210,6 @@ public class RepositoryTest extends Inte
}
@Override
- protected Component[] getDependencies() {
- return new Component[] {
- createComponent()
- .setImplementation(this)
- .add(createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true))
- };
- }
-
- @Override
protected void doTearDown() throws Exception {
// remove all repositories, in case a test case does not reach it's cleanup section due to an exception
removeAllRepositories();
@@ -229,32 +221,35 @@ public class RepositoryTest extends Inte
/* Configure a new repository instance */
private void addRepository(String instanceName, String customer, String name, String basedir, String fileextension, String initial, boolean isMaster) throws IOException, InterruptedException, InvalidSyntaxException {
+ ServiceTracker tracker = new ServiceTracker(m_bundleContext, m_bundleContext.createFilter("(factory.instance.pid=" + instanceName + ")"), null);
+ tracker.open();
+
// Publish configuration for a repository instance
Properties props = new Properties();
- props.put(RepositoryConstants.REPOSITORY_CUSTOMER, customer);
- props.put(RepositoryConstants.REPOSITORY_NAME, name);
- props.put(RepositoryConstants.REPOSITORY_BASE_DIR, basedir == null ? "" : basedir);
- props.put(RepositoryConstants.REPOSITORY_FILE_EXTENSION, fileextension == null ? "" : fileextension);
- props.put(RepositoryConstants.REPOSITORY_MASTER, String.valueOf(isMaster));
+ props.put(REPOSITORY_CUSTOMER, customer);
+ props.put(REPOSITORY_NAME, name);
+ props.put(REPOSITORY_BASE_DIR, basedir == null ? "" : basedir);
+ props.put(REPOSITORY_FILE_EXTENSION, fileextension == null ? "" : fileextension);
+ props.put(REPOSITORY_MASTER, String.valueOf(isMaster));
if (initial != null) {
- props.put(RepositoryConstants.REPOSITORY_INITIAL_CONTENT, initial);
+ props.put(REPOSITORY_INITIAL_CONTENT, initial);
}
props.put("factory.instance.pid", instanceName);
- Configuration config = m_configAdmin.createFactoryConfiguration("org.apache.ace.server.repository.factory", null);
-
- ServiceTracker tracker = new ServiceTracker(m_bundleContext, m_bundleContext.createFilter("(factory.instance.pid=" + instanceName + ")"), null);
- tracker.open();
-
+ Configuration config = createFactoryConfiguration("org.apache.ace.server.repository.factory");
config.update(props);
- if (tracker.waitForService(1000) == null) {
- throw new IOException("Did not get notified about new repository becoming available in time.");
+ try {
+ if (tracker.waitForService(1000) == null) {
+ throw new IOException("Did not get notified about new repository becoming available in time.");
+ }
+ }
+ finally {
+ tracker.close();
}
- tracker.close();
}
private void removeAllRepositories() throws IOException, InvalidSyntaxException, InterruptedException {
- final Configuration[] configs = m_configAdmin.listConfigurations("(factory.instance.pid=*)");
+ final Configuration[] configs = listConfigurations("(factory.instance.pid=*)");
if ((configs != null) && (configs.length > 0)) {
final Semaphore sem = new Semaphore(0);
@@ -270,25 +265,29 @@ public class RepositoryTest extends Inte
};
tracker.open();
- for (int i = 0; i < configs.length; i++) {
- configs[i].delete();
+ try {
+ for (int i = 0; i < configs.length; i++) {
+ configs[i].delete();
+ }
+ if (!sem.tryAcquire(1, TimeUnit.SECONDS)) {
+ throw new IOException("Not all instances were removed in time.");
+ }
}
-
- if (!sem.tryAcquire(1, TimeUnit.SECONDS)) {
- throw new IOException("Not all instances were removed in time.");
+ finally {
+ tracker.close();
}
- tracker.close();
}
}
private void removeRepository(String instanceName) throws IOException, InterruptedException, InvalidSyntaxException {
Configuration[] configs = null;
try {
- configs = m_configAdmin.listConfigurations("(factory.instance.pid=" + instanceName + ")");
+ configs = listConfigurations("(factory.instance.pid=" + instanceName + ")");
}
catch (InvalidSyntaxException e) {
// should not happen
}
+
if ((configs != null) && (configs.length > 0)) {
final Semaphore sem = new Semaphore(0);
ServiceTracker tracker = new ServiceTracker(m_bundleContext, m_bundleContext.createFilter("(factory.instance.pid=" + instanceName + ")"), null) {
@@ -300,10 +299,15 @@ public class RepositoryTest extends Inte
};
tracker.open();
- configs[0].delete();
+ try {
+ configs[0].delete();
- if (!sem.tryAcquire(1, TimeUnit.SECONDS)) {
- throw new IOException("Instance did not get removed in time.");
+ if (!sem.tryAcquire(1, TimeUnit.SECONDS)) {
+ throw new IOException("Instance did not get removed in time.");
+ }
+ }
+ finally {
+ tracker.close();
}
}
}
Modified: ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/Utils.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/Utils.java?rev=1529142&r1=1529141&r2=1529142&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/Utils.java (original)
+++ ace/trunk/org.apache.ace.repository.itest/src/org/apache/ace/it/repository/Utils.java Fri Oct 4 12:26:17 2013
@@ -19,6 +19,7 @@
package org.apache.ace.it.repository;
+import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -27,29 +28,21 @@ import java.net.HttpURLConnection;
import java.net.URL;
final class Utils {
-
+
private static final int COPY_BUFFER_SIZE = 4096;
- private static final String MIME_APPLICATION_OCTET_STREAM = "application/octet-stream";
+ private static final String MIME_APPLICATION_OCTET_STREAM = "application/octet-stream";
- static void waitForWebserver(URL host) throws IOException {
- int retries = 1;
- IOException ioe = null;
- while (retries++ < 10) {
- try {
- ((HttpURLConnection) host.openConnection()).getResponseCode();
- return;
- }
- catch (ConnectException e) {
- ioe = e;
- try {
- Thread.sleep(retries * 50);
- }
- catch (InterruptedException ie) {}
- }
+ static void closeSilently(Closeable resource) {
+ if (resource != null) {
+ try {
+ resource.close();
+ }
+ catch (IOException exception) {
+ // Ignore...
+ }
}
- throw ioe;
}
-
+
/* copy in to out */
static void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[COPY_BUFFER_SIZE];
@@ -59,17 +52,27 @@ final class Utils {
bytes = in.read(buffer);
}
}
-
+
static int get(URL host, String endpoint, String customer, String name, String version, OutputStream out) throws IOException {
URL url = new URL(host, endpoint + "?customer=" + customer + "&name=" + name + "&version=" + version);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- int responseCode = connection.getResponseCode();
- if (responseCode == HttpURLConnection.HTTP_OK) {
- InputStream input = connection.getInputStream();
- copy(input, out);
- out.flush();
+ try {
+ int responseCode = connection.getResponseCode();
+ if (responseCode == HttpURLConnection.HTTP_OK) {
+ InputStream input = connection.getInputStream();
+ try {
+ copy(input, out);
+ out.flush();
+ }
+ finally {
+ closeSilently(input);
+ }
+ }
+ return responseCode;
+ }
+ finally {
+ connection.disconnect();
}
- return responseCode;
}
static int put(URL host, String endpoint, String customer, String name, String version, InputStream in) throws IOException {
@@ -82,12 +85,26 @@ final class Utils {
connection.setChunkedStreamingMode(8192);
connection.setRequestProperty("Content-Type", MIME_APPLICATION_OCTET_STREAM);
OutputStream out = connection.getOutputStream();
- copy(in, out);
- out.flush();
+ try {
+ copy(in, out);
+ out.flush();
+ }
+ finally {
+ closeSilently(in);
+ closeSilently(out);
+ }
+
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream is = (InputStream) connection.getContent();
- is.close();
+ try {
+ while (is.read() > 0) {
+ // ignore...
+ }
+ }
+ finally {
+ closeSilently(is);
+ }
}
return responseCode;
}
@@ -101,9 +118,49 @@ final class Utils {
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream input = connection.getInputStream();
- copy(input, out);
- out.flush();
+ try {
+ copy(input, out);
+ out.flush();
+ }
+ finally {
+ closeSilently(input);
+ }
}
return responseCode;
}
+
+ static void waitForWebserver(URL host) throws IOException {
+ int retries = 1;
+ IOException ioe = null;
+ HttpURLConnection conn = null;
+ while (retries++ < 10) {
+ try {
+ conn = (HttpURLConnection) host.openConnection();
+
+ int rc = conn.getResponseCode();
+ if (rc >= 0) {
+ return;
+ }
+ }
+ catch (ConnectException e) {
+ ioe = e;
+ try {
+ Thread.sleep(retries * 50);
+ }
+ catch (InterruptedException ie) {
+ // We're asked to stop...
+ return;
+ }
+ }
+ finally {
+ if (conn != null) {
+ conn.disconnect();
+ }
+ conn = null;
+ }
+ }
+ if (ioe != null) {
+ throw ioe;
+ }
+ }
}
Modified: ace/trunk/org.apache.ace.test/src/org/apache/ace/it/IntegrationTestBase.java
URL: http://svn.apache.org/viewvc/ace/trunk/org.apache.ace.test/src/org/apache/ace/it/IntegrationTestBase.java?rev=1529142&r1=1529141&r2=1529142&view=diff
==============================================================================
--- ace/trunk/org.apache.ace.test/src/org/apache/ace/it/IntegrationTestBase.java (original)
+++ ace/trunk/org.apache.ace.test/src/org/apache/ace/it/IntegrationTestBase.java Fri Oct 4 12:26:17 2013
@@ -146,6 +146,15 @@ public class IntegrationTestBase extends
}
/**
+ * @param filter
+ * @return an array of configurations, can be <code>null</code>.
+ */
+ protected Configuration[] listConfigurations(String filter) throws IOException, InvalidSyntaxException {
+ ConfigurationAdmin admin = getService(ConfigurationAdmin.class);
+ return admin.listConfigurations(filter);
+ }
+
+ /**
* Sets whether or not any of the tracked configurations should be automatically be deleted when ending a test.
*
* @param aClean