新增内容,新增拉起软件层
This commit is contained in:
+113
@@ -0,0 +1,113 @@
|
||||
package com.nanri.aiimage.modules.task.service;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.nanri.aiimage.config.InstanceMetadata;
|
||||
import com.nanri.aiimage.config.StorageProperties;
|
||||
import com.nanri.aiimage.config.TransientStorageProperties;
|
||||
import com.nanri.aiimage.modules.file.service.object.RustfsObjectStorageService;
|
||||
import com.nanri.aiimage.modules.file.service.oss.OssStorageService;
|
||||
import com.nanri.aiimage.modules.task.mapper.TaskChunkMapper;
|
||||
import com.nanri.aiimage.modules.task.mapper.TaskScopeStateMapper;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
class TransientPayloadStorageServiceTest {
|
||||
|
||||
@TempDir
|
||||
Path tempDir;
|
||||
|
||||
@Test
|
||||
void oversizeRawPayloadFallsBackToLocalAndKeepsFallbackMarker() {
|
||||
RustfsObjectStorageService rustfs = mock(RustfsObjectStorageService.class);
|
||||
when(rustfs.isConfigured()).thenReturn(true);
|
||||
TransientPayloadStorageService service = newService(rustfs, propertiesWithLimit(4, 1024, true));
|
||||
|
||||
String pointer = service.storeParsedPayloadFast("TEST", 1L, "scope", "abcdef", false);
|
||||
|
||||
assertTrue(pointer.startsWith("local:i/test-instance/task-parsed/test/1/scope/latest.json"));
|
||||
assertTrue(service.wasLastStoreLocalFallback());
|
||||
assertEquals("abcdef", service.resolvePayload(pointer, "read failed"));
|
||||
verify(rustfs, never()).uploadText(anyString(), anyString(), anyBoolean());
|
||||
verify(rustfs).recordLocalFallback();
|
||||
}
|
||||
|
||||
@Test
|
||||
void encodedPayloadLimitCanForceLocalFallback() {
|
||||
RustfsObjectStorageService rustfs = mock(RustfsObjectStorageService.class);
|
||||
when(rustfs.isConfigured()).thenReturn(true);
|
||||
TransientPayloadStorageService service = newService(rustfs, propertiesWithLimit(1024, 1, true));
|
||||
|
||||
String pointer = service.storeParsedPayloadFast("TEST", 1L, "scope", "a", false);
|
||||
|
||||
assertTrue(pointer.startsWith("local:"));
|
||||
assertTrue(service.wasLastStoreLocalFallback());
|
||||
verify(rustfs, never()).uploadText(anyString(), anyString(), anyBoolean());
|
||||
}
|
||||
|
||||
@Test
|
||||
void oversizePayloadCanBeRejectedByConfiguration() {
|
||||
RustfsObjectStorageService rustfs = mock(RustfsObjectStorageService.class);
|
||||
when(rustfs.isConfigured()).thenReturn(true);
|
||||
TransientPayloadStorageService service = newService(rustfs, propertiesWithLimit(4, 1024, false));
|
||||
|
||||
IllegalStateException ex = assertThrows(IllegalStateException.class,
|
||||
() -> service.storeParsedPayloadFast("TEST", 1L, "scope", "abcdef", false));
|
||||
|
||||
assertTrue(ex.getMessage().contains("exceeds configured size limit"));
|
||||
verify(rustfs, never()).uploadText(anyString(), anyString(), anyBoolean());
|
||||
}
|
||||
|
||||
@Test
|
||||
void smallPayloadStillUsesRustfsAndClearsFallbackMarker() {
|
||||
RustfsObjectStorageService rustfs = mock(RustfsObjectStorageService.class);
|
||||
when(rustfs.isConfigured()).thenReturn(true);
|
||||
when(rustfs.uploadText(anyString(), anyString(), anyBoolean())).thenAnswer(invocation -> invocation.getArgument(0));
|
||||
TransientPayloadStorageService service = newService(rustfs, propertiesWithLimit(1024, 4096, true));
|
||||
|
||||
String pointer = service.storeParsedPayloadFast("TEST", 1L, "scope", "abc", false);
|
||||
|
||||
assertTrue(pointer.startsWith("rustfs:task-parsed/test/1/scope/latest.json"));
|
||||
assertFalse(service.wasLastStoreLocalFallback());
|
||||
verify(rustfs).uploadText(anyString(), anyString(), anyBoolean());
|
||||
}
|
||||
|
||||
private TransientPayloadStorageService newService(RustfsObjectStorageService rustfs,
|
||||
TransientStorageProperties transientProperties) {
|
||||
StorageProperties storageProperties = new StorageProperties();
|
||||
storageProperties.setLocalTempDir(tempDir.toString());
|
||||
return new TransientPayloadStorageService(
|
||||
transientProperties,
|
||||
storageProperties,
|
||||
rustfs,
|
||||
mock(OssStorageService.class),
|
||||
new ObjectMapper(),
|
||||
new InstanceMetadata("test-instance"),
|
||||
mock(TaskChunkMapper.class),
|
||||
mock(TaskScopeStateMapper.class));
|
||||
}
|
||||
|
||||
private TransientStorageProperties propertiesWithLimit(long maxPayloadBytes,
|
||||
long maxStoredPayloadBytes,
|
||||
boolean fallbackToLocalOnOversize) {
|
||||
TransientStorageProperties properties = new TransientStorageProperties();
|
||||
properties.setEnabled(true);
|
||||
properties.setMaxPayloadBytes(maxPayloadBytes);
|
||||
properties.setMaxStoredPayloadBytes(maxStoredPayloadBytes);
|
||||
properties.setWarnPayloadBytes(1);
|
||||
properties.setFallbackToLocalOnOversize(fallbackToLocalOnOversize);
|
||||
return properties;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user