Protect against race condition where output file exists but it is empty

Previously, there was a timing window where the output file had been
created but it was empty. This would cause the test to fail as the
output was read from the empty file and didn’t match the expected “Hello
World”.

This commit updates the test to only process the resources in the output
directory when all the resolved resources have a non-zero content
length. An @Before method has also been added to delete the output
produced by the test so that the outcome of the test isn’t affected by
files generated by previous runs.

Fixes gh-1735
pull/2035/head
Andy Wilkinson 10 years ago
parent 9a2d654eba
commit 160d609bd4

@ -16,12 +16,15 @@
package sample.integration.consumer; package sample.integration.consumer;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
@ -29,6 +32,7 @@ import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.support.ResourcePatternUtils; import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.util.FileSystemUtils;
import org.springframework.util.StreamUtils; import org.springframework.util.StreamUtils;
import sample.integration.SampleIntegrationApplication; import sample.integration.SampleIntegrationApplication;
@ -40,6 +44,7 @@ import static org.junit.Assert.assertTrue;
* Basic integration tests for service demo application. * Basic integration tests for service demo application.
* *
* @author Dave Syer * @author Dave Syer
* @author Andy Wilkinson
*/ */
public class SampleIntegrationApplicationTests { public class SampleIntegrationApplicationTests {
@ -57,6 +62,11 @@ public class SampleIntegrationApplicationTests {
} }
} }
@Before
public void deleteOutput() {
FileSystemUtils.deleteRecursively(new File("target/output"));
}
@Test @Test
public void testVanillaExchange() throws Exception { public void testVanillaExchange() throws Exception {
SpringApplication.run(ProducerApplication.class, "World"); SpringApplication.run(ProducerApplication.class, "World");
@ -69,12 +79,10 @@ public class SampleIntegrationApplicationTests {
new Callable<String>() { new Callable<String>() {
@Override @Override
public String call() throws Exception { public String call() throws Exception {
Resource[] resources = new Resource[0]; Resource[] resources = getResourcesWithContent();
while (resources.length == 0) { while (resources.length == 0) {
Thread.sleep(200); Thread.sleep(200);
resources = ResourcePatternUtils.getResourcePatternResolver( resources = getResourcesWithContent();
new DefaultResourceLoader()).getResources(
"file:target/output/**");
} }
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
for (Resource resource : resources) { for (Resource resource : resources) {
@ -86,4 +94,15 @@ public class SampleIntegrationApplicationTests {
}); });
return future.get(30, TimeUnit.SECONDS); return future.get(30, TimeUnit.SECONDS);
} }
private Resource[] getResourcesWithContent() throws IOException {
Resource[] candidates = ResourcePatternUtils.getResourcePatternResolver(
new DefaultResourceLoader()).getResources("file:target/output/**");
for (Resource candidate : candidates) {
if (candidate.contentLength() == 0) {
return new Resource[0];
}
}
return candidates;
}
} }

Loading…
Cancel
Save