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
This commit is contained in:
parent
9a2d654eba
commit
160d609bd4
|
|
@ -16,12 +16,15 @@
|
|||
|
||||
package sample.integration.consumer;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
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.Resource;
|
||||
import org.springframework.core.io.support.ResourcePatternUtils;
|
||||
import org.springframework.util.FileSystemUtils;
|
||||
import org.springframework.util.StreamUtils;
|
||||
|
||||
import sample.integration.SampleIntegrationApplication;
|
||||
|
|
@ -40,6 +44,7 @@ import static org.junit.Assert.assertTrue;
|
|||
* Basic integration tests for service demo application.
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class SampleIntegrationApplicationTests {
|
||||
|
||||
|
|
@ -57,6 +62,11 @@ public class SampleIntegrationApplicationTests {
|
|||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
public void deleteOutput() {
|
||||
FileSystemUtils.deleteRecursively(new File("target/output"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testVanillaExchange() throws Exception {
|
||||
SpringApplication.run(ProducerApplication.class, "World");
|
||||
|
|
@ -69,12 +79,10 @@ public class SampleIntegrationApplicationTests {
|
|||
new Callable<String>() {
|
||||
@Override
|
||||
public String call() throws Exception {
|
||||
Resource[] resources = new Resource[0];
|
||||
Resource[] resources = getResourcesWithContent();
|
||||
while (resources.length == 0) {
|
||||
Thread.sleep(200);
|
||||
resources = ResourcePatternUtils.getResourcePatternResolver(
|
||||
new DefaultResourceLoader()).getResources(
|
||||
"file:target/output/**");
|
||||
resources = getResourcesWithContent();
|
||||
}
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (Resource resource : resources) {
|
||||
|
|
@ -86,4 +94,15 @@ public class SampleIntegrationApplicationTests {
|
|||
});
|
||||
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…
Reference in New Issue