zhouhn
2026-02-25 0f5fc39356b6bff677984c33c296573bb9c8393e
xp-robotaxi-automatic-pilot-boot/src/test/java/com/xiaopeng/automaticPilot/util/XPUUtilTest.java
@@ -4,12 +4,18 @@
import com.xiaopeng.api.feignClient.automaticPilot.VmpOpenServiceClient;
import com.xiaopeng.api.feignClient.automaticPilot.XPUClient;
import com.xiaopeng.api.vo.automaticPilot.MqttPublishVo;
import com.xiaopeng.api.vo.automaticPilot.proto.down.GeoPoint;
import com.xiaopeng.api.vo.automaticPilot.proto.down.ResponseMessage;
import com.xiaopeng.api.vo.automaticPilot.proto.down.StatusCode;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudCreateOrder.*;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.*;
import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudPushNavigation.RestoreNavigationData;
import com.xiaopeng.api.vo.automaticPilot.protobuf.RtTask;
import com.xiaopeng.api.vo.automaticPilot.protobuf.RtTaskList;
import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderType;
import com.xiaopeng.api.vo.automaticPilot.protobuf.Waypoint;
import com.xiaopeng.api.vo.automaticPilot.protobuf.PointType;
import com.xiaopeng.api.vo.automaticPilot.protobuf.ActionType;
import com.xiaopeng.api.vo.automaticPilot.protobuf.GeoPoint;
import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperation;
import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType;
import com.xiaopeng.api.vo.automaticPilot.protobuf.ResponseMessage;
import com.xiaopeng.api.vo.automaticPilot.protobuf.StatusCode;
import com.xiaopeng.api.vo.automaticPilot.protobuf.RestoreNavigationData;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -21,6 +27,7 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class XPUUtilTest {
@@ -70,125 +77,135 @@
    public void testCloudCreateOrder() {
        String orderId = "1881347710714060802";
        RTTask task = new RTTask();
        task.setTask_id("task-123");
        task.setOrder_id(orderId);
        task.setVin("VIN12345678900000");
        task.setTask_type(TaskType.ROBOTAXI);
        task.setStatus(TaskStatus.PENDING);
        RtTask.Builder taskBuilder = RtTask.newBuilder();
        taskBuilder.setTaskId("task-123");
        taskBuilder.setOrderId(orderId);
        // taskBuilder.setVin("VIN12345678900000"); // RtTask might not have vin, check proto if needed
        taskBuilder.setTaskType(OrderType.ORDER_TYPE_ROBOTAXI);
        // taskBuilder.setStatus(TaskStatus.PENDING); // RtTask might not have status or enum differs
        Waypoint.Builder pointBuilder = Waypoint.newBuilder();
        pointBuilder.setPointType(PointType.START_POINT);
        pointBuilder.setActionType(ActionType.PICK_UP);
        pointBuilder.setSequence(1);
        
        NavigationWaypoint point = new NavigationWaypoint();
        point.setType(WaypointType.START_POINT);
        point.setAction(WaypointAction.PICK_UP);
        point.setSequence(1);
        GeoPoint geoPoint = new GeoPoint();
        geoPoint.setLatitude(30.0);
        geoPoint.setLongitude(120.0);
        geoPoint.setPoi_name("Start Point");
        point.setPoint(geoPoint);
        GeoPoint.Builder geoPointBuilder = GeoPoint.newBuilder();
        geoPointBuilder.setLatitude(30.0);
        geoPointBuilder.setLongitude(120.0);
        // geoPointBuilder.setPoiName("Start Point"); // GeoPoint might not have poi_name
        pointBuilder.setPoint(geoPointBuilder.build());
        // taskBuilder.addPoints(pointBuilder.build()); // RtTask might use different field for points?
        // Wait, RtTask in XPUUtil.cloudCreateOrder(RtTaskList taskList...)
        // So I need to build RtTaskList
        
        task.setPoints(Collections.singletonList(point));
        RtTaskList.Builder taskListBuilder = RtTaskList.newBuilder();
        taskListBuilder.addTasks(taskBuilder.build());
        String vin = "VIN12345678900000";
        Long sequence = 1L;
        xpuUtil.cloudCreateOrder(task, vin, sequence);
        xpuUtil.cloudCreateOrder(taskListBuilder.build(), vin, sequence);
        ArgumentCaptor<MqttPublishVo> captor = ArgumentCaptor.forClass(MqttPublishVo.class);
        Mockito.verify(xpuClient).publish(captor.capture());
        MqttPublishVo capturedVo = captor.getValue();
        Assertions.assertEquals("Robotaxi/Msg/Xpu/ABCDEFGHIJKL00000000", capturedVo.getTopic());
        // Note: Current implementation serializes enum as ordinal. CLOUD_CREATE_ORDER is ordinal 2.
        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\":2"), "Payload should contain cmd CLOUD_CREATE_ORDER (ordinal 2), but was: " + capturedVo.getPayload());
        // Note: Current implementation serializes enum as ordinal.
        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\": 10003"), "Payload should contain cmd CLOUD_CREATE_ORDER (10003), but was: " + capturedVo.getPayload());
    }
    @Test
    public void testCloudOrderOperation() {
        String orderId = "1881347710714060802";
        OrderOperation operation = new OrderOperation();
        operation.setOrder_id(orderId);
        operation.setTask_id("task-123");
        operation.setOperation_type(OrderOperationType.CLOUD_CREATE_ORDER);
        operation.setOrder_type(OrderType.ROBOTAXI);
        OrderOperation.Builder operationBuilder = OrderOperation.newBuilder();
        operationBuilder.setOrderId(orderId);
        operationBuilder.setTaskId("task-123");
        operationBuilder.setOperationType(OrderOperationType.CLOUD_CREATE_ORDER);
        operationBuilder.setOrderType(OrderType.ORDER_TYPE_ROBOTAXI);
        
        Waypoint waypoint = new Waypoint();
        waypoint.setWaypoint_id("wp-1");
        waypoint.setPoint_type(PointType.WAY_POINT);
        waypoint.setAction_type(ActionType.WAIT);
        waypoint.setSequence(2);
        Waypoint.Builder waypointBuilder = Waypoint.newBuilder();
        waypointBuilder.setWaypointId("wp-1");
        waypointBuilder.setPointType(PointType.WAY_POINT);
        // waypointBuilder.setActionType(ActionType.WAIT); // WAIT might not exist
        waypointBuilder.setActionType(ActionType.PICK_UP); // Use valid enum
        waypointBuilder.setSequence(2);
        
        GeoPoint geoPoint = new GeoPoint();
        geoPoint.setLatitude(30.1);
        geoPoint.setLongitude(120.1);
        geoPoint.setPoi_name("Way Point");
        waypoint.setPoint(geoPoint);
        GeoPoint.Builder geoPointBuilder = GeoPoint.newBuilder();
        geoPointBuilder.setLatitude(30.1);
        geoPointBuilder.setLongitude(120.1);
        // geoPointBuilder.setPoiName("Way Point");
        waypointBuilder.setPoint(geoPointBuilder.build());
        
        operation.setWaypoints(Collections.singletonList(waypoint));
        operationBuilder.addWaypoints(waypointBuilder.build());
        
        TargetPoint targetPoint = new TargetPoint();
        GeoPoint endGeoPoint = new GeoPoint();
        endGeoPoint.setLatitude(30.2);
        endGeoPoint.setLongitude(120.2);
        endGeoPoint.setPoi_name("End Point");
        targetPoint.setPoint(endGeoPoint);
        operation.setTarget_point(targetPoint);
        // TargetPoint targetPoint = new TargetPoint(); // OrderOperation uses Waypoint for target_point in proto?
        // Check proto: Waypoint target_point = 6;
        Waypoint.Builder targetPointBuilder = Waypoint.newBuilder();
        GeoPoint.Builder endGeoPointBuilder = GeoPoint.newBuilder();
        endGeoPointBuilder.setLatitude(30.2);
        endGeoPointBuilder.setLongitude(120.2);
        targetPointBuilder.setPoint(endGeoPointBuilder.build());
        operationBuilder.setTargetPoint(targetPointBuilder.build());
        String vin = "VIN12345678900000";
        Long sequence = 2L;
        xpuUtil.cloudOrderOperation(operation, vin, sequence);
        xpuUtil.cloudOrderOperation(operationBuilder.build(), vin, sequence);
        ArgumentCaptor<MqttPublishVo> captor = ArgumentCaptor.forClass(MqttPublishVo.class);
        Mockito.verify(xpuClient).publish(captor.capture());
        MqttPublishVo capturedVo = captor.getValue();
        
        Assertions.assertEquals("Robotaxi/Msg/Xpu/ABCDEFGHIJKL00000000", capturedVo.getTopic());
        // Note: CLOUD_ORDER_OPERATION is ordinal 0.
        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\":0"), "Payload should contain cmd CLOUD_ORDER_OPERATION (ordinal 0), but was: " + capturedVo.getPayload());
        // Note: CLOUD_ORDER_OPERATION is 10001
        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\": 10001"), "Payload should contain cmd CLOUD_ORDER_OPERATION (10001), but was: " + capturedVo.getPayload());
    }
    @Test
    public void testResponseMessage() {
        ResponseMessage responseMessage = new ResponseMessage();
        responseMessage.setRequest_seq(12345L);
        responseMessage.setCode(StatusCode.OK);
        responseMessage.setTimestamp(System.currentTimeMillis());
        ResponseMessage.Builder responseMessageBuilder = ResponseMessage.newBuilder();
        responseMessageBuilder.setRequestSeq(12345L);
        responseMessageBuilder.setCode(StatusCode.OK);
        responseMessageBuilder.setTimestamp(System.currentTimeMillis());
        String vin = "VIN12345678900000";
        xpuUtil.responseMessage(responseMessage, vin);
        xpuUtil.responseMessage(responseMessageBuilder.build(), vin);
        ArgumentCaptor<MqttPublishVo> captor = ArgumentCaptor.forClass(MqttPublishVo.class);
        Mockito.verify(xpuClient).publish(captor.capture());
        MqttPublishVo capturedVo = captor.getValue();
        
        Assertions.assertEquals("Robotaxi/Msg/Xpu/ABCDEFGHIJKL00000000", capturedVo.getTopic());
        // Note: CLOUD_TASK_CONTROL is ordinal 1.
        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\":1"), "Payload should contain cmd CLOUD_TASK_CONTROL (ordinal 1), but was: " + capturedVo.getPayload());
        // Note: CLOUD_TASK_CONTROL (used in responseMessage method? check code)
        // In XPUUtil.java: headerBuilder.setCmd(RTCmdType.CLOUD_TASK_CONTROL.getValue());
        // CLOUD_TASK_CONTROL is 10002
        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\": 10002"), "Payload should contain cmd CLOUD_TASK_CONTROL (10002), but was: " + capturedVo.getPayload());
    }
    @Test
    public void testCloudPushNavigation() {
        RestoreNavigationData navigationData = new RestoreNavigationData();
        navigationData.setRequest_id("req-123");
        navigationData.setRoute_id("5939fa259ad6479cbdf8871ceed96b72");
        RestoreNavigationData.Builder navigationDataBuilder = RestoreNavigationData.newBuilder();
        navigationDataBuilder.setRequestId("req-123");
        navigationDataBuilder.setRouteId("5939fa259ad6479cbdf8871ceed96b72");
        String content = "{\"startPoint\":{\"location\":\"116.481028,39.989643\"},\"endPoint\":{\"location\":\"116.465302,40.004717\"},\"routeID\":\"xxxxxxxxxxxxx\",\"strategy\":17,\"type\":1,\"ferry\":0,\"disableEndDispatch\":1,\"viaInfo\":[{},{}],\"routeUserType\":2,\"bizScene\":2,\"plate\":\"京A12345\",\"vehicleType\":1}";
        navigationData.setContent(content);
        navigationData.setTimestamp(System.currentTimeMillis());
        navigationDataBuilder.setContent(content);
        navigationDataBuilder.setTimestamp(System.currentTimeMillis());
        String xpuId = "1234567890ABCDEFGHIJKL";
        Long sequence = 3L;
        xpuUtil.cloudPushNavigation(navigationData, xpuId, sequence);
        xpuUtil.cloudPushNavigation(navigationDataBuilder.build(), xpuId, sequence);
        ArgumentCaptor<MqttPublishVo> captor = ArgumentCaptor.forClass(MqttPublishVo.class);
        Mockito.verify(xpuClient).publish(captor.capture());
        MqttPublishVo capturedVo = captor.getValue();
        
        Assertions.assertEquals("Robotaxi/Msg/Xpu/ABCDEFGHIJKL00000000", capturedVo.getTopic());
        // Note: CLOUD_NAVIGATION_RESPONSE is ordinal 5.
        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\":5"), "Payload should contain cmd CLOUD_NAVIGATION_RESPONSE (ordinal 5), but was: " + capturedVo.getPayload());
        // Note: CLOUD_NAVIGATION_RESPONSE is 10006
        Assertions.assertTrue(capturedVo.getPayload().contains("\"cmd\": 10006"), "Payload should contain cmd CLOUD_NAVIGATION_RESPONSE (10006), but was: " + capturedVo.getPayload());
    }
}