package com.xiaopeng.map.service; import com.xiaopeng.map.dto.AreaInput; import com.xiaopeng.map.utils.XngpAreaRTreeFbsUtil; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.actuate.metrics.AutoConfigureMetrics; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import java.util.Arrays; import java.util.List; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; /** * AdcOssHandleService 集成测试,直接调用真实 OSS 服务。 * 运行前需配置环境变量:ALIYUN_OSS_ACCESS_KEY_ID、ALIYUN_OSS_ACCESS_KEY_SECRET、VIN_SALT1、VIN_SALT2 */ @Slf4j @SpringBootTest(classes = com.xiaopeng.map.MapApplication.class) @ActiveProfiles("local") @AutoConfigureMetrics class AdcOssHandleServiceTest { @Autowired(required = false) private AdcOssHandleService adcOssHandleService; @Autowired(required = false) private RobotaxiOssService robotaxiOssService; @Test void uploadOddLayerFile() { if (adcOssHandleService == null || robotaxiOssService == null) { log.warn("OSS 未启用,测试跳过。请配置 ALIYUN_OSS_ACCESS_KEY_ID、ALIYUN_OSS_ACCESS_KEY_SECRET、VIN_SALT1、VIN_SALT2"); Assumptions.assumeTrue(false, "OSS 未启用,请配置环境变量"); } // 构造测试坐标点:成都区域 3 个多边形 String gcl1 = "104.06249_30.58322,104.06244_30.58049,104.06500_30.58100,104.06600_30.58400"; String gcl2 = "104.06800_30.58200,104.06900_30.58000,104.07100_30.58150,104.06800_30.58200"; String gcl3 = "104.05500_30.57800,104.05700_30.57600,104.06000_30.57750,104.05500_30.57800"; List points1 = XngpAreaRTreeFbsUtil.parseGcl(gcl1); List points2 = XngpAreaRTreeFbsUtil.parseGcl(gcl2); List points3 = XngpAreaRTreeFbsUtil.parseGcl(gcl3); assertNotNull(points1); assertNotNull(points2); assertNotNull(points3); assertTrue(points1.size() >= 3, "多边形1至少需要 3 个点"); assertTrue(points2.size() >= 3, "多边形2至少需要 3 个点"); assertTrue(points3.size() >= 3, "多边形3至少需要 3 个点"); String vin = "21312323333333312"; // 替换为实际测试 VIN List areas = Arrays.asList( AreaInput.builder().points(points1).areaId(1).build(), AreaInput.builder().points(points2).areaId(2).build(), AreaInput.builder().points(points3).areaId(3).build() ); String objectKey = adcOssHandleService.uploadOddLayerFile(areas, vin); log.info("uploadOddLayerFile objectKey={}", objectKey); assertNotNull(objectKey); assertTrue(objectKey.contains("ROBOTAXI_ODD_layer"), "返回 objectKey 应包含路径前缀"); // 获取 bin 文件下载临时链接(Presigned URL) String downloadUrl = robotaxiOssService.generatePresignedDownloadUrl(objectKey, 3600); log.info("generatePresignedDownloadUrl bin downloadUrl={}", downloadUrl); assertNotNull(downloadUrl); assertTrue(downloadUrl.contains("Expires") || downloadUrl.contains("Signature"), "下载临时链接应包含签名参数(Expires 或 Signature)"); // 获取 xngp_area_version.pb 下载临时链接(与 bin 同目录) String pbObjectKey = objectKey.substring(0, objectKey.lastIndexOf('/') + 1) + "xngp_area_version.pb"; String pbDownloadUrl = robotaxiOssService.generatePresignedDownloadUrl(pbObjectKey, 3600); log.info("generatePresignedDownloadUrl xngp_area_version.pb downloadUrl={}", pbDownloadUrl); assertNotNull(pbDownloadUrl); assertTrue(pbDownloadUrl.contains("Expires") || pbDownloadUrl.contains("Signature"), "xngp_area_version.pb 下载临时链接应包含签名参数"); } }