| | |
| | | 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.*; |
| | | import org.junit.jupiter.api.Assertions; |
| | | import org.junit.jupiter.api.BeforeEach; |
| | | import org.junit.jupiter.api.Test; |
| | |
| | | |
| | | import java.lang.reflect.Field; |
| | | import java.lang.reflect.Method; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | |
| | | 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.setTaskType(OrderType.ORDER_TYPE_ROBOTAXI); |
| | | |
| | | 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); |
| | | Waypoint.Builder pointBuilder = Waypoint.newBuilder(); |
| | | pointBuilder.setPointType(PointType.START_POINT); |
| | | pointBuilder.setActionType(ActionType.PICK_UP); |
| | | pointBuilder.setSequence(1); |
| | | |
| | | task.setPoints(Collections.singletonList(point)); |
| | | 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); |
| | | |
| | | 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.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()); |
| | | } |
| | | } |