From 3c62b1d86a1e34156ff4ceae22273553a4a1fe0b Mon Sep 17 00:00:00 2001 From: Enrico Martelli Date: Sun, 21 Sep 2025 19:41:10 +0200 Subject: [PATCH 1/6] Fix rogue api requests that spammed the logs during tests --- .../stickerify/bot/Stickerify.java | 8 +- .../stickerifier/stickerify/runner/Main.java | 10 +- .../stickerify/bot/MockResponses.java | 6 + .../stickerify/bot/StickerifyTest.java | 295 +++++++++--------- 4 files changed, 171 insertions(+), 148 deletions(-) diff --git a/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java b/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java index ab995e4b..c4e5043e 100644 --- a/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java +++ b/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java @@ -48,7 +48,7 @@ * * @author Roberto Cella */ -public record Stickerify(TelegramBot bot, Executor executor) implements UpdatesListener, ExceptionHandler { +public record Stickerify(TelegramBot bot, Executor executor) implements UpdatesListener, ExceptionHandler, AutoCloseable { private static final Logger LOGGER = LoggerFactory.getLogger(Stickerify.class); private static final String BOT_TOKEN = System.getenv("STICKERIFY_TOKEN"); @@ -91,6 +91,12 @@ public void onException(TelegramException e) { LOGGER.atError().log("There was an unexpected failure: {}", e.getMessage()); } + @Override + public void close() { + bot.removeGetUpdatesListener(); + bot.shutdown(); + } + private void answer(TelegramRequest request) { var file = request.getFile(); diff --git a/src/main/java/com/github/stickerifier/stickerify/runner/Main.java b/src/main/java/com/github/stickerifier/stickerify/runner/Main.java index 936e5b6b..b464947b 100644 --- a/src/main/java/com/github/stickerifier/stickerify/runner/Main.java +++ b/src/main/java/com/github/stickerifier/stickerify/runner/Main.java @@ -3,7 +3,15 @@ import com.github.stickerifier.stickerify.bot.Stickerify; public class Main { + static final Object LOCK = new Object(); + public static void main(String[] args) { - new Stickerify(); + try (var _ = new Stickerify()) { + synchronized (LOCK) { + LOCK.wait(); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } } } diff --git a/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java b/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java index 9b2e9e61..76f73e71 100644 --- a/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java +++ b/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java @@ -8,6 +8,12 @@ public final class MockResponses { + static final MockResponse EMPTY_UPDATES = new MockResponse.Builder().body(""" + { + ok: true + } + """).build(); + static final MockResponse START_MESSAGE = new MockResponse.Builder().body(""" { ok: true, diff --git a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java index 67e00c50..7c33e850 100644 --- a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java +++ b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java @@ -12,6 +12,7 @@ import com.github.stickerifier.stickerify.telegram.Answer; import com.pengrad.telegrambot.TelegramBot; import mockwebserver3.MockWebServer; +import mockwebserver3.QueueDispatcher; import mockwebserver3.RecordedRequest; import mockwebserver3.junit5.StartStop; import org.junit.jupiter.api.Tag; @@ -30,24 +31,26 @@ class StickerifyTest { void startMessage() throws Exception { server.enqueue(MockResponses.START_MESSAGE); - startBot(); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.HELP); + var sendMessage = server.takeRequest(); + assertEquals("/api/token/sendMessage", sendMessage.getTarget()); + assertResponseContainsMessage(sendMessage, Answer.HELP); + } } - private void startBot() { + private Stickerify startBot() { + ((QueueDispatcher)server.getDispatcher()).setFailFast(MockResponses.EMPTY_UPDATES); + var bot = new TelegramBot.Builder("token") .apiUrl(server.url("api/").toString()) .fileApiUrl(server.url("files/").toString()) .updateListenerSleep(500) .build(); - new Stickerify(bot, Runnable::run); + return new Stickerify(bot, Runnable::run); } private static void assertResponseContainsMessage(RecordedRequest request, Answer answer) { @@ -60,56 +63,56 @@ private static void assertResponseContainsMessage(RecordedRequest request, Answe void helpMessage() throws Exception { server.enqueue(MockResponses.HELP_MESSAGE); - startBot(); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.HELP); + var sendMessage = server.takeRequest(); + assertEquals("/api/token/sendMessage", sendMessage.getTarget()); + assertResponseContainsMessage(sendMessage, Answer.HELP); + } } @Test void privacyMessage() throws Exception { server.enqueue(MockResponses.PRIVACY_MESSAGE); - startBot(); - - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.PRIVACY_POLICY); + var sendMessage = server.takeRequest(); + assertEquals("/api/token/sendMessage", sendMessage.getTarget()); + assertResponseContainsMessage(sendMessage, Answer.PRIVACY_POLICY); + } } @Test void fileNotSupported() throws Exception { server.enqueue(MockResponses.FILE_NOT_SUPPORTED); - startBot(); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.ERROR); + var sendMessage = server.takeRequest(); + assertEquals("/api/token/sendMessage", sendMessage.getTarget()); + assertResponseContainsMessage(sendMessage, Answer.ERROR); + } } @Test void fileTooBig() throws Exception { server.enqueue(MockResponses.FILE_TOO_BIG); - startBot(); - - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.FILE_TOO_LARGE); + var sendMessage = server.takeRequest(); + assertEquals("/api/token/sendMessage", sendMessage.getTarget()); + assertResponseContainsMessage(sendMessage, Answer.FILE_TOO_LARGE); + } } @Test @@ -118,22 +121,22 @@ void fileAlreadyValid() throws Exception { server.enqueue(MockResponses.fileInfo("animated_sticker.tgs")); server.enqueue(MockResponses.fileDownload(loadResource("animated_sticker.tgs"))); - startBot(); - - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getFile = server.takeRequest(); - assertEquals("/api/token/getFile", getFile.getTarget()); - assertNotNull(getFile.getBody()); - assertEquals("file_id=animated_sticker.tgs", getFile.getBody().utf8()); + var getFile = server.takeRequest(); + assertEquals("/api/token/getFile", getFile.getTarget()); + assertNotNull(getFile.getBody()); + assertEquals("file_id=animated_sticker.tgs", getFile.getBody().utf8()); - var download = server.takeRequest(); - assertEquals("/files/token/animated_sticker.tgs", download.getTarget()); + var download = server.takeRequest(); + assertEquals("/files/token/animated_sticker.tgs", download.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.FILE_ALREADY_VALID); + var sendMessage = server.takeRequest(); + assertEquals("/api/token/sendMessage", sendMessage.getTarget()); + assertResponseContainsMessage(sendMessage, Answer.FILE_ALREADY_VALID); + } } @Test @@ -142,23 +145,23 @@ void convertedPng() throws Exception { server.enqueue(MockResponses.fileInfo("big.png")); server.enqueue(MockResponses.fileDownload(loadResource("big.png"))); - startBot(); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var getFile = server.takeRequest(); + assertEquals("/api/token/getFile", getFile.getTarget()); + assertNotNull(getFile.getBody()); + assertEquals("file_id=big.png", getFile.getBody().utf8()); - var getFile = server.takeRequest(); - assertEquals("/api/token/getFile", getFile.getTarget()); - assertNotNull(getFile.getBody()); - assertEquals("file_id=big.png", getFile.getBody().utf8()); + var download = server.takeRequest(); + assertEquals("/files/token/big.png", download.getTarget()); - var download = server.takeRequest(); - assertEquals("/files/token/big.png", download.getTarget()); - - var sendDocument = server.takeRequest(); - assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + var sendDocument = server.takeRequest(); + assertEquals("/api/token/sendDocument", sendDocument.getTarget()); + assertNotNull(sendDocument.getBody()); + assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + } } @Test @@ -167,23 +170,23 @@ void convertedWebp() throws Exception { server.enqueue(MockResponses.fileInfo("static.webp")); server.enqueue(MockResponses.fileDownload(loadResource("static.webp"))); - startBot(); - - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getFile = server.takeRequest(); - assertEquals("/api/token/getFile", getFile.getTarget()); - assertNotNull(getFile.getBody()); - assertEquals("file_id=static.webp", getFile.getBody().utf8()); + var getFile = server.takeRequest(); + assertEquals("/api/token/getFile", getFile.getTarget()); + assertNotNull(getFile.getBody()); + assertEquals("file_id=static.webp", getFile.getBody().utf8()); - var download = server.takeRequest(); - assertEquals("/files/token/static.webp", download.getTarget()); + var download = server.takeRequest(); + assertEquals("/files/token/static.webp", download.getTarget()); - var sendDocument = server.takeRequest(); - assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + var sendDocument = server.takeRequest(); + assertEquals("/api/token/sendDocument", sendDocument.getTarget()); + assertNotNull(sendDocument.getBody()); + assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + } } @Test @@ -192,23 +195,23 @@ void convertedMov() throws Exception { server.enqueue(MockResponses.fileInfo("long.mov")); server.enqueue(MockResponses.fileDownload(loadResource("long.mov"))); - startBot(); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var getFile = server.takeRequest(); + assertEquals("/api/token/getFile", getFile.getTarget()); + assertNotNull(getFile.getBody()); + assertEquals("file_id=long.mov", getFile.getBody().utf8()); - var getFile = server.takeRequest(); - assertEquals("/api/token/getFile", getFile.getTarget()); - assertNotNull(getFile.getBody()); - assertEquals("file_id=long.mov", getFile.getBody().utf8()); + var download = server.takeRequest(); + assertEquals("/files/token/long.mov", download.getTarget()); - var download = server.takeRequest(); - assertEquals("/files/token/long.mov", download.getTarget()); - - var sendDocument = server.takeRequest(); - assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + var sendDocument = server.takeRequest(); + assertEquals("/api/token/sendDocument", sendDocument.getTarget()); + assertNotNull(sendDocument.getBody()); + assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + } } @Test @@ -217,23 +220,23 @@ void convertedWebm() throws Exception { server.enqueue(MockResponses.fileInfo("short_low_fps.webm")); server.enqueue(MockResponses.fileDownload(loadResource("short_low_fps.webm"))); - startBot(); - - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getFile = server.takeRequest(); - assertEquals("/api/token/getFile", getFile.getTarget()); - assertNotNull(getFile.getBody()); - assertEquals("file_id=short_low_fps.webm", getFile.getBody().utf8()); + var getFile = server.takeRequest(); + assertEquals("/api/token/getFile", getFile.getTarget()); + assertNotNull(getFile.getBody()); + assertEquals("file_id=short_low_fps.webm", getFile.getBody().utf8()); - var download = server.takeRequest(); - assertEquals("/files/token/short_low_fps.webm", download.getTarget()); + var download = server.takeRequest(); + assertEquals("/files/token/short_low_fps.webm", download.getTarget()); - var sendDocument = server.takeRequest(); - assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + var sendDocument = server.takeRequest(); + assertEquals("/api/token/sendDocument", sendDocument.getTarget()); + assertNotNull(sendDocument.getBody()); + assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + } } @Test @@ -242,23 +245,23 @@ void convertedGif() throws Exception { server.enqueue(MockResponses.fileInfo("valid.gif")); server.enqueue(MockResponses.fileDownload(loadResource("valid.gif"))); - startBot(); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var getFile = server.takeRequest(); + assertEquals("/api/token/getFile", getFile.getTarget()); + assertNotNull(getFile.getBody()); + assertEquals("file_id=valid.gif", getFile.getBody().utf8()); - var getFile = server.takeRequest(); - assertEquals("/api/token/getFile", getFile.getTarget()); - assertNotNull(getFile.getBody()); - assertEquals("file_id=valid.gif", getFile.getBody().utf8()); + var download = server.takeRequest(); + assertEquals("/files/token/valid.gif", download.getTarget()); - var download = server.takeRequest(); - assertEquals("/files/token/valid.gif", download.getTarget()); - - var sendDocument = server.takeRequest(); - assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + var sendDocument = server.takeRequest(); + assertEquals("/api/token/sendDocument", sendDocument.getTarget()); + assertNotNull(sendDocument.getBody()); + assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + } } @Test @@ -267,22 +270,22 @@ void documentNotSupported() throws Exception { server.enqueue(MockResponses.fileInfo("document.txt")); server.enqueue(MockResponses.fileDownload(loadResource("document.txt"))); - startBot(); - - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getFile = server.takeRequest(); - assertEquals("/api/token/getFile", getFile.getTarget()); - assertNotNull(getFile.getBody()); - assertEquals("file_id=document.txt", getFile.getBody().utf8()); + var getFile = server.takeRequest(); + assertEquals("/api/token/getFile", getFile.getTarget()); + assertNotNull(getFile.getBody()); + assertEquals("file_id=document.txt", getFile.getBody().utf8()); - var download = server.takeRequest(); - assertEquals("/files/token/document.txt", download.getTarget()); + var download = server.takeRequest(); + assertEquals("/files/token/document.txt", download.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.ERROR); + var sendMessage = server.takeRequest(); + assertEquals("/api/token/sendMessage", sendMessage.getTarget()); + assertResponseContainsMessage(sendMessage, Answer.ERROR); + } } @Test @@ -291,21 +294,21 @@ void corruptedVideo() throws Exception { server.enqueue(MockResponses.fileInfo("corrupted.mp4")); server.enqueue(MockResponses.fileDownload(loadResource("corrupted.mp4"))); - startBot(); - - var getUpdates = server.takeRequest(); - assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + try (var _ = startBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var getFile = server.takeRequest(); - assertEquals("/api/token/getFile", getFile.getTarget()); - assertNotNull(getFile.getBody()); - assertEquals("file_id=corrupted.mp4", getFile.getBody().utf8()); + var getFile = server.takeRequest(); + assertEquals("/api/token/getFile", getFile.getTarget()); + assertNotNull(getFile.getBody()); + assertEquals("file_id=corrupted.mp4", getFile.getBody().utf8()); - var download = server.takeRequest(); - assertEquals("/files/token/corrupted.mp4", download.getTarget()); + var download = server.takeRequest(); + assertEquals("/files/token/corrupted.mp4", download.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.CORRUPTED); + var sendMessage = server.takeRequest(); + assertEquals("/api/token/sendMessage", sendMessage.getTarget()); + assertResponseContainsMessage(sendMessage, Answer.CORRUPTED); + } } } From a85e7c5df374f42935846574dcae41436445d4eb Mon Sep 17 00:00:00 2001 From: Enrico Martelli Date: Sun, 21 Sep 2025 19:59:34 +0200 Subject: [PATCH 2/6] Simplify usage a bit --- .../stickerify/bot/MockResponses.java | 10 ++--- .../stickerify/bot/StickerifyTest.java | 45 +++++++++---------- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java b/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java index 76f73e71..a047ee7f 100644 --- a/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java +++ b/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java @@ -1,11 +1,10 @@ package com.github.stickerifier.stickerify.bot; +import com.github.stickerifier.stickerify.ResourceHelper; import mockwebserver3.MockResponse; import okio.Buffer; import okio.Okio; -import java.io.File; - public final class MockResponses { static final MockResponse EMPTY_UPDATES = new MockResponse.Builder().body(""" @@ -320,7 +319,7 @@ public final class MockResponses { } """).build(); - static MockResponse fileInfo(String id) { + static MockResponse fileInfo(String fileName) { return new MockResponse.Builder().body(""" { ok: true, @@ -329,10 +328,11 @@ static MockResponse fileInfo(String id) { file_path: "%1$s" } } - """.formatted(id)).build(); + """.formatted(fileName)).build(); } - static MockResponse fileDownload(File file) throws Exception { + static MockResponse fileDownload(String fileName) throws Exception { + var file = ResourceHelper.loadResource(fileName); try (var buffer = new Buffer(); var source = Okio.source(file)) { buffer.writeAll(source); return new MockResponse.Builder().body(buffer).build(); diff --git a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java index 7c33e850..e66eaf36 100644 --- a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java +++ b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java @@ -1,6 +1,5 @@ package com.github.stickerifier.stickerify.bot; -import static com.github.stickerifier.stickerify.ResourceHelper.loadResource; import static java.nio.charset.StandardCharsets.UTF_8; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -31,7 +30,7 @@ class StickerifyTest { void startMessage() throws Exception { server.enqueue(MockResponses.START_MESSAGE); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -41,7 +40,7 @@ void startMessage() throws Exception { } } - private Stickerify startBot() { + private Stickerify runBot() { ((QueueDispatcher)server.getDispatcher()).setFailFast(MockResponses.EMPTY_UPDATES); var bot = new TelegramBot.Builder("token") @@ -63,7 +62,7 @@ private static void assertResponseContainsMessage(RecordedRequest request, Answe void helpMessage() throws Exception { server.enqueue(MockResponses.HELP_MESSAGE); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -77,7 +76,7 @@ void helpMessage() throws Exception { void privacyMessage() throws Exception { server.enqueue(MockResponses.PRIVACY_MESSAGE); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -91,7 +90,7 @@ void privacyMessage() throws Exception { void fileNotSupported() throws Exception { server.enqueue(MockResponses.FILE_NOT_SUPPORTED); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -105,7 +104,7 @@ void fileNotSupported() throws Exception { void fileTooBig() throws Exception { server.enqueue(MockResponses.FILE_TOO_BIG); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -119,9 +118,9 @@ void fileTooBig() throws Exception { void fileAlreadyValid() throws Exception { server.enqueue(MockResponses.ANIMATED_STICKER); server.enqueue(MockResponses.fileInfo("animated_sticker.tgs")); - server.enqueue(MockResponses.fileDownload(loadResource("animated_sticker.tgs"))); + server.enqueue(MockResponses.fileDownload("animated_sticker.tgs")); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -143,9 +142,9 @@ void fileAlreadyValid() throws Exception { void convertedPng() throws Exception { server.enqueue(MockResponses.PNG_FILE); server.enqueue(MockResponses.fileInfo("big.png")); - server.enqueue(MockResponses.fileDownload(loadResource("big.png"))); + server.enqueue(MockResponses.fileDownload("big.png")); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -168,9 +167,9 @@ void convertedPng() throws Exception { void convertedWebp() throws Exception { server.enqueue(MockResponses.WEBP_FILE); server.enqueue(MockResponses.fileInfo("static.webp")); - server.enqueue(MockResponses.fileDownload(loadResource("static.webp"))); + server.enqueue(MockResponses.fileDownload("static.webp")); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -193,9 +192,9 @@ void convertedWebp() throws Exception { void convertedMov() throws Exception { server.enqueue(MockResponses.MOV_FILE); server.enqueue(MockResponses.fileInfo("long.mov")); - server.enqueue(MockResponses.fileDownload(loadResource("long.mov"))); + server.enqueue(MockResponses.fileDownload("long.mov")); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -218,9 +217,9 @@ void convertedMov() throws Exception { void convertedWebm() throws Exception { server.enqueue(MockResponses.WEBM_FILE); server.enqueue(MockResponses.fileInfo("short_low_fps.webm")); - server.enqueue(MockResponses.fileDownload(loadResource("short_low_fps.webm"))); + server.enqueue(MockResponses.fileDownload("short_low_fps.webm")); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -243,9 +242,9 @@ void convertedWebm() throws Exception { void convertedGif() throws Exception { server.enqueue(MockResponses.GIF_FILE); server.enqueue(MockResponses.fileInfo("valid.gif")); - server.enqueue(MockResponses.fileDownload(loadResource("valid.gif"))); + server.enqueue(MockResponses.fileDownload("valid.gif")); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -268,9 +267,9 @@ void convertedGif() throws Exception { void documentNotSupported() throws Exception { server.enqueue(MockResponses.DOCUMENT); server.enqueue(MockResponses.fileInfo("document.txt")); - server.enqueue(MockResponses.fileDownload(loadResource("document.txt"))); + server.enqueue(MockResponses.fileDownload("document.txt")); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); @@ -292,9 +291,9 @@ void documentNotSupported() throws Exception { void corruptedVideo() throws Exception { server.enqueue(MockResponses.CORRUPTED_FILE); server.enqueue(MockResponses.fileInfo("corrupted.mp4")); - server.enqueue(MockResponses.fileDownload(loadResource("corrupted.mp4"))); + server.enqueue(MockResponses.fileDownload("corrupted.mp4")); - try (var _ = startBot()) { + try (var _ = runBot()) { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); From 29b4cc421332585a2dc055d6ec988c2e81cbfbd5 Mon Sep 17 00:00:00 2001 From: Enrico Martelli Date: Sun, 21 Sep 2025 20:20:56 +0200 Subject: [PATCH 3/6] Allow AutoClosable to close properly on JVM shutdown --- .../com/github/stickerifier/stickerify/runner/Main.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/github/stickerifier/stickerify/runner/Main.java b/src/main/java/com/github/stickerifier/stickerify/runner/Main.java index b464947b..6854324c 100644 --- a/src/main/java/com/github/stickerifier/stickerify/runner/Main.java +++ b/src/main/java/com/github/stickerifier/stickerify/runner/Main.java @@ -7,6 +7,12 @@ public class Main { public static void main(String[] args) { try (var _ = new Stickerify()) { + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + synchronized (LOCK) { + LOCK.notifyAll(); + } + })); + synchronized (LOCK) { LOCK.wait(); } From 0d1742c567e64b6d125b4ac0278120deeef7f64a Mon Sep 17 00:00:00 2001 From: Enrico Martelli Date: Sun, 21 Sep 2025 20:36:47 +0200 Subject: [PATCH 4/6] Allow also ExecutorService to close properly --- .../com/github/stickerifier/stickerify/bot/Stickerify.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java b/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java index c4e5043e..a5937223 100644 --- a/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java +++ b/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java @@ -41,6 +41,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadFactory; /** @@ -94,6 +95,11 @@ public void onException(TelegramException e) { @Override public void close() { bot.removeGetUpdatesListener(); + + if (executor instanceof ExecutorService es) { + es.close(); + } + bot.shutdown(); } From f17486bde6ff2e3d34f92d75c322e1084df5c402 Mon Sep 17 00:00:00 2001 From: Enrico Martelli Date: Sun, 21 Sep 2025 20:55:08 +0200 Subject: [PATCH 5/6] Use @BeforeEach method to set failFast response --- .../stickerifier/stickerify/bot/StickerifyTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java index e66eaf36..6228ec51 100644 --- a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java +++ b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java @@ -14,6 +14,7 @@ import mockwebserver3.QueueDispatcher; import mockwebserver3.RecordedRequest; import mockwebserver3.junit5.StartStop; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -26,6 +27,11 @@ class StickerifyTest { @StartStop private final MockWebServer server = new MockWebServer(); + @BeforeEach + public void setup() { + ((QueueDispatcher) server.getDispatcher()).setFailFast(MockResponses.EMPTY_UPDATES); + } + @Test void startMessage() throws Exception { server.enqueue(MockResponses.START_MESSAGE); @@ -41,8 +47,6 @@ void startMessage() throws Exception { } private Stickerify runBot() { - ((QueueDispatcher)server.getDispatcher()).setFailFast(MockResponses.EMPTY_UPDATES); - var bot = new TelegramBot.Builder("token") .apiUrl(server.url("api/").toString()) .fileApiUrl(server.url("files/").toString()) From b5dc25ed0bc756f9cd91877d1f221ed31947b4d0 Mon Sep 17 00:00:00 2001 From: Enrico Martelli Date: Fri, 26 Sep 2025 22:08:33 +0200 Subject: [PATCH 6/6] Make setup method package private --- .../com/github/stickerifier/stickerify/bot/StickerifyTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java index 6228ec51..9e1f31c8 100644 --- a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java +++ b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java @@ -28,7 +28,7 @@ class StickerifyTest { private final MockWebServer server = new MockWebServer(); @BeforeEach - public void setup() { + void setup() { ((QueueDispatcher) server.getDispatcher()).setFailFast(MockResponses.EMPTY_UPDATES); }