package org.buddycloud.channelserver.db.jdbc;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import org.buddycloud.channelserver.db.CloseableIterator;
import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler;
import org.buddycloud.channelserver.pubsub.model.GlobalItemID;
import org.buddycloud.channelserver.pubsub.model.NodeItem;
import org.buddycloud.channelserver.pubsub.model.impl.GlobalItemIDImpl;
import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl;
import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl;
import org.buddycloud.channelserver.pubsub.subscription.Subscriptions;
import org.junit.Test;
public class JDBCNodeStoreRecentItemsTest extends JDBCNodeStoreAbstract {
public JDBCNodeStoreRecentItemsTest() throws SQLException, IOException, ClassNotFoundException {
dbTester = new DatabaseTester();
IQTestHandler.readConf();
}
@Test
public void testGetRecentItems() throws Exception {
Date since = new Date();
dbTester.loadData("node_1");
store.addRemoteNode(TEST_SERVER1_NODE2_ID);
store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE2_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null));
NodeItem nodeItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "123", new Date(), "payload");
store.addNodeItem(nodeItem1);
Thread.sleep(1);
NodeItem nodeItem2 = new NodeItemImpl(TEST_SERVER1_NODE2_ID, "123", new Date(), "payload2");
store.addNodeItem(nodeItem2);
Thread.sleep(20);
CloseableIterator<NodeItem> items = store.getRecentItems(TEST_SERVER1_USER1_JID, since, -1, -1, null, null, false);
// 2 -> 1 on purpose results are most recent first!
assertSameNodeItem(items.next(), nodeItem2);
assertSameNodeItem(items.next(), nodeItem1);
assertEquals(false, items.hasNext());
}
@Test
public void testGetRecentItemsNoSubscriptions() throws Exception {
CloseableIterator<NodeItem> items = store.getRecentItems(
TEST_SERVER1_USER1_JID, new Date(), -1, -1, null, null, false);
assertEquals(false, items.hasNext());
}
@Test
public void testGetRecentItemsFromEphemeralNode() throws Exception {
Date since = new Date();
dbTester.loadData("node_1");
store.setNodeConfValue(TEST_SERVER1_NODE1_ID, "buddycloud#ephemeral", "true");
NodeItem nodeItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "123", new Date(), "payload");
store.addNodeItem(nodeItem1);
Thread.sleep(20);
CloseableIterator<NodeItem> items = store.getRecentItems(TEST_SERVER1_USER1_JID, since, -1, -1, null, null, false);
// 2 -> 1 on purpose results are most recent first!
assertSameNodeItem(items.next(), nodeItem1);
assertEquals(false, items.hasNext());
}
@Test
public void testGetRecentItemsCanBePaged() throws Exception {
Date since = new Date(0);
dbTester.loadData("node_1");
store.addRemoteNode(TEST_SERVER1_NODE2_ID);
store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE2_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null));
long now = System.currentTimeMillis();
NodeItem nodeItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "123", new Date(now - 400), "<entry><id>123</id></entry>");
store.addNodeItem(nodeItem1);
NodeItem nodeItem2 = new NodeItemImpl(TEST_SERVER1_NODE2_ID, "123", new Date(now - 400), "<entry><id>123</id></entry>");
store.addNodeItem(nodeItem2);
NodeItem nodeItem3 = new NodeItemImpl(TEST_SERVER1_NODE2_ID, "124", new Date(now - 300), "<entry><id>124</id></entry>");
store.addNodeItem(nodeItem3);
NodeItem nodeItem4 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "124", new Date(now - 200), "<entry><id>124</id></entry>");
store.addNodeItem(nodeItem4);
CloseableIterator<NodeItem> items =
store.getRecentItems(TEST_SERVER1_USER1_JID, since, -1, 2, new GlobalItemIDImpl(TEST_SERVER1_CHANNELS_JID, TEST_SERVER1_NODE1_ID, "124"),
null, false);
assertSameNodeItem(items.next(), nodeItem3);
assertSameNodeItem(items.next(), nodeItem1);
assertFalse(items.hasNext());
}
@Test
public void testGetRecentItemsWithNoResultsPerNodeRequestedReturnsExpectedCount() throws Exception {
Date since = new Date(0);
dbTester.loadData("node_1");
store.addRemoteNode(TEST_SERVER1_NODE2_ID);
store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE2_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null));
NodeItem nodeItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "1", new Date(), "payload");
NodeItem nodeItem2 = new NodeItemImpl(TEST_SERVER1_NODE2_ID, "2", new Date(), "payload2");
store.addNodeItem(nodeItem1);
store.addNodeItem(nodeItem2);
CloseableIterator<NodeItem> items = store.getRecentItems(TEST_SERVER1_USER1_JID, since, 0, -1, null, null, false);
int count = 0;
while (items.hasNext()) {
items.next();
++count;
}
assertEquals(0, count);
}
@Test
public void testGetRecentItemCountWithNoResultsPerNodeRequestedReturnsExpectedCount() throws Exception {
Date since = new Date();
dbTester.loadData("node_1");
store.addRemoteNode(TEST_SERVER1_NODE2_ID);
store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE2_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null));
store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE1_ID, "123", new Date(), "payload"));
store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE2_ID, "123", new Date(), "payload2"));
int count = store.getCountRecentItems(TEST_SERVER1_USER1_JID, since, 0, null, false);
assertEquals(0, count);
}
@Test
public void testCanPageGetRecentItemsUsingResultSetManagement() throws Exception {
dbTester.loadData("node_1");
Date since = new Date();
Thread.sleep(10);
store.addRemoteNode(TEST_SERVER1_NODE2_ID);
store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE2_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null));
for (int i = 1; i < 20; i++) {
Thread.sleep(10);
store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE1_ID, String.valueOf(i), new Date(), "payload" + String.valueOf(i)));
}
GlobalItemID itemID = new GlobalItemIDImpl(TEST_SERVER1_CHANNELS_JID, TEST_SERVER1_NODE1_ID, "15");
CloseableIterator<NodeItem> items = store.getRecentItems(TEST_SERVER1_USER1_JID, since, -1, 10, itemID, null, false);
int count = 0;
int i = 14;
while (items.hasNext()) {
assertSameNodeItem(items.next(), new NodeItemImpl(TEST_SERVER1_NODE1_ID, String.valueOf(i), new Date(), "payload" + String.valueOf(i)));
--i;
++count;
}
assertEquals(10, count);
}
@Test
public void testGetRecentItemCount() throws Exception {
Date since = new Date();
dbTester.loadData("node_1");
store.addRemoteNode(TEST_SERVER1_NODE2_ID);
store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE2_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null));
Thread.sleep(1);
store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE1_ID, "123", new Date(), "payload"));
store.addNodeItem(new NodeItemImpl(TEST_SERVER1_NODE2_ID, "123", new Date(), "payload2"));
int count = store.getCountRecentItems(TEST_SERVER1_USER1_JID, since, -1, null, false);
assertEquals(2, count);
}
@Test
public void settingParentOnlyOnlyReturnsThreadParentsForGetRecentItems() throws Exception {
Date since = new Date();
dbTester.loadData("node_1");
store.addRemoteNode(TEST_SERVER1_NODE2_ID);
store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE2_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null));
NodeItem nodeItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "12-node1", new Date(), "payload", null, new Date());
store.addNodeItem(nodeItem1);
Thread.sleep(1);
NodeItem nodeItem2 = new NodeItemImpl(TEST_SERVER1_NODE2_ID, "123-node2", new Date(), "payload2", "123", new Date());
store.addNodeItem(nodeItem2);
Thread.sleep(1);
NodeItem nodeItem3 = new NodeItemImpl(TEST_SERVER1_NODE2_ID, "124-node1", new Date(), "payload3", null, new Date());
store.addNodeItem(nodeItem3);
Thread.sleep(20);
CloseableIterator<NodeItem> items = store.getRecentItems(TEST_SERVER1_USER1_JID, since, -1, -1, null, null, true);
// 2 -> 1 on purpose results are most recent first!
assertSameNodeItem(items.next(), nodeItem3);
assertSameNodeItem(items.next(), nodeItem1);
assertEquals(false, items.hasNext());
}
@Test
public void settingParentOnlyReturnsThreadParentsForGetRecentItemsCount() throws Exception {
Date since = new Date();
since.setTime(0);
dbTester.loadData("node_1");
store.addRemoteNode(TEST_SERVER1_NODE2_ID);
store.purgeNodeItems(TEST_SERVER1_NODE1_ID);
store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE2_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null));
NodeItem nodeItem1 = new NodeItemImpl(TEST_SERVER1_NODE1_ID, "12-node1", new Date(), "payload", null, new Date());
store.addNodeItem(nodeItem1);
Thread.sleep(1);
NodeItem nodeItem2 = new NodeItemImpl(TEST_SERVER1_NODE2_ID, "123-node2", new Date(), "payload2", "123", new Date());
store.addNodeItem(nodeItem2);
Thread.sleep(1);
NodeItem nodeItem3 = new NodeItemImpl(TEST_SERVER1_NODE2_ID, "124-node1", new Date(), "payload3", null, new Date());
store.addNodeItem(nodeItem3);
Thread.sleep(20);
int itemCount = store.getCountRecentItems(TEST_SERVER1_USER1_JID, since, -1, null, true);
assertEquals(2, itemCount);
}
}