private static void AssertOperationResultValidationResultsMessageCodeOnPushNotificationSendResult(PushNotificationSendResult result, ResultType resultType, bool completelyValid, bool validWithWarnings, string code = null)
        {
            Assert.AreEqual(result.OperationResult, resultType);
            Assert.AreEqual(result.ValidationResults.IsCompletelyValid, completelyValid);
            Assert.AreEqual(result.ValidationResults.IsValidWithWarnings, validWithWarnings);

            if (!String.IsNullOrWhiteSpace(code))
            {
                Assert.IsTrue(result.ValidationResults.Any(vr => vr.MessageCode == code));
            }
        }
        /// <summary>
        /// Sets the <see cref="HttpWebResponse"/> values of notification into our <see cref="PushNotificationSendResult"/> object.
        /// </summary>
        /// <param name="pushNotificationSendResult">The result of the Notification Send operation.</param>
        /// <param name="httpWebResponse">The web response of the Notification Send operation.</param>
        private static void SetNotificationWebResponseValuesToResult(PushNotificationSendResult pushNotificationSendResult, HttpWebResponse httpWebResponse)
        {
            pushNotificationSendResult.HttpStatusCode = httpWebResponse.StatusCode;

            var pushNotificationStatus             = httpWebResponse.Headers["X-NotificationStatus"];
            var pushNotificationSubscriptionStatus = httpWebResponse.Headers["X-SubscriptionStatus"];
            var deviceConnectionStatus             = httpWebResponse.Headers["X-DeviceConnectionStatus"];

            if (!String.IsNullOrWhiteSpace(pushNotificationStatus))
            {
                pushNotificationSendResult.PushNotificationStatus = pushNotificationStatus.ToEnum <PushNotificationStatus>();
            }

            if (!String.IsNullOrWhiteSpace(pushNotificationSubscriptionStatus))
            {
                pushNotificationSendResult.PushNotificationSubscriptionStatus = pushNotificationSubscriptionStatus.ToEnum <SubscriptionStatus>();
            }

            if (!String.IsNullOrWhiteSpace(deviceConnectionStatus))
            {
                pushNotificationSendResult.DeviceConnectionStatus = deviceConnectionStatus.ToEnum <DeviceConnectionStatus>();
            }
        }
        private void ResponseComments_Test(HttpStatusCode httpStatusCode, PushNotificationStatus pushNotificationStatus, DeviceConnectionStatus deviceConnectionStatus, SubscriptionStatus subscriptionStatus, string value)
        {
            var result = new PushNotificationSendResult()
            {
                HttpStatusCode = httpStatusCode,
                PushNotificationStatus = pushNotificationStatus,
                DeviceConnectionStatus = deviceConnectionStatus,
                PushNotificationSubscriptionStatus = subscriptionStatus,
            };

            Assert.AreEqual(result.Comments, value);
        }
        /// <summary>
        /// Represents the worker method to send the actual notification message.
        /// </summary>
        /// <typeparam name="T">Type of <see cref="PushNotificationMessage"/>.</typeparam>
        /// <param name="pushNotificationMessage">The notification message to send.</param>
        /// <returns>The response of the Notification Send operation.</returns>
        public static PushNotificationSendResult SendPushNotificationMessage <T>(T pushNotificationMessage) where T : PushNotificationMessage
        {
            var pushNotificationSendResult = new PushNotificationSendResult()
            {
                OperationStartUtcDateTime = DateTime.UtcNow,
            };

            try
            {
                if (pushNotificationMessage != null)
                {
                    pushNotificationSendResult.DeviceType           = pushNotificationMessage.DeviceType;
                    pushNotificationSendResult.PushNotificationType = pushNotificationMessage.PushNotificationType;
                }

                pushNotificationSendResult.ValidationResults = Validator.Validate(pushNotificationMessage);

                if (pushNotificationSendResult.ValidationResults.IsValidWithWarnings)
                {
                    switch (pushNotificationMessage.DeviceType)
                    {
                    case DeviceType.WindowsPhone7_1:
                    case DeviceType.WindowsPhone7_0:

                        var windowsPhonePushNotificationMessage = pushNotificationMessage as WindowsPhonePushNotificationMessage;

                        var pushNotificationWebRequest = (HttpWebRequest)WebRequest.Create(windowsPhonePushNotificationMessage.NotificationUri);

                        pushNotificationWebRequest.Method      = "POST";
                        pushNotificationWebRequest.ContentType = "text/xml";

                        var messageId = Guid.NewGuid();

                        pushNotificationSendResult.MessageId = messageId;
                        pushNotificationWebRequest.Headers.Add("X-MessageID", messageId.ToString());

                        var windowsPhoneTargetHeader = windowsPhonePushNotificationMessage.PushNotificationType.ToWindowsPhoneTarget();
                        pushNotificationWebRequest.Headers["X-WindowsPhone-Target"] = windowsPhoneTargetHeader;

                        var notificationClass = windowsPhonePushNotificationMessage.MessagePriority.ToNotificationClass(windowsPhonePushNotificationMessage.PushNotificationType);
                        pushNotificationWebRequest.Headers.Add("X-NotificationClass", notificationClass);

                        var notificationPayload = windowsPhonePushNotificationMessage.CreatePayload();
                        pushNotificationWebRequest.ContentLength = notificationPayload.Length;

                        if (windowsPhonePushNotificationMessage.AuthenticationSettings != null && windowsPhonePushNotificationMessage.AuthenticationSettings.EnableAuthentication)
                        {
                            pushNotificationWebRequest.ClientCertificates.Add(windowsPhonePushNotificationMessage.AuthenticationSettings.X509Certificate);
                        }

                        using (var notificationRequestStream = pushNotificationWebRequest.GetRequestStream())
                        {
                            notificationRequestStream.Write(notificationPayload, 0, notificationPayload.Length);
                        }

                        using (var pushNotificationWebResponse = (HttpWebResponse)pushNotificationWebRequest.GetResponse())
                        {
                            PushNotifier.SetNotificationWebResponseValuesToResult(pushNotificationSendResult, pushNotificationWebResponse);
                        }

                        break;
                    }
                }
            }
            catch (Exception exception)
            {
                pushNotificationSendResult.OperationResult = ResultType.Failed;
                pushNotificationSendResult.RawException    = exception;

                var webException = exception as WebException;

                if (webException != null && webException.Response != null)
                {
                    var httpWebResponse = webException.Response as HttpWebResponse;

                    if (httpWebResponse != null)
                    {
                        PushNotifier.SetNotificationWebResponseValuesToResult(pushNotificationSendResult, httpWebResponse);
                    }
                }
            }
            finally
            {
                pushNotificationSendResult.OperationEndUtcDateTime = DateTime.UtcNow;
            }

            return(pushNotificationSendResult);
        }