/*
* Copyright 2000-2006 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrains.communicator.core.impl.dispatcher;
import jetbrains.communicator.core.impl.BaseTestCase;
import jetbrains.communicator.core.dispatcher.LocalMessage;
import jetbrains.communicator.core.dispatcher.Message;
import jetbrains.communicator.core.impl.users.UserImpl;
import jetbrains.communicator.core.impl.users.UserModelImpl;
import jetbrains.communicator.core.transport.TransportEvent;
import jetbrains.communicator.core.users.User;
import jetbrains.communicator.ide.SendMessageEvent;
import jetbrains.communicator.mock.MockIDEFacade;
import jetbrains.communicator.mock.MockMessage;
import jetbrains.communicator.mock.MockTransport;
import jetbrains.communicator.util.WatchDog;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import java.io.File;
import java.util.Date;
/**
* @author kir
*/
@SuppressWarnings({"HardCodedStringLiteral"})
public class LocalMessageDispatcherTest extends BaseTestCase {
private LocalMessageDispatcherImpl myDispatcher;
private User myUser;
private MockIDEFacade myIdeFacade;
private UserModelImpl myUserModel;
private static final long SAVE_WAIT_TIMEOUT = MessageHistory.SAVE_TIMEOUT + 200;
@Override
protected void setUp() throws Exception {
super.setUp();
myUserModel = new UserModelImpl(getBroadcaster());
disposeOnTearDown(myUserModel);
myIdeFacade = new MockIDEFacade(getClass());
myDispatcher = new LocalMessageDispatcherImpl(getBroadcaster(), myIdeFacade, myUserModel);
myUser = UserImpl.create("user", MockTransport.NAME);
}
@Override
protected void tearDown() throws Exception {
myDispatcher.clearAll();
myDispatcher.dispose();
super.tearDown();
}
public void testIconBlinkingStatus() throws Exception {
assertFalse(hasMessagesWhichRequireIconBlinking());
MockMessage message = new MockMessage();
myDispatcher.addPendingMessage(myUser, message);
assertEquals(1, myDispatcher.getPendingMessages(myUser).length);
assertTrue("Should blink to inform user about urgent event",
hasMessagesWhichRequireIconBlinking());
myDispatcher.sendNow(myUser, message);
assertFalse("No more blinking expected - message was dispatched",
hasMessagesWhichRequireIconBlinking());
}
private boolean hasMessagesWhichRequireIconBlinking() {
return myDispatcher.getBlinkingIcon() != null;
}
public void testAddPendingMessage() throws Exception {
MockMessage message = new MockMessage();
myDispatcher.addPendingMessage(myUser, message);
assertEquals(1, myDispatcher.getPendingMessages(myUser).length);
assertSame(message, myDispatcher.getPendingMessages(myUser)[0]);
// add again
myDispatcher.addPendingMessage(myUser, message);
assertEquals("Should be added once", 1, myDispatcher.getPendingMessages(myUser).length);
myDispatcher.addPendingMessage(myUser, null);
assertEquals("Should have no problems with nulls", 1, myDispatcher.getPendingMessages(myUser).length);
}
public void testTransportEvent() throws Exception {
MockTransport mockTransport = new MockTransport();
MockMessage localMessage = new MockMessage();
MockMessage localMessage1 = new MockMessage();
myIdeFacade.setReturnedMessage(localMessage);
getBroadcaster().fireEvent(new TransportEvent(mockTransport, "user"){});
myIdeFacade.setReturnedMessage(localMessage1);
getBroadcaster().fireEvent(new TransportEvent(mockTransport, "user"){});
Message[] pendingMessages = myDispatcher.getPendingMessages(myUser);
assertEquals("Expect a local localMessages as a result to TransportEvent",
2, pendingMessages.length);
assertSame(localMessage, pendingMessages[0]);
assertSame(localMessage1, pendingMessages[1]);
assertEquals("", localMessage.getLog());
}
public void testSendMessageEvent() throws Exception {
MockTransport mockTransport = new MockTransport();
MockMessage localMessage = new MockMessage();
MockMessage localMessage1 = new MockMessage();
myIdeFacade.setReturnedMessage(localMessage);
getBroadcaster().fireEvent(new SendMessageEvent("text", myUser));
myIdeFacade.setReturnedMessage(localMessage1);
getBroadcaster().fireEvent(new SendMessageEvent("text", myUser));
LocalMessage[] history = myDispatcher.getHistory(myUser, null);
assertEquals("Expect localMessages as a result to OwnMessageEvent",
2, history.length);
assertSame(localMessage, history[0]);
assertSame(localMessage1, history[1]);
}
public void testPersistency() throws Exception {
myDispatcher.addPendingMessage(myUser, new MockMessage());
assertEquals("Should have no problems with nulls", 1, myDispatcher.getPendingMessages(myUser).length);
// test persistency
LocalMessageDispatcherImpl localMessageDispatcher = createLocalMessageDispatcher();
assertEquals(1, localMessageDispatcher.getPendingMessages(myUser).length);
localMessageDispatcher.sendNow(myUser,
localMessageDispatcher.getPendingMessages(myUser)[0]);
localMessageDispatcher =
new LocalMessageDispatcherImpl(getBroadcaster(), myIdeFacade, myUserModel);
disposeOnTearDown(localMessageDispatcher);
assertEquals(0, localMessageDispatcher.getPendingMessages(myUser).length);
}
public void testHistory() throws Exception {
assertEquals(0, myDispatcher.getHistory(myUser, null).length);
MockMessage message = new MockMessage();
myDispatcher.addPendingMessage(myUser, message);
assertEquals(1, myDispatcher.getPendingMessages(myUser).length);
assertEquals(0, myDispatcher.getHistory(myUser, null).length);
myDispatcher.sendNow(myUser, message);
assertEquals(0, myDispatcher.getPendingMessages(myUser).length);
assertEquals(1, myDispatcher.getHistory(myUser, null).length);
MockMessage message2 = new MockMessage();
myDispatcher.sendNow(myUser, message2);
LocalMessage[] history = myDispatcher.getHistory(myUser, null);
assertEquals(2, history.length);
assertSame(message, history[0]);
assertSame(message2, history[1]);
}
public void testHistoryWithDate() throws Exception {
MockMessage message = new MockMessage();
myDispatcher.sendNow(myUser, message);
Thread.sleep(10);
assertEquals(1, myDispatcher.getHistory(myUser, a_moment_ago()).length);
assertEquals("Do not expect old history", 0, myDispatcher.getHistory(myUser, new Date()).length);
}
private Date a_moment_ago() {
return new Date(System.currentTimeMillis() - 5100);
}
public void testClearHistory() throws Exception {
assertTrue(myDispatcher.isHistoryEmpty());
MockMessage message = new MockMessage();
myDispatcher.sendNow(myUser, message);
myDispatcher.clearHistory();
assertEquals(0, myDispatcher.getHistory(myUser, null).length);
}
public void testHistoryPersistence() throws Exception {
// Test Saving history message:
MockMessage message = new MockMessage(new Date(), "some text \u0420\u041f \u0422\u0425\u0423\u0423\u041b\u0419");
myDispatcher.sendNow(myUser, message);
Thread.sleep(SAVE_WAIT_TIMEOUT);
LocalMessageDispatcherImpl localMessageDispatcher = createLocalMessageDispatcher();
assertEquals(1, localMessageDispatcher.getHistory(myUser, null).length);
assertEquals("some text \u0420\u041f \u0422\u0425\u0423\u0423\u041b\u0419",
((MockMessage) localMessageDispatcher.getHistory(myUser, null)[0]).getMessage());
}
public void testHistoryPersistence_SortLoadedHistory() throws Exception {
myDispatcher.sendNow(myUser, new MockMessage(yesterday(), "someText"));
MockMessage message = new MockMessage();
myDispatcher.sendNow(myUser, message);
Thread.sleep(SAVE_WAIT_TIMEOUT);
LocalMessageDispatcherImpl localMessageDispatcher = createLocalMessageDispatcher();
localMessageDispatcher.sendNow(myUser, message);
Thread.sleep(SAVE_WAIT_TIMEOUT);
assertEquals(2, localMessageDispatcher.getHistory(myUser, a_moment_ago()).length);
LocalMessage[] messages = localMessageDispatcher.getHistory(myUser, null);
assertEquals(3, messages.length);
assertEquals("someText", ((MockMessage) messages[0]).getMessage());
}
protected LocalMessageDispatcherImpl createLocalMessageDispatcher() {
LocalMessageDispatcherImpl localMessageDispatcher =
new LocalMessageDispatcherImpl(getBroadcaster(), myIdeFacade, myUserModel);
disposeOnTearDown(localMessageDispatcher);
return localMessageDispatcher;
}
public void testHistoryInSeveralFiles() throws Exception {
myDispatcher.sendNow(myUser, new MockMessage(new Date()));
myDispatcher.sendNow(myUser, new MockMessage(yesterday()));
Thread.sleep(SAVE_WAIT_TIMEOUT);
assertEquals(2, new File(myIdeFacade.getCacheDir(), "history").listFiles().length);
LocalMessageDispatcherImpl localMessageDispatcher = createLocalMessageDispatcher();
LocalMessage[] messages = localMessageDispatcher.getHistory(myUser, a_moment_ago());
assertEquals(1, messages.length);
messages = localMessageDispatcher.getHistory(myUser, new Date(System.currentTimeMillis() - 1000 * 3601 * 24));
assertEquals(2, messages.length);
}
private Date yesterday() {
return new Date(System.currentTimeMillis() - 1000 * 3600 * 24);
}
public void testPerformance() throws Exception {
Logger logger = Logger.getLogger("jetbrains.communicator");
Level oldLevel = logger.getLevel();
try {
logger.setLevel(Level.WARN);
for (int i = 0; i < 1000; i ++) {
Date date = new Date(System.currentTimeMillis() + i * 1000L * 3600L);
myDispatcher.sendNow(myUser, new MockMessage(date));
}
Thread.sleep(SAVE_WAIT_TIMEOUT*2);
WatchDog watchDog = new WatchDog("Load history");
LocalMessageDispatcherImpl localMessageDispatcher = createLocalMessageDispatcher();
LocalMessage[] messages = localMessageDispatcher.getHistory(myUser, yesterday());
assertEquals(1000, messages.length);
long diff = watchDog.diff();
watchDog.watchAndReset("done");
assertTrue("Too long getting history:" + diff, diff < 1500);
messages = localMessageDispatcher.getHistory(myUser, null);
assertEquals(1000, messages.length);
diff = watchDog.diff();
watchDog.watchAndReset("again done");
assertTrue("Too long getting history second time:" + diff, diff < 100);
} finally {
logger.setLevel(oldLevel);
}
}
public void testClearHistory_Persistence() throws Exception {
myDispatcher.sendNow(myUser, new MockMessage(new Date()));
Thread.sleep(SAVE_WAIT_TIMEOUT);
assertFalse(myDispatcher.isHistoryEmpty());
myDispatcher.clearHistory();
Thread.sleep(SAVE_WAIT_TIMEOUT);
assertEquals("History should be deleted", 0, new File(myIdeFacade.getCacheDir(), "history").listFiles().length);
myDispatcher.sendNow(myUser, new MockMessage(new Date()));
myDispatcher.clearHistory();
Thread.sleep(SAVE_WAIT_TIMEOUT);
assertEquals("History should be deleted", 0, new File(myIdeFacade.getCacheDir(), "history").listFiles().length);
assertEquals(0, myDispatcher.getHistory(myUser, null).length);
assertTrue(myDispatcher.isHistoryEmpty());
}
}