From 5741e4ba97e3c5a8d222101c992629acf6b1ce5b Mon Sep 17 00:00:00 2001 From: vsubhuman Date: Wed, 2 Aug 2017 23:58:58 +0300 Subject: [PATCH 1/4] #269 Fixed update queue polling order and added `TelegramBatchLongPollingBot` --- .../bots/TelegramBatchLongPollingBot.java | 16 +++++++ .../updatesreceivers/DefaultBotSession.java | 42 +++++++++++++++---- 2 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 telegrambots/src/main/java/org/telegram/telegrambots/bots/TelegramBatchLongPollingBot.java diff --git a/telegrambots/src/main/java/org/telegram/telegrambots/bots/TelegramBatchLongPollingBot.java b/telegrambots/src/main/java/org/telegram/telegrambots/bots/TelegramBatchLongPollingBot.java new file mode 100644 index 00000000..4b294868 --- /dev/null +++ b/telegrambots/src/main/java/org/telegram/telegrambots/bots/TelegramBatchLongPollingBot.java @@ -0,0 +1,16 @@ +package org.telegram.telegrambots.bots; + +import org.telegram.telegrambots.api.objects.Update; + +import java.util.Collections; +import java.util.List; + +public abstract class TelegramBatchLongPollingBot extends TelegramLongPollingBot { + + @Override + public final void onUpdateReceived(Update update) { + onUpdatesReceived(Collections.singletonList(update)); + } + + public abstract void onUpdatesReceived(List updates); +} diff --git a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java index 1347e03a..c12c0eb1 100644 --- a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java +++ b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java @@ -18,6 +18,7 @@ import org.telegram.telegrambots.ApiConstants; import org.telegram.telegrambots.api.methods.updates.GetUpdates; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.DefaultBotOptions; +import org.telegram.telegrambots.bots.TelegramBatchLongPollingBot; import org.telegram.telegrambots.exceptions.TelegramApiRequestException; import org.telegram.telegrambots.generics.*; import org.telegram.telegrambots.logging.BotLogger; @@ -27,6 +28,8 @@ import java.io.InvalidObjectException; import java.net.SocketTimeoutException; import java.nio.charset.StandardCharsets; import java.security.InvalidParameterException; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.TimeUnit; @@ -252,23 +255,46 @@ public class DefaultBotSession implements BotSession { } } + private List getUpdateList() { + List updates = new ArrayList<>(); + for (Iterator it = receivedUpdates.iterator(); it.hasNext();) { + updates.add(it.next()); + it.remove(); + } + return updates; + } + private class HandlerThread extends Thread implements UpdatesHandler { @Override public void run() { setPriority(Thread.MIN_PRIORITY); while (running) { try { - Update update = receivedUpdates.pollLast(); - if (update == null) { - synchronized (receivedUpdates) { - receivedUpdates.wait(); - update = receivedUpdates.pollLast(); - if (update == null) { - continue; + if (callback instanceof TelegramBatchLongPollingBot) { + List updates = getUpdateList(); + if (updates.isEmpty()) { + synchronized (receivedUpdates) { + receivedUpdates.wait(); + updates = getUpdateList(); + if (updates.isEmpty()) { + continue; + } } } + ((TelegramBatchLongPollingBot) callback).onUpdatesReceived(updates); + } else { + Update update = receivedUpdates.pollFirst(); + if (update == null) { + synchronized (receivedUpdates) { + receivedUpdates.wait(); + update = receivedUpdates.pollFirst(); + if (update == null) { + continue; + } + } + } + callback.onUpdateReceived(update); } - callback.onUpdateReceived(update); } catch (InterruptedException e) { BotLogger.debug(LOGTAG, e); } catch (Exception e) { From fefe0cff052bd2c6f295a43df90d241a6c9b1115 Mon Sep 17 00:00:00 2001 From: vsubhuman Date: Thu, 3 Aug 2017 12:19:19 +0300 Subject: [PATCH 2/4] #269 Added `TelegramBatchLongPollingBotTest` --- .../test/TelegramBatchLongPollingBotTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramBatchLongPollingBotTest.java diff --git a/telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramBatchLongPollingBotTest.java b/telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramBatchLongPollingBotTest.java new file mode 100644 index 00000000..54a92057 --- /dev/null +++ b/telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramBatchLongPollingBotTest.java @@ -0,0 +1,19 @@ +package org.telegram.telegrambots.test; + +import org.junit.Test; +import org.mockito.Mockito; +import org.telegram.telegrambots.api.objects.Update; +import org.telegram.telegrambots.bots.TelegramBatchLongPollingBot; + +import java.util.Collections; + +public class TelegramBatchLongPollingBotTest { + + @Test + public void testOnUpdateReceived() throws Exception { + TelegramBatchLongPollingBot bot = Mockito.mock(TelegramBatchLongPollingBot.class); + Update update = new Update(); + bot.onUpdateReceived(update); + Mockito.verify(bot).onUpdatesReceived(Collections.singletonList(update)); + } +} \ No newline at end of file From 0fb556518a02cb61a083e7acb5fe80ad969c30a3 Mon Sep 17 00:00:00 2001 From: vsubhuman Date: Thu, 3 Aug 2017 13:29:02 +0300 Subject: [PATCH 3/4] #269 Extracted `UpdatesSupplier` insede `DefaultBotSession` and created tests --- .../updatesreceivers/DefaultBotSession.java | 137 ++++++++++-------- .../test/Fakes/FakeBatchLongPollingBot.java | 34 +++++ .../test/TestDefaultBotSession.java | 90 +++++++++++- 3 files changed, 201 insertions(+), 60 deletions(-) create mode 100644 telegrambots/src/test/java/org/telegram/telegrambots/test/Fakes/FakeBatchLongPollingBot.java diff --git a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java index c12c0eb1..d968329c 100644 --- a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java +++ b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java @@ -28,9 +28,7 @@ import java.io.InvalidObjectException; import java.net.SocketTimeoutException; import java.nio.charset.StandardCharsets; import java.security.InvalidParameterException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.*; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.TimeUnit; @@ -55,6 +53,7 @@ public class DefaultBotSession implements BotSession { private String token; private int lastReceivedUpdate = 0; private DefaultBotOptions options; + private UpdatesSupplier updatesSupplier; @Inject public DefaultBotSession() { @@ -70,7 +69,7 @@ public class DefaultBotSession implements BotSession { lastReceivedUpdate = 0; - readerThread = new ReaderThread(); + readerThread = new ReaderThread(updatesSupplier); readerThread.setName(callback.getBotUsername() + " Telegram Connection"); readerThread.start(); @@ -100,6 +99,10 @@ public class DefaultBotSession implements BotSession { } } + public void setUpdatesSupplier(UpdatesSupplier updatesSupplier) { + this.updatesSupplier = updatesSupplier; + } + @Override public void setOptions(BotOptions options) { if (this.options != null) { @@ -130,10 +133,16 @@ public class DefaultBotSession implements BotSession { } private class ReaderThread extends Thread implements UpdatesReader { + + private final UpdatesSupplier updatesSupplier; private CloseableHttpClient httpclient; private ExponentialBackOff exponentialBackOff; private RequestConfig requestConfig; + public ReaderThread(UpdatesSupplier updatesSupplier) { + this.updatesSupplier = Optional.ofNullable(updatesSupplier).orElse(this::getUpdatesFromServer); + } + @Override public synchronized void start() { httpclient = HttpClientBuilder.create() @@ -175,62 +184,23 @@ public class DefaultBotSession implements BotSession { setPriority(Thread.MIN_PRIORITY); while (running) { try { - GetUpdates request = new GetUpdates() - .setLimit(100) - .setTimeout(ApiConstants.GETUPDATES_TIMEOUT) - .setOffset(lastReceivedUpdate + 1); - - if (options.getAllowedUpdates() != null) { - request.setAllowedUpdates(options.getAllowedUpdates()); - } - - String url = options.getBaseUrl() + token + "/" + GetUpdates.PATH; - //http client - HttpPost httpPost = new HttpPost(url); - httpPost.addHeader("charset", StandardCharsets.UTF_8.name()); - httpPost.setConfig(requestConfig); - httpPost.setEntity(new StringEntity(objectMapper.writeValueAsString(request), ContentType.APPLICATION_JSON)); - - try (CloseableHttpResponse response = httpclient.execute(httpPost)) { - HttpEntity ht = response.getEntity(); - BufferedHttpEntity buf = new BufferedHttpEntity(ht); - String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); - - if (response.getStatusLine().getStatusCode() >= 500) { - BotLogger.warn(LOGTAG, responseContent); - synchronized (this) { - this.wait(500); - } - } else { - try { - List updates = request.deserializeResponse(responseContent); - exponentialBackOff.reset(); - - if (updates.isEmpty()) { - synchronized (this) { - this.wait(500); - } - } else { - updates.removeIf(x -> x.getUpdateId() < lastReceivedUpdate); - lastReceivedUpdate = updates.parallelStream() - .map( - Update::getUpdateId) - .max(Integer::compareTo) - .orElse(0); - receivedUpdates.addAll(updates); - - synchronized (receivedUpdates) { - receivedUpdates.notifyAll(); - } - } - } catch (JSONException e) { - BotLogger.severe(responseContent, LOGTAG, e); - } + List updates = updatesSupplier.getUpdates(); + if (updates.isEmpty()) { + synchronized (this) { + this.wait(500); + } + } else { + updates.removeIf(x -> x.getUpdateId() < lastReceivedUpdate); + lastReceivedUpdate = updates.parallelStream() + .map( + Update::getUpdateId) + .max(Integer::compareTo) + .orElse(0); + receivedUpdates.addAll(updates); + + synchronized (receivedUpdates) { + receivedUpdates.notifyAll(); } - } catch (SocketTimeoutException e) { - BotLogger.fine(LOGTAG, e); - } catch (InvalidObjectException | TelegramApiRequestException e) { - BotLogger.severe(LOGTAG, e); } } catch (InterruptedException e) { if (!running) { @@ -253,6 +223,55 @@ public class DefaultBotSession implements BotSession { } BotLogger.debug(LOGTAG, "Reader thread has being closed"); } + + private List getUpdatesFromServer() throws InterruptedException, Exception { + GetUpdates request = new GetUpdates() + .setLimit(100) + .setTimeout(ApiConstants.GETUPDATES_TIMEOUT) + .setOffset(lastReceivedUpdate + 1); + + if (options.getAllowedUpdates() != null) { + request.setAllowedUpdates(options.getAllowedUpdates()); + } + + String url = options.getBaseUrl() + token + "/" + GetUpdates.PATH; + //http client + HttpPost httpPost = new HttpPost(url); + httpPost.addHeader("charset", StandardCharsets.UTF_8.name()); + httpPost.setConfig(requestConfig); + httpPost.setEntity(new StringEntity(objectMapper.writeValueAsString(request), ContentType.APPLICATION_JSON)); + + try (CloseableHttpResponse response = httpclient.execute(httpPost)) { + HttpEntity ht = response.getEntity(); + BufferedHttpEntity buf = new BufferedHttpEntity(ht); + String responseContent = EntityUtils.toString(buf, StandardCharsets.UTF_8); + + if (response.getStatusLine().getStatusCode() >= 500) { + BotLogger.warn(LOGTAG, responseContent); + synchronized (this) { + this.wait(500); + } + } else { + try { + List updates = request.deserializeResponse(responseContent); + exponentialBackOff.reset(); + return updates; + } catch (JSONException e) { + BotLogger.severe(responseContent, LOGTAG, e); + } + } + } catch (SocketTimeoutException e) { + BotLogger.fine(LOGTAG, e); + } catch (InvalidObjectException | TelegramApiRequestException e) { + BotLogger.severe(LOGTAG, e); + } + return Collections.emptyList(); + } + } + + public interface UpdatesSupplier { + + List getUpdates() throws InterruptedException, Exception; } private List getUpdateList() { diff --git a/telegrambots/src/test/java/org/telegram/telegrambots/test/Fakes/FakeBatchLongPollingBot.java b/telegrambots/src/test/java/org/telegram/telegrambots/test/Fakes/FakeBatchLongPollingBot.java new file mode 100644 index 00000000..46f89377 --- /dev/null +++ b/telegrambots/src/test/java/org/telegram/telegrambots/test/Fakes/FakeBatchLongPollingBot.java @@ -0,0 +1,34 @@ +package org.telegram.telegrambots.test.Fakes; + +import org.telegram.telegrambots.api.objects.Update; +import org.telegram.telegrambots.bots.DefaultBotOptions; +import org.telegram.telegrambots.bots.TelegramBatchLongPollingBot; +import org.telegram.telegrambots.exceptions.TelegramApiRequestException; +import org.telegram.telegrambots.generics.BotOptions; +import org.telegram.telegrambots.generics.LongPollingBot; + +import java.util.List; + +public class FakeBatchLongPollingBot extends TelegramBatchLongPollingBot +{ + + @Override + public void onUpdatesReceived(List updates) { + + } + + @Override + public String getBotUsername() { + return ""; + } + + @Override + public String getBotToken() { + return ""; + } + + @Override + public void clearWebhook() throws TelegramApiRequestException { + + } +} diff --git a/telegrambots/src/test/java/org/telegram/telegrambots/test/TestDefaultBotSession.java b/telegrambots/src/test/java/org/telegram/telegrambots/test/TestDefaultBotSession.java index c37fd5a6..39c6a83f 100644 --- a/telegrambots/src/test/java/org/telegram/telegrambots/test/TestDefaultBotSession.java +++ b/telegrambots/src/test/java/org/telegram/telegrambots/test/TestDefaultBotSession.java @@ -11,12 +11,22 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.mockito.Matchers; import org.mockito.Mockito; +import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.DefaultBotOptions; +import org.telegram.telegrambots.bots.TelegramBatchLongPollingBot; +import org.telegram.telegrambots.generics.LongPollingBot; +import org.telegram.telegrambots.test.Fakes.FakeBatchLongPollingBot; import org.telegram.telegrambots.test.Fakes.FakeLongPollingBot; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.IntStream; /** * @author Ruben Bermudez @@ -79,7 +89,85 @@ public class TestDefaultBotSession { session.stop(); } + @Test + public void testUpdatesForStandardLongPollingBot() throws Exception { + LongPollingBot bot = Mockito.spy(new FakeLongPollingBot()); + session = getDefaultBotSession(bot); + AtomicInteger flag = new AtomicInteger(); + Update[] updates = createFakeUpdates(9); + session.setUpdatesSupplier(createFakeUpdatesSupplier(flag, updates)); + session.start(); + Thread.sleep(1000); + Mockito.verify(bot, Mockito.never()).onUpdateReceived(Matchers.any()); + flag.compareAndSet(0, 1); + Thread.sleep(1000); + Mockito.verify(bot).onUpdateReceived(updates[0]); + Mockito.verify(bot).onUpdateReceived(updates[1]); + flag.compareAndSet(2, 3); + Thread.sleep(1000); + Mockito.verify(bot).onUpdateReceived(updates[2]); + Mockito.verify(bot).onUpdateReceived(updates[3]); + Mockito.verify(bot).onUpdateReceived(updates[4]); + flag.compareAndSet(4, 5); + Thread.sleep(1000); + Mockito.verify(bot).onUpdateReceived(updates[5]); + Mockito.verify(bot).onUpdateReceived(updates[6]); + Mockito.verify(bot).onUpdateReceived(updates[7]); + Mockito.verify(bot).onUpdateReceived(updates[8]); + session.stop(); + } + + @Test + public void testUpdatesForBatchLongPollingBot() throws Exception { + TelegramBatchLongPollingBot bot = Mockito.spy(new FakeBatchLongPollingBot()); + session = getDefaultBotSession(bot); + AtomicInteger flag = new AtomicInteger(); + Update[] updates = createFakeUpdates(9); + session.setUpdatesSupplier(createFakeUpdatesSupplier(flag, updates)); + session.start(); + Thread.sleep(1000); + Mockito.verify(bot, Mockito.never()).onUpdateReceived(Matchers.any()); + flag.compareAndSet(0, 1); + Thread.sleep(1000); + Mockito.verify(bot).onUpdatesReceived(Arrays.asList(updates[0], updates[1])); + flag.compareAndSet(2, 3); + Thread.sleep(1000); + Mockito.verify(bot).onUpdatesReceived(Arrays.asList(updates[2], updates[3], updates[4])); + flag.compareAndSet(4, 5); + Thread.sleep(1000); + Mockito.verify(bot).onUpdatesReceived(Arrays.asList(updates[5], updates[6], updates[7], updates[8])); + session.stop(); + } + + private Update[] createFakeUpdates(int count) { + return IntStream.range(0, count).mapToObj(x -> { + Update mock = Mockito.mock(Update.class); + Mockito.when(mock.getUpdateId()).thenReturn(x); + return mock; + }).toArray(Update[]::new); + } + + private DefaultBotSession.UpdatesSupplier createFakeUpdatesSupplier(AtomicInteger flag, Update[] updates) { + return new DefaultBotSession.UpdatesSupplier() { + @Override + public List getUpdates() throws InterruptedException, Exception { + if (flag.compareAndSet(1, 2)) { + return Arrays.asList(updates[0], updates[1]); + } else if (flag.compareAndSet(3, 4)) { + return Arrays.asList(updates[2], updates[3], updates[4]); + } else if (flag.compareAndSet(5, 6)) { + return Arrays.asList(updates[5], updates[6], updates[7], updates[8]); + } + return Collections.emptyList(); + } + }; + } + private DefaultBotSession getDefaultBotSession() throws IOException { + return getDefaultBotSession(new FakeLongPollingBot()); + } + + private DefaultBotSession getDefaultBotSession(LongPollingBot bot) throws IOException { HttpResponse response = new BasicHttpResponse(new BasicStatusLine( new ProtocolVersion("HTTP", 1, 1), 200, "")); response.setStatusCode(200); @@ -89,7 +177,7 @@ public class TestDefaultBotSession { Mockito.when(mockHttpClient.execute(Mockito.any(HttpPost.class))) .thenReturn(response); DefaultBotSession session = new DefaultBotSession(); - session.setCallback(new FakeLongPollingBot()); + session.setCallback(bot); session.setOptions(new DefaultBotOptions()); return session; } From cb92eca883340fdf653dc3b23f403936095bae7b Mon Sep 17 00:00:00 2001 From: vantuz-subhuman Date: Thu, 21 Sep 2017 00:46:41 +0300 Subject: [PATCH 4/4] #269: Deleted `TelegramBatchLongPollingBot`, added `onUpdatesReceived` method to basic `LongPollingBot` interface --- .../telegrambots/generics/LongPollingBot.java | 11 ++++++ .../bots/TelegramBatchLongPollingBot.java | 16 --------- .../updatesreceivers/DefaultBotSession.java | 31 +++++------------ .../test/Fakes/FakeBatchLongPollingBot.java | 34 ------------------- .../test/TelegramBatchLongPollingBotTest.java | 19 ----------- .../test/TelegramLongPollingBotTest.java | 24 +++++++++++++ .../test/TestDefaultBotSession.java | 8 ++--- 7 files changed, 46 insertions(+), 97 deletions(-) delete mode 100644 telegrambots/src/main/java/org/telegram/telegrambots/bots/TelegramBatchLongPollingBot.java delete mode 100644 telegrambots/src/test/java/org/telegram/telegrambots/test/Fakes/FakeBatchLongPollingBot.java delete mode 100644 telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramBatchLongPollingBotTest.java create mode 100644 telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramLongPollingBotTest.java diff --git a/telegrambots-meta/src/main/java/org/telegram/telegrambots/generics/LongPollingBot.java b/telegrambots-meta/src/main/java/org/telegram/telegrambots/generics/LongPollingBot.java index ce9bda79..32118616 100644 --- a/telegrambots-meta/src/main/java/org/telegram/telegrambots/generics/LongPollingBot.java +++ b/telegrambots-meta/src/main/java/org/telegram/telegrambots/generics/LongPollingBot.java @@ -3,6 +3,8 @@ package org.telegram.telegrambots.generics; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.exceptions.TelegramApiRequestException; +import java.util.List; + /** * @author Ruben Bermudez * @version 1.0 @@ -16,6 +18,15 @@ public interface LongPollingBot { */ void onUpdateReceived(Update update); + /** + * This method is called when receiving updates via GetUpdates method. + * If not reimplemented - it just sends updates by one into {@link #onUpdateReceived(Update)} + * @param updates list of Update received + */ + default void onUpdatesReceived(List updates) { + updates.forEach(this::onUpdateReceived); + } + /** * Return bot username of this bot */ diff --git a/telegrambots/src/main/java/org/telegram/telegrambots/bots/TelegramBatchLongPollingBot.java b/telegrambots/src/main/java/org/telegram/telegrambots/bots/TelegramBatchLongPollingBot.java deleted file mode 100644 index 4b294868..00000000 --- a/telegrambots/src/main/java/org/telegram/telegrambots/bots/TelegramBatchLongPollingBot.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.telegram.telegrambots.bots; - -import org.telegram.telegrambots.api.objects.Update; - -import java.util.Collections; -import java.util.List; - -public abstract class TelegramBatchLongPollingBot extends TelegramLongPollingBot { - - @Override - public final void onUpdateReceived(Update update) { - onUpdatesReceived(Collections.singletonList(update)); - } - - public abstract void onUpdatesReceived(List updates); -} diff --git a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java index d968329c..23f5b618 100644 --- a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java +++ b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultBotSession.java @@ -18,7 +18,6 @@ import org.telegram.telegrambots.ApiConstants; import org.telegram.telegrambots.api.methods.updates.GetUpdates; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.DefaultBotOptions; -import org.telegram.telegrambots.bots.TelegramBatchLongPollingBot; import org.telegram.telegrambots.exceptions.TelegramApiRequestException; import org.telegram.telegrambots.generics.*; import org.telegram.telegrambots.logging.BotLogger; @@ -289,31 +288,17 @@ public class DefaultBotSession implements BotSession { setPriority(Thread.MIN_PRIORITY); while (running) { try { - if (callback instanceof TelegramBatchLongPollingBot) { - List updates = getUpdateList(); - if (updates.isEmpty()) { - synchronized (receivedUpdates) { - receivedUpdates.wait(); - updates = getUpdateList(); - if (updates.isEmpty()) { - continue; - } + List updates = getUpdateList(); + if (updates.isEmpty()) { + synchronized (receivedUpdates) { + receivedUpdates.wait(); + updates = getUpdateList(); + if (updates.isEmpty()) { + continue; } } - ((TelegramBatchLongPollingBot) callback).onUpdatesReceived(updates); - } else { - Update update = receivedUpdates.pollFirst(); - if (update == null) { - synchronized (receivedUpdates) { - receivedUpdates.wait(); - update = receivedUpdates.pollFirst(); - if (update == null) { - continue; - } - } - } - callback.onUpdateReceived(update); } + callback.onUpdatesReceived(updates); } catch (InterruptedException e) { BotLogger.debug(LOGTAG, e); } catch (Exception e) { diff --git a/telegrambots/src/test/java/org/telegram/telegrambots/test/Fakes/FakeBatchLongPollingBot.java b/telegrambots/src/test/java/org/telegram/telegrambots/test/Fakes/FakeBatchLongPollingBot.java deleted file mode 100644 index 46f89377..00000000 --- a/telegrambots/src/test/java/org/telegram/telegrambots/test/Fakes/FakeBatchLongPollingBot.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.telegram.telegrambots.test.Fakes; - -import org.telegram.telegrambots.api.objects.Update; -import org.telegram.telegrambots.bots.DefaultBotOptions; -import org.telegram.telegrambots.bots.TelegramBatchLongPollingBot; -import org.telegram.telegrambots.exceptions.TelegramApiRequestException; -import org.telegram.telegrambots.generics.BotOptions; -import org.telegram.telegrambots.generics.LongPollingBot; - -import java.util.List; - -public class FakeBatchLongPollingBot extends TelegramBatchLongPollingBot -{ - - @Override - public void onUpdatesReceived(List updates) { - - } - - @Override - public String getBotUsername() { - return ""; - } - - @Override - public String getBotToken() { - return ""; - } - - @Override - public void clearWebhook() throws TelegramApiRequestException { - - } -} diff --git a/telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramBatchLongPollingBotTest.java b/telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramBatchLongPollingBotTest.java deleted file mode 100644 index 54a92057..00000000 --- a/telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramBatchLongPollingBotTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.telegram.telegrambots.test; - -import org.junit.Test; -import org.mockito.Mockito; -import org.telegram.telegrambots.api.objects.Update; -import org.telegram.telegrambots.bots.TelegramBatchLongPollingBot; - -import java.util.Collections; - -public class TelegramBatchLongPollingBotTest { - - @Test - public void testOnUpdateReceived() throws Exception { - TelegramBatchLongPollingBot bot = Mockito.mock(TelegramBatchLongPollingBot.class); - Update update = new Update(); - bot.onUpdateReceived(update); - Mockito.verify(bot).onUpdatesReceived(Collections.singletonList(update)); - } -} \ No newline at end of file diff --git a/telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramLongPollingBotTest.java b/telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramLongPollingBotTest.java new file mode 100644 index 00000000..23dbfc6d --- /dev/null +++ b/telegrambots/src/test/java/org/telegram/telegrambots/test/TelegramLongPollingBotTest.java @@ -0,0 +1,24 @@ +package org.telegram.telegrambots.test; + +import org.junit.Test; +import org.mockito.Mockito; +import org.telegram.telegrambots.api.objects.Update; +import org.telegram.telegrambots.bots.TelegramLongPollingBot; + +import static java.util.Arrays.asList; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyList; + +public class TelegramLongPollingBotTest { + + @Test + public void testOnUpdateReceived() throws Exception { + TelegramLongPollingBot bot = Mockito.mock(TelegramLongPollingBot.class); + Mockito.doCallRealMethod().when(bot).onUpdatesReceived(any()); + Update update1 = new Update(); + Update update2 = new Update(); + bot.onUpdatesReceived(asList(update1, update2)); + Mockito.verify(bot).onUpdateReceived(update1); + Mockito.verify(bot).onUpdateReceived(update2); + } +} \ No newline at end of file diff --git a/telegrambots/src/test/java/org/telegram/telegrambots/test/TestDefaultBotSession.java b/telegrambots/src/test/java/org/telegram/telegrambots/test/TestDefaultBotSession.java index 39c6a83f..17d4aa65 100644 --- a/telegrambots/src/test/java/org/telegram/telegrambots/test/TestDefaultBotSession.java +++ b/telegrambots/src/test/java/org/telegram/telegrambots/test/TestDefaultBotSession.java @@ -15,9 +15,7 @@ import org.mockito.Matchers; import org.mockito.Mockito; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.DefaultBotOptions; -import org.telegram.telegrambots.bots.TelegramBatchLongPollingBot; import org.telegram.telegrambots.generics.LongPollingBot; -import org.telegram.telegrambots.test.Fakes.FakeBatchLongPollingBot; import org.telegram.telegrambots.test.Fakes.FakeLongPollingBot; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; @@ -90,7 +88,7 @@ public class TestDefaultBotSession { } @Test - public void testUpdatesForStandardLongPollingBot() throws Exception { + public void testUpdates() throws Exception { LongPollingBot bot = Mockito.spy(new FakeLongPollingBot()); session = getDefaultBotSession(bot); AtomicInteger flag = new AtomicInteger(); @@ -118,8 +116,8 @@ public class TestDefaultBotSession { } @Test - public void testUpdatesForBatchLongPollingBot() throws Exception { - TelegramBatchLongPollingBot bot = Mockito.spy(new FakeBatchLongPollingBot()); + public void testBatchUpdates() throws Exception { + LongPollingBot bot = Mockito.spy(new FakeLongPollingBot()); session = getDefaultBotSession(bot); AtomicInteger flag = new AtomicInteger(); Update[] updates = createFakeUpdates(9);