fix: preserve jt808 registration metadata
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
@@ -237,6 +237,53 @@ class Jt808ChannelHandlerTest {
|
||||
eventBus.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
void registerArchivePreservesRegistrationFieldsInMetadata() throws Exception {
|
||||
RecordingSink sink = new RecordingSink(1);
|
||||
DisruptorEventBus eventBus = new DisruptorEventBus(1024, "blocking", List.of(sink));
|
||||
AsyncBatchExecutor batchExecutor = new AsyncBatchExecutor(eventBus::publish);
|
||||
Dispatcher dispatcher = new Dispatcher(
|
||||
new HandlerRegistry(),
|
||||
new InterceptorChain(List.of()),
|
||||
new HandlerInvoker(),
|
||||
eventBus,
|
||||
batchExecutor);
|
||||
InMemoryVehicleIdentityService identity = new InMemoryVehicleIdentityService();
|
||||
Jt808ChannelHandler handler = new Jt808ChannelHandler(
|
||||
new Jt808MessageDecoder(new BodyParserRegistry(List.of(new RegisterBodyParser()))),
|
||||
dispatcher,
|
||||
new InMemorySessionStore(),
|
||||
identity,
|
||||
new Jt808ChannelRegistry(),
|
||||
new Jt808PendingRequests());
|
||||
EmbeddedChannel channel = new EmbeddedChannel(handler);
|
||||
byte[] frame = buildFrame(
|
||||
Jt808MessageId.TERMINAL_REGISTER,
|
||||
"123456789012",
|
||||
1,
|
||||
buildRegisterBody("DEV808", "B80808"));
|
||||
|
||||
channel.writeInbound(frame);
|
||||
|
||||
assertThat(sink.await()).isTrue();
|
||||
assertThat(sink.events).singleElement().satisfies(event -> {
|
||||
assertThat(event).isInstanceOf(VehicleEvent.RawArchive.class);
|
||||
VehicleEvent.RawArchive archive = (VehicleEvent.RawArchive) event;
|
||||
assertThat(archive.command()).isEqualTo(Jt808MessageId.TERMINAL_REGISTER);
|
||||
assertThat(archive.metadata())
|
||||
.containsEntry("jt808.register.province", "44")
|
||||
.containsEntry("jt808.register.city", "4401")
|
||||
.containsEntry("jt808.register.maker", "MAKER")
|
||||
.containsEntry("jt808.register.deviceType", "TYPE-A")
|
||||
.containsEntry("jt808.register.deviceId", "DEV808")
|
||||
.containsEntry("jt808.register.plateColor", "1")
|
||||
.containsEntry("jt808.register.plate", "B80808");
|
||||
});
|
||||
|
||||
batchExecutor.close();
|
||||
eventBus.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
void malformedFrameIsArchivedAndDispatchedAsPassthrough() throws Exception {
|
||||
RecordingSink sink = new RecordingSink(2);
|
||||
|
||||
@@ -133,6 +133,30 @@ class Jt808EventMapperTest {
|
||||
.first().isInstanceOf(VehicleEvent.Heartbeat.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void registerBodyPreservesRegistrationFieldsInMetadata() {
|
||||
var header = new Jt808Header(
|
||||
Jt808MessageId.TERMINAL_REGISTER, 37, 0, false,
|
||||
Jt808Header.ProtocolVersion.V2013, "123456789012", 1, 0, 0);
|
||||
var body = new Jt808Body.Register(
|
||||
44, 1, "G7", "MODEL-X", "DEV123456", 2, "粤B12345");
|
||||
|
||||
List<VehicleEvent> events = mapper.toEvents(new Jt808Message(header, body));
|
||||
|
||||
assertThat(events).singleElement()
|
||||
.satisfies(event -> {
|
||||
assertThat(event).isInstanceOf(VehicleEvent.Login.class);
|
||||
assertThat(event.metadata())
|
||||
.containsEntry("jt808.register.province", "44")
|
||||
.containsEntry("jt808.register.city", "1")
|
||||
.containsEntry("jt808.register.maker", "G7")
|
||||
.containsEntry("jt808.register.deviceType", "MODEL-X")
|
||||
.containsEntry("jt808.register.deviceId", "DEV123456")
|
||||
.containsEntry("jt808.register.plateColor", "2")
|
||||
.containsEntry("jt808.register.plate", "粤B12345");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void unregisterBodyProducesLogoutEvent() {
|
||||
var header = new Jt808Header(
|
||||
|
||||
Reference in New Issue
Block a user