From fdfd54cc2a8cddc8352833446647d80a5687c1f6 Mon Sep 17 00:00:00 2001 From: Stas Parshin Date: Mon, 17 Jun 2019 15:41:17 +0700 Subject: [PATCH 1/2] Add ErrorHandler to UpdatesListener #168 --- .../pengrad/telegrambot/ExceptionHandler.java | 11 ++ .../com/pengrad/telegrambot/TelegramBot.java | 10 +- .../telegrambot/TelegramException.java | 24 +++ .../telegrambot/impl/UpdatesHandler.java | 25 ++- .../pengrad/telegrambot/TelegramBotTest.java | 4 +- .../telegrambot/TestGetUpdatesListener.java | 42 ----- .../telegrambot/TestLoopGetUpdates.java | 75 -------- .../telegrambot/UpdatesListenerTest.java | 160 ++++++++++++++++++ 8 files changed, 223 insertions(+), 128 deletions(-) create mode 100644 library/src/main/java/com/pengrad/telegrambot/ExceptionHandler.java create mode 100644 library/src/main/java/com/pengrad/telegrambot/TelegramException.java delete mode 100644 library/src/test/java/com/pengrad/telegrambot/TestGetUpdatesListener.java delete mode 100644 library/src/test/java/com/pengrad/telegrambot/TestLoopGetUpdates.java create mode 100644 library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java diff --git a/library/src/main/java/com/pengrad/telegrambot/ExceptionHandler.java b/library/src/main/java/com/pengrad/telegrambot/ExceptionHandler.java new file mode 100644 index 00000000..08a0ff33 --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/ExceptionHandler.java @@ -0,0 +1,11 @@ +package com.pengrad.telegrambot; + +/** + * Stas Parshin + * 14 June 2019 + */ +public interface ExceptionHandler { + + void onException(TelegramException e); + +} diff --git a/library/src/main/java/com/pengrad/telegrambot/TelegramBot.java b/library/src/main/java/com/pengrad/telegrambot/TelegramBot.java index b9fc6b3a..6f63828f 100644 --- a/library/src/main/java/com/pengrad/telegrambot/TelegramBot.java +++ b/library/src/main/java/com/pengrad/telegrambot/TelegramBot.java @@ -63,7 +63,15 @@ public void setUpdatesListener(UpdatesListener listener) { } public void setUpdatesListener(UpdatesListener listener, GetUpdates request) { - updatesHandler.start(this, listener, request); + setUpdatesListener(listener, null, request); + } + + public void setUpdatesListener(UpdatesListener listener, ExceptionHandler exceptionHandler) { + setUpdatesListener(listener, exceptionHandler, new GetUpdates()); + } + + public void setUpdatesListener(UpdatesListener listener, ExceptionHandler exceptionHandler, GetUpdates request) { + updatesHandler.start(this, listener, exceptionHandler, request); } public void removeGetUpdatesListener() { diff --git a/library/src/main/java/com/pengrad/telegrambot/TelegramException.java b/library/src/main/java/com/pengrad/telegrambot/TelegramException.java new file mode 100644 index 00000000..e7302ed2 --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/TelegramException.java @@ -0,0 +1,24 @@ +package com.pengrad.telegrambot; + +import com.pengrad.telegrambot.response.BaseResponse; + +/** + * Stas Parshin + * 17 June 2019 + */ +public class TelegramException extends Exception { + private BaseResponse response; + + public TelegramException(String message, BaseResponse response) { + super(message); + this.response = response; + } + + public TelegramException(Exception e) { + super(e); + } + + public BaseResponse response() { + return response; + } +} diff --git a/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java b/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java index acaaa65a..99300fc5 100644 --- a/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java +++ b/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java @@ -1,8 +1,6 @@ package com.pengrad.telegrambot.impl; -import com.pengrad.telegrambot.Callback; -import com.pengrad.telegrambot.TelegramBot; -import com.pengrad.telegrambot.UpdatesListener; +import com.pengrad.telegrambot.*; import com.pengrad.telegrambot.model.Update; import com.pengrad.telegrambot.request.GetUpdates; import com.pengrad.telegrambot.response.GetUpdatesResponse; @@ -22,6 +20,7 @@ public class UpdatesHandler { private TelegramBot bot; private UpdatesListener listener; + private ExceptionHandler exceptionHandler; private final long sleepTimeout; @@ -29,15 +28,17 @@ public UpdatesHandler(long sleepTimeout) { this.sleepTimeout = sleepTimeout; } - public void start(TelegramBot bot, UpdatesListener listener, GetUpdates request) { + public void start(TelegramBot bot, UpdatesListener listener, ExceptionHandler exceptionHandler, GetUpdates request) { this.bot = bot; this.listener = listener; + this.exceptionHandler = exceptionHandler; getUpdates(request); } public void stop() { bot = null; listener = null; + exceptionHandler = null; } private void getUpdates(GetUpdates request) { @@ -50,9 +51,13 @@ public void onResponse(GetUpdates request, GetUpdatesResponse response) { if (!response.isOk() || response.updates() == null || response.updates().size() <= 0) { if (!response.isOk()) { - Platform.get().log(Platform.INFO, - "Update listener error for request " + request.toWebhookResponse() + - " with response " + response.errorCode() + " " + response.description(), null); + if (exceptionHandler != null) { + exceptionHandler.onException(new TelegramException("", response)); + } else { + Platform.get().log(Platform.INFO, + "Update listener error for request " + request.toWebhookResponse() + + " with response " + response.errorCode() + " " + response.description(), null); + } } sleep(); getUpdates(request); @@ -73,7 +78,11 @@ public void onResponse(GetUpdates request, GetUpdatesResponse response) { @Override public void onFailure(GetUpdates request, IOException e) { - Platform.get().log(Platform.INFO, "Update listener failure", e); + if (exceptionHandler != null) { + exceptionHandler.onException(new TelegramException(e)); + } else { + Platform.get().log(Platform.INFO, "Update listener failure", e); + } sleep(); getUpdates(request); } diff --git a/library/src/test/java/com/pengrad/telegrambot/TelegramBotTest.java b/library/src/test/java/com/pengrad/telegrambot/TelegramBotTest.java index f56a284b..6c712f33 100644 --- a/library/src/test/java/com/pengrad/telegrambot/TelegramBotTest.java +++ b/library/src/test/java/com/pengrad/telegrambot/TelegramBotTest.java @@ -1355,7 +1355,7 @@ public void onFailure(GetMe request, IOException e) { throw new RuntimeException(e); } }); - latch.await(10, TimeUnit.SECONDS); + assertTrue(latch.await(5, TimeUnit.SECONDS)); } @Test @@ -1372,7 +1372,7 @@ public void onFailure(GetMe request, IOException e) { latch.countDown(); } }); - latch.await(10, TimeUnit.SECONDS); + assertTrue(latch.await(5, TimeUnit.SECONDS)); } @Test diff --git a/library/src/test/java/com/pengrad/telegrambot/TestGetUpdatesListener.java b/library/src/test/java/com/pengrad/telegrambot/TestGetUpdatesListener.java deleted file mode 100644 index 7e82360c..00000000 --- a/library/src/test/java/com/pengrad/telegrambot/TestGetUpdatesListener.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pengrad.telegrambot; - -import com.pengrad.telegrambot.model.Update; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.List; -import java.util.Properties; - -/** - * Stas Parshin - * 29 September 2016 - */ -public class TestGetUpdatesListener { - - public static void main(String[] args) throws IOException { - Properties properties = new Properties(); - properties.load(new FileInputStream("local.properties")); - final TelegramBot bot = new TelegramBot(properties.getProperty("TEST_TOKEN")); - - bot.setUpdatesListener(new UpdatesListener() { - - int updatesCount = 5; - - @Override - public int process(List updates) { - System.out.println(updates); - if (--updatesCount <= 0) bot.removeGetUpdatesListener(); - return UpdatesListener.CONFIRMED_UPDATES_ALL; - } - }); - - while (true) { - try { - Thread.currentThread().sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - -} diff --git a/library/src/test/java/com/pengrad/telegrambot/TestLoopGetUpdates.java b/library/src/test/java/com/pengrad/telegrambot/TestLoopGetUpdates.java deleted file mode 100644 index 06ec67eb..00000000 --- a/library/src/test/java/com/pengrad/telegrambot/TestLoopGetUpdates.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.pengrad.telegrambot; - -import com.pengrad.telegrambot.model.Chat; -import com.pengrad.telegrambot.model.Message; -import com.pengrad.telegrambot.model.Update; -import com.pengrad.telegrambot.model.User; -import com.pengrad.telegrambot.request.GetUpdates; -import com.pengrad.telegrambot.request.SetWebhook; -import com.pengrad.telegrambot.response.GetUpdatesResponse; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.List; -import java.util.Properties; - -/** - * stas - * 3/31/16. - */ -public class TestLoopGetUpdates { - - // TODO write proper tests - // 1. Exception in UpdateListener will fail and stop update handler - // 2. Exception in lib will be logged and updates continue - // 3. Bad response from API will be logged and updates continue - - public static void main(String[] args) throws Exception { - Properties properties = new Properties(); - properties.load(new FileInputStream("library/local.properties")); - TelegramBot bot = new TelegramBot.Builder(properties.getProperty("TEST_TOKEN")) -// .okHttpClient(new OkHttpClient.Builder().readTimeout(Duration.ofSeconds(1)).build()) - .updateListenerSleep(1000) - .build(); - -// bot.execute(new SetWebhook().url("https://google.com")); - bot.execute(new SetWebhook()); - - bot.setUpdatesListener(updates -> { - System.out.println("update"); -// updates.get(0).callbackQuery().chatInstance(); - return UpdatesListener.CONFIRMED_UPDATES_ALL; - }, new GetUpdates().timeout(1)); - } - - public static void main2(String[] args) throws IOException { - Properties properties = new Properties(); - properties.load(new FileInputStream("local.properties")); - TelegramBot bot = new TelegramBot(properties.getProperty("TEST_TOKEN")); - - GetUpdatesResponse updatesResponse; - int j = 0; - while (true) { - try { - updatesResponse = bot.execute(new GetUpdates().offset(j).limit(100).timeout(20)); - List updates = updatesResponse.updates(); - for (int z = 0; z < updates.size(); z++) { - j = updates.get(z).updateId() + 1; - Message message = updates.get(z).message(); - // - Chat chat = message.chat(); - User user = message.from(); - //String mes=message.text(); - - // Base64.getEncoder().encodeToString(s.getBytes(StandardCharsets.UTF_8)); - if (message.text() != null) { - System.out.println("New message: " + message.text() + " id: " + message.messageId() + " from " + chat); - } - - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } -} diff --git a/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java b/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java new file mode 100644 index 00000000..340868ff --- /dev/null +++ b/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java @@ -0,0 +1,160 @@ +package com.pengrad.telegrambot; + +import com.pengrad.telegrambot.model.Update; +import okhttp3.*; +import org.junit.Before; +import org.junit.Test; + +import java.io.FileInputStream; +import java.time.Duration; +import java.util.Properties; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.logging.ConsoleHandler; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +import static org.junit.Assert.*; + +/** + * Stas Parshin + * 17 June 2019 + */ +public class UpdatesListenerTest { + + private static String token() { + String token; + try { + Properties properties = new Properties(); + properties.load(new FileInputStream("local.properties")); + token = properties.getProperty("TEST_TOKEN"); + } catch (Exception e) { + token = System.getenv("TEST_TOKEN"); + } + return token; + } + + private TelegramBot bot; + + @Before + public void initBot() { + bot = new TelegramBot.Builder(token()).debug().build(); + } + + @Test + public void receiveUpdates() throws InterruptedException { + withLatch(1, latch -> { + AtomicInteger i = new AtomicInteger(1); + bot = new TelegramBot.Builder(token()) + .okHttpClient(new OkHttpClient.Builder() + .addInterceptor(chain -> { + Response response = new Response.Builder() + .request(chain.request()) + .protocol(Protocol.HTTP_2) + .code(1) + .message("") + .build(); + response = response.newBuilder().body(ResponseBody + .create(MediaType.parse("application/json"), + "{\"ok\":true,\"result\":[{\"update_id\":" + i.getAndIncrement() + "}]}" + )).build(); + return response; + }) + .build()) + .build(); + bot.setUpdatesListener(updates -> { + Update u = updates.get(0); + switch (u.updateId()) { + case 1: + return UpdatesListener.CONFIRMED_UPDATES_NONE; + case 2: + return UpdatesListener.CONFIRMED_UPDATES_ALL; + case 3: + return 3; + default: { + latch.countDown(); + return 0; + } + } + }); + }); + bot.removeGetUpdatesListener(); + } + + @Test + public void telegramError() throws InterruptedException { + withLatch(3, latch -> { + bot = new TelegramBot("bad_token"); + bot.setUpdatesListener(updates -> 0, e -> { + assertFalse(e.response().isOk()); + assertEquals(404, e.response().errorCode()); + assertNull(e.getCause()); + latch.countDown(); + }); + }); + } + + @Test + public void telegramErrorLogging() throws InterruptedException { + withLatch(3, latch -> { + bot = new TelegramBot("bad_token"); + bot.setUpdatesListener(updates -> 0); + Logger logger = Logger.getLogger(OkHttpClient.class.getName()); + logger.addHandler(new OneShotHandler(() -> { + System.out.println("get log"); + latch.countDown(); + })); + }); + } + + + @Test + public void ioError() throws InterruptedException { + withLatch(1, (latch) -> { + bot = new TelegramBot.Builder(token()) + .okHttpClient(new OkHttpClient.Builder().callTimeout(Duration.ofMillis(1)).build()) + .build(); + bot.setUpdatesListener(updates -> 0, e -> { + assertNull(e.response()); + latch.countDown(); + }); + }); + } + + @Test + public void ioErrorLogging() throws Exception { + withLatch(1, (latch) -> { + bot = new TelegramBot.Builder(token()) + .okHttpClient(new OkHttpClient.Builder().callTimeout(Duration.ofMillis(1)).build()) + .build(); + bot.setUpdatesListener(updates -> 0); + Logger logger = Logger.getLogger(OkHttpClient.class.getName()); + logger.addHandler(new OneShotHandler(() -> { + System.out.println("get log"); + latch.countDown(); + })); + }); + } + + private void withLatch(int secTimeout, Consumer body) throws InterruptedException { + CountDownLatch latch = new CountDownLatch(1); + body.accept(latch); + assertTrue(latch.await(secTimeout, TimeUnit.SECONDS)); + } + + private static class OneShotHandler extends ConsoleHandler { + Runnable runnable; + + public OneShotHandler(Runnable runnable) { + this.runnable = runnable; + } + + @Override + public void publish(LogRecord record) { + if (runnable != null) runnable.run(); + runnable = null; + } + } +} From c8d80bb674d5e40e0eada398bbb5f7000da2e873 Mon Sep 17 00:00:00 2001 From: Stas Parshin Date: Tue, 18 Jun 2019 11:21:14 +0700 Subject: [PATCH 2/2] Update exception message --- .../java/com/pengrad/telegrambot/impl/UpdatesHandler.java | 4 +++- .../java/com/pengrad/telegrambot/UpdatesListenerTest.java | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java b/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java index 99300fc5..84af9c7c 100644 --- a/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java +++ b/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java @@ -52,7 +52,9 @@ public void onResponse(GetUpdates request, GetUpdatesResponse response) { if (!response.isOk() || response.updates() == null || response.updates().size() <= 0) { if (!response.isOk()) { if (exceptionHandler != null) { - exceptionHandler.onException(new TelegramException("", response)); + String message = "GetUpdates failed with error_code " + + response.errorCode() + " " + response.description(); + exceptionHandler.onException(new TelegramException(message, response)); } else { Platform.get().log(Platform.INFO, "Update listener error for request " + request.toWebhookResponse() + diff --git a/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java b/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java index 340868ff..859c606f 100644 --- a/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java +++ b/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java @@ -86,10 +86,10 @@ public void receiveUpdates() throws InterruptedException { @Test public void telegramError() throws InterruptedException { withLatch(3, latch -> { - bot = new TelegramBot("bad_token"); + bot = new TelegramBot("12312312:token"); bot.setUpdatesListener(updates -> 0, e -> { assertFalse(e.response().isOk()); - assertEquals(404, e.response().errorCode()); + assertEquals(401, e.response().errorCode()); assertNull(e.getCause()); latch.countDown(); }); @@ -99,7 +99,7 @@ public void telegramError() throws InterruptedException { @Test public void telegramErrorLogging() throws InterruptedException { withLatch(3, latch -> { - bot = new TelegramBot("bad_token"); + bot = new TelegramBot("12312312:token"); bot.setUpdatesListener(updates -> 0); Logger logger = Logger.getLogger(OkHttpClient.class.getName()); logger.addHandler(new OneShotHandler(() -> {