mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-16 12:12:06 +01:00
Add kick presence tests
Inspired by OF-2240. Used to validate the problem, then test the fix.
This commit is contained in:
parent
3d4e7938a7
commit
920b686f29
1 changed files with 101 additions and 0 deletions
|
@ -16,7 +16,9 @@
|
||||||
*/
|
*/
|
||||||
package org.jivesoftware.smackx.muc;
|
package org.jivesoftware.smackx.muc;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertAll;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
@ -45,6 +47,7 @@ import org.igniterealtime.smack.inttest.util.SimpleResultSyncPoint;
|
||||||
import org.jxmpp.jid.DomainBareJid;
|
import org.jxmpp.jid.DomainBareJid;
|
||||||
import org.jxmpp.jid.EntityBareJid;
|
import org.jxmpp.jid.EntityBareJid;
|
||||||
import org.jxmpp.jid.EntityFullJid;
|
import org.jxmpp.jid.EntityFullJid;
|
||||||
|
import org.jxmpp.jid.Jid;
|
||||||
import org.jxmpp.jid.impl.JidCreate;
|
import org.jxmpp.jid.impl.JidCreate;
|
||||||
import org.jxmpp.jid.parts.Localpart;
|
import org.jxmpp.jid.parts.Localpart;
|
||||||
import org.jxmpp.jid.parts.Resourcepart;
|
import org.jxmpp.jid.parts.Resourcepart;
|
||||||
|
@ -646,6 +649,104 @@ public class MultiUserChatIntegrationTest extends AbstractSmackIntegrationTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that a user who gets kicked receives that change as a presence update
|
||||||
|
*
|
||||||
|
* <p>From XEP-0045 § 8.2:</p>
|
||||||
|
* <blockquote>
|
||||||
|
* The kick is performed based on the occupant's room nickname and is completed by setting the role of a
|
||||||
|
* participant or visitor to a value of "none".
|
||||||
|
*
|
||||||
|
* The service MUST remove the kicked occupant by sending a presence stanza of type "unavailable" to each kicked
|
||||||
|
* occupant, including status code 307 in the extended presence information, optionally along with the reason (if
|
||||||
|
* provided) and the roomnick or bare JID of the user who initiated the kick.
|
||||||
|
* </blockquote>
|
||||||
|
*
|
||||||
|
* @throws Exception when errors occur
|
||||||
|
*/
|
||||||
|
@SmackIntegrationTest
|
||||||
|
public void mucPresenceTestForGettingKicked() throws Exception {
|
||||||
|
EntityBareJid mucAddress = getRandomRoom("smack-inttest");
|
||||||
|
|
||||||
|
MultiUserChat mucAsSeenByOne = mucManagerOne.getMultiUserChat(mucAddress);
|
||||||
|
MultiUserChat mucAsSeenByTwo = mucManagerTwo.getMultiUserChat(mucAddress);
|
||||||
|
|
||||||
|
createMUC(mucAsSeenByOne, "one-" + randomString);
|
||||||
|
final Resourcepart nicknameTwo = Resourcepart.from("two-" + randomString);
|
||||||
|
mucAsSeenByTwo.join(nicknameTwo);
|
||||||
|
|
||||||
|
final ResultSyncPoint<Presence, Exception> resultSyncPoint = new ResultSyncPoint<>();
|
||||||
|
mucAsSeenByTwo.addParticipantListener(kickPresence -> resultSyncPoint.signal(kickPresence));
|
||||||
|
|
||||||
|
mucAsSeenByOne.kickParticipant(nicknameTwo, "Nothing personal. Just a test.");
|
||||||
|
try {
|
||||||
|
Presence kickPresence = resultSyncPoint.waitForResult(timeout);
|
||||||
|
MUCUser mucUser = MUCUser.from(kickPresence);
|
||||||
|
assertNotNull(mucUser);
|
||||||
|
assertAll(
|
||||||
|
() -> assertTrue(mucUser.getStatus().contains(MUCUser.Status.PRESENCE_TO_SELF_110), "Missing self-presence status code in kick presence"),
|
||||||
|
() -> assertTrue(mucUser.getStatus().contains(MUCUser.Status.KICKED_307), "Missing kick status code in kick presence"),
|
||||||
|
() -> assertEquals(MUCRole.none, mucUser.getItem().getRole(), "Role other than 'none' in kick presence")
|
||||||
|
);
|
||||||
|
Jid itemJid = mucUser.getItem().getJid();
|
||||||
|
if (itemJid != null) {
|
||||||
|
assertEquals(conTwo.getUser().asEntityFullJidIfPossible(), itemJid, "Incorrect kicked user in kick presence");
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
tryDestroy(mucAsSeenByOne);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that a user who is present when another user gets kicked receives that change as a presence update
|
||||||
|
*
|
||||||
|
* <p>From XEP-0045 § 8.2:</p>
|
||||||
|
* <blockquote>
|
||||||
|
* ...the service MUST then inform all of the remaining occupants that the kicked occupant is no longer in the room
|
||||||
|
* by sending presence stanzas of type "unavailable" from the individual's roomnick (<room@service/nick>) to all
|
||||||
|
* the remaining occupants (just as it does when occupants exit the room of their own volition), including the
|
||||||
|
* status code and optionally the reason and actor.
|
||||||
|
* </blockquote>
|
||||||
|
*
|
||||||
|
* @throws Exception when errors occur
|
||||||
|
*/
|
||||||
|
@SmackIntegrationTest
|
||||||
|
public void mucPresenceTestForWitnessingKick() throws Exception {
|
||||||
|
EntityBareJid mucAddress = getRandomRoom("smack-inttest");
|
||||||
|
|
||||||
|
MultiUserChat mucAsSeenByOne = mucManagerOne.getMultiUserChat(mucAddress);
|
||||||
|
MultiUserChat mucAsSeenByTwo = mucManagerTwo.getMultiUserChat(mucAddress);
|
||||||
|
MultiUserChat mucAsSeenByThree = mucManagerThree.getMultiUserChat(mucAddress);
|
||||||
|
|
||||||
|
createMUC(mucAsSeenByOne, "one-" + randomString);
|
||||||
|
final Resourcepart nicknameTwo = Resourcepart.from("two-" + randomString);
|
||||||
|
final Resourcepart nicknameThree = Resourcepart.from("three-" + randomString);
|
||||||
|
mucAsSeenByTwo.join(nicknameTwo);
|
||||||
|
mucAsSeenByThree.join(nicknameThree);
|
||||||
|
|
||||||
|
final ResultSyncPoint<Presence, Exception> resultSyncPoint = new ResultSyncPoint<>();
|
||||||
|
mucAsSeenByThree.addParticipantListener(kickPresence -> resultSyncPoint.signal(kickPresence));
|
||||||
|
|
||||||
|
mucAsSeenByOne.kickParticipant(nicknameTwo, "Nothing personal. Just a test.");
|
||||||
|
try {
|
||||||
|
Presence kickPresence = resultSyncPoint.waitForResult(timeout);
|
||||||
|
MUCUser mucUser = MUCUser.from(kickPresence);
|
||||||
|
assertNotNull(mucUser);
|
||||||
|
assertAll(
|
||||||
|
() -> assertFalse(mucUser.getStatus().contains(MUCUser.Status.PRESENCE_TO_SELF_110), "Incorrect self-presence status code in kick presence"),
|
||||||
|
() -> assertTrue(mucUser.getStatus().contains(MUCUser.Status.KICKED_307), "Missing kick status code in kick presence"),
|
||||||
|
() -> assertEquals(MUCRole.none, mucUser.getItem().getRole(), "Role other than 'none' in kick presence")
|
||||||
|
);
|
||||||
|
Jid itemJid = mucUser.getItem().getJid();
|
||||||
|
if (itemJid != null) {
|
||||||
|
assertEquals(conTwo.getUser().asEntityFullJidIfPossible(), itemJid, "Incorrect kicked user in kick presence");
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
tryDestroy(mucAsSeenByOne);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@SmackIntegrationTest
|
@SmackIntegrationTest
|
||||||
public void mucDestroyTest() throws TimeoutException, Exception {
|
public void mucDestroyTest() throws TimeoutException, Exception {
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue