- RemoteServiceTest 原先调用 ResponseMessage(int, byte),主源码中不存在该构造器, 导致测试源码无法编译;改为在测试内用 setter 组装。 - commons-compress 1.26.1 依赖 commons-io 2.15.1 的 IOUtils.skip(InputStream,long,Supplier), 而 POM 钉在 2.11.0,任何 tar 读取都会抛 NoSuchMethodError;commons-io 升至 2.15.1 (同时覆盖 CVE-2024-47554)。 后端 mvn test 16 项、storageNode 5 项、桌面前端 9 项全部通过。
63 lines
2.7 KiB
Java
63 lines
2.7 KiB
Java
package com.lion.lionwebsite.Service;
|
|
|
|
import com.lion.lionwebsite.Dao.normal.GalleryMapper;
|
|
import com.lion.lionwebsite.Message.*;
|
|
import io.netty.channel.*;
|
|
import io.netty.channel.embedded.EmbeddedChannel;
|
|
import org.junit.jupiter.api.Test;
|
|
import java.io.IOException;
|
|
import java.util.concurrent.TimeUnit;
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
import static org.mockito.Mockito.*;
|
|
|
|
class RemoteServiceTest {
|
|
private static ResponseMessage response(int messageId, byte result) {
|
|
ResponseMessage message = new ResponseMessage();
|
|
message.setMessageId(messageId);
|
|
message.setResult(result);
|
|
return message;
|
|
}
|
|
|
|
private RemoteService service() {
|
|
return new RemoteService(mock(GalleryMapper.class), mock(PushService.class),
|
|
mock(WebSocketService.class), mock(SubscriptionStandbySnapshotService.class));
|
|
}
|
|
|
|
@Test void immediateResponseHasRegisteredWaiter() {
|
|
RemoteService service = service();
|
|
EmbeddedChannel channel = new EmbeddedChannel(new ChannelOutboundHandlerAdapter() {
|
|
@Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
|
|
AbstractMessage request = (AbstractMessage) msg;
|
|
ctx.fireChannelRead(response(request.messageId, (byte) 0));
|
|
promise.setSuccess();
|
|
}
|
|
}, service.new MyChannelInboundHandlerAdapter());
|
|
service.channel = channel;
|
|
try {
|
|
assertEquals(0, service.checkAvailability());
|
|
assertTrue(service.promiseHashMap.isEmpty());
|
|
} finally { service.shutdownResources(); channel.finishAndReleaseAll(); }
|
|
}
|
|
|
|
@Test void timeoutAndWriteFailureRemoveWaiters() {
|
|
RemoteService service = service();
|
|
EmbeddedChannel channel = new EmbeddedChannel(new ChannelOutboundHandlerAdapter() {
|
|
@Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
|
|
promise.setSuccess(); // no reply
|
|
}
|
|
});
|
|
service.channel = channel;
|
|
try {
|
|
assertEquals(-1, service.sendRequest(new AvailableCheckMessage(), 1, TimeUnit.MILLISECONDS));
|
|
assertTrue(service.promiseHashMap.isEmpty());
|
|
channel.pipeline().addLast(new ChannelOutboundHandlerAdapter() {
|
|
@Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
|
|
promise.setFailure(new IOException("test failure"));
|
|
}
|
|
});
|
|
assertEquals(-1, service.sendRequest(new AvailableCheckMessage(), 1, TimeUnit.SECONDS));
|
|
assertTrue(service.promiseHashMap.isEmpty());
|
|
} finally { service.shutdownResources(); channel.finishAndReleaseAll(); }
|
|
}
|
|
}
|