/* * Copyright 2011 Google Inc. All Rights Reserved. * * 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 info.guardianproject.otr.app.im.plugin.xmpp; import static org.easymock.EasyMock.*; import java.util.ArrayList; import static junit.framework.Assert.*; import info.guardianproject.otr.app.im.app.ImApp; import info.guardianproject.otr.app.im.engine.Contact; import info.guardianproject.otr.app.im.engine.ContactList; import info.guardianproject.otr.app.im.engine.ContactListListener; import info.guardianproject.otr.app.im.engine.SubscriptionRequestListener; import info.guardianproject.otr.app.im.plugin.XmppAddress; import info.guardianproject.otr.app.im.plugin.xmpp.XmppConnection; import info.guardianproject.otr.app.im.plugin.xmpp.XmppConnection.MyXMPPConnection; import info.guardianproject.otr.app.im.plugin.xmpp.XmppConnection.XmppContactList; import org.easymock.Capture; import org.easymock.EasyMockSupport; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.smack.RosterGroup; import org.jivesoftware.smack.RosterListener; import org.jivesoftware.smack.packet.Packet; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import com.xtremelabs.robolectric.RobolectricTestRunner; /** * @author devrandom */ @RunWith(RobolectricTestRunner.class) public class XmppConnectionTest extends EasyMockSupport { private static final String DEFAULT_GROUP_NAME = "Buddies"; private static final String TEST_CONTACT_NAME = "test"; private static final String TEST_CONTACT = "test@test.com"; private XmppConnection con; private Roster roster; private MyXMPPConnection smackCon; private ImApp app; private XmppContactList contactListManager; private SubscriptionRequestListener subscriptionRequestListener; private ContactListListener listener; @Before public void setUp() throws Exception { app = new ImApp(); con = new XmppConnection(app); roster = createMock(Roster.class); smackCon = createMock(MyXMPPConnection.class); expect(smackCon.getRoster()).andStubReturn(roster); Contact user = new Contact(new XmppAddress(TEST_CONTACT), TEST_CONTACT_NAME); con.initConnection(smackCon, user, XmppConnection.LOGGED_IN); contactListManager = con.getContactListManager(); subscriptionRequestListener = createMock(SubscriptionRequestListener.class); contactListManager.setSubscriptionRequestListener(subscriptionRequestListener); listener = createMock(ContactListListener.class); contactListManager.addContactListListener(listener); expect(smackCon.isConnected()).andStubReturn(true); } @Test public void testApproveSubscription() throws Exception { expectInitialListCreation(); Capture<RosterListener> listenerCapture = new Capture<RosterListener>(); roster.addRosterListener(capture(listenerCapture)); expectLastCall(); subscriptionRequestListener.onSubscriptionApproved(TEST_CONTACT); expectLastCall().times(2); smackCon.sendPacket(anyObject(Packet.class)); expectLastCall().times(2); expect(roster.getGroups()).andReturn(new ArrayList<RosterGroup>()); expect(roster.getUnfiledEntryCount()).andStubReturn(0); roster.createEntry(eq(TEST_CONTACT), eq(TEST_CONTACT_NAME), aryEq(new String[] { DEFAULT_GROUP_NAME })); expectLastCall().times(2); listener.onContactChange(eq(ContactListListener.LIST_CONTACT_ADDED), anyObject(ContactList.class), anyObject(Contact.class)); expectLastCall(); replayAll(); contactListManager.listenToRoster(roster); contactListManager.loadContactLists(); contactListManager.approveSubscriptionRequest(TEST_CONTACT); // Second time should not call notifyContactListUpdated, since contact // already exists contactListManager.approveSubscriptionRequest(TEST_CONTACT); assertEquals(1, contactListManager.getContactLists().size()); assertNotNull(contactListManager.getContactList(DEFAULT_GROUP_NAME)); assertTrue(con.joinGracefully()); verifyAll(); } // Approve a subscription while the server already has a Buddies group @Test public void testApproveSubscription_serverBuddies() throws Exception { expectInitialListCreation(); Capture<RosterListener> listenerCapture = new Capture<RosterListener>(); roster.addRosterListener(capture(listenerCapture)); expectLastCall(); subscriptionRequestListener.onSubscriptionApproved(TEST_CONTACT); expectLastCall(); smackCon.sendPacket(anyObject(Packet.class)); expectLastCall(); final ArrayList<RosterGroup> groups = new ArrayList<RosterGroup>(); RosterGroup buddiesGroup = createNiceMock(RosterGroup.class); expect(buddiesGroup.getName()).andStubReturn(DEFAULT_GROUP_NAME); expect(buddiesGroup.getEntries()).andStubReturn(new ArrayList<RosterEntry>()); groups.add(buddiesGroup); expect(roster.getGroups()).andReturn(groups); expect(roster.getUnfiledEntryCount()).andStubReturn(0); roster.createEntry(eq(TEST_CONTACT), eq(TEST_CONTACT_NAME), aryEq(new String[] { DEFAULT_GROUP_NAME })); expectLastCall(); listener.onContactChange(eq(ContactListListener.LIST_CONTACT_ADDED), anyObject(ContactList.class), anyObject(Contact.class)); expectLastCall(); replayAll(); contactListManager.listenToRoster(roster); contactListManager.loadContactLists(); contactListManager.approveSubscriptionRequest(TEST_CONTACT); assertEquals(1, contactListManager.getContactLists().size()); assertNotNull(contactListManager.getContactList(DEFAULT_GROUP_NAME)); assertTrue(con.joinGracefully()); verifyAll(); } private void expectInitialListCreation() { listener.onContactChange(eq(ContactListListener.LIST_CREATED), anyObject(ContactList.class), eq((Contact) null)); expectLastCall(); listener.onContactsPresenceUpdate(anyObject(Contact[].class)); expectLastCall(); listener.onAllContactListsLoaded(); expectLastCall(); } }