Clean up warnings and polish tests
This commit also modifies ResourceWebHandlerTests.getResourceFromFileSystem() so that it passes in the IDE.
This commit is contained in:
parent
e53c7ae6f5
commit
b50415062b
|
|
@ -506,6 +506,7 @@ public class DefaultDataBuffer implements DataBuffer {
|
|||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public DefaultDataBuffer capacity(int newCapacity) {
|
||||
throw new UnsupportedOperationException("Changing the capacity of a sliced buffer is not supported");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ class Netty5BufferEncoderTests extends AbstractEncoderTests<Netty5BufferEncoder>
|
|||
super(new Netty5BufferEncoder());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Test
|
||||
@Override
|
||||
public void canEncode() {
|
||||
assertThat(this.encoder.canEncode(ResolvableType.forClass(Buffer.class),
|
||||
MimeTypeUtils.TEXT_PLAIN)).isTrue();
|
||||
|
|
@ -56,8 +56,9 @@ class Netty5BufferEncoderTests extends AbstractEncoderTests<Netty5BufferEncoder>
|
|||
assertThat(this.encoder.canEncode(ResolvableType.NONE, null)).isFalse();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Test
|
||||
@Override
|
||||
@SuppressWarnings("resource")
|
||||
public void encode() {
|
||||
Flux<Buffer> input = Flux.just(this.fooBytes, this.barBytes)
|
||||
.map(DefaultBufferAllocators.preferredAllocator()::copyOf);
|
||||
|
|
@ -67,4 +68,5 @@ class Netty5BufferEncoderTests extends AbstractEncoderTests<Netty5BufferEncoder>
|
|||
.consumeNextWith(expectBytes(this.barBytes))
|
||||
.verifyComplete());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -389,6 +389,7 @@ class DataBufferTests extends AbstractDataBufferAllocatingTests {
|
|||
}
|
||||
|
||||
@ParameterizedDataBufferAllocatingTest
|
||||
@SuppressWarnings("deprecation")
|
||||
void increaseCapacity(DataBufferFactory bufferFactory) {
|
||||
super.bufferFactory = bufferFactory;
|
||||
|
||||
|
|
@ -402,6 +403,7 @@ class DataBufferTests extends AbstractDataBufferAllocatingTests {
|
|||
}
|
||||
|
||||
@ParameterizedDataBufferAllocatingTest
|
||||
@SuppressWarnings("deprecation")
|
||||
void decreaseCapacityLowReadPosition(DataBufferFactory bufferFactory) {
|
||||
assumeFalse(bufferFactory instanceof Netty5DataBufferFactory,
|
||||
"Netty 5 does not support decreasing the capacity");
|
||||
|
|
@ -417,6 +419,7 @@ class DataBufferTests extends AbstractDataBufferAllocatingTests {
|
|||
}
|
||||
|
||||
@ParameterizedDataBufferAllocatingTest
|
||||
@SuppressWarnings("deprecation")
|
||||
void decreaseCapacityHighReadPosition(DataBufferFactory bufferFactory) {
|
||||
assumeFalse(bufferFactory instanceof Netty5DataBufferFactory,
|
||||
"Netty 5 does not support decreasing the capacity");
|
||||
|
|
@ -433,13 +436,13 @@ class DataBufferTests extends AbstractDataBufferAllocatingTests {
|
|||
}
|
||||
|
||||
@ParameterizedDataBufferAllocatingTest
|
||||
@SuppressWarnings("deprecation")
|
||||
void capacityLessThanZero(DataBufferFactory bufferFactory) {
|
||||
super.bufferFactory = bufferFactory;
|
||||
|
||||
DataBuffer buffer = createDataBuffer(1);
|
||||
try {
|
||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
||||
buffer.capacity(-1));
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> buffer.capacity(-1));
|
||||
}
|
||||
finally {
|
||||
release(buffer);
|
||||
|
|
@ -754,6 +757,7 @@ class DataBufferTests extends AbstractDataBufferAllocatingTests {
|
|||
}
|
||||
|
||||
@ParameterizedDataBufferAllocatingTest
|
||||
@SuppressWarnings("deprecation")
|
||||
void spr16351(DataBufferFactory bufferFactory) {
|
||||
super.bufferFactory = 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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -32,11 +32,11 @@ class LeakAwareDataBufferFactoryTests {
|
|||
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
void leak() {
|
||||
DataBuffer dataBuffer = this.bufferFactory.allocateBuffer();
|
||||
try {
|
||||
assertThatExceptionOfType(AssertionError.class).isThrownBy(
|
||||
this.bufferFactory::checkForLeaks);
|
||||
assertThatExceptionOfType(AssertionError.class).isThrownBy(this.bufferFactory::checkForLeaks);
|
||||
}
|
||||
finally {
|
||||
release(dataBuffer);
|
||||
|
|
@ -45,7 +45,7 @@ class LeakAwareDataBufferFactoryTests {
|
|||
|
||||
@Test
|
||||
void noLeak() {
|
||||
DataBuffer dataBuffer = this.bufferFactory.allocateBuffer();
|
||||
DataBuffer dataBuffer = this.bufferFactory.allocateBuffer(256);
|
||||
release(dataBuffer);
|
||||
this.bufferFactory.checkForLeaks();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ public class LeakAwareDataBufferFactory implements DataBufferFactory {
|
|||
List<AssertionError> errors = this.created.stream()
|
||||
.filter(LeakAwareDataBuffer::isAllocated)
|
||||
.map(LeakAwareDataBuffer::leakError)
|
||||
.collect(Collectors.toList());
|
||||
.toList();
|
||||
|
||||
errors.forEach(it -> logger.error("Leaked error: ", it));
|
||||
throw new AssertionError(errors.size() + " buffer leaks detected (see logs above)");
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -47,12 +47,11 @@ import static org.springframework.util.MimeTypeUtils.TEXT_HTML;
|
|||
import static org.springframework.util.MimeTypeUtils.TEXT_PLAIN;
|
||||
import static org.springframework.util.MimeTypeUtils.TEXT_XML;
|
||||
|
||||
|
||||
/**
|
||||
* Unit tests for {@link DefaultMetadataExtractor}.
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
public class DefaultMetadataExtractorTests {
|
||||
class DefaultMetadataExtractorTests {
|
||||
|
||||
private static MimeType COMPOSITE_METADATA =
|
||||
MimeTypeUtils.parseMimeType(WellKnownMimeType.MESSAGE_RSOCKET_COMPOSITE_METADATA.getString());
|
||||
|
|
@ -64,21 +63,21 @@ public class DefaultMetadataExtractorTests {
|
|||
|
||||
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
void setUp() {
|
||||
DataBufferFactory bufferFactory = new LeakAwareNettyDataBufferFactory(PooledByteBufAllocator.DEFAULT);
|
||||
this.strategies = RSocketStrategies.builder().dataBufferFactory(bufferFactory).build();
|
||||
this.extractor = new DefaultMetadataExtractor(StringDecoder.allMimeTypes());
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void tearDown() throws InterruptedException {
|
||||
void tearDown() throws InterruptedException {
|
||||
DataBufferFactory bufferFactory = this.strategies.dataBufferFactory();
|
||||
((LeakAwareNettyDataBufferFactory) bufferFactory).checkForLeaks(Duration.ofSeconds(5));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void compositeMetadataWithDefaultSettings() {
|
||||
void compositeMetadataWithDefaultSettings() {
|
||||
MetadataEncoder metadataEncoder = new MetadataEncoder(COMPOSITE_METADATA, this.strategies)
|
||||
.route("toA")
|
||||
.metadata("text data", TEXT_PLAIN)
|
||||
|
|
@ -94,7 +93,7 @@ public class DefaultMetadataExtractorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void compositeMetadataWithMimeTypeRegistrations() {
|
||||
void compositeMetadataWithMimeTypeRegistrations() {
|
||||
this.extractor.metadataToExtract(TEXT_PLAIN, String.class, "text-entry");
|
||||
this.extractor.metadataToExtract(TEXT_HTML, String.class, "html-entry");
|
||||
this.extractor.metadataToExtract(TEXT_XML, String.class, "xml-entry");
|
||||
|
|
@ -118,7 +117,7 @@ public class DefaultMetadataExtractorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void route() {
|
||||
void route() {
|
||||
MimeType metaMimeType = MimeTypeUtils.parseMimeType(WellKnownMimeType.MESSAGE_RSOCKET_ROUTING.getString());
|
||||
MetadataEncoder metadataEncoder = new MetadataEncoder(metaMimeType, this.strategies).route("toA");
|
||||
DataBuffer metadata = metadataEncoder.encode().block();
|
||||
|
|
@ -130,7 +129,7 @@ public class DefaultMetadataExtractorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void routeAsText() {
|
||||
void routeAsText() {
|
||||
this.extractor.metadataToExtract(TEXT_PLAIN, String.class, ROUTE_KEY);
|
||||
|
||||
MetadataEncoder metadataEncoder = new MetadataEncoder(TEXT_PLAIN, this.strategies).route("toA");
|
||||
|
|
@ -143,7 +142,7 @@ public class DefaultMetadataExtractorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void routeWithCustomFormatting() {
|
||||
void routeWithCustomFormatting() {
|
||||
this.extractor.metadataToExtract(TEXT_PLAIN, String.class, (text, result) -> {
|
||||
String[] items = text.split(":");
|
||||
Assert.isTrue(items.length == 2, "Expected two items");
|
||||
|
|
@ -163,7 +162,7 @@ public class DefaultMetadataExtractorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void nonCompositeMetadataCanBeReadTwice() {
|
||||
void nonCompositeMetadataCanBeReadTwice() {
|
||||
DefaultMetadataExtractor extractor = new DefaultMetadataExtractor(new TestDecoder());
|
||||
extractor.metadataToExtract(TEXT_PLAIN, String.class, "name");
|
||||
|
||||
|
|
@ -181,7 +180,7 @@ public class DefaultMetadataExtractorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void noDecoder() {
|
||||
void noDecoder() {
|
||||
DefaultMetadataExtractor extractor =
|
||||
new DefaultMetadataExtractor(Collections.singletonList(new ByteArrayDecoder())
|
||||
);
|
||||
|
|
@ -193,7 +192,7 @@ public class DefaultMetadataExtractorTests {
|
|||
|
||||
|
||||
private Payload createPayload(DataBuffer metadata) {
|
||||
return PayloadUtils.createPayload(this.strategies.dataBufferFactory().allocateBuffer(), metadata);
|
||||
return PayloadUtils.createPayload(this.strategies.dataBufferFactory().allocateBuffer(256), metadata);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -203,7 +202,7 @@ public class DefaultMetadataExtractorTests {
|
|||
*/
|
||||
private static class TestDecoder extends AbstractDataBufferDecoder<String> {
|
||||
|
||||
public TestDecoder() {
|
||||
TestDecoder() {
|
||||
super(TEXT_PLAIN);
|
||||
}
|
||||
|
||||
|
|
@ -217,4 +216,5 @@ public class DefaultMetadataExtractorTests {
|
|||
return new String(bytes, StandardCharsets.UTF_8);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -52,8 +52,8 @@ public class LeakAwareNettyDataBufferFactory extends NettyDataBufferFactory {
|
|||
while (true) {
|
||||
try {
|
||||
this.created.forEach(info -> {
|
||||
if (((PooledDataBuffer) info.getDataBuffer()).isAllocated()) {
|
||||
throw info.getError();
|
||||
if (((PooledDataBuffer) info.dataBuffer()).isAllocated()) {
|
||||
throw info.error();
|
||||
}
|
||||
});
|
||||
break;
|
||||
|
|
@ -73,6 +73,7 @@ public class LeakAwareNettyDataBufferFactory extends NettyDataBufferFactory {
|
|||
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public NettyDataBuffer allocateBuffer() {
|
||||
return (NettyDataBuffer) recordHint(super.allocateBuffer());
|
||||
}
|
||||
|
|
@ -105,23 +106,7 @@ public class LeakAwareNettyDataBufferFactory extends NettyDataBufferFactory {
|
|||
}
|
||||
|
||||
|
||||
private static class DataBufferLeakInfo {
|
||||
|
||||
private final DataBuffer dataBuffer;
|
||||
|
||||
private final AssertionError error;
|
||||
|
||||
DataBufferLeakInfo(DataBuffer dataBuffer, AssertionError error) {
|
||||
this.dataBuffer = dataBuffer;
|
||||
this.error = error;
|
||||
}
|
||||
|
||||
DataBuffer getDataBuffer() {
|
||||
return this.dataBuffer;
|
||||
}
|
||||
|
||||
AssertionError getError() {
|
||||
return this.error;
|
||||
}
|
||||
private static record DataBufferLeakInfo(DataBuffer dataBuffer, AssertionError error) {
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2022 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.
|
||||
|
|
@ -42,11 +42,10 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 5.2
|
||||
*/
|
||||
public class MetadataEncoderTests {
|
||||
class MetadataEncoderTests {
|
||||
|
||||
private static MimeType COMPOSITE_METADATA =
|
||||
MimeTypeUtils.parseMimeType(WellKnownMimeType.MESSAGE_RSOCKET_COMPOSITE_METADATA.getString());
|
||||
|
|
@ -56,7 +55,7 @@ public class MetadataEncoderTests {
|
|||
|
||||
|
||||
@Test
|
||||
public void compositeMetadata() {
|
||||
void compositeMetadata() {
|
||||
|
||||
Mono<String> asyncMeta1 = Mono.delay(Duration.ofMillis(1)).map(aLong -> "Async Metadata 1");
|
||||
Mono<String> asyncMeta2 = Mono.delay(Duration.ofMillis(1)).map(aLong -> "Async Metadata 2");
|
||||
|
|
@ -102,7 +101,7 @@ public class MetadataEncoderTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void routeWithRoutingMimeType() {
|
||||
void routeWithRoutingMimeType() {
|
||||
|
||||
MimeType mimeType = MimeTypeUtils.parseMimeType(
|
||||
WellKnownMimeType.MESSAGE_RSOCKET_ROUTING.getString());
|
||||
|
|
@ -117,7 +116,7 @@ public class MetadataEncoderTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void routeWithTextPlainMimeType() {
|
||||
void routeWithTextPlainMimeType() {
|
||||
DataBuffer buffer =
|
||||
new MetadataEncoder(MimeTypeUtils.TEXT_PLAIN, this.strategies)
|
||||
.route("toA")
|
||||
|
|
@ -128,7 +127,7 @@ public class MetadataEncoderTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void routeWithVars() {
|
||||
void routeWithVars() {
|
||||
DataBuffer buffer =
|
||||
new MetadataEncoder(MimeTypeUtils.TEXT_PLAIN, this.strategies)
|
||||
.route("a.{b}.{c}.d", "BBB", "C.C.C")
|
||||
|
|
@ -139,7 +138,7 @@ public class MetadataEncoderTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void metadataWithTextPlainMimeType() {
|
||||
void metadataWithTextPlainMimeType() {
|
||||
DataBuffer buffer =
|
||||
new MetadataEncoder(MimeTypeUtils.TEXT_PLAIN, this.strategies)
|
||||
.metadata(Unpooled.wrappedBuffer("Raw data".getBytes(UTF_8)), null)
|
||||
|
|
@ -150,7 +149,7 @@ public class MetadataEncoderTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void metadataWithByteBuf() {
|
||||
void metadataWithByteBuf() {
|
||||
DataBuffer buffer =
|
||||
new MetadataEncoder(MimeTypeUtils.TEXT_PLAIN, this.strategies)
|
||||
.metadata("toA", null)
|
||||
|
|
@ -161,7 +160,7 @@ public class MetadataEncoderTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void compositeRequiredForMultipleEntries() {
|
||||
void compositeRequiredForMultipleEntries() {
|
||||
|
||||
// Route, metadata
|
||||
MetadataEncoder encoder1 = new MetadataEncoder(MimeTypeUtils.TEXT_PLAIN, this.strategies);
|
||||
|
|
@ -186,7 +185,7 @@ public class MetadataEncoderTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void mimeTypeRequiredForCompositeEntries() {
|
||||
void mimeTypeRequiredForCompositeEntries() {
|
||||
MetadataEncoder encoder = new MetadataEncoder(COMPOSITE_METADATA, this.strategies);
|
||||
|
||||
assertThatThrownBy(() -> encoder.metadata("toA", null))
|
||||
|
|
@ -194,7 +193,7 @@ public class MetadataEncoderTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void mimeTypeDoesNotMatchConnectionMetadataMimeType() {
|
||||
void mimeTypeDoesNotMatchConnectionMetadataMimeType() {
|
||||
MetadataEncoder encoder = new MetadataEncoder(MimeTypeUtils.TEXT_PLAIN, this.strategies);
|
||||
|
||||
assertThatThrownBy(() -> encoder.metadata("toA", MimeTypeUtils.APPLICATION_JSON))
|
||||
|
|
@ -203,7 +202,7 @@ public class MetadataEncoderTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void defaultDataBufferFactory() {
|
||||
void defaultDataBufferFactory() {
|
||||
DefaultDataBufferFactory bufferFactory = DefaultDataBufferFactory.sharedInstance;
|
||||
RSocketStrategies strategies = RSocketStrategies.builder().dataBufferFactory(bufferFactory).build();
|
||||
|
||||
|
|
@ -213,7 +212,7 @@ public class MetadataEncoderTests {
|
|||
.block();
|
||||
|
||||
ByteBuf byteBuf = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT)
|
||||
.wrap(buffer.asByteBuffer())
|
||||
.wrap(buffer.toByteBuffer())
|
||||
.getNativeBuffer();
|
||||
|
||||
CompositeMetadata entries = new CompositeMetadata(byteBuf, false);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2022 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.
|
||||
|
|
@ -37,23 +37,24 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
|
||||
/**
|
||||
* Unit tests for {@link PayloadUtils}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 5.2
|
||||
*/
|
||||
public class PayloadUtilsTests {
|
||||
class PayloadUtilsTests {
|
||||
|
||||
private LeakAwareNettyDataBufferFactory nettyBufferFactory =
|
||||
new LeakAwareNettyDataBufferFactory(PooledByteBufAllocator.DEFAULT);
|
||||
|
||||
|
||||
@AfterEach
|
||||
public void tearDown() throws Exception {
|
||||
void tearDown() throws Exception {
|
||||
this.nettyBufferFactory.checkForLeaks(Duration.ofSeconds(5));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void retainAndReleaseWithNettyFactory() {
|
||||
void retainAndReleaseWithNettyFactory() {
|
||||
Payload payload = ByteBufPayload.create("sample data");
|
||||
DataBuffer buffer = PayloadUtils.retainDataAndReleasePayload(payload, this.nettyBufferFactory);
|
||||
try {
|
||||
|
|
@ -67,7 +68,7 @@ public class PayloadUtilsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void retainAndReleaseWithDefaultFactory() {
|
||||
void retainAndReleaseWithDefaultFactory() {
|
||||
Payload payload = ByteBufPayload.create("sample data");
|
||||
DataBuffer buffer = PayloadUtils.retainDataAndReleasePayload(payload, DefaultDataBufferFactory.sharedInstance);
|
||||
|
||||
|
|
@ -76,7 +77,7 @@ public class PayloadUtilsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void createWithNettyBuffers() {
|
||||
void createWithNettyBuffers() {
|
||||
NettyDataBuffer data = createNettyDataBuffer("sample data");
|
||||
NettyDataBuffer metadata = createNettyDataBuffer("sample metadata");
|
||||
|
||||
|
|
@ -92,7 +93,7 @@ public class PayloadUtilsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void createWithDefaultBuffers() {
|
||||
void createWithDefaultBuffers() {
|
||||
DataBuffer data = createDefaultDataBuffer("sample data");
|
||||
DataBuffer metadata = createDefaultDataBuffer("sample metadata");
|
||||
Payload payload = PayloadUtils.createPayload(data, metadata);
|
||||
|
|
@ -103,7 +104,7 @@ public class PayloadUtilsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void createWithNettyAndDefaultBuffers() {
|
||||
void createWithNettyAndDefaultBuffers() {
|
||||
NettyDataBuffer data = createNettyDataBuffer("sample data");
|
||||
DefaultDataBuffer metadata = createDefaultDataBuffer("sample metadata");
|
||||
Payload payload = PayloadUtils.createPayload(data, metadata);
|
||||
|
|
@ -118,7 +119,7 @@ public class PayloadUtilsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void createWithDefaultAndNettyBuffers() {
|
||||
void createWithDefaultAndNettyBuffers() {
|
||||
DefaultDataBuffer data = createDefaultDataBuffer("sample data");
|
||||
NettyDataBuffer metadata = createNettyDataBuffer("sample metadata");
|
||||
Payload payload = PayloadUtils.createPayload(data, metadata);
|
||||
|
|
@ -133,7 +134,7 @@ public class PayloadUtilsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void createWithNettyBuffer() {
|
||||
void createWithNettyBuffer() {
|
||||
NettyDataBuffer data = createNettyDataBuffer("sample data");
|
||||
Payload payload = PayloadUtils.createPayload(data);
|
||||
try {
|
||||
|
|
@ -146,7 +147,7 @@ public class PayloadUtilsTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void createWithDefaultBuffer() {
|
||||
void createWithDefaultBuffer() {
|
||||
DataBuffer data = createDefaultDataBuffer("sample data");
|
||||
Payload payload = PayloadUtils.createPayload(data);
|
||||
|
||||
|
|
@ -162,7 +163,7 @@ public class PayloadUtilsTests {
|
|||
}
|
||||
|
||||
private DefaultDataBuffer createDefaultDataBuffer(String content) {
|
||||
DefaultDataBuffer buffer = DefaultDataBufferFactory.sharedInstance.allocateBuffer();
|
||||
DefaultDataBuffer buffer = DefaultDataBufferFactory.sharedInstance.allocateBuffer(256);
|
||||
buffer.write(content, StandardCharsets.UTF_8);
|
||||
return buffer;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2022 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.
|
||||
|
|
@ -30,13 +30,13 @@ import org.springframework.web.server.WebFilter;
|
|||
* Tests for a {@link WebFilter}.
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
public class WebFilterTests {
|
||||
class WebFilterTests {
|
||||
|
||||
@Test
|
||||
public void testWebFilter() throws Exception {
|
||||
void webFilter() {
|
||||
|
||||
WebFilter filter = (exchange, chain) -> {
|
||||
DataBuffer buffer = DefaultDataBufferFactory.sharedInstance.allocateBuffer();
|
||||
DataBuffer buffer = DefaultDataBufferFactory.sharedInstance.allocateBuffer(256);
|
||||
buffer.write("It works!".getBytes(StandardCharsets.UTF_8));
|
||||
return exchange.getResponse().writeWith(Mono.just(buffer));
|
||||
};
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ public class MultipartWriterSupport extends LoggingCodecSupport {
|
|||
|
||||
protected Mono<DataBuffer> generatePartHeaders(HttpHeaders headers, DataBufferFactory bufferFactory) {
|
||||
return Mono.fromCallable(() -> {
|
||||
@SuppressWarnings("resource")
|
||||
FastByteArrayOutputStream bos = new FastByteArrayOutputStream();
|
||||
for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
|
||||
byte[] headerName = entry.getKey().getBytes(getCharset());
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -65,12 +65,11 @@ public class ProtobufDecoderTests extends AbstractDecoderTests<ProtobufDecoder>
|
|||
|
||||
@Test
|
||||
public void extensionRegistryNull() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
||||
new ProtobufDecoder(null));
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new ProtobufDecoder(null));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Test
|
||||
@Override
|
||||
public void canDecode() {
|
||||
assertThat(this.decoder.canDecode(forClass(Msg.class), null)).isTrue();
|
||||
assertThat(this.decoder.canDecode(forClass(Msg.class), PROTOBUF_MIME_TYPE)).isTrue();
|
||||
|
|
@ -79,8 +78,8 @@ public class ProtobufDecoderTests extends AbstractDecoderTests<ProtobufDecoder>
|
|||
assertThat(this.decoder.canDecode(forClass(Object.class), PROTOBUF_MIME_TYPE)).isFalse();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Test
|
||||
@Override
|
||||
public void decodeToMono() {
|
||||
Mono<DataBuffer> input = dataBuffer(this.testMsg1);
|
||||
|
||||
|
|
@ -107,8 +106,9 @@ public class ProtobufDecoderTests extends AbstractDecoderTests<ProtobufDecoder>
|
|||
.verifyComplete());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Test
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void decode() {
|
||||
Flux<DataBuffer> input = Flux.just(this.testMsg1, this.testMsg2)
|
||||
.flatMap(msg -> Mono.defer(() -> {
|
||||
|
|
@ -130,9 +130,8 @@ public class ProtobufDecoderTests extends AbstractDecoderTests<ProtobufDecoder>
|
|||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
public void decodeSplitChunks() {
|
||||
|
||||
|
||||
Flux<DataBuffer> input = Flux.just(this.testMsg1, this.testMsg2)
|
||||
.flatMap(msg -> Mono.defer(() -> {
|
||||
DataBuffer buffer = this.bufferFactory.allocateBuffer();
|
||||
|
|
@ -163,6 +162,7 @@ public class ProtobufDecoderTests extends AbstractDecoderTests<ProtobufDecoder>
|
|||
}
|
||||
|
||||
@Test // SPR-17429
|
||||
@SuppressWarnings("deprecation")
|
||||
public void decodeSplitMessageSize() {
|
||||
this.decoder.setMaxMessageSize(100009);
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
|
@ -201,6 +201,7 @@ public class ProtobufDecoderTests extends AbstractDecoderTests<ProtobufDecoder>
|
|||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("deprecation")
|
||||
public void decodeMergedChunks() throws IOException {
|
||||
DataBuffer buffer = this.bufferFactory.allocateBuffer();
|
||||
this.testMsg1.writeDelimitedTo(buffer.asOutputStream());
|
||||
|
|
@ -220,8 +221,7 @@ public class ProtobufDecoderTests extends AbstractDecoderTests<ProtobufDecoder>
|
|||
this.decoder.setMaxMessageSize(1);
|
||||
Mono<DataBuffer> input = dataBuffer(this.testMsg1);
|
||||
|
||||
testDecode(input, Msg.class, step -> step
|
||||
.verifyError(DecodingException.class));
|
||||
testDecode(input, Msg.class, step -> step.verifyError(DecodingException.class));
|
||||
}
|
||||
|
||||
private Mono<DataBuffer> dataBuffer(Msg msg) {
|
||||
|
|
@ -233,5 +233,4 @@ public class ProtobufDecoderTests extends AbstractDecoderTests<ProtobufDecoder>
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2022 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.
|
||||
|
|
@ -61,6 +61,7 @@ class AsyncIntegrationTests extends AbstractHttpHandlerIntegrationTests {
|
|||
private class AsyncHandler implements HttpHandler {
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
|
||||
return response.writeWith(Flux.just("h", "e", "l", "l", "o")
|
||||
.delayElements(Duration.ofMillis(100))
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -43,13 +43,13 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
* @author Rossen Stoyanchev
|
||||
* @author Stephane Maldini
|
||||
*/
|
||||
public class ChannelSendOperatorTests {
|
||||
class ChannelSendOperatorTests {
|
||||
|
||||
private final OneByOneAsyncWriter writer = new OneByOneAsyncWriter();
|
||||
|
||||
|
||||
@Test
|
||||
public void errorBeforeFirstItem() throws Exception {
|
||||
void errorBeforeFirstItem() throws Exception {
|
||||
IllegalStateException error = new IllegalStateException("boo");
|
||||
Mono<Void> completion = Mono.<String>error(error).as(this::sendOperator);
|
||||
Signal<Void> signal = completion.materialize().block();
|
||||
|
|
@ -59,7 +59,7 @@ public class ChannelSendOperatorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void completionBeforeFirstItem() throws Exception {
|
||||
void completionBeforeFirstItem() throws Exception {
|
||||
Mono<Void> completion = Flux.<String>empty().as(this::sendOperator);
|
||||
Signal<Void> signal = completion.materialize().block();
|
||||
|
||||
|
|
@ -71,7 +71,7 @@ public class ChannelSendOperatorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void writeOneItem() throws Exception {
|
||||
void writeOneItem() throws Exception {
|
||||
Mono<Void> completion = Flux.just("one").as(this::sendOperator);
|
||||
Signal<Void> signal = completion.materialize().block();
|
||||
|
||||
|
|
@ -85,7 +85,7 @@ public class ChannelSendOperatorTests {
|
|||
|
||||
|
||||
@Test
|
||||
public void writeMultipleItems() {
|
||||
void writeMultipleItems() {
|
||||
List<String> items = Arrays.asList("one", "two", "three");
|
||||
Mono<Void> completion = Flux.fromIterable(items).as(this::sendOperator);
|
||||
Signal<Void> signal = completion.materialize().block();
|
||||
|
|
@ -101,7 +101,7 @@ public class ChannelSendOperatorTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void errorAfterMultipleItems() {
|
||||
void errorAfterMultipleItems() {
|
||||
IllegalStateException error = new IllegalStateException("boo");
|
||||
Flux<String> publisher = Flux.generate(() -> 0, (idx , subscriber) -> {
|
||||
int i = ++idx;
|
||||
|
|
@ -125,12 +125,12 @@ public class ChannelSendOperatorTests {
|
|||
}
|
||||
|
||||
@Test // gh-22720
|
||||
public void cancelWhileItemCached() {
|
||||
void cancelWhileItemCached() {
|
||||
LeakAwareDataBufferFactory bufferFactory = new LeakAwareDataBufferFactory();
|
||||
|
||||
ChannelSendOperator<DataBuffer> operator = new ChannelSendOperator<>(
|
||||
Mono.fromCallable(() -> {
|
||||
DataBuffer dataBuffer = bufferFactory.allocateBuffer();
|
||||
DataBuffer dataBuffer = bufferFactory.allocateBuffer(256);
|
||||
dataBuffer.write("foo", StandardCharsets.UTF_8);
|
||||
return dataBuffer;
|
||||
}),
|
||||
|
|
@ -148,7 +148,7 @@ public class ChannelSendOperatorTests {
|
|||
}
|
||||
|
||||
@Test // gh-22720
|
||||
public void errorFromWriteSourceWhileItemCached() {
|
||||
void errorFromWriteSourceWhileItemCached() {
|
||||
|
||||
// 1. First item received
|
||||
// 2. writeFunction applied and writeCompletionBarrier subscribed to it
|
||||
|
|
@ -159,7 +159,7 @@ public class ChannelSendOperatorTests {
|
|||
|
||||
ChannelSendOperator<DataBuffer> operator = new ChannelSendOperator<>(
|
||||
Flux.create(sink -> {
|
||||
DataBuffer dataBuffer = bufferFactory.allocateBuffer();
|
||||
DataBuffer dataBuffer = bufferFactory.allocateBuffer(256);
|
||||
dataBuffer.write("foo", StandardCharsets.UTF_8);
|
||||
sink.next(dataBuffer);
|
||||
sink.error(new IllegalStateException("err"));
|
||||
|
|
@ -169,7 +169,6 @@ public class ChannelSendOperatorTests {
|
|||
return Mono.never();
|
||||
});
|
||||
|
||||
|
||||
operator.subscribe(new BaseSubscriber<Void>() {});
|
||||
try {
|
||||
writeSubscriber.signalDemand(1); // Let cached signals ("foo" and error) be published..
|
||||
|
|
@ -183,7 +182,7 @@ public class ChannelSendOperatorTests {
|
|||
}
|
||||
|
||||
@Test // gh-22720
|
||||
public void errorFromWriteFunctionWhileItemCached() {
|
||||
void errorFromWriteFunctionWhileItemCached() {
|
||||
|
||||
// 1. First item received
|
||||
// 2. writeFunction applied and writeCompletionBarrier subscribed to it
|
||||
|
|
@ -193,7 +192,7 @@ public class ChannelSendOperatorTests {
|
|||
|
||||
ChannelSendOperator<DataBuffer> operator = new ChannelSendOperator<>(
|
||||
Flux.create(sink -> {
|
||||
DataBuffer dataBuffer = bufferFactory.allocateBuffer();
|
||||
DataBuffer dataBuffer = bufferFactory.allocateBuffer(256);
|
||||
dataBuffer.write("foo", StandardCharsets.UTF_8);
|
||||
sink.next(dataBuffer);
|
||||
}),
|
||||
|
|
@ -207,7 +206,7 @@ public class ChannelSendOperatorTests {
|
|||
}
|
||||
|
||||
@Test // gh-23175
|
||||
public void errorInWriteFunction() {
|
||||
void errorInWriteFunction() {
|
||||
|
||||
StepVerifier
|
||||
.create(new ChannelSendOperator<>(Mono.just("one"), p -> {
|
||||
|
|
@ -251,7 +250,7 @@ public class ChannelSendOperatorTests {
|
|||
|
||||
private final Subscriber<? super Void> subscriber;
|
||||
|
||||
public WriteSubscriber(Subscriber<? super Void> subscriber) {
|
||||
WriteSubscriber(Subscriber<? super Void> subscriber) {
|
||||
this.subscriber = subscriber;
|
||||
}
|
||||
|
||||
|
|
@ -284,7 +283,6 @@ public class ChannelSendOperatorTests {
|
|||
|
||||
private static class ZeroDemandSubscriber extends BaseSubscriber<DataBuffer> {
|
||||
|
||||
|
||||
@Override
|
||||
protected void hookOnSubscribe(Subscription subscription) {
|
||||
// Just subscribe without requesting
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2022 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.
|
||||
|
|
@ -34,9 +34,10 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
|
||||
/**
|
||||
* Unit tests for {@link HttpHeadResponseDecorator}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
public class HttpHeadResponseDecoratorTests {
|
||||
class HttpHeadResponseDecoratorTests {
|
||||
|
||||
private final LeakAwareDataBufferFactory bufferFactory =
|
||||
new LeakAwareDataBufferFactory(new NettyDataBufferFactory(PooledByteBufAllocator.DEFAULT));
|
||||
|
|
@ -46,27 +47,27 @@ public class HttpHeadResponseDecoratorTests {
|
|||
|
||||
|
||||
@AfterEach
|
||||
public void tearDown() {
|
||||
void tearDown() {
|
||||
this.bufferFactory.checkForLeaks();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void writeWithFlux() {
|
||||
void writeWithFlux() {
|
||||
Flux<DataBuffer> body = Flux.just(toDataBuffer("data1"), toDataBuffer("data2"));
|
||||
this.response.writeWith(body).block();
|
||||
assertThat(this.response.getHeaders().getContentLength()).isEqualTo(-1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void writeWithMono() {
|
||||
void writeWithMono() {
|
||||
Mono<DataBuffer> body = Mono.just(toDataBuffer("data1,data2"));
|
||||
this.response.writeWith(body).block();
|
||||
assertThat(this.response.getHeaders().getContentLength()).isEqualTo(11);
|
||||
}
|
||||
|
||||
@Test // gh-23484
|
||||
public void writeWithGivenContentLength() {
|
||||
void writeWithGivenContentLength() {
|
||||
int length = 15;
|
||||
this.response.getHeaders().setContentLength(length);
|
||||
this.response.writeWith(Flux.empty()).block();
|
||||
|
|
@ -74,7 +75,7 @@ public class HttpHeadResponseDecoratorTests {
|
|||
}
|
||||
|
||||
@Test // gh-25908
|
||||
public void writeWithGivenTransferEncoding() {
|
||||
void writeWithGivenTransferEncoding() {
|
||||
Flux<DataBuffer> body = Flux.just(toDataBuffer("data1"), toDataBuffer("data2"));
|
||||
this.response.getHeaders().add(HttpHeaders.TRANSFER_ENCODING, "chunked");
|
||||
this.response.writeWith(body).block();
|
||||
|
|
@ -82,7 +83,7 @@ public class HttpHeadResponseDecoratorTests {
|
|||
}
|
||||
|
||||
private DataBuffer toDataBuffer(String s) {
|
||||
DataBuffer buffer = this.bufferFactory.allocateBuffer();
|
||||
DataBuffer buffer = this.bufferFactory.allocateBuffer(256);
|
||||
buffer.write(s.getBytes(StandardCharsets.UTF_8));
|
||||
return buffer;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2022 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.
|
||||
|
|
@ -56,7 +56,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
* @author Sebastien Deleuze
|
||||
* @author Brian Clozel
|
||||
*/
|
||||
public class ServerHttpResponseTests {
|
||||
class ServerHttpResponseTests {
|
||||
|
||||
@Test
|
||||
void writeWith() {
|
||||
|
|
@ -68,9 +68,9 @@ public class ServerHttpResponseTests {
|
|||
assertThat(response.cookiesWritten).isTrue();
|
||||
|
||||
assertThat(response.body.size()).isEqualTo(3);
|
||||
assertThat(new String(response.body.get(0).asByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("a");
|
||||
assertThat(new String(response.body.get(1).asByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("b");
|
||||
assertThat(new String(response.body.get(2).asByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("c");
|
||||
assertThat(new String(response.body.get(0).toByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("a");
|
||||
assertThat(new String(response.body.get(1).toByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("b");
|
||||
assertThat(new String(response.body.get(2).toByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("c");
|
||||
}
|
||||
|
||||
@Test // SPR-14952
|
||||
|
|
@ -84,7 +84,7 @@ public class ServerHttpResponseTests {
|
|||
assertThat(response.cookiesWritten).isTrue();
|
||||
|
||||
assertThat(response.body.size()).isEqualTo(1);
|
||||
assertThat(new String(response.body.get(0).asByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("foo");
|
||||
assertThat(new String(response.body.get(0).toByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("foo");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -139,9 +139,9 @@ public class ServerHttpResponseTests {
|
|||
assertThat(response.getCookies().getFirst("ID")).isSameAs(cookie);
|
||||
|
||||
assertThat(response.body.size()).isEqualTo(3);
|
||||
assertThat(new String(response.body.get(0).asByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("a");
|
||||
assertThat(new String(response.body.get(1).asByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("b");
|
||||
assertThat(new String(response.body.get(2).asByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("c");
|
||||
assertThat(new String(response.body.get(0).toByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("a");
|
||||
assertThat(new String(response.body.get(1).toByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("b");
|
||||
assertThat(new String(response.body.get(2).toByteBuffer().array(), StandardCharsets.UTF_8)).isEqualTo("c");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
* Copyright 2002-2022 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.
|
||||
|
|
@ -17,16 +17,19 @@
|
|||
package org.springframework.web.reactive.resource;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.test.StepVerifier;
|
||||
|
|
@ -44,6 +47,7 @@ import org.springframework.http.HttpMethod;
|
|||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.server.PathContainer;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.reactive.HandlerMapping;
|
||||
import org.springframework.web.server.MethodNotAllowedException;
|
||||
|
|
@ -67,8 +71,9 @@ import static org.mockito.Mockito.mock;
|
|||
* Unit tests for {@link ResourceWebHandler}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @author Sam Brannen
|
||||
*/
|
||||
public class ResourceWebHandlerTests {
|
||||
class ResourceWebHandlerTests {
|
||||
|
||||
private static final Duration TIMEOUT = Duration.ofSeconds(1);
|
||||
|
||||
|
|
@ -76,11 +81,11 @@ public class ResourceWebHandlerTests {
|
|||
|
||||
|
||||
@BeforeEach
|
||||
public void setup() throws Exception {
|
||||
List<Resource> locations = new ArrayList<>(2);
|
||||
locations.add(new ClassPathResource("test/", getClass()));
|
||||
locations.add(new ClassPathResource("testalternatepath/", getClass()));
|
||||
locations.add(new ClassPathResource("META-INF/resources/webjars/"));
|
||||
void setup() throws Exception {
|
||||
List<Resource> locations = List.of(
|
||||
new ClassPathResource("test/", getClass()),
|
||||
new ClassPathResource("testalternatepath/", getClass()),
|
||||
new ClassPathResource("META-INF/resources/webjars/"));
|
||||
|
||||
this.handler = new ResourceWebHandler();
|
||||
this.handler.setLocations(locations);
|
||||
|
|
@ -90,7 +95,7 @@ public class ResourceWebHandlerTests {
|
|||
|
||||
|
||||
@Test
|
||||
public void getResource() throws Exception {
|
||||
void getResource() throws Exception {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
setPathWithinHandlerMapping(exchange, "foo.css");
|
||||
this.handler.handle(exchange).block(TIMEOUT);
|
||||
|
|
@ -107,7 +112,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getResourceHttpHeader() throws Exception {
|
||||
void getResourceHttpHeader() throws Exception {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.head(""));
|
||||
setPathWithinHandlerMapping(exchange, "foo.css");
|
||||
this.handler.handle(exchange).block(TIMEOUT);
|
||||
|
|
@ -127,7 +132,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getResourceHttpOptions() {
|
||||
void getResourceHttpOptions() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.options(""));
|
||||
setPathWithinHandlerMapping(exchange, "foo.css");
|
||||
this.handler.handle(exchange).block(TIMEOUT);
|
||||
|
|
@ -137,7 +142,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getResourceNoCache() throws Exception {
|
||||
void getResourceNoCache() throws Exception {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
setPathWithinHandlerMapping(exchange, "foo.css");
|
||||
this.handler.setCacheControl(CacheControl.noStore());
|
||||
|
|
@ -152,7 +157,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getVersionedResource() throws Exception {
|
||||
void getVersionedResource() throws Exception {
|
||||
VersionResourceResolver versionResolver = new VersionResourceResolver();
|
||||
versionResolver.addFixedVersionStrategy("versionString", "/**");
|
||||
this.handler.setResourceResolvers(Arrays.asList(versionResolver, new PathResourceResolver()));
|
||||
|
|
@ -168,7 +173,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getResourceWithHtmlMediaType() throws Exception {
|
||||
void getResourceWithHtmlMediaType() throws Exception {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
setPathWithinHandlerMapping(exchange, "foo.html");
|
||||
this.handler.handle(exchange).block(TIMEOUT);
|
||||
|
|
@ -183,7 +188,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getResourceFromAlternatePath() throws Exception {
|
||||
void getResourceFromAlternatePath() throws Exception {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
setPathWithinHandlerMapping(exchange, "baz.css");
|
||||
this.handler.handle(exchange).block(TIMEOUT);
|
||||
|
|
@ -200,7 +205,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getResourceFromSubDirectory() {
|
||||
void getResourceFromSubDirectory() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
setPathWithinHandlerMapping(exchange, "js/foo.js");
|
||||
this.handler.handle(exchange).block(TIMEOUT);
|
||||
|
|
@ -210,7 +215,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getResourceFromSubDirectoryOfAlternatePath() {
|
||||
void getResourceFromSubDirectoryOfAlternatePath() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
setPathWithinHandlerMapping(exchange, "js/baz.js");
|
||||
this.handler.handle(exchange).block(TIMEOUT);
|
||||
|
|
@ -221,11 +226,11 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getResourceWithRegisteredMediaType() throws Exception {
|
||||
void getResourceWithRegisteredMediaType() throws Exception {
|
||||
MediaType mediaType = new MediaType("foo", "bar");
|
||||
|
||||
ResourceWebHandler handler = new ResourceWebHandler();
|
||||
handler.setLocations(Collections.singletonList(new ClassPathResource("test/", getClass())));
|
||||
handler.setLocations(List.of(new ClassPathResource("test/", getClass())));
|
||||
handler.setMediaTypes(Collections.singletonMap("bar", mediaType));
|
||||
handler.afterPropertiesSet();
|
||||
|
||||
|
|
@ -239,12 +244,12 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void getResourceFromFileSystem() throws Exception {
|
||||
String path = new ClassPathResource("", getClass()).getFile().getCanonicalPath()
|
||||
.replace('\\', '/').replace("classes/java", "resources") + "/";
|
||||
void getResourceFromFileSystem() throws Exception {
|
||||
String packagePath = ClassUtils.classPackageAsResourcePath(getClass());
|
||||
String path = Paths.get("src/test/resources", packagePath).normalize() + "/";
|
||||
|
||||
ResourceWebHandler handler = new ResourceWebHandler();
|
||||
handler.setLocations(Collections.singletonList(new FileSystemResource(path)));
|
||||
handler.setLocations(List.of(new FileSystemResource(path)));
|
||||
handler.afterPropertiesSet();
|
||||
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
|
|
@ -258,7 +263,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test // gh-27538, gh-27624
|
||||
public void filterNonExistingLocations() throws Exception {
|
||||
void filterNonExistingLocations() throws Exception {
|
||||
List<Resource> inputLocations = Arrays.asList(
|
||||
new ClassPathResource("test/", getClass()),
|
||||
new ClassPathResource("testalternatepath/", getClass()),
|
||||
|
|
@ -276,8 +281,8 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test // SPR-14577
|
||||
public void getMediaTypeWithFavorPathExtensionOff() throws Exception {
|
||||
List<Resource> paths = Collections.singletonList(new ClassPathResource("test/", getClass()));
|
||||
void getMediaTypeWithFavorPathExtensionOff() throws Exception {
|
||||
List<Resource> paths = List.of(new ClassPathResource("test/", getClass()));
|
||||
ResourceWebHandler handler = new ResourceWebHandler();
|
||||
handler.setLocations(paths);
|
||||
handler.afterPropertiesSet();
|
||||
|
|
@ -291,7 +296,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testInvalidPath() throws Exception {
|
||||
void invalidPath() throws Exception {
|
||||
|
||||
// Use mock ResourceResolver: i.e. we're only testing upfront validations...
|
||||
|
||||
|
|
@ -302,8 +307,8 @@ public class ResourceWebHandlerTests {
|
|||
given(resolver.resolveResource(any(), any(), any(), any())).willReturn(Mono.just(resource));
|
||||
|
||||
ResourceWebHandler handler = new ResourceWebHandler();
|
||||
handler.setLocations(Collections.singletonList(new ClassPathResource("test/", getClass())));
|
||||
handler.setResourceResolvers(Collections.singletonList(resolver));
|
||||
handler.setLocations(List.of(new ClassPathResource("test/", getClass())));
|
||||
handler.setResourceResolvers(List.of(resolver));
|
||||
handler.afterPropertiesSet();
|
||||
|
||||
testInvalidPath("../testsecret/secret.txt", handler);
|
||||
|
|
@ -311,7 +316,7 @@ public class ResourceWebHandlerTests {
|
|||
testInvalidPath(":/../../testsecret/secret.txt", handler);
|
||||
|
||||
Resource location = new UrlResource(getClass().getResource("./test/"));
|
||||
this.handler.setLocations(Collections.singletonList(location));
|
||||
handler.setLocations(List.of(location));
|
||||
Resource secretResource = new UrlResource(getClass().getResource("testsecret/secret.txt"));
|
||||
String secretPath = secretResource.getURL().getPath();
|
||||
|
||||
|
|
@ -336,34 +341,29 @@ public class ResourceWebHandlerTests {
|
|||
}).verify(TIMEOUT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResolvePathWithTraversal() throws Exception {
|
||||
for (HttpMethod method : HttpMethod.values()) {
|
||||
testResolvePathWithTraversal(method);
|
||||
}
|
||||
}
|
||||
|
||||
private void testResolvePathWithTraversal(HttpMethod httpMethod) throws Exception {
|
||||
@ParameterizedTest
|
||||
@MethodSource("httpMethods")
|
||||
void resolvePathWithTraversal(HttpMethod method) throws Exception {
|
||||
Resource location = new ClassPathResource("test/", getClass());
|
||||
this.handler.setLocations(Collections.singletonList(location));
|
||||
this.handler.setLocations(List.of(location));
|
||||
|
||||
testResolvePathWithTraversal(httpMethod, "../testsecret/secret.txt", location);
|
||||
testResolvePathWithTraversal(httpMethod, "test/../../testsecret/secret.txt", location);
|
||||
testResolvePathWithTraversal(httpMethod, ":/../../testsecret/secret.txt", location);
|
||||
testResolvePathWithTraversal(method, "../testsecret/secret.txt", location);
|
||||
testResolvePathWithTraversal(method, "test/../../testsecret/secret.txt", location);
|
||||
testResolvePathWithTraversal(method, ":/../../testsecret/secret.txt", location);
|
||||
|
||||
location = new UrlResource(getClass().getResource("./test/"));
|
||||
this.handler.setLocations(Collections.singletonList(location));
|
||||
this.handler.setLocations(List.of(location));
|
||||
Resource secretResource = new UrlResource(getClass().getResource("testsecret/secret.txt"));
|
||||
String secretPath = secretResource.getURL().getPath();
|
||||
|
||||
testResolvePathWithTraversal(httpMethod, "file:" + secretPath, location);
|
||||
testResolvePathWithTraversal(httpMethod, "/file:" + secretPath, location);
|
||||
testResolvePathWithTraversal(httpMethod, "url:" + secretPath, location);
|
||||
testResolvePathWithTraversal(httpMethod, "/url:" + secretPath, location);
|
||||
testResolvePathWithTraversal(httpMethod, "////../.." + secretPath, location);
|
||||
testResolvePathWithTraversal(httpMethod, "/%2E%2E/testsecret/secret.txt", location);
|
||||
testResolvePathWithTraversal(httpMethod, "%2F%2F%2E%2E%2F%2Ftestsecret/secret.txt", location);
|
||||
testResolvePathWithTraversal(httpMethod, "url:" + secretPath, location);
|
||||
testResolvePathWithTraversal(method, "file:" + secretPath, location);
|
||||
testResolvePathWithTraversal(method, "/file:" + secretPath, location);
|
||||
testResolvePathWithTraversal(method, "url:" + secretPath, location);
|
||||
testResolvePathWithTraversal(method, "/url:" + secretPath, location);
|
||||
testResolvePathWithTraversal(method, "////../.." + secretPath, location);
|
||||
testResolvePathWithTraversal(method, "/%2E%2E/testsecret/secret.txt", location);
|
||||
testResolvePathWithTraversal(method, "%2F%2F%2E%2E%2F%2Ftestsecret/secret.txt", location);
|
||||
testResolvePathWithTraversal(method, "url:" + secretPath, location);
|
||||
|
||||
// The following tests fail with a MalformedURLException on Windows
|
||||
// testResolvePathWithTraversal(location, "/" + secretPath);
|
||||
|
|
@ -387,7 +387,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void processPath() {
|
||||
void processPath() {
|
||||
assertThat(this.handler.processPath("/foo/bar")).isSameAs("/foo/bar");
|
||||
assertThat(this.handler.processPath("foo/bar")).isSameAs("foo/bar");
|
||||
|
||||
|
|
@ -416,7 +416,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void initAllowedLocations() {
|
||||
void initAllowedLocations() {
|
||||
PathResourceResolver resolver = (PathResourceResolver) this.handler.getResourceResolvers().get(0);
|
||||
Resource[] locations = resolver.getAllowedLocations();
|
||||
|
||||
|
|
@ -427,7 +427,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void initAllowedLocationsWithExplicitConfiguration() throws Exception {
|
||||
void initAllowedLocationsWithExplicitConfiguration() throws Exception {
|
||||
ClassPathResource location1 = new ClassPathResource("test/", getClass());
|
||||
ClassPathResource location2 = new ClassPathResource("testalternatepath/", getClass());
|
||||
|
||||
|
|
@ -435,7 +435,7 @@ public class ResourceWebHandlerTests {
|
|||
pathResolver.setAllowedLocations(location1);
|
||||
|
||||
ResourceWebHandler handler = new ResourceWebHandler();
|
||||
handler.setResourceResolvers(Collections.singletonList(pathResolver));
|
||||
handler.setResourceResolvers(List.of(pathResolver));
|
||||
handler.setLocations(Arrays.asList(location1, location2));
|
||||
handler.afterPropertiesSet();
|
||||
|
||||
|
|
@ -445,7 +445,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void notModified() throws Exception {
|
||||
void notModified() throws Exception {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(
|
||||
MockServerHttpRequest.get("").ifModifiedSince(resourceLastModified("test/foo.css")));
|
||||
|
||||
|
|
@ -455,7 +455,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void modified() throws Exception {
|
||||
void modified() throws Exception {
|
||||
long timestamp = resourceLastModified("test/foo.css") / 1000 * 1000 - 1;
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("").ifModifiedSince(timestamp).build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
|
|
@ -467,7 +467,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void directory() {
|
||||
void directory() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
setPathWithinHandlerMapping(exchange, "js/");
|
||||
StepVerifier.create(this.handler.handle(exchange))
|
||||
|
|
@ -478,7 +478,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void directoryInJarFile() {
|
||||
void directoryInJarFile() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
setPathWithinHandlerMapping(exchange, "underscorejs/");
|
||||
StepVerifier.create(this.handler.handle(exchange))
|
||||
|
|
@ -489,7 +489,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void missingResourcePath() {
|
||||
void missingResourcePath() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
setPathWithinHandlerMapping(exchange, "");
|
||||
StepVerifier.create(this.handler.handle(exchange))
|
||||
|
|
@ -500,29 +500,24 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void noPathWithinHandlerMappingAttribute() {
|
||||
void noPathWithinHandlerMappingAttribute() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
||||
this.handler.handle(exchange).block(TIMEOUT));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void unsupportedHttpMethod() {
|
||||
void unsupportedHttpMethod() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.post(""));
|
||||
setPathWithinHandlerMapping(exchange, "foo.css");
|
||||
assertThatExceptionOfType(MethodNotAllowedException.class).isThrownBy(() ->
|
||||
this.handler.handle(exchange).block(TIMEOUT));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resourceNotFound() throws Exception {
|
||||
for (HttpMethod method : HttpMethod.values()) {
|
||||
resourceNotFound(method);
|
||||
}
|
||||
}
|
||||
|
||||
private void resourceNotFound(HttpMethod httpMethod) {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.method(httpMethod, "").build();
|
||||
@ParameterizedTest
|
||||
@MethodSource("httpMethods")
|
||||
void resourceNotFound(HttpMethod method) throws Exception {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.method(method, "").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
setPathWithinHandlerMapping(exchange, "not-there.css");
|
||||
Mono<Void> mono = this.handler.handle(exchange);
|
||||
|
|
@ -540,7 +535,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void partialContentByteRange() {
|
||||
void partialContentByteRange() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("").header("Range", "bytes=0-1").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
setPathWithinHandlerMapping(exchange, "foo.txt");
|
||||
|
|
@ -556,7 +551,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void partialContentByteRangeNoEnd() {
|
||||
void partialContentByteRangeNoEnd() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("").header("range", "bytes=9-").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
setPathWithinHandlerMapping(exchange, "foo.txt");
|
||||
|
|
@ -572,7 +567,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void partialContentByteRangeLargeEnd() {
|
||||
void partialContentByteRangeLargeEnd() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("").header("range", "bytes=9-10000").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
setPathWithinHandlerMapping(exchange, "foo.txt");
|
||||
|
|
@ -588,7 +583,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void partialContentSuffixRange() {
|
||||
void partialContentSuffixRange() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("").header("range", "bytes=-1").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
setPathWithinHandlerMapping(exchange, "foo.txt");
|
||||
|
|
@ -604,7 +599,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void partialContentSuffixRangeLargeSuffix() {
|
||||
void partialContentSuffixRangeLargeSuffix() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("").header("range", "bytes=-11").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
setPathWithinHandlerMapping(exchange, "foo.txt");
|
||||
|
|
@ -620,7 +615,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void partialContentInvalidRangeHeader() {
|
||||
void partialContentInvalidRangeHeader() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("").header("range", "bytes=foo bar").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
setPathWithinHandlerMapping(exchange, "foo.txt");
|
||||
|
|
@ -635,7 +630,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void partialContentMultipleByteRanges() {
|
||||
void partialContentMultipleByteRanges() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("").header("Range", "bytes=0-1, 4-5, 8-9").build();
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
setPathWithinHandlerMapping(exchange, "foo.txt");
|
||||
|
|
@ -648,7 +643,7 @@ public class ResourceWebHandlerTests {
|
|||
String boundary = "--" + exchange.getResponse().getHeaders().getContentType().toString().substring(30);
|
||||
|
||||
Mono<DataBuffer> reduced = Flux.from(exchange.getResponse().getBody())
|
||||
.reduce(DefaultDataBufferFactory.sharedInstance.allocateBuffer(), (previous, current) -> {
|
||||
.reduce(DefaultDataBufferFactory.sharedInstance.allocateBuffer(256), (previous, current) -> {
|
||||
previous.write(current);
|
||||
DataBufferUtils.release(current);
|
||||
return previous;
|
||||
|
|
@ -679,7 +674,7 @@ public class ResourceWebHandlerTests {
|
|||
}
|
||||
|
||||
@Test // SPR-14005
|
||||
public void doOverwriteExistingCacheControlHeaders() {
|
||||
void doOverwriteExistingCacheControlHeaders() {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(""));
|
||||
exchange.getResponse().getHeaders().setCacheControl(CacheControl.noStore().getHeaderValue());
|
||||
setPathWithinHandlerMapping(exchange, "foo.css");
|
||||
|
|
@ -723,4 +718,9 @@ public class ResourceWebHandlerTests {
|
|||
.verify();
|
||||
}
|
||||
|
||||
|
||||
static Stream<HttpMethod> httpMethods() {
|
||||
return Arrays.stream(HttpMethod.values());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2022 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.
|
||||
|
|
@ -67,7 +67,7 @@ class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandlerIntegra
|
|||
|
||||
|
||||
@ParameterizedHttpServerTest
|
||||
void testRequestToFooHandler(HttpServer httpServer) throws Exception {
|
||||
void requestToFooHandler(HttpServer httpServer) throws Exception {
|
||||
startServer(httpServer);
|
||||
|
||||
URI url = new URI("http://localhost:" + this.port + "/foo");
|
||||
|
|
@ -79,7 +79,7 @@ class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandlerIntegra
|
|||
}
|
||||
|
||||
@ParameterizedHttpServerTest
|
||||
public void testRequestToBarHandler(HttpServer httpServer) throws Exception {
|
||||
public void requestToBarHandler(HttpServer httpServer) throws Exception {
|
||||
startServer(httpServer);
|
||||
|
||||
URI url = new URI("http://localhost:" + this.port + "/bar");
|
||||
|
|
@ -91,7 +91,7 @@ class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandlerIntegra
|
|||
}
|
||||
|
||||
@ParameterizedHttpServerTest
|
||||
void testRequestToHeaderSettingHandler(HttpServer httpServer) throws Exception {
|
||||
void requestToHeaderSettingHandler(HttpServer httpServer) throws Exception {
|
||||
startServer(httpServer);
|
||||
|
||||
URI url = new URI("http://localhost:" + this.port + "/header");
|
||||
|
|
@ -103,7 +103,7 @@ class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandlerIntegra
|
|||
}
|
||||
|
||||
@ParameterizedHttpServerTest
|
||||
void testHandlerNotFound(HttpServer httpServer) throws Exception {
|
||||
void handlerNotFound(HttpServer httpServer) throws Exception {
|
||||
startServer(httpServer);
|
||||
|
||||
URI url = new URI("http://localhost:" + this.port + "/oops");
|
||||
|
|
@ -117,7 +117,7 @@ class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandlerIntegra
|
|||
}
|
||||
|
||||
private static DataBuffer asDataBuffer(String text) {
|
||||
DefaultDataBuffer buffer = DefaultDataBufferFactory.sharedInstance.allocateBuffer();
|
||||
DefaultDataBuffer buffer = DefaultDataBufferFactory.sharedInstance.allocateBuffer(256);
|
||||
return buffer.write(text.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2022 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.
|
||||
|
|
@ -487,7 +487,7 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
|
|||
public Publisher<ByteBuffer> getPublisher() {
|
||||
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
|
||||
return encoder.encode(Mono.just(new Person("Robert")), DefaultDataBufferFactory.sharedInstance,
|
||||
ResolvableType.forClass(Person.class), JSON, Collections.emptyMap()).map(DataBuffer::asByteBuffer);
|
||||
ResolvableType.forClass(Person.class), JSON, Collections.emptyMap()).map(DataBuffer::toByteBuffer);
|
||||
}
|
||||
|
||||
@GetMapping("/flux")
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
@ -79,16 +79,16 @@ public class FreeMarkerViewTests {
|
|||
FreeMarkerView view = new FreeMarkerView();
|
||||
view.setApplicationContext(this.context);
|
||||
view.setUrl("anythingButNull");
|
||||
assertThatExceptionOfType(ApplicationContextException.class).isThrownBy(
|
||||
view::afterPropertiesSet)
|
||||
assertThatExceptionOfType(ApplicationContextException.class)
|
||||
.isThrownBy(view::afterPropertiesSet)
|
||||
.withMessageContaining("Must define a single FreeMarkerConfig bean");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noTemplateName() throws Exception {
|
||||
FreeMarkerView freeMarkerView = new FreeMarkerView();
|
||||
assertThatIllegalArgumentException().isThrownBy(
|
||||
freeMarkerView::afterPropertiesSet)
|
||||
assertThatIllegalArgumentException()
|
||||
.isThrownBy(freeMarkerView::afterPropertiesSet)
|
||||
.withMessageContaining("Property 'url' is required");
|
||||
}
|
||||
|
||||
|
|
@ -141,7 +141,7 @@ public class FreeMarkerViewTests {
|
|||
|
||||
|
||||
private static String asString(DataBuffer dataBuffer) {
|
||||
ByteBuffer byteBuffer = dataBuffer.asByteBuffer();
|
||||
ByteBuffer byteBuffer = dataBuffer.toByteBuffer();
|
||||
final byte[] bytes = new byte[byteBuffer.remaining()];
|
||||
byteBuffer.get(bytes);
|
||||
return new String(bytes, StandardCharsets.UTF_8);
|
||||
|
|
|
|||
Loading…
Reference in New Issue