Adjust checkForLeaks timeout settings
LeakAwareDataBufferFactory#checkForLeaks automatically waits up to 5 sec for buffers to be released, which could be used as a way of awaiting on some async logic to complete, and as long as buffers are released, it shouldn't be long. However, the leak test in LeakAwareDataBufferFactoryTests actually expects to find a leak, and always ends up waiting the full 5 seconds. This change, makes the wait configurable, with the no-arg method using 0 (no waiting). AbstractLeakCheckingTests uses 1 second by default since ResourceRegionEncoderTests did fail locally. If more tests need this, we can adjust the settings.
This commit is contained in:
parent
9410998897
commit
3d89acf9ea
|
@ -63,7 +63,7 @@ class ResourceRegionEncoderTests extends AbstractLeakCheckingTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldEncodeResourceRegionFileResource() throws Exception {
|
void shouldEncodeResourceRegionFileResource() {
|
||||||
ResourceRegion region = new ResourceRegion(
|
ResourceRegion region = new ResourceRegion(
|
||||||
new ClassPathResource("ResourceRegionEncoderTests.txt", getClass()), 0, 6);
|
new ClassPathResource("ResourceRegionEncoderTests.txt", getClass()), 0, 6);
|
||||||
Flux<DataBuffer> result = this.encoder.encode(Mono.just(region), this.bufferFactory,
|
Flux<DataBuffer> result = this.encoder.encode(Mono.just(region), this.bufferFactory,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2019 the original author or authors.
|
* Copyright 2002-2022 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -35,8 +35,7 @@ class LeakAwareDataBufferFactoryTests {
|
||||||
void leak() {
|
void leak() {
|
||||||
DataBuffer dataBuffer = this.bufferFactory.allocateBuffer();
|
DataBuffer dataBuffer = this.bufferFactory.allocateBuffer();
|
||||||
try {
|
try {
|
||||||
assertThatExceptionOfType(AssertionError.class).isThrownBy(
|
assertThatExceptionOfType(AssertionError.class).isThrownBy(this.bufferFactory::checkForLeaks);
|
||||||
this.bufferFactory::checkForLeaks);
|
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
release(dataBuffer);
|
release(dataBuffer);
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
package org.springframework.core.testfixture.io.buffer;
|
package org.springframework.core.testfixture.io.buffer;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
import org.junit.jupiter.api.AfterEach;
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
|
||||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||||
|
@ -42,7 +44,7 @@ public abstract class AbstractLeakCheckingTests {
|
||||||
*/
|
*/
|
||||||
@AfterEach
|
@AfterEach
|
||||||
final void checkForLeaks() {
|
final void checkForLeaks() {
|
||||||
this.bufferFactory.checkForLeaks();
|
this.bufferFactory.checkForLeaks(Duration.ofSeconds(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,13 +81,21 @@ public class LeakAwareDataBufferFactory implements DataBufferFactory {
|
||||||
* method.
|
* method.
|
||||||
*/
|
*/
|
||||||
public void checkForLeaks() {
|
public void checkForLeaks() {
|
||||||
|
checkForLeaks(Duration.ofSeconds(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Variant of {@link #checkForLeaks()} with the option to wait for buffer release.
|
||||||
|
* @param timeout how long to wait for buffers to be released; 0 for no waiting
|
||||||
|
*/
|
||||||
|
public void checkForLeaks(Duration timeout) {
|
||||||
this.trackCreated.set(false);
|
this.trackCreated.set(false);
|
||||||
Instant start = Instant.now();
|
Instant start = Instant.now();
|
||||||
while (true) {
|
while (true) {
|
||||||
if (this.created.stream().noneMatch(LeakAwareDataBuffer::isAllocated)) {
|
if (this.created.stream().noneMatch(LeakAwareDataBuffer::isAllocated)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Instant.now().isBefore(start.plus(Duration.ofSeconds(5)))) {
|
if (Instant.now().isBefore(start.plus(timeout))) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(50);
|
Thread.sleep(50);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue