2222import org .awaitility .Durations ;
2323import org .hamcrest .core .IsEqual ;
2424import org .jetbrains .annotations .NotNull ;
25+ import org .junit .Ignore ;
2526import org .junit .Test ;
2627
2728import java .util .ArrayList ;
3839
3940public class PresenceIntegrationTests extends BaseIntegrationTest {
4041
42+ private static final String STATE_CHANGE_EVENT = "state-change" ;
43+
4144 @ Test
4245 public void testWhereNow () {
4346 final AtomicBoolean success = new AtomicBoolean ();
@@ -206,6 +209,101 @@ public void testHereNow() {
206209 listen (success );
207210 }
208211
212+ @ Ignore ("For now server doesn't emit state-change event on Heartbeat as default. To do this you need to set presence_heartbeat_state_change_event flag on keys. " +
213+ "Server plans to generate state-change event as default. Once server change is on Prod modify it by replacing Thread.sleep(10000) with Awaitility.await()" )
214+ @ Test
215+ public void should_setState_withHeartbeat () throws InterruptedException {
216+ // enableHeartbeatLoop(2);
217+ boolean WITH_HEARTBEAT_TRUE = true ;
218+ final AtomicInteger hits = new AtomicInteger ();
219+ final int expectedHits = 2 ;
220+
221+ final JsonObject expectedStatePayload = generatePayload ();
222+ final String expectedChannel = RandomGenerator .get ();
223+
224+ pubNub .addListener (new SubscribeCallback () {
225+ @ Override
226+ public void file (@ NotNull PubNub pubnub , @ NotNull PNFileEventResult pnFileEventResult ) {
227+
228+ }
229+
230+ @ Override
231+ public void status (@ NotNull PubNub pubnub , @ NotNull PNStatus status ) {
232+ System .out .println ("---" + status .getCategory ());
233+ }
234+
235+ @ Override
236+ public void message (@ NotNull PubNub pubnub , @ NotNull PNMessageResult message ) {
237+
238+ }
239+
240+ @ Override
241+ public void presence (@ NotNull PubNub pubnub , @ NotNull PNPresenceEventResult presence ) {
242+ System .out .println ("---" + presence .getEvent ());
243+ if (presence .getEvent ().equals (STATE_CHANGE_EVENT )
244+ && presence .getChannel ().equals (expectedChannel )
245+ && presence .getUuid ().equals (pubNub .getConfiguration ().getUserId ().getValue ())) {
246+ assertEquals (expectedStatePayload , presence .getState ());
247+ hits .incrementAndGet ();
248+ }
249+ }
250+
251+ @ Override
252+ public void signal (@ NotNull PubNub pubNub , @ NotNull PNSignalResult pnSignalResult ) {
253+
254+ }
255+
256+ @ Override
257+ public void uuid (@ NotNull final PubNub pubnub , @ NotNull final PNUUIDMetadataResult pnUUIDMetadataResult ) {
258+
259+ }
260+
261+ @ Override
262+ public void channel (@ NotNull final PubNub pubnub , @ NotNull final PNChannelMetadataResult pnChannelMetadataResult ) {
263+
264+ }
265+
266+ @ Override
267+ public void membership (@ NotNull final PubNub pubnub , @ NotNull final PNMembershipResult pnMembershipResult ) {
268+
269+ }
270+
271+ @ Override
272+ public void messageAction (@ NotNull PubNub pubnub , @ NotNull PNMessageActionResult pnActionResult ) {
273+
274+ }
275+ });
276+
277+ subscribeToChannel (pubNub , expectedChannel );
278+
279+ pubNub .setPresenceState ()
280+ .channels (Collections .singletonList (expectedChannel ))
281+ .state (expectedStatePayload )
282+ .withHeartbeat (WITH_HEARTBEAT_TRUE )
283+ .async ((result , status ) -> {
284+ assertFalse (status .isError ());
285+ assert result != null ;
286+ assertEquals (expectedStatePayload , result .getState ());
287+ });
288+
289+ // Awaitility.await().atMost(Durations.FIVE_SECONDS).untilAtomic(hits, IsEqual.equalTo(1));
290+ Thread .sleep (1000 );
291+
292+ pubNub .getPresenceState ()
293+ .channels (Collections .singletonList (expectedChannel ))
294+ .async ((result , status ) -> {
295+ assertFalse (status .isError ());
296+ assert result != null ;
297+ assertEquals (expectedStatePayload .get ("text" ), result .getStateByUUID ().get (expectedChannel ).getAsJsonObject ().get ("text" ));
298+ assertEquals (expectedStatePayload .get ("info" ), result .getStateByUUID ().get (expectedChannel ).getAsJsonObject ().get ("info" ));
299+ assertEquals (expectedStatePayload .get ("uncd" ), result .getStateByUUID ().get (expectedChannel ).getAsJsonObject ().get ("uncd" ));
300+ hits .incrementAndGet ();
301+ });
302+
303+ // Awaitility.await().atMost(Durations.FIVE_SECONDS).untilAtomic(hits, IsEqual.equalTo(expectedHits));
304+ Thread .sleep (1000 );
305+ }
306+
209307 @ Test
210308 public void testPresenceState () {
211309 final AtomicInteger hits = new AtomicInteger ();
@@ -232,7 +330,7 @@ public void message(@NotNull PubNub pubnub, @NotNull PNMessageResult message) {
232330
233331 @ Override
234332 public void presence (@ NotNull PubNub pubnub , @ NotNull PNPresenceEventResult presence ) {
235- if (presence .getEvent ().equals ("state-change" )
333+ if (presence .getEvent ().equals (STATE_CHANGE_EVENT )
236334 && presence .getChannel ().equals (expectedChannel )
237335 && presence .getUuid ().equals (pubNub .getConfiguration ().getUserId ().getValue ())) {
238336 assertEquals (expectedStatePayload , presence .getState ());
@@ -458,4 +556,8 @@ public void messageAction(@NotNull PubNub pubnub, @NotNull PNMessageActionResult
458556 .atMost (20 , TimeUnit .SECONDS )
459557 .until (() -> subscribeSuccess .get () && heartbeatCallsCount .get () > 2 );
460558 }
559+
560+ private void enableHeartbeatLoop (int interval ) {
561+ pubNub .getConfiguration ().setPresenceTimeoutWithCustomInterval (20 , interval );
562+ }
461563}
0 commit comments