Author: cziegeler Date: Sun Oct 16 13:14:53 2016 New Revision: 1765152 URL: http://svn.apache.org/viewvc?rev=1765152&view=rev Log: SLING-4867 : EntityResourceList should be thread-safe
Modified: sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/installer/InstallManyBundlesTest.java Modified: sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/installer/InstallManyBundlesTest.java URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/installer/InstallManyBundlesTest.java?rev=1765152&r1=1765151&r2=1765152&view=diff ============================================================================== --- sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/installer/InstallManyBundlesTest.java (original) +++ sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/installer/InstallManyBundlesTest.java Sun Oct 16 13:14:53 2016 @@ -20,9 +20,11 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; -import junit.framework.AssertionFailedError; +import javax.servlet.http.HttpServletResponse; import org.apache.sling.commons.json.JSONException; import org.apache.sling.commons.json.JSONObject; @@ -36,56 +38,58 @@ import org.osgi.framework.Constants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** Test the installation and update of several (optionally many) - * bundles via the JCR installer +import junit.framework.AssertionFailedError; + +/** Test the installation and update of several (optionally many) + * bundles via the JCR installer */ public class InstallManyBundlesTest { /** How many test cycles to run - can be set to a higher * value manually for heavier testing. */ private static final int HOW_MANY = Integer.getInteger("InstallManyBundlesTest.howMany", 10); - + private static final long WAIT_ACTIVE_TIMEOUT_MSEC = 10000; - + private static final String TEST_ID = UUID.randomUUID().toString(); - - private static final String BASE_BSN = "org.apache.sling.testbundle." - + InstallManyBundlesTest.class.getSimpleName() - + "." + TEST_ID; - - private static final String INSTALL_PATH = "/apps/" + InstallManyBundlesTest.class.getSimpleName() + "/" + TEST_ID + "/install"; - + + private static final String BASE_BSN = "org.apache.sling.testbundle." + + InstallManyBundlesTest.class.getSimpleName() + + "." + TEST_ID; + + private static final String INSTALL_PATH = "/apps/" + InstallManyBundlesTest.class.getSimpleName() + "/" + TEST_ID + "/install"; + private static HttpTest H = new HttpTest(); - + private final Logger log = LoggerFactory.getLogger(getClass()); - + private String toDelete; - + @Before public void setup() throws Exception { H.setUp(); H.getTestClient().mkdirs(HttpTest.HTTP_BASE_URL, INSTALL_PATH); toDelete = HttpTest.HTTP_BASE_URL + INSTALL_PATH; } - + @After public void cleanup() throws IOException { H.getTestClient().delete(toDelete); } - + private InputStream getBundleStream(String bsn, String version) { return TinyBundles.bundle() .set(Constants.BUNDLE_VERSION, version) .set(Constants.BUNDLE_SYMBOLICNAME, bsn) .build(); } - + private void assertActiveBundle(String bsn, String expectedState, String expectedVersion) throws IOException, JSONException { final String consoleUrl = HttpTest.HTTP_BASE_URL + "/system/console/bundles/" + bsn + ".json"; - + String state = null; String version = null; - + final long timeoutMsec = TimeoutsProvider.getInstance().getTimeout(WAIT_ACTIVE_TIMEOUT_MSEC); final long endTime = System.currentTimeMillis() + timeoutMsec; while(System.currentTimeMillis() < endTime) { @@ -104,25 +108,46 @@ public class InstallManyBundlesTest { } catch(InterruptedException ignore) { } } - - fail("Did not get state=" - + expectedState + " and version=" + expectedVersion + + fail("Did not get state=" + + expectedState + " and version=" + expectedVersion + " within " + timeoutMsec + " msec" + ", got " + state + " / " + version); } - + + private boolean waitNoBundles(String bsn) throws IOException { + final String consoleUrl = HttpTest.HTTP_BASE_URL + "/system/console/bundles/" + bsn + ".json"; + + final long timeoutMsec = TimeoutsProvider.getInstance().getTimeout(WAIT_ACTIVE_TIMEOUT_MSEC); + final long endTime = System.currentTimeMillis() + timeoutMsec; + while(System.currentTimeMillis() < endTime) { + try { + H.getContent(consoleUrl, HttpTest.CONTENT_TYPE_DONTCARE, null, HttpServletResponse.SC_NOT_FOUND ); + return true; + } catch(AssertionFailedError dontCare) { + // Thrown by getContent - might happen if the bundle is still installed + } + try { + Thread.sleep(100); + } catch(InterruptedException ignore) { + } + } + + return false; + } + private void installAndCheckBundle(String bsn, int filenameVariant, String version) throws IOException, JSONException { final String filename = bsn + "." + filenameVariant + ".jar"; - final String url = HttpTest.HTTP_BASE_URL + INSTALL_PATH + "/" + filename; + final String url = HttpTest.HTTP_BASE_URL + INSTALL_PATH + "/" + filename; H.getTestClient().upload(url, getBundleStream(bsn, version)); assertActiveBundle(bsn, "Active", version); } - + @Test public void installAndUpgradeBundleManyTimes() throws IOException, JSONException { + final String bsn = BASE_BSN + "_upgradetest"; int i = 0; try { - final String bsn = BASE_BSN + "_upgradetest"; for(i=0; i < HOW_MANY; i++) { final String version = "42.0." + i; installAndCheckBundle(bsn, i, version); @@ -130,21 +155,36 @@ public class InstallManyBundlesTest { log.info("Test bundle successfully installed, upgraded and started {} times", HOW_MANY); } finally { log.info("installAndUpgradeBundleManyTimes exiting with i={}", i); + // we should wait until the OSGi installer has removed everything + H.getTestClient().delete(toDelete); + waitNoBundles(bsn); } } - + @Test public void installManyBundles() throws IOException, JSONException { + final List<String> bsns = new ArrayList<String>(); int i = 0; try { final String version = "42.42.42"; for(i=0; i < HOW_MANY; i++) { final String bsn = BASE_BSN + "_manybundles_" + i; + bsns.add(bsn); installAndCheckBundle(bsn, 0, version); } log.info("{} different bundles successfully installed and started", HOW_MANY); } finally { log.info("installManyBundles exiting with i={}", i); + // we should wait until the OSGi installer has removed everything + H.getTestClient().delete(toDelete); + while ( !bsns.isEmpty() ) { + if ( waitNoBundles(bsns.get(0)) ) { + bsns.remove(0); + } else { + final String bsn = bsns.remove(0); + bsns.add(bsn); + } + } } } } \ No newline at end of file