public static async Task ThenWithAsyncRemoveMessageActionReturnsSuccess()
#endif
        {
            server.ClearRequests();

            bool receivedMessage = false;

            if (!PubnubCommon.PAMServerSideRun)
            {
                Assert.Ignore("ThenWithAsyncRemoveMessageActionReturnsSuccess needs Secret Key");
                return;
            }

            PNConfiguration config = new PNConfiguration
            {
                PublishKey   = PubnubCommon.PublishKey,
                SubscribeKey = PubnubCommon.SubscribeKey,
                Uuid         = "mytestuuid",
                Secure       = false
            };

            if (PubnubCommon.PAMServerSideRun)
            {
                config.SecretKey = PubnubCommon.SecretKey;
            }
            else if (!string.IsNullOrEmpty(authKey) && !PubnubCommon.SuppressAuthKey)
            {
                config.AuthKey = authKey;
            }

            server.RunOnHttps(false);
            if (PubnubCommon.PAMServerSideRun)
            {
                config.AuthKey = "myauth";
            }

            pubnub = createPubNubInstance(config);

            string channel = "hello_my_channel";
            long   currentMessageTimetoken = 0;
            long   currentActionTimetoken  = 0;
            string currentUUID             = "";

            manualResetEventWaitTimeout = (PubnubCommon.EnableStubTest) ? 1000 : 310 * 1000;

            System.Diagnostics.Debug.WriteLine("GetMessageActions 1 STARTED");
#if NET40
            PNResult <PNGetMessageActionsResult> getMsgActionResult = Task.Factory.StartNew(async() => await pubnub.GetMessageActions().Channel(channel).Limit(1).ExecuteAsync()).Result.Result;
#else
            PNResult <PNGetMessageActionsResult> getMsgActionResult = await pubnub.GetMessageActions().Channel(channel).Limit(1).ExecuteAsync();
#endif
            if (getMsgActionResult.Result != null && getMsgActionResult.Status.StatusCode == 200 && !getMsgActionResult.Status.Error)
            {
                System.Diagnostics.Debug.WriteLine("GetMessageActions = " + pubnub.JsonPluggableLibrary.SerializeToJsonString(getMsgActionResult.Result));

                if (getMsgActionResult.Result.MessageActions != null && getMsgActionResult.Result.MessageActions.Count > 0)
                {
                    PNMessageActionItem actionItem = getMsgActionResult.Result.MessageActions[0];
                    currentMessageTimetoken = actionItem.MessageTimetoken;
                    currentActionTimetoken  = actionItem.ActionTimetoken;
                    currentUUID             = actionItem.Uuid;
                }
            }

            System.Diagnostics.Debug.WriteLine("RemoveMessageAction STARTED");
#if NET40
            PNResult <PNRemoveMessageActionResult> removeMsgActionResult = Task.Factory.StartNew(async() => await pubnub.RemoveMessageAction()
                                                                                                 .Channel(channel)
                                                                                                 .MessageTimetoken(currentMessageTimetoken)
                                                                                                 .ActionTimetoken(currentActionTimetoken)
                                                                                                 .Uuid(currentUUID)
                                                                                                 .ExecuteAsync()).Result.Result;
#else
            PNResult <PNRemoveMessageActionResult> removeMsgActionResult = await pubnub.RemoveMessageAction()
                                                                           .Channel(channel)
                                                                           .MessageTimetoken(currentMessageTimetoken)
                                                                           .ActionTimetoken(currentActionTimetoken)
                                                                           .Uuid(currentUUID)
                                                                           .ExecuteAsync();
#endif
            if (removeMsgActionResult.Result != null && removeMsgActionResult.Status.StatusCode == 200 && !removeMsgActionResult.Status.Error)
            {
                System.Diagnostics.Debug.WriteLine("RemoveMessageAction = " + pubnub.JsonPluggableLibrary.SerializeToJsonString(removeMsgActionResult.Result));
                receivedMessage = true;
            }

            pubnub.Destroy();
            pubnub.PubnubUnitTest = null;
            pubnub = null;
            Assert.IsTrue(receivedMessage, "ThenWithAsyncRemoveMessageActionReturnsSuccess Failed");
        }
        public static async Task ThenWithAsyncAddRemoveMessageActionReturnEventInfo()
#endif
        {
            server.ClearRequests();
            if (!PubnubCommon.PAMServerSideRun)
            {
                Assert.Ignore("ThenWithAsyncAddRemoveMessageActionReturnEventInfo needs Secret Key");
                return;
            }

            bool receivedMessage     = false;
            bool receivedAddEvent    = false;
            bool receivedRemoveEvent = false;

            SubscribeCallbackExt eventListener = new SubscribeCallbackExt(
                delegate(Pubnub pnObj, PNMessageActionEventResult eventResult)
            {
                System.Diagnostics.Debug.WriteLine("EVENT:" + pubnub.JsonPluggableLibrary.SerializeToJsonString(eventResult));
                if (eventResult.Event == "added")
                {
                    receivedAddEvent = true;
                }
                else if (eventResult.Event == "removed")
                {
                    receivedRemoveEvent = true;
                }
            },
                delegate(Pubnub pnObj, PNStatus status)
            {
            }
                );

            PNConfiguration config = new PNConfiguration
            {
                PublishKey   = PubnubCommon.PublishKey,
                SubscribeKey = PubnubCommon.SubscribeKey,
                Uuid         = "mytestuuid",
                Secure       = false
            };

            if (PubnubCommon.PAMServerSideRun)
            {
                config.SecretKey = PubnubCommon.SecretKey;
            }
            else if (!string.IsNullOrEmpty(authKey) && !PubnubCommon.SuppressAuthKey)
            {
                config.AuthKey = authKey;
            }

            server.RunOnHttps(false);

            pubnub = createPubNubInstance(config);
            pubnub.AddListener(eventListener);

            string channel = "hello_my_channel";

            manualResetEventWaitTimeout = (PubnubCommon.EnableStubTest) ? 1000 : 310 * 1000;
            long   currentMessageTimetoken = new Random().Next(Int32.MaxValue);
            long   currentActionTimetoken  = 0;
            string currentUUID             = "";

            ManualResetEvent me = new ManualResetEvent(false);

            pubnub.Subscribe <string>().Channels(new string[] { channel }).Execute();
            me.WaitOne(2000);

            System.Diagnostics.Debug.WriteLine("GetMessageActions STARTED");
#if NET40
            PNResult <PNGetMessageActionsResult> getMsgActionResult = Task.Factory.StartNew(async() => await pubnub.GetMessageActions().Channel(channel).ExecuteAsync()).Result.Result;
#else
            PNResult <PNGetMessageActionsResult> getMsgActionResult = await pubnub.GetMessageActions().Channel(channel).ExecuteAsync();
#endif
            if (getMsgActionResult.Result != null && getMsgActionResult.Status.StatusCode == 200 && !getMsgActionResult.Status.Error)
            {
                System.Diagnostics.Debug.WriteLine("GetMessageActions = " + pubnub.JsonPluggableLibrary.SerializeToJsonString(getMsgActionResult.Result));

                if (getMsgActionResult.Result.MessageActions != null && getMsgActionResult.Result.MessageActions.Exists(x => x.MessageTimetoken == currentMessageTimetoken))
                {
                    PNMessageActionItem actionItem = getMsgActionResult.Result.MessageActions.Find(x => x.MessageTimetoken == currentMessageTimetoken);
                    currentActionTimetoken = actionItem.ActionTimetoken;
                    currentUUID            = actionItem.Uuid;
                }
            }
            Thread.Sleep(2000);

            if (currentMessageTimetoken > 0 && currentActionTimetoken > 0)
            {
                System.Diagnostics.Debug.WriteLine("RemoveMessageAction STARTED");

#if NET40
                PNResult <PNRemoveMessageActionResult> removeMsgActionResult = Task.Factory.StartNew(async() => await pubnub.RemoveMessageAction()
                                                                                                     .Channel(channel)
                                                                                                     .MessageTimetoken(currentMessageTimetoken)
                                                                                                     .ActionTimetoken(currentActionTimetoken)
                                                                                                     .Uuid(currentUUID)
                                                                                                     .ExecuteAsync()).Result.Result;
#else
                PNResult <PNRemoveMessageActionResult> removeMsgActionResult = await pubnub.RemoveMessageAction()
                                                                               .Channel(channel)
                                                                               .MessageTimetoken(currentMessageTimetoken)
                                                                               .ActionTimetoken(currentActionTimetoken)
                                                                               .Uuid(currentUUID)
                                                                               .ExecuteAsync();
#endif
                if (removeMsgActionResult.Result != null && removeMsgActionResult.Status.StatusCode == 200 && !removeMsgActionResult.Status.Error)
                {
                    System.Diagnostics.Debug.WriteLine("RemoveMessageAction = " + pubnub.JsonPluggableLibrary.SerializeToJsonString(removeMsgActionResult.Result));
                    receivedMessage = true;
                }
            }

            System.Diagnostics.Debug.WriteLine("AddMessageAction STARTED");
#if NET40
            PNResult <PNAddMessageActionResult> addMsgActionResult = Task.Factory.StartNew(async() => await pubnub.AddMessageAction()
                                                                                           .Channel(channel)
                                                                                           .MessageTimetoken(currentMessageTimetoken)
                                                                                           .Action(new PNMessageAction {
                Type = "reaction", Value = "smily_face"
            })
                                                                                           .ExecuteAsync()).Result.Result;
#else
            PNResult <PNAddMessageActionResult> addMsgActionResult = await pubnub.AddMessageAction()
                                                                     .Channel(channel)
                                                                     .MessageTimetoken(currentMessageTimetoken)
                                                                     .Action(new PNMessageAction {
                Type = "reaction", Value = "smily_face"
            })
                                                                     .ExecuteAsync();
#endif
            if (addMsgActionResult.Result != null && addMsgActionResult.Status.StatusCode == 200 && !addMsgActionResult.Status.Error && addMsgActionResult.Result.MessageTimetoken == currentMessageTimetoken)
            {
                System.Diagnostics.Debug.WriteLine("AddMessageAction = " + pubnub.JsonPluggableLibrary.SerializeToJsonString(addMsgActionResult.Result));
                receivedMessage        = true;
                currentActionTimetoken = addMsgActionResult.Result.ActionTimetoken;
                currentUUID            = addMsgActionResult.Result.Uuid;
            }
            Thread.Sleep(2000);

            if (receivedMessage && currentActionTimetoken > 0 && currentMessageTimetoken > 0 && !receivedRemoveEvent)
            {
                System.Diagnostics.Debug.WriteLine("RemoveMessageAction To Confirm STARTED");

#if NET40
                Task.Factory.StartNew(async() => await pubnub.RemoveMessageAction()
                                      .Channel(channel)
                                      .MessageTimetoken(currentMessageTimetoken)
                                      .ActionTimetoken(currentActionTimetoken)
                                      .Uuid(currentUUID)
                                      .ExecuteAsync());
#else
                await pubnub.RemoveMessageAction()
                .Channel(channel)
                .MessageTimetoken(currentMessageTimetoken)
                .ActionTimetoken(currentActionTimetoken)
                .Uuid(currentUUID)
                .ExecuteAsync();
#endif
            }

            Thread.Sleep(4000);

            pubnub.Unsubscribe <string>().Channels(new string[] { channel }).Execute();
            pubnub.RemoveListener(eventListener);

            pubnub.Destroy();
            pubnub.PubnubUnitTest = null;
            pubnub = null;
            Assert.IsTrue(receivedAddEvent && receivedRemoveEvent, "Message Action events Failed");
        }
        public static void ThenRemoveMessageActionReturnsSuccess()
        {
            server.ClearRequests();

            bool receivedMessage = false;

            if (!PubnubCommon.PAMServerSideRun)
            {
                Assert.Ignore("RemoveMessageActionReturnsSuccess needs Secret Key");
                return;
            }

            PNConfiguration config = new PNConfiguration
            {
                PublishKey   = PubnubCommon.PublishKey,
                SubscribeKey = PubnubCommon.SubscribeKey,
                Uuid         = "mytestuuid",
                Secure       = false
            };

            if (PubnubCommon.PAMServerSideRun)
            {
                config.SecretKey = PubnubCommon.SecretKey;
            }
            else if (!string.IsNullOrEmpty(authKey) && !PubnubCommon.SuppressAuthKey)
            {
                config.AuthKey = authKey;
            }

            server.RunOnHttps(false);
            if (PubnubCommon.PAMServerSideRun)
            {
                config.AuthKey = "myauth";
            }

            pubnub = createPubNubInstance(config);

            string channel = "hello_my_channel";
            long   currentMessageTimetoken = 0;
            long   currentActionTimetoken  = 0;
            string currentUUID             = "";

            manualResetEventWaitTimeout = (PubnubCommon.EnableStubTest) ? 1000 : 310 * 1000;

            System.Diagnostics.Debug.WriteLine("GetMessageActions 1 STARTED");
            ManualResetEvent me = new ManualResetEvent(false);

            pubnub.GetMessageActions()
            .Channel(channel)
            .Limit(1)
            .Execute(new PNGetMessageActionsResultExt((r, s) =>
            {
                if (r != null && s.StatusCode == 200 && !s.Error)
                {
                    System.Diagnostics.Debug.WriteLine("GetMessageActions = " + pubnub.JsonPluggableLibrary.SerializeToJsonString(r));

                    if (r.MessageActions != null && r.MessageActions.Count > 0)
                    {
                        PNMessageActionItem actionItem = r.MessageActions[0];
                        currentMessageTimetoken        = actionItem.MessageTimetoken;
                        currentActionTimetoken         = actionItem.ActionTimetoken;
                        currentUUID = actionItem.Uuid;
                    }
                }
                me.Set();
            }));
            me.WaitOne(manualResetEventWaitTimeout);

            System.Diagnostics.Debug.WriteLine("RemoveMessageAction STARTED");
            me = new ManualResetEvent(false);
            pubnub.RemoveMessageAction()
            .Channel(channel)
            .MessageTimetoken(currentMessageTimetoken)
            .ActionTimetoken(currentActionTimetoken)
            .Uuid(currentUUID)
            .Execute(new PNRemoveMessageActionResultExt((r, s) =>
            {
                if (r != null && s.StatusCode == 200 && !s.Error)
                {
                    System.Diagnostics.Debug.WriteLine("RemoveMessageAction = " + pubnub.JsonPluggableLibrary.SerializeToJsonString(r));
                    receivedMessage = true;
                }
                me.Set();
            }));
            me.WaitOne(manualResetEventWaitTimeout);

            pubnub.Destroy();
            pubnub.PubnubUnitTest = null;
            pubnub = null;
            Assert.IsTrue(receivedMessage, "RemoveMessageActionReturnsSuccess Failed");
        }