From 7f21b52de428e83cb3226210c151f522b78f96d3 Mon Sep 17 00:00:00 2001 From: scrudden Date: Sat, 15 Sep 2018 17:35:35 +0100 Subject: [PATCH 1/6] Implementation of E053 check. --- RULES.md | 11 +++ .../lib/validation/ValidationRules.java | 4 ++ .../rules/FrequencyTypeZeroValidator.java | 33 ++++++++- .../rules/FrequencyTypeZeroValidatorTest.java | 72 +++++++++++++++++++ 4 files changed, 118 insertions(+), 2 deletions(-) diff --git a/RULES.md b/RULES.md index aa315515..3f5cda22 100644 --- a/RULES.md +++ b/RULES.md @@ -54,6 +54,7 @@ Rules are declared in the [`ValidationRules` class](https://github.com/CUTR-at-U | [E050](#E050) | `timestamp` is in the future | [E051](#E051) | GTFS-rt `stop_sequence` not found in GTFS data | [E052](#E052) | `vehicle.id` is not unique +| [E053](#E053) | `start_time` for trip has changed ### Table of Warnings @@ -717,6 +718,16 @@ From [VehiclePosition.VehicleDescriptor](https://github.com/google/transit/blob/ #### References: * [`vehicle.id`](https://github.com/google/transit/blob/master/gtfs-realtime/spec/en/reference.md#message-vehicledescriptor) + + +### E053 - `start_time` for trip has changed + +A frequency based trip should have the same start time in the descriptor. + +From [TripUpdate.TripDescriptor](https://github.com/google/transit/blob/master/gtfs-realtime/spec/en/reference.md#message-tripdescriptor) for `start_time`: + +>If the trip corresponds to exact_times=0, then its start_time may be arbitrary, and is initially expected to be the first departure of the trip. Once established, the start_time of this frequency-based exact_times=0 trip should be considered immutable, even if the first departure time changes + # Warnings diff --git a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/ValidationRules.java b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/ValidationRules.java index 4e7b2a61..b3df9ef5 100644 --- a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/ValidationRules.java +++ b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/ValidationRules.java @@ -267,6 +267,10 @@ public class ValidationRules { public static final ValidationRule E052 = new ValidationRule("E052", "ERROR", "vehicle.id is not unique", "Each vehicle should have a unique ID", "which is used by more than one vehicle in the feed"); + + public static final ValidationRule E053 = new ValidationRule("E053", "ERROR", "start_time for frequency-based trip changed.", + "start_time for frequency-based trips", + "exact_times=0 must be immutable"); private static List mAllRules = new ArrayList<>(); diff --git a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java index e9053388..5f3ce27d 100644 --- a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java +++ b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java @@ -17,6 +17,8 @@ package edu.usf.cutr.gtfsrtvalidator.lib.validation.rules; import com.google.transit.realtime.GtfsRealtime; +import com.google.transit.realtime.GtfsRealtime.TripUpdate; + import edu.usf.cutr.gtfsrtvalidator.lib.model.MessageLogModel; import edu.usf.cutr.gtfsrtvalidator.lib.model.OccurrenceModel; import edu.usf.cutr.gtfsrtvalidator.lib.model.helper.ErrorListHelperModel; @@ -27,6 +29,7 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import static edu.usf.cutr.gtfsrtvalidator.lib.validation.ValidationRules.*; @@ -41,16 +44,21 @@ public class FrequencyTypeZeroValidator implements FeedEntityValidator { private static final org.slf4j.Logger _log = LoggerFactory.getLogger(FrequencyTypeZeroValidator.class); - + + private HashMap previousTripUpdates=new HashMap(); + @Override public List validate(long currentTimeMillis, GtfsMutableDao gtfsData, GtfsMetadata gtfsMetadata, GtfsRealtime.FeedMessage feedMessage, GtfsRealtime.FeedMessage previousFeedMessage, GtfsRealtime.FeedMessage combinedFeedMessage) { List errorListE006 = new ArrayList<>(); List errorListE013 = new ArrayList<>(); List errorListW005 = new ArrayList<>(); + List errorListE053 = new ArrayList<>(); for (GtfsRealtime.FeedEntity entity : feedMessage.getEntityList()) { if (entity.hasTripUpdate()) { GtfsRealtime.TripUpdate tripUpdate = entity.getTripUpdate(); + + if (gtfsMetadata.getExactTimesZeroTripIds().contains(tripUpdate.getTrip().getTripId())) { /** @@ -75,7 +83,25 @@ public List validate(long currentTimeMillis, GtfsMutableDa // W005 - Missing vehicle_id in trip_update for frequency-based exact_times = 0 RuleUtils.addOccurrence(W005, "trip_id " + tripUpdate.getTrip().getTripId(), errorListW005, _log); } - } + + if(tripUpdate.getVehicle()!=null && tripUpdate.getVehicle().getId()!=null && previousTripUpdates.get(tripUpdate.getVehicle().getId())!=null) + { + if(tripUpdate.getStopTimeUpdateCount()>0 && previousTripUpdates.get(tripUpdate.getVehicle().getId()).getStopTimeUpdateCount()>0) + { + if(tripUpdate.getStopTimeUpdate(tripUpdate.getStopTimeUpdateCount()-1).getStopSequence()>=previousTripUpdates.get(tripUpdate.getVehicle().getId()).getStopTimeUpdate(previousTripUpdates.get(tripUpdate.getVehicle().getId()).getStopTimeUpdateCount()-1).getStopSequence()) + { + // E053 - start time of trip not consistent for trip updates for frequency-based exact_times = 0 + if(!tripUpdate.getTrip().getStartTime().equals(previousTripUpdates.get(tripUpdate.getVehicle().getId()).getTrip().getStartTime())) + { + RuleUtils.addOccurrence(E053, "vehicle_id" + tripUpdate.getVehicle().getId(), errorListE053, _log); + } + } + } + + } + } + // Need to store previous for checking E053 + previousTripUpdates.put(tripUpdate.getVehicle().getId(), tripUpdate); } if (entity.hasVehicle()) { @@ -119,6 +145,9 @@ public List validate(long currentTimeMillis, GtfsMutableDa if (!errorListW005.isEmpty()) { errors.add(new ErrorListHelperModel(new MessageLogModel(W005), errorListW005)); } + if (!errorListE053.isEmpty()) { + errors.add(new ErrorListHelperModel(new MessageLogModel(E053), errorListE053)); + } return errors; } } diff --git a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java index 45236b35..6d5611f1 100644 --- a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java +++ b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java @@ -262,4 +262,76 @@ public void testW005() { clearAndInitRequiredFeedFields(); } + /** + * E053- inconsistent start time in trip descriptor for frequency-based exact_times = 0 + */ + @Test + public void testE053() + { + FrequencyTypeZeroValidator frequencyTypeZeroValidator = new FrequencyTypeZeroValidator(); + Map expected = new HashMap<>(); + + for( int i = 0; i <2;i++) + { + GtfsRealtime.TripDescriptor.Builder tripDescriptorBuilder = GtfsRealtime.TripDescriptor.newBuilder(); + + tripDescriptorBuilder.setTripId("1"); + tripDescriptorBuilder.setStartDate("4-24-2016"); + if(i==0) + { + tripDescriptorBuilder.setStartTime("08:00:00AM"); + } + if(i==1) + { + tripDescriptorBuilder.setStartTime("09:00:00AM"); + } + + + GtfsRealtime.VehicleDescriptor.Builder vehicleDescriptorBuilder = GtfsRealtime.VehicleDescriptor.newBuilder(); + + vehicleDescriptorBuilder.setId("1"); + + vehiclePositionBuilder.setVehicle(vehicleDescriptorBuilder.build()); + vehiclePositionBuilder.setTimestamp(TimestampUtils.MIN_POSIX_TIME); + vehiclePositionBuilder.setTrip(tripDescriptorBuilder.build()); + vehiclePositionBuilder.setVehicle(vehicleDescriptorBuilder.build()); + + feedEntityBuilder.setVehicle(vehiclePositionBuilder.build()); + + feedMessageBuilder.setEntity(0, feedEntityBuilder.build()); + + tripUpdateBuilder.setVehicle(vehicleDescriptorBuilder.build()); + tripUpdateBuilder.setTrip(tripDescriptorBuilder.build()); + + for(int j=0;j Date: Sat, 15 Sep 2018 18:39:17 +0100 Subject: [PATCH 2/6] Now uses previousFeedMessage parameter rather than a member hashmap. --- .../rules/FrequencyTypeZeroValidator.java | 48 ++++++++++--------- .../gtfsrtvalidator/lib/test/UtilTest.java | 2 +- .../rules/FrequencyTypeZeroValidatorTest.java | 19 ++++---- 3 files changed, 37 insertions(+), 32 deletions(-) diff --git a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java index 5f3ce27d..e85c0cab 100644 --- a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java +++ b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java @@ -45,7 +45,7 @@ public class FrequencyTypeZeroValidator implements FeedEntityValidator { private static final org.slf4j.Logger _log = LoggerFactory.getLogger(FrequencyTypeZeroValidator.class); - private HashMap previousTripUpdates=new HashMap(); + @Override public List validate(long currentTimeMillis, GtfsMutableDao gtfsData, GtfsMetadata gtfsMetadata, GtfsRealtime.FeedMessage feedMessage, GtfsRealtime.FeedMessage previousFeedMessage, GtfsRealtime.FeedMessage combinedFeedMessage) { @@ -56,10 +56,9 @@ public List validate(long currentTimeMillis, GtfsMutableDa for (GtfsRealtime.FeedEntity entity : feedMessage.getEntityList()) { if (entity.hasTripUpdate()) { + GtfsRealtime.TripUpdate tripUpdate = entity.getTripUpdate(); - - - + if (gtfsMetadata.getExactTimesZeroTripIds().contains(tripUpdate.getTrip().getTripId())) { /** * NOTE - W006 checks for missing trip_ids, because we can't check for that here - we need the trip_id to know if it's exact_times=0 @@ -84,26 +83,31 @@ public List validate(long currentTimeMillis, GtfsMutableDa RuleUtils.addOccurrence(W005, "trip_id " + tripUpdate.getTrip().getTripId(), errorListW005, _log); } - if(tripUpdate.getVehicle()!=null && tripUpdate.getVehicle().getId()!=null && previousTripUpdates.get(tripUpdate.getVehicle().getId())!=null) - { - if(tripUpdate.getStopTimeUpdateCount()>0 && previousTripUpdates.get(tripUpdate.getVehicle().getId()).getStopTimeUpdateCount()>0) - { - if(tripUpdate.getStopTimeUpdate(tripUpdate.getStopTimeUpdateCount()-1).getStopSequence()>=previousTripUpdates.get(tripUpdate.getVehicle().getId()).getStopTimeUpdate(previousTripUpdates.get(tripUpdate.getVehicle().getId()).getStopTimeUpdateCount()-1).getStopSequence()) - { - // E053 - start time of trip not consistent for trip updates for frequency-based exact_times = 0 - if(!tripUpdate.getTrip().getStartTime().equals(previousTripUpdates.get(tripUpdate.getVehicle().getId()).getTrip().getStartTime())) - { - RuleUtils.addOccurrence(E053, "vehicle_id" + tripUpdate.getVehicle().getId(), errorListE053, _log); - } - } + for (GtfsRealtime.FeedEntity previousEntity : previousFeedMessage.getEntityList()) + { + if (previousEntity.hasTripUpdate()) + { + if(tripUpdate.getVehicle()!=null && previousEntity.getTripUpdate().getVehicle()!=null) + { + if(previousEntity.getTripUpdate().getVehicle().getId().equals(tripUpdate.getVehicle().getId())) + { + if(tripUpdate.getStopTimeUpdateCount()>0 && previousEntity.getTripUpdate().getStopTimeUpdateCount()>0) + { + if(tripUpdate.getStopTimeUpdate(tripUpdate.getStopTimeUpdateCount()-1).getStopSequence()>=previousEntity.getTripUpdate().getStopTimeUpdate(previousEntity.getTripUpdate().getStopTimeUpdateCount()-1).getStopSequence()) + { + // E053 - start time of trip not consistent for trip updates for frequency-based exact_times = 0 + if(!tripUpdate.getTrip().getStartTime().equals(previousEntity.getTripUpdate().getTrip().getStartTime())) + { + RuleUtils.addOccurrence(E053, "vehicle_id " + tripUpdate.getVehicle().getId(), errorListE053, _log); + } + } + } + } + } } - - } - } - // Need to store previous for checking E053 - previousTripUpdates.put(tripUpdate.getVehicle().getId(), tripUpdate); + } + } } - if (entity.hasVehicle()) { GtfsRealtime.VehiclePosition vehiclePosition = entity.getVehicle(); if (vehiclePosition.hasTrip() && diff --git a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/UtilTest.java b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/UtilTest.java index a92c1443..a9233fc4 100644 --- a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/UtilTest.java +++ b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/UtilTest.java @@ -844,6 +844,6 @@ public void testIsInFuture() { @Test public void testGetAllRules() { List rules = ValidationRules.getRules(); - assertEquals(61, rules.size()); + assertEquals(62, rules.size()); } } diff --git a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java index 6d5611f1..c7c649f9 100644 --- a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java +++ b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java @@ -1,6 +1,8 @@ package edu.usf.cutr.gtfsrtvalidator.lib.test.rules; import com.google.transit.realtime.GtfsRealtime; +import com.google.transit.realtime.GtfsRealtime.FeedMessage; + import edu.usf.cutr.gtfsrtvalidator.lib.model.ValidationRule; import edu.usf.cutr.gtfsrtvalidator.lib.test.FeedMessageTest; import edu.usf.cutr.gtfsrtvalidator.lib.test.util.TestUtils; @@ -270,7 +272,7 @@ public void testE053() { FrequencyTypeZeroValidator frequencyTypeZeroValidator = new FrequencyTypeZeroValidator(); Map expected = new HashMap<>(); - + FeedMessage[] feedMessages= new FeedMessage[2]; for( int i = 0; i <2;i++) { GtfsRealtime.TripDescriptor.Builder tripDescriptorBuilder = GtfsRealtime.TripDescriptor.newBuilder(); @@ -315,23 +317,22 @@ public void testE053() tripUpdateBuilder.addStopTimeUpdate(stopTimeUpdateBuilder.build()); } - - + feedEntityBuilder.setTripUpdate(tripUpdateBuilder.build()); // Add vehicle_id to vehicle position - 1 warning feedEntityBuilder.setVehicle(vehiclePositionBuilder.build()); - - + feedMessageBuilder.setEntity(0, feedEntityBuilder.build()); - results = frequencyTypeZeroValidator.validate(TimestampUtils.MIN_POSIX_TIME, bullRunnerGtfs, bullRunnerGtfsMetadata, feedMessageBuilder.build(), null, null); - - + feedMessages[i]=feedMessageBuilder.build(); + + } + results = frequencyTypeZeroValidator.validate(TimestampUtils.MIN_POSIX_TIME, bullRunnerGtfs, bullRunnerGtfsMetadata, feedMessages[1], feedMessages[0], null); expected.put(ValidationRules.E053, 1); TestUtils.assertResults(expected, results); - + expected.clear(); clearAndInitRequiredFeedFields(); } } From 27623efa19493cabb2c667fad843ac132bd8bf6f Mon Sep 17 00:00:00 2001 From: scrudden Date: Sat, 15 Sep 2018 18:48:01 +0100 Subject: [PATCH 3/6] Fix NPE. Previous feed is set to null for other tests so need to check before using. --- .../rules/FrequencyTypeZeroValidator.java | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java index e85c0cab..736ad748 100644 --- a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java +++ b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java @@ -82,30 +82,32 @@ public List validate(long currentTimeMillis, GtfsMutableDa // W005 - Missing vehicle_id in trip_update for frequency-based exact_times = 0 RuleUtils.addOccurrence(W005, "trip_id " + tripUpdate.getTrip().getTripId(), errorListW005, _log); } - - for (GtfsRealtime.FeedEntity previousEntity : previousFeedMessage.getEntityList()) - { - if (previousEntity.hasTripUpdate()) - { - if(tripUpdate.getVehicle()!=null && previousEntity.getTripUpdate().getVehicle()!=null) - { - if(previousEntity.getTripUpdate().getVehicle().getId().equals(tripUpdate.getVehicle().getId())) - { - if(tripUpdate.getStopTimeUpdateCount()>0 && previousEntity.getTripUpdate().getStopTimeUpdateCount()>0) - { - if(tripUpdate.getStopTimeUpdate(tripUpdate.getStopTimeUpdateCount()-1).getStopSequence()>=previousEntity.getTripUpdate().getStopTimeUpdate(previousEntity.getTripUpdate().getStopTimeUpdateCount()-1).getStopSequence()) - { - // E053 - start time of trip not consistent for trip updates for frequency-based exact_times = 0 - if(!tripUpdate.getTrip().getStartTime().equals(previousEntity.getTripUpdate().getTrip().getStartTime())) - { - RuleUtils.addOccurrence(E053, "vehicle_id " + tripUpdate.getVehicle().getId(), errorListE053, _log); - } - } - } + if(previousFeedMessage!=null) + { + for (GtfsRealtime.FeedEntity previousEntity : previousFeedMessage.getEntityList()) + { + if (previousEntity.hasTripUpdate()) + { + if(tripUpdate.getVehicle()!=null && previousEntity.getTripUpdate().getVehicle()!=null) + { + if(previousEntity.getTripUpdate().getVehicle().getId().equals(tripUpdate.getVehicle().getId())) + { + if(tripUpdate.getStopTimeUpdateCount()>0 && previousEntity.getTripUpdate().getStopTimeUpdateCount()>0) + { + if(tripUpdate.getStopTimeUpdate(tripUpdate.getStopTimeUpdateCount()-1).getStopSequence()>=previousEntity.getTripUpdate().getStopTimeUpdate(previousEntity.getTripUpdate().getStopTimeUpdateCount()-1).getStopSequence()) + { + // E053 - start time of trip not consistent for trip updates for frequency-based exact_times = 0 + if(!tripUpdate.getTrip().getStartTime().equals(previousEntity.getTripUpdate().getTrip().getStartTime())) + { + RuleUtils.addOccurrence(E053, "vehicle_id " + tripUpdate.getVehicle().getId(), errorListE053, _log); + } + } + } + } } - } - } - } + } + } + } } } if (entity.hasVehicle()) { From e90285c30d3e4c81067777b8868fa2836960a2d4 Mon Sep 17 00:00:00 2001 From: scrudden Date: Sat, 15 Sep 2018 21:18:55 +0100 Subject: [PATCH 4/6] Start of implementing rule to check delay has not been set for freq services. --- RULES.md | 10 ++++++++ .../lib/validation/ValidationRules.java | 4 ++++ .../rules/FrequencyTypeZeroValidator.java | 24 +++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/RULES.md b/RULES.md index 3f5cda22..25c31f38 100644 --- a/RULES.md +++ b/RULES.md @@ -55,6 +55,7 @@ Rules are declared in the [`ValidationRules` class](https://github.com/CUTR-at-U | [E051](#E051) | GTFS-rt `stop_sequence` not found in GTFS data | [E052](#E052) | `vehicle.id` is not unique | [E053](#E053) | `start_time` for trip has changed +| [E054](#E054) | `delay` for freq based trip with exact times=0 is set ### Table of Warnings @@ -728,6 +729,15 @@ From [TripUpdate.TripDescriptor](https://github.com/google/transit/blob/master/g >If the trip corresponds to exact_times=0, then its start_time may be arbitrary, and is initially expected to be the first departure of the trip. Once established, the start_time of this frequency-based exact_times=0 trip should be considered immutable, even if the first departure time changes +### E054 - `start_time` for trip has changed + +A frequency based trip of type 0 should not have any delay values set. + +From [TripUpdate](https://github.com/google/transit/blob/master/gtfs-realtime/spec/en/reference.md#message-tripupdate) for `delay`: + +>Delay should only be specified when the prediction is given relative to some existing schedule in GTFS. + + # Warnings diff --git a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/ValidationRules.java b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/ValidationRules.java index b3df9ef5..9d93c049 100644 --- a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/ValidationRules.java +++ b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/ValidationRules.java @@ -271,6 +271,10 @@ public class ValidationRules { public static final ValidationRule E053 = new ValidationRule("E053", "ERROR", "start_time for frequency-based trip changed.", "start_time for frequency-based trips", "exact_times=0 must be immutable"); + + public static final ValidationRule E054 = new ValidationRule("E054", "ERROR", "Frequency type 0 trips should not have delay set.", + "Frequency type 0 trips should", + "not have delay values"); private static List mAllRules = new ArrayList<>(); diff --git a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java index 736ad748..ccc146e8 100644 --- a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java +++ b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java @@ -18,6 +18,7 @@ import com.google.transit.realtime.GtfsRealtime; import com.google.transit.realtime.GtfsRealtime.TripUpdate; +import com.google.transit.realtime.GtfsRealtime.TripUpdate.StopTimeUpdate; import edu.usf.cutr.gtfsrtvalidator.lib.model.MessageLogModel; import edu.usf.cutr.gtfsrtvalidator.lib.model.OccurrenceModel; @@ -53,6 +54,7 @@ public List validate(long currentTimeMillis, GtfsMutableDa List errorListE013 = new ArrayList<>(); List errorListW005 = new ArrayList<>(); List errorListE053 = new ArrayList<>(); + List errorListE054 = new ArrayList<>(); for (GtfsRealtime.FeedEntity entity : feedMessage.getEntityList()) { if (entity.hasTripUpdate()) { @@ -82,6 +84,7 @@ public List validate(long currentTimeMillis, GtfsMutableDa // W005 - Missing vehicle_id in trip_update for frequency-based exact_times = 0 RuleUtils.addOccurrence(W005, "trip_id " + tripUpdate.getTrip().getTripId(), errorListW005, _log); } + if(previousFeedMessage!=null) { for (GtfsRealtime.FeedEntity previousEntity : previousFeedMessage.getEntityList()) @@ -108,6 +111,24 @@ public List validate(long currentTimeMillis, GtfsMutableDa } } } + + for(StopTimeUpdate stopTimeUpdate:tripUpdate.getStopTimeUpdateList()) + { + if(stopTimeUpdate.hasArrival()) + { + if(stopTimeUpdate.getArrival().hasDelay()) + { + RuleUtils.addOccurrence(E054, "vehicle_id " + tripUpdate.getVehicle().getId(), errorListE054, _log); + } + } + if(stopTimeUpdate.hasDeparture()) + { + if(stopTimeUpdate.getDeparture().hasDelay()) + { + RuleUtils.addOccurrence(E054, "vehicle_id " + tripUpdate.getVehicle().getId(), errorListE054, _log); + } + } + } } } if (entity.hasVehicle()) { @@ -153,6 +174,9 @@ public List validate(long currentTimeMillis, GtfsMutableDa } if (!errorListE053.isEmpty()) { errors.add(new ErrorListHelperModel(new MessageLogModel(E053), errorListE053)); + } + if (!errorListE054.isEmpty()) { + errors.add(new ErrorListHelperModel(new MessageLogModel(E054), errorListE053)); } return errors; } From 687d63fdc85ae868e678ee1b344f54dafd7a5c9c Mon Sep 17 00:00:00 2001 From: scrudden Date: Sat, 15 Sep 2018 21:53:28 +0100 Subject: [PATCH 5/6] Add unit test. --- .../rules/FrequencyTypeZeroValidator.java | 2 +- .../rules/FrequencyTypeZeroValidatorTest.java | 61 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java index ccc146e8..d18d9c9f 100644 --- a/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java +++ b/gtfs-realtime-validator-lib/src/main/java/edu/usf/cutr/gtfsrtvalidator/lib/validation/rules/FrequencyTypeZeroValidator.java @@ -176,7 +176,7 @@ public List validate(long currentTimeMillis, GtfsMutableDa errors.add(new ErrorListHelperModel(new MessageLogModel(E053), errorListE053)); } if (!errorListE054.isEmpty()) { - errors.add(new ErrorListHelperModel(new MessageLogModel(E054), errorListE053)); + errors.add(new ErrorListHelperModel(new MessageLogModel(E054), errorListE054)); } return errors; } diff --git a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java index c7c649f9..096b5131 100644 --- a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java +++ b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/rules/FrequencyTypeZeroValidatorTest.java @@ -335,4 +335,65 @@ public void testE053() expected.clear(); clearAndInitRequiredFeedFields(); } + /** + * E054- delay should not be set for frequency-based exact_times = 0 + */ + @Test + public void testE054() + { + FrequencyTypeZeroValidator frequencyTypeZeroValidator = new FrequencyTypeZeroValidator(); + Map expected = new HashMap<>(); + FeedMessage[] feedMessages= new FeedMessage[2]; + + GtfsRealtime.TripDescriptor.Builder tripDescriptorBuilder = GtfsRealtime.TripDescriptor.newBuilder(); + + tripDescriptorBuilder.setTripId("1"); + tripDescriptorBuilder.setStartDate("4-24-2016"); + + tripDescriptorBuilder.setStartTime("08:00:00AM"); + + + GtfsRealtime.VehicleDescriptor.Builder vehicleDescriptorBuilder = GtfsRealtime.VehicleDescriptor.newBuilder(); + + vehicleDescriptorBuilder.setId("1"); + + vehiclePositionBuilder.setVehicle(vehicleDescriptorBuilder.build()); + vehiclePositionBuilder.setTimestamp(TimestampUtils.MIN_POSIX_TIME); + vehiclePositionBuilder.setTrip(tripDescriptorBuilder.build()); + vehiclePositionBuilder.setVehicle(vehicleDescriptorBuilder.build()); + + feedEntityBuilder.setVehicle(vehiclePositionBuilder.build()); + + feedMessageBuilder.setEntity(0, feedEntityBuilder.build()); + + tripUpdateBuilder.setVehicle(vehicleDescriptorBuilder.build()); + tripUpdateBuilder.setTrip(tripDescriptorBuilder.build()); + + + GtfsRealtime.TripUpdate.StopTimeUpdate.Builder stopTimeUpdateBuilder = GtfsRealtime.TripUpdate.StopTimeUpdate.newBuilder(); + + stopTimeUpdateBuilder.setStopId(""+1); + stopTimeUpdateBuilder.setStopSequence(1); + + + GtfsRealtime.TripUpdate.StopTimeEvent.Builder stopTimeEventBuilder = GtfsRealtime.TripUpdate.StopTimeEvent.newBuilder(); + stopTimeEventBuilder.setDelay(10); + stopTimeUpdateBuilder.setArrival(stopTimeEventBuilder.build()); + + tripUpdateBuilder.addStopTimeUpdate(stopTimeUpdateBuilder.build()); + + + feedEntityBuilder.setTripUpdate(tripUpdateBuilder.build()); + + + feedEntityBuilder.setVehicle(vehiclePositionBuilder.build()); + + feedMessageBuilder.setEntity(0, feedEntityBuilder.build()); + + results = frequencyTypeZeroValidator.validate(TimestampUtils.MIN_POSIX_TIME, bullRunnerGtfs, bullRunnerGtfsMetadata, feedMessageBuilder.build(), null, null); + expected.put(ValidationRules.E054, 1); + TestUtils.assertResults(expected, results); + expected.clear(); + clearAndInitRequiredFeedFields(); + } } From 55a0e1b00a5191ed884035ef5c181cff0fe6144b Mon Sep 17 00:00:00 2001 From: scrudden Date: Sat, 15 Sep 2018 21:57:08 +0100 Subject: [PATCH 6/6] Set the correct number of tests. --- .../java/edu/usf/cutr/gtfsrtvalidator/lib/test/UtilTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/UtilTest.java b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/UtilTest.java index a9233fc4..1aadab7b 100644 --- a/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/UtilTest.java +++ b/gtfs-realtime-validator-lib/src/test/java/edu/usf/cutr/gtfsrtvalidator/lib/test/UtilTest.java @@ -844,6 +844,6 @@ public void testIsInFuture() { @Test public void testGetAllRules() { List rules = ValidationRules.getRules(); - assertEquals(62, rules.size()); + assertEquals(63, rules.size()); } }