From f746c38d5e2089d7d1d95cfa34ae9cedff6ac8b4 Mon Sep 17 00:00:00 2001 From: Leonard Ehrenfried Date: Wed, 9 Aug 2023 17:25:27 +0200 Subject: [PATCH 1/9] Use external OTP client for smoke tests --- pom.xml | 6 ++ .../smoketest/AtlantaSmokeTest.java | 28 +++++---- .../smoketest/DenverSmokeTest.java | 11 ++-- .../smoketest/HoustonSmokeTest.java | 17 +++-- .../smoketest/PortlandSmokeTest.java | 20 +++--- .../smoketest/SeattleSmokeTest.java | 22 ++++--- .../smoketest/SeptaSmokeTest.java | 19 +++--- .../opentripplanner/smoketest/SmokeTest.java | 31 +++++++--- .../smoketest/util/RestClient.java | 62 ------------------- .../smoketest/util/SmokeTestRequest.java | 34 ++-------- 10 files changed, 106 insertions(+), 144 deletions(-) delete mode 100644 src/test/java/org/opentripplanner/smoketest/util/RestClient.java diff --git a/pom.xml b/pom.xml index 67420ed48bc..4a6a9d4e7e3 100644 --- a/pom.xml +++ b/pom.xml @@ -1008,6 +1008,12 @@ 1.23.0 test + + org.opentripplanner + otp-client + 0.0.4 + test + diff --git a/src/test/java/org/opentripplanner/smoketest/AtlantaSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/AtlantaSmokeTest.java index 5b5f4a78d79..09ef914bbf7 100644 --- a/src/test/java/org/opentripplanner/smoketest/AtlantaSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/AtlantaSmokeTest.java @@ -1,14 +1,17 @@ package org.opentripplanner.smoketest; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.opentripplanner.client.model.RequestMode.FLEX_EGRESS; +import static org.opentripplanner.client.model.RequestMode.TRANSIT; +import static org.opentripplanner.client.model.RequestMode.WALK; import static org.opentripplanner.smoketest.SmokeTest.assertThatItineraryHasModes; +import static org.opentripplanner.smoketest.SmokeTest.basicRouteTest; import java.util.List; import java.util.Set; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.opentripplanner.framework.geometry.WgsCoordinate; -import org.opentripplanner.smoketest.util.RestClient; +import org.opentripplanner.client.model.Coordinate; import org.opentripplanner.smoketest.util.SmokeTestRequest; /** @@ -25,15 +28,15 @@ @Tag("atlanta") public class AtlantaSmokeTest { - WgsCoordinate nearGeorgiaStateStation = new WgsCoordinate(33.74139944890028, -84.38607215881348); - WgsCoordinate powderSpringsInsideFlexZone1 = new WgsCoordinate( + Coordinate nearGeorgiaStateStation = new Coordinate(33.74139944890028, -84.38607215881348); + Coordinate powderSpringsInsideFlexZone1 = new Coordinate( 33.86916840022388, -84.66315507888794 ); @Test public void regularRouteFromCentralAtlantaToPowderSprings() { - Set modes = Set.of("TRANSIT", "WALK"); + var modes = Set.of(TRANSIT, WALK); SmokeTest.basicRouteTest( new SmokeTestRequest(nearGeorgiaStateStation, powderSpringsInsideFlexZone1, modes), List.of("WALK", "SUBWAY", "WALK", "BUS", "WALK", "BUS", "WALK") @@ -42,27 +45,26 @@ public void regularRouteFromCentralAtlantaToPowderSprings() { @Test public void flexRouteFromCentralAtlantaToPowderSprings() { - var params = new SmokeTestRequest( + var req = new SmokeTestRequest( nearGeorgiaStateStation, powderSpringsInsideFlexZone1, - Set.of("FLEX_EGRESS", "WALK", "TRANSIT") + Set.of(FLEX_EGRESS, WALK, TRANSIT) ); - var otpResponse = RestClient.sendPlanRequest(params); - var itineraries = otpResponse.getPlan().itineraries; - - assertTrue(itineraries.size() > 0); var expectedModes = List.of("WALK", "SUBWAY", "WALK", "BUS", "WALK", "BUS"); + var plan = basicRouteTest(req, expectedModes); + var itineraries = plan.itineraries(); + assertThatItineraryHasModes(itineraries, expectedModes); var transitLegs = itineraries .stream() - .flatMap(i -> i.legs.stream().filter(l -> l.transitLeg)) + .flatMap(i -> i.legs().stream().filter(l -> l.route() != null)) .toList(); var usesZone1Route = transitLegs .stream() - .map(l -> l.routeShortName) + .map(l -> l.route().shortName()) .anyMatch(name -> name.equals("Zone 1")); assertTrue(usesZone1Route); diff --git a/src/test/java/org/opentripplanner/smoketest/DenverSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/DenverSmokeTest.java index 939e3743ded..ea8a92402a4 100644 --- a/src/test/java/org/opentripplanner/smoketest/DenverSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/DenverSmokeTest.java @@ -1,10 +1,13 @@ package org.opentripplanner.smoketest; +import static org.opentripplanner.client.model.RequestMode.TRANSIT; +import static org.opentripplanner.client.model.RequestMode.WALK; + import java.util.List; import java.util.Set; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.opentripplanner.framework.geometry.WgsCoordinate; +import org.opentripplanner.client.model.Coordinate; import org.opentripplanner.smoketest.util.SmokeTestRequest; /** @@ -16,12 +19,12 @@ @Tag("denver") public class DenverSmokeTest { - WgsCoordinate southBroadway = new WgsCoordinate(39.7020, -104.9866); - WgsCoordinate twinLakes = new WgsCoordinate(39.8232, -105.0055); + Coordinate southBroadway = new Coordinate(39.7020, -104.9866); + Coordinate twinLakes = new Coordinate(39.8232, -105.0055); @Test public void routeFromSouthToNorth() { - Set modes = Set.of("TRANSIT", "WALK"); + var modes = Set.of(TRANSIT, WALK); SmokeTest.basicRouteTest( new SmokeTestRequest(southBroadway, twinLakes, modes), List.of("WALK", "TRAM", "WALK", "BUS", "WALK") diff --git a/src/test/java/org/opentripplanner/smoketest/HoustonSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/HoustonSmokeTest.java index c3166c4bbe8..1be6c8fd9ff 100644 --- a/src/test/java/org/opentripplanner/smoketest/HoustonSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/HoustonSmokeTest.java @@ -1,10 +1,15 @@ package org.opentripplanner.smoketest; +import static org.opentripplanner.client.model.RequestMode.BICYCLE; +import static org.opentripplanner.client.model.RequestMode.BUS; +import static org.opentripplanner.client.model.RequestMode.TRANSIT; +import static org.opentripplanner.client.model.RequestMode.WALK; + import java.util.List; import java.util.Set; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.opentripplanner.framework.geometry.WgsCoordinate; +import org.opentripplanner.client.model.Coordinate; import org.opentripplanner.smoketest.util.SmokeTestRequest; /** @@ -16,12 +21,12 @@ @Tag("houston") public class HoustonSmokeTest { - WgsCoordinate galvestonRoad = new WgsCoordinate(29.6598, -95.2342); - WgsCoordinate northLindale = new WgsCoordinate(29.8158, -95.3697); + Coordinate galvestonRoad = new Coordinate(29.6598, -95.2342); + Coordinate northLindale = new Coordinate(29.8158, -95.3697); @Test public void routeFromSouthToNorth() { - Set modes = Set.of("TRANSIT", "WALK"); + var modes = Set.of(TRANSIT, WALK); SmokeTest.basicRouteTest( new SmokeTestRequest(galvestonRoad, northLindale, modes), List.of("WALK", "BUS", "BUS", "WALK", "TRAM", "WALK") @@ -30,7 +35,7 @@ public void routeFromSouthToNorth() { @Test public void selectOnlyBusses() { - Set modes = Set.of("BUS", "WALK"); + var modes = Set.of(BUS, WALK); SmokeTest.basicRouteTest( new SmokeTestRequest(galvestonRoad, northLindale, modes), List.of("WALK", "BUS", "BUS", "WALK", "BUS", "WALK") @@ -40,7 +45,7 @@ public void selectOnlyBusses() { @Test public void bikeRoute() { SmokeTest.basicRouteTest( - new SmokeTestRequest(galvestonRoad, northLindale, Set.of("BICYCLE")), + new SmokeTestRequest(galvestonRoad, northLindale, Set.of(BICYCLE)), List.of("BICYCLE") ); } diff --git a/src/test/java/org/opentripplanner/smoketest/PortlandSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/PortlandSmokeTest.java index 9dcfda6a775..840c8922424 100644 --- a/src/test/java/org/opentripplanner/smoketest/PortlandSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/PortlandSmokeTest.java @@ -1,29 +1,33 @@ package org.opentripplanner.smoketest; +import static org.opentripplanner.client.model.RequestMode.SCOOTER_RENT; +import static org.opentripplanner.client.model.RequestMode.TRAM; +import static org.opentripplanner.client.model.RequestMode.WALK; + import java.util.List; import java.util.Set; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import org.opentripplanner.framework.geometry.WgsCoordinate; +import org.opentripplanner.client.model.Coordinate; import org.opentripplanner.smoketest.util.SmokeTestRequest; @Tag("smoke-test") @Tag("portland") public class PortlandSmokeTest { - WgsCoordinate cennentenial = new WgsCoordinate(45.504602, -122.4968719); - WgsCoordinate hazelwood = new WgsCoordinate(45.52463, -122.5583); - WgsCoordinate piedmont = new WgsCoordinate(45.5746, -122.6697); - WgsCoordinate mountTaborPark = new WgsCoordinate(45.511399, -122.594203); + Coordinate cennentenial = new Coordinate(45.504602, -122.4968719); + Coordinate hazelwood = new Coordinate(45.52463, -122.5583); + Coordinate piedmont = new Coordinate(45.5746, -122.6697); + Coordinate mountTaborPark = new Coordinate(45.511399, -122.594203); @Test public void railTrip() { // this used to be across the city by since the train is interrupter in April '23 this is a // much shorter trip SmokeTest.basicRouteTest( - new SmokeTestRequest(cennentenial, hazelwood, Set.of("TRAM", "WALK")), + new SmokeTestRequest(cennentenial, hazelwood, Set.of(TRAM, WALK)), List.of("WALK", "TRAM", "WALK") ); } @@ -36,7 +40,7 @@ public void railTrip() { @ValueSource(booleans = { true, false }) public void geofencingZone(boolean arriveBy) { SmokeTest.basicRouteTest( - new SmokeTestRequest(cennentenial, mountTaborPark, Set.of("SCOOTER_RENT", "WALK"), arriveBy), + new SmokeTestRequest(cennentenial, mountTaborPark, Set.of(SCOOTER_RENT, WALK), arriveBy), List.of("WALK", "SCOOTER", "WALK") ); } @@ -45,7 +49,7 @@ public void geofencingZone(boolean arriveBy) { @ValueSource(booleans = { true, false }) void scooterRent(boolean arriveBy) { SmokeTest.basicRouteTest( - new SmokeTestRequest(cennentenial, piedmont, Set.of("SCOOTER_RENT", "WALK"), arriveBy), + new SmokeTestRequest(cennentenial, piedmont, Set.of(SCOOTER_RENT, WALK), arriveBy), List.of("WALK", "SCOOTER") ); } diff --git a/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java index c9139eec987..6565fb8c70c 100644 --- a/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java @@ -1,14 +1,22 @@ package org.opentripplanner.smoketest; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.opentripplanner.client.model.RequestMode.BUS; +import static org.opentripplanner.client.model.RequestMode.FLEX_ACCESS; +import static org.opentripplanner.client.model.RequestMode.FLEX_DIRECT; +import static org.opentripplanner.client.model.RequestMode.FLEX_EGRESS; +import static org.opentripplanner.client.model.RequestMode.TRANSIT; +import static org.opentripplanner.client.model.RequestMode.WALK; +import java.io.IOException; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.opentripplanner.framework.geometry.WgsCoordinate; +import org.opentripplanner.client.model.Coordinate; +import org.opentripplanner.client.model.RequestMode; import org.opentripplanner.smoketest.util.GraphQLClient; import org.opentripplanner.smoketest.util.SmokeTestRequest; @@ -16,15 +24,15 @@ @Tag("seattle") public class SeattleSmokeTest { - WgsCoordinate sodo = new WgsCoordinate(47.5811, -122.3290); - WgsCoordinate clydeHill = new WgsCoordinate(47.6316, -122.2173); + Coordinate sodo = new Coordinate(47.5811, -122.3290); + Coordinate clydeHill = new Coordinate(47.6316, -122.2173); - WgsCoordinate boeingCreekPark = new WgsCoordinate(47.755872, -122.361645); - WgsCoordinate ronaldBogPark = new WgsCoordinate(47.75601664, -122.33141); + Coordinate boeingCreekPark = new Coordinate(47.755872, -122.361645); + Coordinate ronaldBogPark = new Coordinate(47.75601664, -122.33141); @Test public void acrossTheCity() { - Set modes = Set.of("TRANSIT", "WALK"); + var modes = Set.of(TRANSIT, WALK); SmokeTest.basicRouteTest( new SmokeTestRequest(sodo, clydeHill, modes), List.of("WALK", "BUS", "WALK", "BUS", "WALK") @@ -33,7 +41,7 @@ public void acrossTheCity() { @Test public void flexAndTransit() { - Set modes = Set.of("WALK", "BUS", "FLEX", "FLEX_DIRECT", "FLEX_EGRESS", "FLEX_ACCESS"); + var modes = Set.of(WALK, BUS, FLEX_DIRECT, FLEX_EGRESS, FLEX_ACCESS); SmokeTest.basicRouteTest( new SmokeTestRequest(boeingCreekPark, ronaldBogPark, modes), List.of("BUS") diff --git a/src/test/java/org/opentripplanner/smoketest/SeptaSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SeptaSmokeTest.java index af04eda6e53..50f68687bf0 100644 --- a/src/test/java/org/opentripplanner/smoketest/SeptaSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SeptaSmokeTest.java @@ -1,10 +1,15 @@ package org.opentripplanner.smoketest; +import static org.opentripplanner.client.model.RequestMode.BICYCLE_RENT; +import static org.opentripplanner.client.model.RequestMode.TRANSIT; +import static org.opentripplanner.client.model.RequestMode.WALK; + +import java.io.IOException; import java.util.List; import java.util.Set; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.opentripplanner.framework.geometry.WgsCoordinate; +import org.opentripplanner.client.model.Coordinate; import org.opentripplanner.smoketest.util.SmokeTestRequest; /** @@ -14,15 +19,15 @@ @Tag("septa") public class SeptaSmokeTest { - WgsCoordinate airport = new WgsCoordinate(39.876151, -75.245189); - WgsCoordinate stPetersCemetary = new WgsCoordinate(39.98974, -75.09515); + Coordinate airport = new Coordinate(39.876151, -75.245189); + Coordinate stPetersCemetary = new Coordinate(39.98974, -75.09515); - WgsCoordinate pierceStreet = new WgsCoordinate(39.93014, -75.18047); - WgsCoordinate templeUniversity = new WgsCoordinate(39.98069, -75.14886); + Coordinate pierceStreet = new Coordinate(39.93014, -75.18047); + Coordinate templeUniversity = new Coordinate(39.98069, -75.14886); @Test public void routeFromAirportToNorthPhiladelphia() { - Set modes = Set.of("TRANSIT", "WALK"); + var modes = Set.of(TRANSIT, WALK); SmokeTest.basicRouteTest( new SmokeTestRequest(airport, stPetersCemetary, modes), List.of("WALK", "RAIL", "WALK", "SUBWAY", "WALK") @@ -42,7 +47,7 @@ public void bikeRentalStations() { @Test public void routeWithBikeRental() { SmokeTest.basicRouteTest( - new SmokeTestRequest(pierceStreet, templeUniversity, Set.of("BICYCLE_RENT")), + new SmokeTestRequest(pierceStreet, templeUniversity, Set.of(BICYCLE_RENT)), List.of("WALK", "BICYCLE", "WALK") ); } diff --git a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java index 0d004037334..37694fff17c 100644 --- a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java @@ -11,16 +11,20 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import java.io.IOException; import java.time.DayOfWeek; import java.time.LocalDate; +import java.time.LocalTime; +import java.time.ZoneId; import java.time.temporal.TemporalAdjusters; import java.util.List; import org.opentripplanner.api.json.JSONObjectMapperProvider; -import org.opentripplanner.api.model.ApiItinerary; import org.opentripplanner.api.resource.DebugOutput; +import org.opentripplanner.client.OtpApiClient; +import org.opentripplanner.client.model.TripPlan; +import org.opentripplanner.client.model.TripPlan.Itinerary; import org.opentripplanner.model.fare.ItineraryFares; import org.opentripplanner.smoketest.util.GraphQLClient; -import org.opentripplanner.smoketest.util.RestClient; import org.opentripplanner.smoketest.util.SmokeTestRequest; /** @@ -72,12 +76,12 @@ public static void assertThatThereAreVehicleRentalStations() { * modes. */ static void assertThatItineraryHasModes( - List itineraries, + List itineraries, List expectedModes ) { var itineraryModes = itineraries .stream() - .map(i -> i.legs.stream().map(l -> l.mode).toList()) + .map(i -> i.legs().stream().map(l -> l.mode().toString()).toList()) .toList(); assertTrue( itineraryModes.contains(expectedModes), @@ -89,13 +93,22 @@ static void assertThatItineraryHasModes( ); } - static void basicRouteTest(SmokeTestRequest req, List expectedModes) { - var otpResponse = RestClient.sendPlanRequest(req); - var itineraries = otpResponse.getPlan().itineraries; + static TripPlan basicRouteTest(SmokeTestRequest req, List expectedModes) { + try { + var client = new OtpApiClient(ZoneId.of("America/New_York"), "localhost:8080"); + + TripPlan plan = client.plan(req.from(), req.to(), SmokeTest.nextMonday().atTime(LocalTime.of(12,0)), req.modes()); + var itineraries = plan.itineraries(); + + assertFalse(itineraries.isEmpty(), "Expected to see some itineraries but got zero."); + + assertThatItineraryHasModes(itineraries, expectedModes); + return plan; + } catch (InterruptedException|IOException e) { + throw new RuntimeException(e); + } - assertTrue(itineraries.size() >= 1, "Expected to see some itineraries but got zero."); - assertThatItineraryHasModes(itineraries, expectedModes); } static void assertThereArePatternsWithVehiclePositions() { diff --git a/src/test/java/org/opentripplanner/smoketest/util/RestClient.java b/src/test/java/org/opentripplanner/smoketest/util/RestClient.java deleted file mode 100644 index 80bd90efa63..00000000000 --- a/src/test/java/org/opentripplanner/smoketest/util/RestClient.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.opentripplanner.smoketest.util; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.IOException; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.util.Map; -import java.util.stream.Collectors; -import org.opentripplanner.api.resource.TripPlannerResponse; -import org.opentripplanner.smoketest.SmokeTest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RestClient { - - static final Logger LOG = LoggerFactory.getLogger(RestClient.class); - - static HttpClient client = HttpClient.newHttpClient(); - - /** - * Builds an HTTP request for sending to an OTP instance. - */ - static HttpRequest buildPlanRequest(Map params) { - var urlParams = params - .entrySet() - .stream() - .map(kv -> kv.getKey() + "=" + kv.getValue()) - .collect(Collectors.joining("&")); - - var uri = URI.create("http://localhost:8080/otp/routers/default/plan?" + urlParams); - - return HttpRequest.newBuilder().uri(uri).GET().build(); - } - - /** - * Sends an HTTP request to the OTP plan endpoint and deserializes the response. - */ - public static TripPlannerResponse sendPlanRequest(SmokeTestRequest req) { - var request = buildPlanRequest(req.toMap()); - LOG.info("Sending request to {}", request.uri()); - TripPlannerResponse otpResponse; - try { - var response = client.send(request, HttpResponse.BodyHandlers.ofInputStream()); - - assertEquals(200, response.statusCode(), "Status code returned by OTP server was not 200"); - otpResponse = SmokeTest.mapper.readValue(response.body(), TripPlannerResponse.class); - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } - - LOG.info( - "Request to {} returned {} itineraries", - request.uri(), - otpResponse.getPlan().itineraries.size() - ); - - return otpResponse; - } -} diff --git a/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java b/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java index 86ca08dd87f..25bafa2f1ad 100644 --- a/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java +++ b/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java @@ -1,39 +1,17 @@ package org.opentripplanner.smoketest.util; -import static java.util.Map.entry; - -import java.time.Duration; -import java.util.Collection; -import java.util.Map; import java.util.Set; -import org.opentripplanner.framework.geometry.WgsCoordinate; -import org.opentripplanner.smoketest.SmokeTest; +import org.opentripplanner.client.model.Coordinate; +import org.opentripplanner.client.model.RequestMode; public record SmokeTestRequest( - WgsCoordinate from, - WgsCoordinate to, - Collection modes, + Coordinate from, + Coordinate to, + Set modes, boolean arriveBy ) { - public SmokeTestRequest(WgsCoordinate from, WgsCoordinate to, Set modes) { + public SmokeTestRequest(Coordinate from, Coordinate to, Set modes) { this(from, to, modes, false); } - public Map toMap() { - return Map.ofEntries( - entry("fromPlace", toString(from)), - entry("toPlace", toString(to)), - entry("time", "1:00pm"), - entry("date", SmokeTest.nextMonday().toString()), - entry("mode", String.join(",", modes)), - entry("showIntermediateStops", "true"), - entry("locale", "en"), - entry("searchWindow", Long.toString(Duration.ofHours(2).toSeconds())), - entry("arriveBy", Boolean.toString(arriveBy)) - ); - } - - private static String toString(WgsCoordinate c) { - return "%s,%s".formatted(c.latitude(), c.longitude()); - } } From 26630b411ebd707d4c9c79dca5cf1d366d000162 Mon Sep 17 00:00:00 2001 From: Leonard Ehrenfried Date: Wed, 9 Aug 2023 19:20:39 +0200 Subject: [PATCH 2/9] Bump client version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4a6a9d4e7e3..3941db52d7a 100644 --- a/pom.xml +++ b/pom.xml @@ -1011,7 +1011,7 @@ org.opentripplanner otp-client - 0.0.4 + 0.0.5 test From 6071055bf72c4478659a4b6dadc238b70082d042 Mon Sep 17 00:00:00 2001 From: Leonard Ehrenfried Date: Wed, 9 Aug 2023 20:04:54 +0200 Subject: [PATCH 3/9] Fix formatting --- .../smoketest/AtlantaSmokeTest.java | 5 +---- .../opentripplanner/smoketest/SmokeTest.java | 20 +++++++++---------- .../smoketest/util/SmokeTestRequest.java | 1 - 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/test/java/org/opentripplanner/smoketest/AtlantaSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/AtlantaSmokeTest.java index 09ef914bbf7..fd6ff192f75 100644 --- a/src/test/java/org/opentripplanner/smoketest/AtlantaSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/AtlantaSmokeTest.java @@ -29,10 +29,7 @@ public class AtlantaSmokeTest { Coordinate nearGeorgiaStateStation = new Coordinate(33.74139944890028, -84.38607215881348); - Coordinate powderSpringsInsideFlexZone1 = new Coordinate( - 33.86916840022388, - -84.66315507888794 - ); + Coordinate powderSpringsInsideFlexZone1 = new Coordinate(33.86916840022388, -84.66315507888794); @Test public void regularRouteFromCentralAtlantaToPowderSprings() { diff --git a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java index 37694fff17c..ef8cab8c172 100644 --- a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java @@ -75,10 +75,7 @@ public static void assertThatThereAreVehicleRentalStations() { * Given a list of itineraries assert that at least one of them has legs that have the expected * modes. */ - static void assertThatItineraryHasModes( - List itineraries, - List expectedModes - ) { + static void assertThatItineraryHasModes(List itineraries, List expectedModes) { var itineraryModes = itineraries .stream() .map(i -> i.legs().stream().map(l -> l.mode().toString()).toList()) @@ -95,20 +92,23 @@ static void assertThatItineraryHasModes( static TripPlan basicRouteTest(SmokeTestRequest req, List expectedModes) { try { - var client = new OtpApiClient(ZoneId.of("America/New_York"), "localhost:8080"); - - TripPlan plan = client.plan(req.from(), req.to(), SmokeTest.nextMonday().atTime(LocalTime.of(12,0)), req.modes()); + var client = new OtpApiClient(ZoneId.of("America/New_York"), "localhost:8080"); + + TripPlan plan = client.plan( + req.from(), + req.to(), + SmokeTest.nextMonday().atTime(LocalTime.of(12, 0)), + req.modes() + ); var itineraries = plan.itineraries(); assertFalse(itineraries.isEmpty(), "Expected to see some itineraries but got zero."); assertThatItineraryHasModes(itineraries, expectedModes); return plan; - } catch (InterruptedException|IOException e) { + } catch (InterruptedException | IOException e) { throw new RuntimeException(e); } - - } static void assertThereArePatternsWithVehiclePositions() { diff --git a/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java b/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java index 25bafa2f1ad..8b1ea89cbad 100644 --- a/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java +++ b/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java @@ -13,5 +13,4 @@ public record SmokeTestRequest( public SmokeTestRequest(Coordinate from, Coordinate to, Set modes) { this(from, to, modes, false); } - } From 395261875739ab2d7d669f54cad23237f0f2d107 Mon Sep 17 00:00:00 2001 From: Leonard Ehrenfried Date: Thu, 10 Aug 2023 08:21:14 +0200 Subject: [PATCH 4/9] Remove our own API client --- pom.xml | 2 +- .../smoketest/SeattleSmokeTest.java | 22 +-- .../opentripplanner/smoketest/SmokeTest.java | 39 +++-- .../smoketest/util/GraphQLClient.java | 146 ------------------ 4 files changed, 35 insertions(+), 174 deletions(-) delete mode 100644 src/test/java/org/opentripplanner/smoketest/util/GraphQLClient.java diff --git a/pom.xml b/pom.xml index 3941db52d7a..475cb523576 100644 --- a/pom.xml +++ b/pom.xml @@ -1011,7 +1011,7 @@ org.opentripplanner otp-client - 0.0.5 + 0.0.7 test diff --git a/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java index 6565fb8c70c..fff55c46ae1 100644 --- a/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java @@ -16,8 +16,7 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.opentripplanner.client.model.Coordinate; -import org.opentripplanner.client.model.RequestMode; -import org.opentripplanner.smoketest.util.GraphQLClient; +import org.opentripplanner.client.model.Route; import org.opentripplanner.smoketest.util.SmokeTestRequest; @Tag("smoke-test") @@ -50,14 +49,17 @@ public void flexAndTransit() { @Test public void monorailRoute() { - var modes = GraphQLClient - .routes() - .stream() - .map(GraphQLClient.Route::mode) - .map(Objects::toString) - .collect(Collectors.toSet()); - - assertEquals(Set.of("MONORAIL", "TRAM", "FERRY", "BUS"), modes); + try { + Set modes = SmokeTest.API_CLIENT + .routes() + .stream() + .map(Route::mode) + .map(Objects::toString) + .collect(Collectors.toSet()); + assertEquals(Set.of("MONORAIL", "TRAM", "FERRY", "BUS"), modes); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } } @Test diff --git a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java index ef8cab8c172..c1c474dcd72 100644 --- a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java @@ -23,8 +23,8 @@ import org.opentripplanner.client.OtpApiClient; import org.opentripplanner.client.model.TripPlan; import org.opentripplanner.client.model.TripPlan.Itinerary; +import org.opentripplanner.client.model.VehicleRentalStation; import org.opentripplanner.model.fare.ItineraryFares; -import org.opentripplanner.smoketest.util.GraphQLClient; import org.opentripplanner.smoketest.util.SmokeTestRequest; /** @@ -38,6 +38,10 @@ public class SmokeTest { public static final ObjectMapper mapper; + public static final OtpApiClient API_CLIENT = new OtpApiClient( + ZoneId.of("America/New_York"), + "http://localhost:8080" + ); static { var provider = new JSONObjectMapperProvider(); @@ -67,8 +71,12 @@ public static LocalDate nextMonday() { } public static void assertThatThereAreVehicleRentalStations() { - var stations = GraphQLClient.vehicleRentalStations(); - assertFalse(stations.isEmpty(), "Found no vehicle rental stations."); + try { + List stations = API_CLIENT.vehicleRentalStations(); + assertFalse(stations.isEmpty(), "Found no vehicle rental stations."); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } } /** @@ -92,9 +100,7 @@ static void assertThatItineraryHasModes(List itineraries, List expectedModes) { try { - var client = new OtpApiClient(ZoneId.of("America/New_York"), "localhost:8080"); - - TripPlan plan = client.plan( + TripPlan plan = API_CLIENT.plan( req.from(), req.to(), SmokeTest.nextMonday().atTime(LocalTime.of(12, 0)), @@ -112,18 +118,17 @@ static TripPlan basicRouteTest(SmokeTestRequest req, List expectedModes) } static void assertThereArePatternsWithVehiclePositions() { - GraphQLClient.VehiclePositionResponse positions = GraphQLClient.patternWithVehiclePositionsQuery(); - - var vehiclePositions = positions - .patterns() - .stream() - .flatMap(p -> p.vehiclePositions().stream()) - .toList(); + try { + var patterns = API_CLIENT.patterns(); + var vehiclePositions = patterns.stream().flatMap(p -> p.vehiclePositions().stream()).toList(); - assertFalse( - vehiclePositions.isEmpty(), - "Found no patterns that have realtime vehicle positions." - ); + assertFalse( + vehiclePositions.isEmpty(), + "Found no patterns that have realtime vehicle positions." + ); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } } /** diff --git a/src/test/java/org/opentripplanner/smoketest/util/GraphQLClient.java b/src/test/java/org/opentripplanner/smoketest/util/GraphQLClient.java deleted file mode 100644 index 8aa30988737..00000000000 --- a/src/test/java/org/opentripplanner/smoketest/util/GraphQLClient.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.opentripplanner.smoketest.util; - -import static org.opentripplanner.smoketest.SmokeTest.mapper; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import java.io.IOException; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.util.List; -import org.opentripplanner.smoketest.SmokeTest; -import org.opentripplanner.transit.model.basic.TransitMode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GraphQLClient { - - static final Logger LOG = LoggerFactory.getLogger(GraphQLClient.class); - - static final HttpClient httpClient = HttpClient.newHttpClient(); - - public static VehiclePositionResponse patternWithVehiclePositionsQuery() { - var json = GraphQLClient.sendGraphQLRequest( - """ - query { - patterns { - vehiclePositions { - vehicleId - lastUpdated - trip { - id - gtfsId - } - stopRelationship { - status - stop { - name - } - } - } - } - } - - """ - ); - - try { - return SmokeTest.mapper.treeToValue(json, VehiclePositionResponse.class); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - public static List vehicleRentalStations() { - var json = GraphQLClient.sendGraphQLRequest( - """ - query { - vehicleRentalStations{ - name - lat - lon - realtime - vehiclesAvailable - } - } - """ - ); - - try { - List stations = SmokeTest.mapper.readValue( - json.path("vehicleRentalStations").toString(), - new TypeReference<>() {} - ); - - LOG.info("Fetched {} vehicle rental stations", stations.size()); - return stations; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static List routes() { - var json = GraphQLClient.sendGraphQLRequest( - """ - query { - routes { - shortName - mode - } - } - """ - ); - - try { - List routes = SmokeTest.mapper.readValue( - json.path("routes").toString(), - new TypeReference<>() {} - ); - - LOG.info("Fetched {} routes", routes.size()); - return routes; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static JsonNode sendGraphQLRequest(String query) { - var body = mapper.createObjectNode(); - body.put("query", query); - - try { - var bodyString = mapper.writeValueAsString(body); - - HttpRequest request = HttpRequest - .newBuilder() - .uri(URI.create("http://localhost:8080/otp/routers/default/index/graphql")) - .header("Content-Type", "application/json") - .POST(HttpRequest.BodyPublishers.ofString(bodyString)) - .build(); - HttpResponse response = httpClient.send( - request, - HttpResponse.BodyHandlers.ofString() - ); - - var responseJson = mapper.readTree(response.body()); - - LOG.info("Response JSON: {}", responseJson); - return responseJson.get("data"); - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } - } - - public record Route(String shortName, TransitMode mode) {} - - public record VehicleRentalStation(String name, float lat, float lon) {} - - public record Position(String vehicleId) {} - - public record Pattern(List vehiclePositions) {} - - public record VehiclePositionResponse(List patterns) {} -} From aa7ed7db7ce6546cacb41eff1a9c58f6bf1591cf Mon Sep 17 00:00:00 2001 From: Leonard Ehrenfried Date: Thu, 10 Aug 2023 11:11:03 +0200 Subject: [PATCH 5/9] Bump client version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 475cb523576..de7ac6ee440 100644 --- a/pom.xml +++ b/pom.xml @@ -1011,7 +1011,7 @@ org.opentripplanner otp-client - 0.0.7 + 0.0.9 test From e20e73d7f5a3b9a631a3557faa714de4bd7cf9ab Mon Sep 17 00:00:00 2001 From: Leonard Ehrenfried Date: Thu, 10 Aug 2023 12:19:07 +0200 Subject: [PATCH 6/9] Run tests next Monday --- .github/workflows/smoke-tests.yml | 7 +++++-- src/test/java/org/opentripplanner/smoketest/SmokeTest.java | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 79a50b4c81b..b6390da71da 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -53,11 +53,14 @@ jobs: restore-keys: | osm-${{ matrix.locations.name }} - - name: Run smoke tests + - name: Build graph tests + working-directory: smoke-tests run: | - cd smoke-tests make build-${{ matrix.locations.name }} + - name: Run smoke tests + working-directory: smoke-tests + run: | make run-${{ matrix.locations.name }} & # OTP needs a little while to start up so we sleep diff --git a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java index c1c474dcd72..27fa3fbdfac 100644 --- a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java @@ -67,7 +67,7 @@ public class SmokeTest { */ public static LocalDate nextMonday() { var today = LocalDate.now(); - return today.with(TemporalAdjusters.next(DayOfWeek.THURSDAY)); + return today.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); } public static void assertThatThereAreVehicleRentalStations() { From 0dc93c28d701c6d1efebe36af5be5ff4a0ec7f09 Mon Sep 17 00:00:00 2001 From: Leonard Ehrenfried Date: Thu, 10 Aug 2023 12:26:43 +0200 Subject: [PATCH 7/9] Switch to Friday --- src/test/java/org/opentripplanner/smoketest/SmokeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java index 27fa3fbdfac..5951ec860eb 100644 --- a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java @@ -67,7 +67,7 @@ public class SmokeTest { */ public static LocalDate nextMonday() { var today = LocalDate.now(); - return today.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); + return today.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)); } public static void assertThatThereAreVehicleRentalStations() { From 01533b877bad610b380cccb028d6275623d026f5 Mon Sep 17 00:00:00 2001 From: Leonard Ehrenfried Date: Thu, 10 Aug 2023 12:51:15 +0200 Subject: [PATCH 8/9] Clean up smoke tests --- .../org/opentripplanner/smoketest/SeattleSmokeTest.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java index fff55c46ae1..95f22c6485f 100644 --- a/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java @@ -48,8 +48,7 @@ public void flexAndTransit() { } @Test - public void monorailRoute() { - try { + public void monorailRoute() throws IOException, InterruptedException { Set modes = SmokeTest.API_CLIENT .routes() .stream() @@ -57,9 +56,6 @@ public void monorailRoute() { .map(Objects::toString) .collect(Collectors.toSet()); assertEquals(Set.of("MONORAIL", "TRAM", "FERRY", "BUS"), modes); - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } } @Test From 02144212915bb4525ba754793e56618b621d28ef Mon Sep 17 00:00:00 2001 From: Leonard Ehrenfried Date: Thu, 10 Aug 2023 13:28:00 +0200 Subject: [PATCH 9/9] Update to version 0.0.10 --- .github/workflows/smoke-tests.yml | 2 +- pom.xml | 2 +- .../smoketest/PortlandSmokeTest.java | 7 ++++--- .../smoketest/SeattleSmokeTest.java | 14 +++++++------- .../org/opentripplanner/smoketest/SmokeTest.java | 16 ++++++++++------ .../smoketest/util/SmokeTestRequest.java | 9 +++++++++ 6 files changed, 32 insertions(+), 18 deletions(-) diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index b6390da71da..72ec3f24f38 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -53,7 +53,7 @@ jobs: restore-keys: | osm-${{ matrix.locations.name }} - - name: Build graph tests + - name: Build graph working-directory: smoke-tests run: | make build-${{ matrix.locations.name }} diff --git a/pom.xml b/pom.xml index de7ac6ee440..5c7242ac8f2 100644 --- a/pom.xml +++ b/pom.xml @@ -1011,7 +1011,7 @@ org.opentripplanner otp-client - 0.0.9 + 0.0.10 test diff --git a/src/test/java/org/opentripplanner/smoketest/PortlandSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/PortlandSmokeTest.java index 840c8922424..538e4f9fc39 100644 --- a/src/test/java/org/opentripplanner/smoketest/PortlandSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/PortlandSmokeTest.java @@ -18,13 +18,14 @@ public class PortlandSmokeTest { Coordinate cennentenial = new Coordinate(45.504602, -122.4968719); + Coordinate buckman = new Coordinate(45.51720, -122.652289867); Coordinate hazelwood = new Coordinate(45.52463, -122.5583); Coordinate piedmont = new Coordinate(45.5746, -122.6697); Coordinate mountTaborPark = new Coordinate(45.511399, -122.594203); @Test public void railTrip() { - // this used to be across the city by since the train is interrupter in April '23 this is a + // this used to be across the city by since the train is interrupted in April '23 this is a // much shorter trip SmokeTest.basicRouteTest( new SmokeTestRequest(cennentenial, hazelwood, Set.of(TRAM, WALK)), @@ -36,11 +37,11 @@ public void railTrip() { * Checks that a scooter rental finishes at the edge of the park area and is continued on * foot rather than scootering all the way to the destination. */ - @ParameterizedTest(name = "scooter rental with arriveBy={0}") + @ParameterizedTest(name = "scooter rental in a geofencing zone with arriveBy={0}") @ValueSource(booleans = { true, false }) public void geofencingZone(boolean arriveBy) { SmokeTest.basicRouteTest( - new SmokeTestRequest(cennentenial, mountTaborPark, Set.of(SCOOTER_RENT, WALK), arriveBy), + new SmokeTestRequest(buckman, mountTaborPark, Set.of(SCOOTER_RENT, WALK), arriveBy), List.of("WALK", "SCOOTER", "WALK") ); } diff --git a/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java index 95f22c6485f..737037acd2c 100644 --- a/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SeattleSmokeTest.java @@ -49,13 +49,13 @@ public void flexAndTransit() { @Test public void monorailRoute() throws IOException, InterruptedException { - Set modes = SmokeTest.API_CLIENT - .routes() - .stream() - .map(Route::mode) - .map(Objects::toString) - .collect(Collectors.toSet()); - assertEquals(Set.of("MONORAIL", "TRAM", "FERRY", "BUS"), modes); + Set modes = SmokeTest.API_CLIENT + .routes() + .stream() + .map(Route::mode) + .map(Objects::toString) + .collect(Collectors.toSet()); + assertEquals(Set.of("MONORAIL", "TRAM", "FERRY", "BUS"), modes); } @Test diff --git a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java index 5951ec860eb..d7de1c0891c 100644 --- a/src/test/java/org/opentripplanner/smoketest/SmokeTest.java +++ b/src/test/java/org/opentripplanner/smoketest/SmokeTest.java @@ -24,6 +24,7 @@ import org.opentripplanner.client.model.TripPlan; import org.opentripplanner.client.model.TripPlan.Itinerary; import org.opentripplanner.client.model.VehicleRentalStation; +import org.opentripplanner.client.parameters.TripPlanParameters; import org.opentripplanner.model.fare.ItineraryFares; import org.opentripplanner.smoketest.util.SmokeTestRequest; @@ -100,12 +101,15 @@ static void assertThatItineraryHasModes(List itineraries, List expectedModes) { try { - TripPlan plan = API_CLIENT.plan( - req.from(), - req.to(), - SmokeTest.nextMonday().atTime(LocalTime.of(12, 0)), - req.modes() - ); + var tpr = TripPlanParameters + .builder() + .withFrom(req.from()) + .withTo(req.to()) + .withModes(req.modes()) + .withTime(SmokeTest.nextMonday().atTime(LocalTime.of(12, 0))) + .withSearchDirection(req.searchDirection()) + .build(); + var plan = API_CLIENT.plan(tpr); var itineraries = plan.itineraries(); assertFalse(itineraries.isEmpty(), "Expected to see some itineraries but got zero."); diff --git a/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java b/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java index 8b1ea89cbad..6580405a1e1 100644 --- a/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java +++ b/src/test/java/org/opentripplanner/smoketest/util/SmokeTestRequest.java @@ -3,6 +3,7 @@ import java.util.Set; import org.opentripplanner.client.model.Coordinate; import org.opentripplanner.client.model.RequestMode; +import org.opentripplanner.client.parameters.TripPlanParameters; public record SmokeTestRequest( Coordinate from, @@ -13,4 +14,12 @@ public record SmokeTestRequest( public SmokeTestRequest(Coordinate from, Coordinate to, Set modes) { this(from, to, modes, false); } + + public TripPlanParameters.SearchDirection searchDirection() { + if (arriveBy) { + return TripPlanParameters.SearchDirection.ARRIVE_BY; + } else { + return TripPlanParameters.SearchDirection.DEPART_AT; + } + } }