mirror of
https://github.com/spring-projects/spring-boot.git
synced 2026-09-28 04:59:10 +00:00
Previously, a temporary .writing file could be found and an attempt made to access its contents. If the temporary file was deleted between it being found and its contents being read, the test would fail with a FileNotFoundException. This commit updates the test to ignore .writing files so that it will only examine the contents of the final file once Integration has finished writing it an atomically moved it to its final location.
126 lines
3.7 KiB
Java
126 lines
3.7 KiB
Java
/*
|
|
* Copyright 2012-2018 the original author or authors.
|
|
*
|
|
* 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 sample.integration.consumer;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.util.concurrent.Callable;
|
|
import java.util.concurrent.Executors;
|
|
import java.util.concurrent.Future;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
import org.junit.After;
|
|
import org.junit.Before;
|
|
import org.junit.Test;
|
|
import sample.integration.SampleIntegrationApplication;
|
|
import sample.integration.producer.ProducerApplication;
|
|
|
|
import org.springframework.boot.SpringApplication;
|
|
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 static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
/**
|
|
* Basic integration tests for service demo application.
|
|
*
|
|
* @author Dave Syer
|
|
* @author Andy Wilkinson
|
|
*/
|
|
public class SampleIntegrationApplicationTests {
|
|
|
|
private ConfigurableApplicationContext context;
|
|
|
|
@Before
|
|
public void deleteInputAndOutput() {
|
|
deleteIfExists(new File("target/input"));
|
|
deleteIfExists(new File("target/output"));
|
|
}
|
|
|
|
private void deleteIfExists(File directory) {
|
|
if (directory.exists()) {
|
|
assertThat(FileSystemUtils.deleteRecursively(directory)).isTrue();
|
|
}
|
|
}
|
|
|
|
@After
|
|
public void stop() {
|
|
if (this.context != null) {
|
|
this.context.close();
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testVanillaExchange() throws Exception {
|
|
this.context = SpringApplication.run(SampleIntegrationApplication.class);
|
|
SpringApplication.run(ProducerApplication.class, "World");
|
|
String output = getOutput();
|
|
assertThat(output).contains("Hello World");
|
|
}
|
|
|
|
@Test
|
|
public void testMessageGateway() throws Exception {
|
|
this.context = SpringApplication.run(SampleIntegrationApplication.class,
|
|
"testviamg");
|
|
String output = getOutput();
|
|
assertThat(output).contains("testviamg");
|
|
}
|
|
|
|
private String getOutput() throws Exception {
|
|
Future<String> future = Executors.newSingleThreadExecutor()
|
|
.submit(new Callable<String>() {
|
|
@Override
|
|
public String call() throws Exception {
|
|
Resource[] resources = getResourcesWithContent();
|
|
while (resources.length == 0) {
|
|
Thread.sleep(200);
|
|
resources = getResourcesWithContent();
|
|
}
|
|
StringBuilder builder = new StringBuilder();
|
|
for (Resource resource : resources) {
|
|
try (InputStream inputStream = resource.getInputStream()) {
|
|
builder.append(new String(
|
|
StreamUtils.copyToByteArray(inputStream)));
|
|
}
|
|
}
|
|
return builder.toString();
|
|
}
|
|
});
|
|
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.getFilename() != null
|
|
&& candidate.getFilename().endsWith(".writing"))
|
|
|| candidate.contentLength() == 0) {
|
|
return new Resource[0];
|
|
}
|
|
}
|
|
return candidates;
|
|
}
|
|
|
|
}
|