From 1a2dade994fb8192263d516c2f3563e84a8989e3 Mon Sep 17 00:00:00 2001 From: andrea Date: Tue, 7 Apr 2015 04:29:00 +0200 Subject: [PATCH] Fixed issue #25 due to bad packetID generation --- .../spi/persistence/MapDBPersistentStore.java | 4 +-- .../spi/impl/MapDBPersistentStoreTest.java | 32 ++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/broker/src/main/java/org/eclipse/moquette/spi/persistence/MapDBPersistentStore.java b/broker/src/main/java/org/eclipse/moquette/spi/persistence/MapDBPersistentStore.java index 06f66b3b..859ef364 100644 --- a/broker/src/main/java/org/eclipse/moquette/spi/persistence/MapDBPersistentStore.java +++ b/broker/src/main/java/org/eclipse/moquette/spi/persistence/MapDBPersistentStore.java @@ -199,7 +199,7 @@ public class MapDBPersistentStore implements IMessagesStore, ISessionsStore { } /** - * Return the next valid packetIdentifer for the given client session. + * Return the next valid packetIdentifier for the given client session. * */ @Override public int nextPacketID(String clientID) { @@ -211,7 +211,7 @@ public class MapDBPersistentStore implements IMessagesStore, ISessionsStore { this.m_inFlightIds.put(clientID, inFlightForClient); return nextPacketId; } - int maxId = Collections.max(inFlightForClient); + int maxId = inFlightForClient.isEmpty() ? 0 : Collections.max(inFlightForClient); int nextPacketId = (maxId + 1) % 0xFFFF; inFlightForClient.add(nextPacketId); return nextPacketId; diff --git a/broker/src/test/java/org/eclipse/moquette/spi/impl/MapDBPersistentStoreTest.java b/broker/src/test/java/org/eclipse/moquette/spi/impl/MapDBPersistentStoreTest.java index 3852a856..7969fa3e 100644 --- a/broker/src/test/java/org/eclipse/moquette/spi/impl/MapDBPersistentStoreTest.java +++ b/broker/src/test/java/org/eclipse/moquette/spi/impl/MapDBPersistentStoreTest.java @@ -38,7 +38,6 @@ public class MapDBPersistentStoreTest { @Before public void setUp() throws Exception { - File dbFile = new File(DEFAULT_PERSISTENT_PATH); assertFalse(String.format("The DB storagefile %s already exists", DEFAULT_PERSISTENT_PATH), dbFile.exists()); @@ -72,4 +71,35 @@ public class MapDBPersistentStoreTest { Subscription sub = subscriptions.get(0); assertEquals(overrindingSubscription.getRequestedQos(), sub.getRequestedQos()); } + + @Test + public void testNextPacketID_notExistingClientSession() { + int packetId = m_storageService.nextPacketID("NOT_EXISTING_CLI"); + assertEquals(1, packetId); + } + + @Test + public void testNextPacketID_existingClientSession() { + //Force creation of inflight map for the CLIENT session + int packetId = m_storageService.nextPacketID("CLIENT"); + assertEquals(1, packetId); + + //request a second packetID + packetId = m_storageService.nextPacketID("CLIENT"); + assertEquals(2, packetId); + } + + @Test + public void testNextPacketID() { + //request a first ID + int packetId = m_storageService.nextPacketID("CLIENT"); + assertEquals(1, packetId); + + //release the ID + m_storageService.cleanInFlight("CLIENT", packetId); + + //request a second packetID, counter restarts from 0 + packetId = m_storageService.nextPacketID("CLIENT"); + assertEquals(1, packetId); + } } \ No newline at end of file