1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2024-11-29 23:42:06 +01:00

Compare commits

..

No commits in common. "0cd3318b128e789a44dd97775ffbb4496a783418" and "daab6039a1af48199a709873020ba81096fb4b2d" have entirely different histories.

17 changed files with 57 additions and 174 deletions

View file

@ -1,7 +0,0 @@
Thank you for your contribution!
Before creating a Pull Request, please make sure to
* read https://github.com/igniterealtime/Smack/wiki/Guidelines-for-Smack-Developers-and-Contributors
* run `gradle check` successfully in order to make sure that your code does not break any JUnit tests and is conform to the projects code style.
* (if applicable) mention any Jira issue codes (eg. `SMACK-XXX`) in the *body* of your commit message (not the header), so that Jira automatically links the PR to the issue.
* squash your commits if possible/sensible.

View file

@ -80,7 +80,6 @@ debugger=console
### Where to place the properties file ### Where to place the properties file
The framework will first load the properties file from `~/.config/smack-integration-test/properties` The framework will first load the properties file from `~/.config/smack-integration-test/properties`
Overview of the components Overview of the components
-------------------------- --------------------------

View file

@ -4,7 +4,5 @@ This API is considered beta quality."""
dependencies { dependencies {
compile project(':smack-core') compile project(':smack-core')
// See https://issues.igniterealtime.org/browse/SMACK-858 and compile 'org.igniterealtime.jbosh:jbosh:[0.9,0.10)'
// comment in version.gradle why the specify the version this way.
compile 'org.igniterealtime.jbosh:jbosh:[0.9.1,0.9.999]'
} }

View file

@ -19,8 +19,6 @@ package org.jivesoftware.smack.bosh;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import org.jivesoftware.smack.ConnectionConfiguration; import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.proxy.ProxyInfo; import org.jivesoftware.smack.proxy.ProxyInfo;
@ -36,7 +34,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
private final boolean https; private final boolean https;
private final String file; private final String file;
private Map<String, String> httpHeaders;
private BOSHConfiguration(Builder builder) { private BOSHConfiguration(Builder builder) {
super(builder); super(builder);
@ -52,7 +49,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
} else { } else {
file = builder.file; file = builder.file;
} }
httpHeaders = builder.httpHeaders;
} }
public boolean isProxyEnabled() { public boolean isProxyEnabled() {
@ -80,10 +76,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
return new URI((https ? "https://" : "http://") + this.host + ":" + this.port + file); return new URI((https ? "https://" : "http://") + this.host + ":" + this.port + file);
} }
public Map<String, String> getHttpHeaders() {
return httpHeaders;
}
public static Builder builder() { public static Builder builder() {
return new Builder(); return new Builder();
} }
@ -91,7 +83,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
public static final class Builder extends ConnectionConfiguration.Builder<Builder, BOSHConfiguration> { public static final class Builder extends ConnectionConfiguration.Builder<Builder, BOSHConfiguration> {
private boolean https; private boolean https;
private String file; private String file;
private Map<String, String> httpHeaders = new HashMap<>();
private Builder() { private Builder() {
} }
@ -110,11 +101,6 @@ public final class BOSHConfiguration extends ConnectionConfiguration {
return this; return this;
} }
public Builder addHttpHeader(String name, String value) {
httpHeaders.put(name, value);
return this;
}
@Override @Override
public BOSHConfiguration build() { public BOSHConfiguration build() {
return new BOSHConfiguration(this); return new BOSHConfiguration(this);

View file

@ -22,7 +22,6 @@ import java.io.PipedReader;
import java.io.PipedWriter; import java.io.PipedWriter;
import java.io.StringReader; import java.io.StringReader;
import java.io.Writer; import java.io.Writer;
import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -158,13 +157,8 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
if (config.isProxyEnabled()) { if (config.isProxyEnabled()) {
cfgBuilder.setProxy(config.getProxyAddress(), config.getProxyPort()); cfgBuilder.setProxy(config.getProxyAddress(), config.getProxyPort());
} }
cfgBuilder.setCompressionEnabled(config.isCompressionEnabled()); cfgBuilder.setCompressionEnabled(config.isCompressionEnabled());
for (Map.Entry<String, String> h : config.getHttpHeaders().entrySet()) {
cfgBuilder.addHttpHeader(h.getKey(), h.getValue());
}
client = BOSHClient.create(cfgBuilder.build()); client = BOSHClient.create(cfgBuilder.build());
client.addBOSHClientConnListener(new BOSHConnectionListener()); client.addBOSHClientConnListener(new BOSHConnectionListener());

View file

@ -858,6 +858,9 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
ASYNC_BUT_ORDERED.performAsyncButOrdered(this, () -> { ASYNC_BUT_ORDERED.performAsyncButOrdered(this, () -> {
currentConnectionException = exception; currentConnectionException = exception;
synchronized (AbstractXMPPConnection.this) {
notifyAll();
}
for (StanzaCollector collector : collectors) { for (StanzaCollector collector : collectors) {
collector.notifyConnectionError(exception); collector.notifyConnectionError(exception);
@ -870,14 +873,10 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
// XMPPTCPConnection. Create delegation method? // XMPPTCPConnection. Create delegation method?
// maybeCompressFeaturesReceived.reportGenericFailure(smackWrappedException); // maybeCompressFeaturesReceived.reportGenericFailure(smackWrappedException);
synchronized (AbstractXMPPConnection.this) {
notifyAll();
// Closes the connection temporary. A if the connection supports stream management, then a reconnection is // Closes the connection temporary. A if the connection supports stream management, then a reconnection is
// possible. Note that a connection listener of e.g. XMPPTCPConnection will drop the SM state in // possible. Note that a connection listener of e.g. XMPPTCPConnection will drop the SM state in
// case the Exception is a StreamErrorException. // case the Exception is a StreamErrorException.
instantShutdown(); instantShutdown();
}
Async.go(() -> { Async.go(() -> {
// Notify connection listeners of the error. // Notify connection listeners of the error.

View file

@ -58,7 +58,7 @@ class HTTPProxySocketConnection implements ProxySocketConnection {
proxyLine = "\r\nProxy-Authorization: Basic " + Base64.encode(username + ":" + password); proxyLine = "\r\nProxy-Authorization: Basic " + Base64.encode(username + ":" + password);
} }
socket.getOutputStream().write((hostport + " HTTP/1.1\r\nHost: " socket.getOutputStream().write((hostport + " HTTP/1.1\r\nHost: "
+ host + ":" + port + proxyLine + "\r\n\r\n").getBytes("UTF-8")); + hostport + proxyLine + "\r\n\r\n").getBytes("UTF-8"));
InputStream in = socket.getInputStream(); InputStream in = socket.getInputStream();
StringBuilder got = new StringBuilder(100); StringBuilder got = new StringBuilder(100);
@ -115,8 +115,7 @@ class HTTPProxySocketConnection implements ProxySocketConnection {
int code = Integer.parseInt(m.group(1)); int code = Integer.parseInt(m.group(1));
if (code != HttpURLConnection.HTTP_OK) { if (code != HttpURLConnection.HTTP_OK) {
throw new ProxyException(ProxyInfo.ProxyType.HTTP, throw new ProxyException(ProxyInfo.ProxyType.HTTP);
"Error code in proxy response: " + code);
} }
} }

View file

@ -152,11 +152,8 @@ public final class MultiUserChatManager extends Manager {
private AutoJoinFailedCallback autoJoinFailedCallback; private AutoJoinFailedCallback autoJoinFailedCallback;
private final ServiceDiscoveryManager serviceDiscoveryManager;
private MultiUserChatManager(XMPPConnection connection) { private MultiUserChatManager(XMPPConnection connection) {
super(connection); super(connection);
serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection);
// Listens for all messages that include a MUCUser extension and fire the invitation // Listens for all messages that include a MUCUser extension and fire the invitation
// listeners if the message includes an invitation. // listeners if the message includes an invitation.
StanzaListener invitationPacketListener = new StanzaListener() { StanzaListener invitationPacketListener = new StanzaListener() {
@ -280,7 +277,7 @@ public final class MultiUserChatManager extends Manager {
* @throws InterruptedException * @throws InterruptedException
*/ */
public boolean isServiceEnabled(Jid user) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { public boolean isServiceEnabled(Jid user) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
return serviceDiscoveryManager.supportsFeature(user, MUCInitialPresence.NAMESPACE); return ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature(user, MUCInitialPresence.NAMESPACE);
} }
/** /**
@ -307,7 +304,7 @@ public final class MultiUserChatManager extends Manager {
public List<EntityBareJid> getJoinedRooms(EntityJid user) throws NoResponseException, XMPPErrorException, public List<EntityBareJid> getJoinedRooms(EntityJid user) throws NoResponseException, XMPPErrorException,
NotConnectedException, InterruptedException { NotConnectedException, InterruptedException {
// Send the disco packet to the user // Send the disco packet to the user
DiscoverItems result = serviceDiscoveryManager.discoverItems(user, DISCO_NODE); DiscoverItems result = ServiceDiscoveryManager.getInstanceFor(connection()).discoverItems(user, DISCO_NODE);
List<DiscoverItems.Item> items = result.getItems(); List<DiscoverItems.Item> items = result.getItems();
List<EntityBareJid> answer = new ArrayList<>(items.size()); List<EntityBareJid> answer = new ArrayList<>(items.size());
// Collect the entityID for each returned item // Collect the entityID for each returned item
@ -334,7 +331,7 @@ public final class MultiUserChatManager extends Manager {
* @throws InterruptedException * @throws InterruptedException
*/ */
public RoomInfo getRoomInfo(EntityBareJid room) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { public RoomInfo getRoomInfo(EntityBareJid room) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
DiscoverInfo info = serviceDiscoveryManager.discoverInfo(room); DiscoverInfo info = ServiceDiscoveryManager.getInstanceFor(connection()).discoverInfo(room);
return new RoomInfo(info); return new RoomInfo(info);
} }
@ -348,7 +345,8 @@ public final class MultiUserChatManager extends Manager {
* @throws InterruptedException * @throws InterruptedException
*/ */
public List<DomainBareJid> getMucServiceDomains() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { public List<DomainBareJid> getMucServiceDomains() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
return serviceDiscoveryManager.findServices(MUCInitialPresence.NAMESPACE, false, false); ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection());
return sdm.findServices(MUCInitialPresence.NAMESPACE, false, false);
} }
/** /**
@ -381,7 +379,7 @@ public final class MultiUserChatManager extends Manager {
*/ */
public boolean providesMucService(DomainBareJid domainBareJid) throws NoResponseException, public boolean providesMucService(DomainBareJid domainBareJid) throws NoResponseException,
XMPPErrorException, NotConnectedException, InterruptedException { XMPPErrorException, NotConnectedException, InterruptedException {
return serviceDiscoveryManager.supportsFeature(domainBareJid, return ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature(domainBareJid,
MUCInitialPresence.NAMESPACE); MUCInitialPresence.NAMESPACE);
} }
@ -404,7 +402,8 @@ public final class MultiUserChatManager extends Manager {
if (!providesMucService(serviceName)) { if (!providesMucService(serviceName)) {
throw new NotAMucServiceException(serviceName); throw new NotAMucServiceException(serviceName);
} }
DiscoverItems discoverItems = serviceDiscoveryManager.discoverItems(serviceName); ServiceDiscoveryManager discoManager = ServiceDiscoveryManager.getInstanceFor(connection());
DiscoverItems discoverItems = discoManager.discoverItems(serviceName);
List<DiscoverItems.Item> items = discoverItems.getItems(); List<DiscoverItems.Item> items = discoverItems.getItems();
Map<EntityBareJid, HostedRoom> answer = new HashMap<>(items.size()); Map<EntityBareJid, HostedRoom> answer = new HashMap<>(items.size());

View file

@ -447,19 +447,6 @@ public final class PingManager extends Manager {
pingFuture.onError(new ExceptionCallback<Exception>() { pingFuture.onError(new ExceptionCallback<Exception>() {
@Override @Override
public void processException(Exception exception) { public void processException(Exception exception) {
long lastStanzaReceived = connection.getLastStanzaReceived();
if (lastStanzaReceived > 0) {
long now = System.currentTimeMillis();
// Delta since the last stanza was received
int deltaInSeconds = (int) ((now - lastStanzaReceived) / 1000);
// If the delta is smaller then the ping interval, we have got an valid stanza in time
// So not error notification needed
if (deltaInSeconds < pingInterval) {
maybeSchedulePingServerTask(deltaInSeconds);
return;
}
}
for (PingFailedListener l : pingFailedListeners) { for (PingFailedListener l : pingFailedListeners) {
l.pingFailed(); l.pingFailed();
} }

View file

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2003-2007 Jive Software, 2016-2019 Florian Schmaus. * Copyright 2003-2007 Jive Software, 2016-2017 Florian Schmaus.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -629,40 +629,14 @@ public final class Roster extends Manager {
* @throws NotLoggedInException If not logged in. * @throws NotLoggedInException If not logged in.
* @throws NotConnectedException * @throws NotConnectedException
* @throws InterruptedException * @throws InterruptedException
* @deprecated use {@link #createItemAndRequestSubscription(BareJid, String, String[])} instead.
*/ */
// TODO: Remove in Smack 4.5.
@Deprecated
public void createEntry(BareJid user, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { public void createEntry(BareJid user, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
createItemAndRequestSubscription(user, name, groups);
}
/**
* Creates a new roster item. The server will asynchronously update the roster with the subscription status.
* <p>
* There will be no presence subscription request. Consider using
* {@link #createItemAndRequestSubscription(BareJid, String, String[])} if you also want to request a presence
* subscription from the contact.
* </p>
*
* @param jid the XMPP address of the contact (e.g. johndoe@jabber.org)
* @param name the nickname of the user.
* @param groups the list of group names the entry will belong to, or <tt>null</tt> if the the roster entry won't
* belong to a group.
* @throws NoResponseException if there was no response from the server.
* @throws XMPPErrorException if an XMPP exception occurs.
* @throws NotLoggedInException If not logged in.
* @throws NotConnectedException
* @throws InterruptedException
* @since 4.4.0
*/
public void createItem(BareJid jid, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
final XMPPConnection connection = getAuthenticatedConnectionOrThrow(); final XMPPConnection connection = getAuthenticatedConnectionOrThrow();
// Create and send roster entry creation packet. // Create and send roster entry creation packet.
RosterPacket rosterPacket = new RosterPacket(); RosterPacket rosterPacket = new RosterPacket();
rosterPacket.setType(IQ.Type.set); rosterPacket.setType(IQ.Type.set);
RosterPacket.Item item = new RosterPacket.Item(jid, name); RosterPacket.Item item = new RosterPacket.Item(user, name);
if (groups != null) { if (groups != null) {
for (String group : groups) { for (String group : groups) {
if (group != null && group.trim().length() > 0) { if (group != null && group.trim().length() > 0) {
@ -672,27 +646,8 @@ public final class Roster extends Manager {
} }
rosterPacket.addRosterItem(item); rosterPacket.addRosterItem(item);
connection.createStanzaCollectorAndSend(rosterPacket).nextResultOrThrow(); connection.createStanzaCollectorAndSend(rosterPacket).nextResultOrThrow();
}
/** sendSubscriptionRequest(user);
* Creates a new roster entry and presence subscription. The server will asynchronously
* update the roster with the subscription status.
*
* @param jid the XMPP address of the contact (e.g. johndoe@jabber.org)
* @param name the nickname of the user.
* @param groups the list of group names the entry will belong to, or <tt>null</tt> if the
* the roster entry won't belong to a group.
* @throws NoResponseException if there was no response from the server.
* @throws XMPPErrorException if an XMPP exception occurs.
* @throws NotLoggedInException If not logged in.
* @throws NotConnectedException
* @throws InterruptedException
* @since 4.4.0
*/
public void createItemAndRequestSubscription(BareJid jid, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
createItem(jid, name, groups);
sendSubscriptionRequest(jid);
} }
/** /**
@ -713,7 +668,7 @@ public final class Roster extends Manager {
*/ */
public void preApproveAndCreateEntry(BareJid user, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException, FeatureNotSupportedException { public void preApproveAndCreateEntry(BareJid user, String name, String[] groups) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException, FeatureNotSupportedException {
preApprove(user); preApprove(user);
createItemAndRequestSubscription(user, name, groups); createEntry(user, name, groups);
} }
/** /**

View file

@ -164,7 +164,7 @@ public class RosterTest extends InitSmackIm {
} }
}; };
serverSimulator.start(); serverSimulator.start();
roster.createItemAndRequestSubscription(contactJID, contactName, contactGroup); roster.createEntry(contactJID, contactName, contactGroup);
serverSimulator.join(); serverSimulator.join();
// Check if an error occurred within the simulator // Check if an error occurred within the simulator
@ -430,7 +430,7 @@ public class RosterTest extends InitSmackIm {
} }
}; };
serverSimulator.start(); serverSimulator.start();
roster.createItemAndRequestSubscription(contactJID, contactName, contactGroup); roster.createEntry(contactJID, contactName, contactGroup);
serverSimulator.join(); serverSimulator.join();
// Check if an error occurred within the simulator // Check if an error occurred within the simulator

View file

@ -299,32 +299,10 @@ public class XmppConnectionStressTest {
private ErrorsWhileSendingOrReceivingException(Map<XMPPConnection, Exception> sendExceptions, private ErrorsWhileSendingOrReceivingException(Map<XMPPConnection, Exception> sendExceptions,
Map<XMPPConnection, Exception> receiveExceptions) { Map<XMPPConnection, Exception> receiveExceptions) {
super(createMessageFrom(sendExceptions, receiveExceptions)); super("Exceptions while sending and/or receiving");
this.sendExceptions = sendExceptions; this.sendExceptions = sendExceptions;
this.receiveExceptions = receiveExceptions; this.receiveExceptions = receiveExceptions;
} }
private static String createMessageFrom(Map<XMPPConnection, Exception> sendExceptions,
Map<XMPPConnection, Exception> receiveExceptions) {
StringBuilder sb = new StringBuilder(1024);
sb.append("Exceptions while sending and/or receiving.");
if (!sendExceptions.isEmpty()) {
sb.append(" Send exxceptions: ");
for (Map.Entry<XMPPConnection, Exception> entry : sendExceptions.entrySet()) {
sb.append(entry.getKey()).append(": ").append(entry.getValue()).append(';');
}
}
if (!receiveExceptions.isEmpty()) {
sb.append(" Receive exceptions: ");
for (Map.Entry<XMPPConnection, Exception> entry : receiveExceptions.entrySet()) {
sb.append(entry.getKey()).append(": ").append(entry.getValue());
}
}
return sb.toString();
}
} }
} }
} }

View file

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2015-2019 Florian Schmaus * Copyright 2015-2018 Florian Schmaus
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -25,13 +25,11 @@ import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException.XMPPErrorException; import org.jivesoftware.smack.XMPPException.XMPPErrorException;
import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.roster.AbstractPresenceEventListener; import org.jivesoftware.smack.roster.AbstractPresenceEventListener;
import org.jivesoftware.smack.roster.PresenceEventListener;
import org.jivesoftware.smack.roster.Roster; import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.roster.RosterEntry; import org.jivesoftware.smack.roster.RosterEntry;
import org.jivesoftware.smack.roster.SubscribeListener; import org.jivesoftware.smack.roster.SubscribeListener;
import org.jxmpp.jid.BareJid; import org.jxmpp.jid.BareJid;
import org.jxmpp.jid.EntityFullJid;
import org.jxmpp.jid.Jid; import org.jxmpp.jid.Jid;
public class IntegrationTestRosterUtil { public class IntegrationTestRosterUtil {
@ -41,47 +39,41 @@ public class IntegrationTestRosterUtil {
ensureSubscribedTo(conTwo, conOne, timeout); ensureSubscribedTo(conTwo, conOne, timeout);
} }
public static void ensureSubscribedTo(final XMPPConnection presenceRequestReceiverConnection, final XMPPConnection presenceRequestingConnection, long timeout) throws TimeoutException, Exception { public static void ensureSubscribedTo(final XMPPConnection conOne, final XMPPConnection conTwo, long timeout) throws TimeoutException, Exception {
final Roster presenceRequestReceiverRoster = Roster.getInstanceFor(presenceRequestReceiverConnection); Roster rosterOne = Roster.getInstanceFor(conOne);
final Roster presenceRequestingRoster = Roster.getInstanceFor(presenceRequestingConnection); Roster rosterTwo = Roster.getInstanceFor(conTwo);
final EntityFullJid presenceRequestReceiverAddress = presenceRequestReceiverConnection.getUser(); if (rosterOne.isSubscribedToMyPresence(conTwo.getUser())) {
final EntityFullJid presenceRequestingAddress = presenceRequestingConnection.getUser();
if (presenceRequestReceiverRoster.isSubscribedToMyPresence(presenceRequestingAddress)) {
return; return;
} }
final SubscribeListener subscribeListener = new SubscribeListener() { final SubscribeListener subscribeListener = new SubscribeListener() {
@Override @Override
public SubscribeAnswer processSubscribe(Jid from, Presence subscribeRequest) { public SubscribeAnswer processSubscribe(Jid from, Presence subscribeRequest) {
if (from.equals(presenceRequestingConnection.getUser().asBareJid())) { if (from.equals(conTwo.getUser().asBareJid())) {
return SubscribeAnswer.Approve; return SubscribeAnswer.Approve;
} }
return SubscribeAnswer.Deny; return SubscribeAnswer.Deny;
} }
}; };
presenceRequestReceiverRoster.addSubscribeListener(subscribeListener); rosterOne.addSubscribeListener(subscribeListener);
final SimpleResultSyncPoint syncPoint = new SimpleResultSyncPoint(); final SimpleResultSyncPoint syncPoint = new SimpleResultSyncPoint();
final PresenceEventListener presenceEventListener = new AbstractPresenceEventListener() { rosterTwo.addPresenceEventListener(new AbstractPresenceEventListener() {
@Override @Override
public void presenceSubscribed(BareJid address, Presence subscribedPresence) { public void presenceSubscribed(BareJid address, Presence subscribedPresence) {
if (!address.equals(presenceRequestReceiverAddress.asBareJid())) { if (!address.equals(conOne.getUser().asBareJid())) {
return; return;
} }
syncPoint.signal(); syncPoint.signal();
} }
}; });
presenceRequestingRoster.addPresenceEventListener(presenceEventListener); rosterTwo.sendSubscriptionRequest(conOne.getUser().asBareJid());
try { try {
presenceRequestingRoster.sendSubscriptionRequest(presenceRequestReceiverAddress.asBareJid());
syncPoint.waitForResult(timeout); syncPoint.waitForResult(timeout);
} finally { } finally {
presenceRequestReceiverRoster.removeSubscribeListener(subscribeListener); rosterOne.removeSubscribeListener(subscribeListener);
presenceRequestingRoster.removePresenceEventListener(presenceEventListener);
} }
} }

View file

@ -42,9 +42,12 @@ public class LowLevelRosterIntegrationTest extends AbstractSmackLowLevelIntegrat
final Roster rosterOne = Roster.getInstanceFor(conOne); final Roster rosterOne = Roster.getInstanceFor(conOne);
final Roster rosterTwo = Roster.getInstanceFor(conTwo); final Roster rosterTwo = Roster.getInstanceFor(conTwo);
rosterOne.createItem(conTwo.getUser().asBareJid(), "Con Two", null); // TODO create Roster.createEntry() with boolean flag for subscribe or not.
rosterTwo.createItem(conOne.getUser().asBareJid(), "Con One", null); rosterOne.createEntry(conTwo.getUser().asBareJid(), "Con Two", null);
rosterTwo.createEntry(conOne.getUser().asBareJid(), "Con One", null);
// TODO Change timeout form '5000' to something configurable.
final long timeout = 5000;
IntegrationTestRosterUtil.ensureBothAccountsAreSubscribedToEachOther(conOne, conTwo, timeout); IntegrationTestRosterUtil.ensureBothAccountsAreSubscribedToEachOther(conOne, conTwo, timeout);
final SimpleResultSyncPoint offlineTriggered = new SimpleResultSyncPoint(); final SimpleResultSyncPoint offlineTriggered = new SimpleResultSyncPoint();

View file

@ -99,7 +99,7 @@ public class RosterIntegrationTest extends AbstractSmackIntegrationTest {
}); });
try { try {
rosterOne.createItemAndRequestSubscription(conTwo.getUser().asBareJid(), conTwosRosterName, null); rosterOne.createEntry(conTwo.getUser().asBareJid(), conTwosRosterName, null);
assertTrue(addedAndSubscribed.waitForResult(2 * connection.getReplyTimeout())); assertTrue(addedAndSubscribed.waitForResult(2 * connection.getReplyTimeout()));
} }

View file

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2018 Paul Schaub, 2019 Florian Schmaus. * Copyright 2018 Paul Schaub.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -18,6 +18,9 @@ package org.jivesoftware.smackx.mood;
import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smackx.mood.element.MoodElement;
import org.igniterealtime.smack.inttest.AbstractSmackIntegrationTest; import org.igniterealtime.smack.inttest.AbstractSmackIntegrationTest;
import org.igniterealtime.smack.inttest.SmackIntegrationTest; import org.igniterealtime.smack.inttest.SmackIntegrationTest;
@ -25,6 +28,7 @@ import org.igniterealtime.smack.inttest.SmackIntegrationTestEnvironment;
import org.igniterealtime.smack.inttest.util.IntegrationTestRosterUtil; import org.igniterealtime.smack.inttest.util.IntegrationTestRosterUtil;
import org.igniterealtime.smack.inttest.util.SimpleResultSyncPoint; import org.igniterealtime.smack.inttest.util.SimpleResultSyncPoint;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.jxmpp.jid.BareJid;
public class MoodIntegrationTest extends AbstractSmackIntegrationTest { public class MoodIntegrationTest extends AbstractSmackIntegrationTest {
@ -43,20 +47,18 @@ public class MoodIntegrationTest extends AbstractSmackIntegrationTest {
final SimpleResultSyncPoint moodReceived = new SimpleResultSyncPoint(); final SimpleResultSyncPoint moodReceived = new SimpleResultSyncPoint();
final MoodListener moodListener = (jid, message, moodElement) -> { mm2.addMoodListener(new MoodListener() {
@Override
public void onMoodUpdated(BareJid jid, Message message, MoodElement moodElement) {
if (moodElement.getMood() == Mood.satisfied) { if (moodElement.getMood() == Mood.satisfied) {
moodReceived.signal(); moodReceived.signal();
} }
}; }
mm2.addMoodListener(moodListener); });
try {
mm1.setMood(Mood.satisfied); mm1.setMood(Mood.satisfied);
moodReceived.waitForResult(timeout); moodReceived.waitForResult(timeout);
} finally {
mm2.removeMoodListener(moodListener);
}
} }
@AfterClass @AfterClass

View file

@ -609,7 +609,6 @@ public class XMPPTCPConnection extends AbstractXMPPConnection {
proxyInfo.getProxySocketConnection().connect(socket, host, port, timeout); proxyInfo.getProxySocketConnection().connect(socket, host, port, timeout);
} catch (IOException e) { } catch (IOException e) {
hostAddress.setException(e); hostAddress.setException(e);
failedAddresses.add(hostAddress);
continue; continue;
} }
LOGGER.finer("Established TCP connection to " + hostAndPort); LOGGER.finer("Established TCP connection to " + hostAndPort);