diff --git a/.github/workflows/test-and-build.yml b/.github/workflows/test-and-build.yml index a801eec..7842c75 100644 --- a/.github/workflows/test-and-build.yml +++ b/.github/workflows/test-and-build.yml @@ -13,6 +13,10 @@ jobs: distribution: 'temurin' java-version: '11' cache: 'maven' + - name: Run Spotless Apply + run: mvn spotless:apply + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Build with Maven run: mvn --file pom.xml clean install env: diff --git a/eclipse-java-formatter.xml b/eclipse-java-formatter.xml new file mode 100644 index 0000000..4ae144a --- /dev/null +++ b/eclipse-java-formatter.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9e1027c..d5db336 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,9 @@ UTF-8 11 11 - 2.0.3-RC6 + 2.0.3 + 2.43.0 + 1.17.0 @@ -86,6 +88,32 @@ maven-surefire-plugin 3.0.0 + + com.diffplug.spotless + spotless-maven-plugin + ${spotlessMavenPlugin.version} + + + + ${project.basedir}/eclipse-java-formatter.xml + + + + + + spotless-check + + check + + + + spotless-apply + + apply + + + + diff --git a/src/main/java/fi/hsl/transitdata/alert/AlertHandler.java b/src/main/java/fi/hsl/transitdata/alert/AlertHandler.java index 3930b6e..e470831 100644 --- a/src/main/java/fi/hsl/transitdata/alert/AlertHandler.java +++ b/src/main/java/fi/hsl/transitdata/alert/AlertHandler.java @@ -34,7 +34,8 @@ public AlertHandler(final PulsarApplicationContext context) { public void handleMessage(final Message message) { try { - if (!TransitdataSchema.hasProtobufSchema(message, TransitdataProperties.ProtobufSchema.TransitdataServiceAlert)) { + if (!TransitdataSchema.hasProtobufSchema(message, + TransitdataProperties.ProtobufSchema.TransitdataServiceAlert)) { throw new Exception("Invalid protobuf schema"); } InternalMessages.ServiceAlert alert = InternalMessages.ServiceAlert.parseFrom(message.getData()); @@ -42,7 +43,8 @@ public void handleMessage(final Message message) { final long timestampMs = message.getEventTime(); final long timestampSecs = timestampMs / 1000; - List entities = createFeedEntities(alert.getBulletinsList(), globalNoServiceAlerts); + List entities = createFeedEntities(alert.getBulletinsList(), + globalNoServiceAlerts); GtfsRealtime.FeedMessage feedMessage = FeedMessageFactory.createFullFeedMessage(entities, timestampSecs); sendPulsarMessage(feedMessage, timestampMs); @@ -54,15 +56,15 @@ public void handleMessage(final Message message) { } private void ack(MessageId received) { - consumer.acknowledgeAsync(received) - .exceptionally(throwable -> { - log.error("Failed to ack Pulsar message", throwable); - return null; - }) - .thenRun(() -> {}); + consumer.acknowledgeAsync(received).exceptionally(throwable -> { + log.error("Failed to ack Pulsar message", throwable); + return null; + }).thenRun(() -> { + }); } - static List createFeedEntities(final List bulletins, final boolean globalNoServiceAlerts) { + static List createFeedEntities(final List bulletins, + final boolean globalNoServiceAlerts) { return bulletins.stream().map(bulletin -> { final Optional maybeAlert = createAlert(bulletin, globalNoServiceAlerts); return maybeAlert.map(alert -> { @@ -71,29 +73,27 @@ static List createFeedEntities(final List createAlert(final InternalMessages.Bulletin bulletin, final boolean globalNoServiceAlerts) { + static Optional createAlert(final InternalMessages.Bulletin bulletin, + final boolean globalNoServiceAlerts) { Optional maybeAlert; try { if (bulletin.hasDisplayOnly() && bulletin.getDisplayOnly()) { - log.debug("No alert created for bulletin {} that is meant to be published only on vehicle displays", bulletin.getBulletinId()); + log.debug("No alert created for bulletin {} that is meant to be published only on vehicle displays", + bulletin.getBulletinId()); return Optional.empty(); } final long startInUtcSecs = bulletin.getValidFromUtcMs() / 1000; final long stopInUtcSecs = bulletin.getValidToUtcMs() / 1000; - final GtfsRealtime.TimeRange timeRange = GtfsRealtime.TimeRange.newBuilder() - .setStart(startInUtcSecs) - .setEnd(stopInUtcSecs) - .build(); + final GtfsRealtime.TimeRange timeRange = GtfsRealtime.TimeRange.newBuilder().setStart(startInUtcSecs) + .setEnd(stopInUtcSecs).build(); final GtfsRealtime.Alert.Builder builder = GtfsRealtime.Alert.newBuilder(); builder.addActivePeriod(timeRange); @@ -108,15 +108,16 @@ static Optional createAlert(final InternalMessages.Bulletin if (bulletin.getUrlsCount() > 0) { builder.setUrl(toGtfsTranslatedString(bulletin.getUrlsList())); } - final Optional maybeSeverityLevel = toGtfsSeverityLevel(bulletin.getPriority()); + final Optional maybeSeverityLevel = toGtfsSeverityLevel( + bulletin.getPriority()); maybeSeverityLevel.ifPresent(builder::setSeverityLevel); Collection entitySelectors = entitySelectorsForBulletin(bulletin); if (entitySelectors.isEmpty()) { - log.error("Failed to find any Informed Entities for bulletin Id {}. Discarding alert.", bulletin.getBulletinId()); + log.error("Failed to find any Informed Entities for bulletin Id {}. Discarding alert.", + bulletin.getBulletinId()); maybeAlert = Optional.empty(); - } - else { + } else { builder.addAllInformedEntity(entitySelectors); maybeAlert = Optional.of(builder.build()); } @@ -126,21 +127,24 @@ static Optional createAlert(final InternalMessages.Bulletin } maybeAlert.ifPresent(alert -> { - final Optional titleEn = alert.getHeaderText().getTranslationList().stream().filter(translation -> "en".equals(translation.getLanguage())).findAny().map(GtfsRealtime.TranslatedString.Translation::getText); - log.info("Created an alert with title {} for bulletin {}", titleEn.orElse("null"), bulletin.getBulletinId()); + final Optional titleEn = alert.getHeaderText().getTranslationList().stream() + .filter(translation -> "en".equals(translation.getLanguage())).findAny() + .map(GtfsRealtime.TranslatedString.Translation::getText); + log.info("Created an alert with title {} for bulletin {}", titleEn.orElse("null"), + bulletin.getBulletinId()); }); return maybeAlert; } - static Collection entitySelectorsForBulletin(final InternalMessages.Bulletin bulletin) { + static Collection entitySelectorsForBulletin( + final InternalMessages.Bulletin bulletin) { Set selectors = new HashSet<>(); if (bulletinAffectsAll(bulletin)) { log.debug("Bulletin {} affects all routes or stops", bulletin.getBulletinId()); GtfsRealtime.EntitySelector agency = GtfsRealtime.EntitySelector.newBuilder() - .setAgencyId(AGENCY_ENTITY_SELECTOR) - .build(); + .setAgencyId(AGENCY_ENTITY_SELECTOR).build(); selectors.add(agency); } if (bulletin.getAffectedRoutesCount() > 0) { @@ -162,72 +166,72 @@ static Collection entitySelectorsForBulletin(final return selectors; } - private void sendPulsarMessage(final GtfsRealtime.FeedMessage feedMessage, long timestampMs) throws PulsarClientException { + private void sendPulsarMessage(final GtfsRealtime.FeedMessage feedMessage, long timestampMs) + throws PulsarClientException { try { - producer.newMessage().value(feedMessage.toByteArray()) - .eventTime(timestampMs) - .property(TransitdataProperties.KEY_PROTOBUF_SCHEMA, TransitdataProperties.ProtobufSchema.GTFS_ServiceAlert.toString()) + producer.newMessage().value(feedMessage.toByteArray()).eventTime(timestampMs) + .property(TransitdataProperties.KEY_PROTOBUF_SCHEMA, + TransitdataProperties.ProtobufSchema.GTFS_ServiceAlert.toString()) .send(); log.info("Produced a new GTFS-RT service alert message with timestamp {}", timestampMs); - } - catch (PulsarClientException e) { + } catch (PulsarClientException e) { log.error("Failed to send message to Pulsar", e); throw e; - } - catch (Exception e) { + } catch (Exception e) { log.error("Failed to handle alert message", e); } } public static GtfsRealtime.Alert.Cause toGtfsCause(final InternalMessages.Category category) { switch (category) { - case OTHER_DRIVER_ERROR: - case TOO_MANY_PASSENGERS: - case MISPARKED_VEHICLE: - case TEST: - case STATE_VISIT: - case TRACK_BLOCKED: - case EARLIER_DISRUPTION: - case OTHER: - case NO_TRAFFIC_DISRUPTION: - case TRAFFIC_JAM: - case PUBLIC_EVENT: - case STAFF_DEFICIT: - case DISTURBANCE: + case OTHER_DRIVER_ERROR : + case TOO_MANY_PASSENGERS : + case MISPARKED_VEHICLE : + case TEST : + case STATE_VISIT : + case TRACK_BLOCKED : + case EARLIER_DISRUPTION : + case OTHER : + case NO_TRAFFIC_DISRUPTION : + case TRAFFIC_JAM : + case PUBLIC_EVENT : + case STAFF_DEFICIT : + case DISTURBANCE : return GtfsRealtime.Alert.Cause.OTHER_CAUSE; - case ITS_SYSTEM_ERROR: - case SWITCH_FAILURE: - case TECHNICAL_FAILURE: - case VEHICLE_BREAKDOWN: - case POWER_FAILURE: - case VEHICLE_DEFICIT: + case ITS_SYSTEM_ERROR : + case SWITCH_FAILURE : + case TECHNICAL_FAILURE : + case VEHICLE_BREAKDOWN : + case POWER_FAILURE : + case VEHICLE_DEFICIT : return GtfsRealtime.Alert.Cause.TECHNICAL_PROBLEM; - case STRIKE: + case STRIKE : return GtfsRealtime.Alert.Cause.STRIKE; - case VEHICLE_OFF_THE_ROAD: - case TRAFFIC_ACCIDENT: - case ACCIDENT: + case VEHICLE_OFF_THE_ROAD : + case TRAFFIC_ACCIDENT : + case ACCIDENT : return GtfsRealtime.Alert.Cause.ACCIDENT; - case SEIZURE: - case MEDICAL_INCIDENT: + case SEIZURE : + case MEDICAL_INCIDENT : return GtfsRealtime.Alert.Cause.MEDICAL_EMERGENCY; - case WEATHER: - case WEATHER_CONDITIONS: + case WEATHER : + case WEATHER_CONDITIONS : return GtfsRealtime.Alert.Cause.WEATHER; - case ROAD_MAINTENANCE: - case TRACK_MAINTENANCE: + case ROAD_MAINTENANCE : + case TRACK_MAINTENANCE : return GtfsRealtime.Alert.Cause.MAINTENANCE; - case ROAD_CLOSED: - case ROAD_TRENCH: + case ROAD_CLOSED : + case ROAD_TRENCH : return GtfsRealtime.Alert.Cause.CONSTRUCTION; - case ASSAULT: + case ASSAULT : return GtfsRealtime.Alert.Cause.POLICE_ACTIVITY; - default: + default : return GtfsRealtime.Alert.Cause.UNKNOWN_CAUSE; } } - public static GtfsRealtime.Alert.Effect getGtfsEffect(final InternalMessages.Bulletin bulletin, final boolean globalNoServiceAlerts) { + public static GtfsRealtime.Alert.Effect getGtfsEffect(final InternalMessages.Bulletin bulletin, + final boolean globalNoServiceAlerts) { final boolean affectsAll = bulletinAffectsAll(bulletin); final InternalMessages.Bulletin.Impact impact = bulletin.getImpact(); @@ -242,46 +246,50 @@ public static GtfsRealtime.Alert.Effect getGtfsEffect(final InternalMessages.Bul public static GtfsRealtime.Alert.Effect toGtfsEffect(final InternalMessages.Bulletin.Impact impact) { switch (impact) { - case CANCELLED: + case CANCELLED : return GtfsRealtime.Alert.Effect.NO_SERVICE; - case DELAYED: - case IRREGULAR_DEPARTURES: + case DELAYED : + case IRREGULAR_DEPARTURES : return GtfsRealtime.Alert.Effect.SIGNIFICANT_DELAYS; - case DEVIATING_SCHEDULE: - case POSSIBLE_DEVIATIONS: + case DEVIATING_SCHEDULE : + case POSSIBLE_DEVIATIONS : return GtfsRealtime.Alert.Effect.MODIFIED_SERVICE; - case DISRUPTION_ROUTE: + case DISRUPTION_ROUTE : return GtfsRealtime.Alert.Effect.DETOUR; - case POSSIBLY_DELAYED: - case VENDING_MACHINE_OUT_OF_ORDER: - case RETURNING_TO_NORMAL: - case OTHER: + case POSSIBLY_DELAYED : + case VENDING_MACHINE_OUT_OF_ORDER : + case RETURNING_TO_NORMAL : + case OTHER : return GtfsRealtime.Alert.Effect.OTHER_EFFECT; - case REDUCED_TRANSPORT: + case REDUCED_TRANSPORT : return GtfsRealtime.Alert.Effect.REDUCED_SERVICE; - case NO_TRAFFIC_IMPACT: + case NO_TRAFFIC_IMPACT : return GtfsRealtime.Alert.Effect.NO_EFFECT; - default: + default : return GtfsRealtime.Alert.Effect.UNKNOWN_EFFECT; } } - public static Optional toGtfsSeverityLevel(final InternalMessages.Bulletin.Priority priority) { + public static Optional toGtfsSeverityLevel( + final InternalMessages.Bulletin.Priority priority) { switch (priority) { - case INFO: return Optional.of(GtfsRealtime.Alert.SeverityLevel.INFO); - case WARNING: return Optional.of(GtfsRealtime.Alert.SeverityLevel.WARNING); - case SEVERE: return Optional.of(GtfsRealtime.Alert.SeverityLevel.SEVERE); - default: return Optional.empty(); + case INFO : + return Optional.of(GtfsRealtime.Alert.SeverityLevel.INFO); + case WARNING : + return Optional.of(GtfsRealtime.Alert.SeverityLevel.WARNING); + case SEVERE : + return Optional.of(GtfsRealtime.Alert.SeverityLevel.SEVERE); + default : + return Optional.empty(); } } - public static GtfsRealtime.TranslatedString toGtfsTranslatedString(final List translations) { + public static GtfsRealtime.TranslatedString toGtfsTranslatedString( + final List translations) { GtfsRealtime.TranslatedString.Builder builder = GtfsRealtime.TranslatedString.newBuilder(); - for (final InternalMessages.Bulletin.Translation translation: translations) { - GtfsRealtime.TranslatedString.Translation gtfsTranslation = GtfsRealtime.TranslatedString.Translation.newBuilder() - .setText(translation.getText()) - .setLanguage(translation.getLanguage()) - .build(); + for (final InternalMessages.Bulletin.Translation translation : translations) { + GtfsRealtime.TranslatedString.Translation gtfsTranslation = GtfsRealtime.TranslatedString.Translation + .newBuilder().setText(translation.getText()).setLanguage(translation.getLanguage()).build(); builder.addTranslation(gtfsTranslation); } return builder.build(); diff --git a/src/test/java/fi/hsl/transitdata/alert/AlertHandlerTest.java b/src/test/java/fi/hsl/transitdata/alert/AlertHandlerTest.java index af39e05..a5da7ed 100644 --- a/src/test/java/fi/hsl/transitdata/alert/AlertHandlerTest.java +++ b/src/test/java/fi/hsl/transitdata/alert/AlertHandlerTest.java @@ -99,7 +99,8 @@ private void validateMockDataFirstEntity(GtfsRealtime.FeedEntity entity) { assertFalse(selector.hasAgencyId()); assertTrue(selector.hasRouteId()); }); - assertThat(selectors.stream().map(GtfsRealtime.EntitySelector::getRouteId).collect(Collectors.toList()), hasItem("4562")); + assertThat(selectors.stream().map(GtfsRealtime.EntitySelector::getRouteId).collect(Collectors.toList()), + hasItem("4562")); GtfsRealtime.TranslatedString header = alert.getHeaderText(); assertEquals(3, header.getTranslationCount()); @@ -117,18 +118,21 @@ public void testOneFeedEntityThoroughly() throws Exception { final List bulletins = alert.getBulletinsList(); List feedEntities = AlertHandler.createFeedEntities(bulletins, true); - Optional maybeEntity = feedEntities.stream().filter(entity -> entity.getId().equals("6431")).findFirst(); + Optional maybeEntity = feedEntities.stream() + .filter(entity -> entity.getId().equals("6431")).findFirst(); assertTrue(maybeEntity.isPresent()); GtfsRealtime.Alert gtfsAlert = maybeEntity.get().getAlert(); assertEquals(AlertHandler.toGtfsCause(InternalMessages.Category.ROAD_CLOSED), gtfsAlert.getCause()); - assertEquals(AlertHandler.toGtfsEffect(InternalMessages.Bulletin.Impact.DISRUPTION_ROUTE), gtfsAlert.getEffect()); + assertEquals(AlertHandler.toGtfsEffect(InternalMessages.Bulletin.Impact.DISRUPTION_ROUTE), + gtfsAlert.getEffect()); assertEquals(1, gtfsAlert.getActivePeriodCount()); - assertEquals( 1557885600L, gtfsAlert.getActivePeriod(0).getStart()); - assertEquals( 1558198800L, gtfsAlert.getActivePeriod(0).getEnd()); + assertEquals(1557885600L, gtfsAlert.getActivePeriod(0).getStart()); + assertEquals(1558198800L, gtfsAlert.getActivePeriod(0).getEnd()); assertEquals(5, gtfsAlert.getInformedEntityCount()); - assertEquals(AlertHandler.toGtfsSeverityLevel(InternalMessages.Bulletin.Priority.INFO).get(), gtfsAlert.getSeverityLevel()); + assertEquals(AlertHandler.toGtfsSeverityLevel(InternalMessages.Bulletin.Priority.INFO).get(), + gtfsAlert.getSeverityLevel()); List entities = gtfsAlert.getInformedEntityList(); validateEntitySelectors(entities, "1230103", "1230104", "1230101", "1232102", "1232104"); @@ -137,13 +141,17 @@ public void testOneFeedEntityThoroughly() throws Exception { assertEquals(3, header.getTranslationCount()); header.getTranslationList().forEach(translation -> { switch (translation.getLanguage()) { - case "fi": assertEquals("Hämeentie suljettu 18.5. Arabian katufestivaalin ", translation.getText()); + case "fi" : + assertEquals("Hämeentie suljettu 18.5. Arabian katufestivaalin ", translation.getText()); break; - case "sv": assertEquals("Gatan avstängd", translation.getText()); + case "sv" : + assertEquals("Gatan avstängd", translation.getText()); break; - case "en": assertEquals("Road closed", translation.getText()); + case "en" : + assertEquals("Road closed", translation.getText()); break; - default: assertTrue(false); + default : + assertTrue(false); } }); @@ -151,13 +159,22 @@ public void testOneFeedEntityThoroughly() throws Exception { assertEquals(3, description.getTranslationCount()); description.getTranslationList().forEach(translation -> { switch (translation.getLanguage()) { - case "fi": assertEquals("Linjat 52, 55, 71, 78N ja 506 Arabiassa poikkeusreiteillä la 18.5. klo 9-20. /Info: hsl.fi.", translation.getText()); + case "fi" : + assertEquals( + "Linjat 52, 55, 71, 78N ja 506 Arabiassa poikkeusreiteillä la 18.5. klo 9-20. /Info: hsl.fi.", + translation.getText()); break; - case "sv": assertEquals("Linjerna 52, 55, 71, 78N och 506 kör avvikande rutter i Arabia 18.5 kl. 9-20. /Info: hsl.fi/sv", translation.getText()); + case "sv" : + assertEquals( + "Linjerna 52, 55, 71, 78N och 506 kör avvikande rutter i Arabia 18.5 kl. 9-20. /Info: hsl.fi/sv", + translation.getText()); break; - case "en": assertEquals("Buses 52, 55, 71, 78N and 506 diverted in Arabia on 18 May 9am-8pm. /Info: hsl.fi/en", translation.getText()); + case "en" : + assertEquals("Buses 52, 55, 71, 78N and 506 diverted in Arabia on 18 May 9am-8pm. /Info: hsl.fi/en", + translation.getText()); break; - default: assertTrue(false); + default : + assertTrue(false); } }); @@ -165,13 +182,17 @@ public void testOneFeedEntityThoroughly() throws Exception { assertEquals(3, url.getTranslationCount()); url.getTranslationList().forEach(translation -> { switch (translation.getLanguage()) { - case "fi": assertEquals("https://www.hsl.fi/", translation.getText()); + case "fi" : + assertEquals("https://www.hsl.fi/", translation.getText()); break; - case "sv": assertEquals("https://www.hsl.fi/sv", translation.getText()); + case "sv" : + assertEquals("https://www.hsl.fi/sv", translation.getText()); break; - case "en": assertEquals("https://www.hsl.fi/en", translation.getText()); + case "en" : + assertEquals("https://www.hsl.fi/en", translation.getText()); break; - default: assertTrue(false); + default : + assertTrue(false); } }); } @@ -189,18 +210,12 @@ private void validateEntitySelectors(Collection ent @Test public void testNoAlertIsCreatedForDisplayOnlyBulletin() { - InternalMessages.Bulletin bulletin = InternalMessages.Bulletin.newBuilder() - .setBulletinId("1") - .setAffectsAllRoutes(true) - .setAffectsAllStops(true) - .setCategory(InternalMessages.Category.STRIKE) - .setImpact(InternalMessages.Bulletin.Impact.CANCELLED) - .setValidFromUtcMs(0) - .setValidToUtcMs(Long.MAX_VALUE) - .setLastModifiedUtcMs(Instant.now().getEpochSecond()) + InternalMessages.Bulletin bulletin = InternalMessages.Bulletin.newBuilder().setBulletinId("1") + .setAffectsAllRoutes(true).setAffectsAllStops(true).setCategory(InternalMessages.Category.STRIKE) + .setImpact(InternalMessages.Bulletin.Impact.CANCELLED).setValidFromUtcMs(0) + .setValidToUtcMs(Long.MAX_VALUE).setLastModifiedUtcMs(Instant.now().getEpochSecond()) .addDescriptions(InternalMessages.Bulletin.Translation.newBuilder().setLanguage("en").setText("Test")) - .setDisplayOnly(true) - .build(); + .setDisplayOnly(true).build(); Optional alert = AlertHandler.createAlert(bulletin, true); assertFalse(alert.isPresent()); @@ -211,12 +226,9 @@ public void testEntitySelectorRouteIdsAreNormalized() { List entities = Stream.of("1009", "1009 1", "1009 6") .map(routeId -> InternalMessages.Bulletin.AffectedEntity.newBuilder().setEntityId(routeId).build()) .collect(Collectors.toList()); - InternalMessages.Bulletin bulletin = InternalMessages.Bulletin.newBuilder() - .addAllAffectedRoutes(entities) - .setLastModifiedUtcMs(System.currentTimeMillis()) - .setValidFromUtcMs(System.currentTimeMillis()) - .setValidToUtcMs(System.currentTimeMillis()) - .build(); + InternalMessages.Bulletin bulletin = InternalMessages.Bulletin.newBuilder().addAllAffectedRoutes(entities) + .setLastModifiedUtcMs(System.currentTimeMillis()).setValidFromUtcMs(System.currentTimeMillis()) + .setValidToUtcMs(System.currentTimeMillis()).build(); Collection selectors = AlertHandler.entitySelectorsForBulletin(bulletin); assertEquals(1, selectors.size()); @@ -226,18 +238,12 @@ public void testEntitySelectorRouteIdsAreNormalized() { @Test public void testNoServiceEffectIsNotUsedWhenBulletinAffectAll() { - InternalMessages.Bulletin bulletin = InternalMessages.Bulletin.newBuilder() - .setBulletinId("1") - .setAffectsAllRoutes(true) - .setAffectsAllStops(true) - .setCategory(InternalMessages.Category.STRIKE) - .setImpact(InternalMessages.Bulletin.Impact.CANCELLED) - .setValidFromUtcMs(0) - .setValidToUtcMs(Long.MAX_VALUE) - .setLastModifiedUtcMs(Instant.now().getEpochSecond()) + InternalMessages.Bulletin bulletin = InternalMessages.Bulletin.newBuilder().setBulletinId("1") + .setAffectsAllRoutes(true).setAffectsAllStops(true).setCategory(InternalMessages.Category.STRIKE) + .setImpact(InternalMessages.Bulletin.Impact.CANCELLED).setValidFromUtcMs(0) + .setValidToUtcMs(Long.MAX_VALUE).setLastModifiedUtcMs(Instant.now().getEpochSecond()) .addDescriptions(InternalMessages.Bulletin.Translation.newBuilder().setLanguage("en").setText("Test")) - .setDisplayOnly(false) - .build(); + .setDisplayOnly(false).build(); Optional alert = AlertHandler.createAlert(bulletin, false); assertTrue(alert.isPresent());