public void Execute_UnicodeCharacters()
        {
            var handler = new TestBodyMessageHnalder()
            {
                GZipEnabled    = false,
                ResponseObject = new MockResponse {
                    Id = 100, Name = @"مرحبا العالم"
                },
                ExpectedRequestObject = new MockRequest {
                    Name = @"مرحبا العالم! 您好,世界!"
                }
            };
            var initializer = new BaseClientService.Initializer()
            {
                GZipEnabled       = false,
                HttpClientFactory = new MockHttpClientFactory(handler)
            };

            using (var service = new MockClientService(initializer))
            {
                handler.Serializer = service.Serializer;

                var request  = new TestClientServiceRequest(service, "GET", handler.ExpectedRequestObject);
                var response = request.Execute();
                Assert.That(handler.Calls, Is.EqualTo(1));
                // the returned response should contain ETag, check that the service add the right ETag property on
                // the response
                handler.ResponseObject.ETag = handler.ResponseETag;
                Assert.That(response, Is.EqualTo(handler.ResponseObject));
            }
        }
        /// <summary> A subtest for testing execute as stream (async and sync). </summary>
        private void SubtestExecuteAsStream(bool async)
        {
            var handler = new TestBodyMessageHnalder
            {
                GZipEnabled    = false,
                ResponseObject = new MockResponse {
                    Id = 100, Name = "sample name"
                },
                ExpectedRequestObject = new MockRequest {
                    Name = "long long name"
                }
            };
            var initializer = new BaseClientService.Initializer
            {
                GZipEnabled       = false,
                HttpClientFactory = new MockHttpClientFactory(handler)
            };

            using (var service = new MockClientService(initializer))
            {
                handler.Serializer = service.Serializer;

                var request = new TestClientServiceRequest(service, "GET", handler.ExpectedRequestObject);

                MockResponse response = null;
                Stream       stream   = null;
                if (async)
                {
                    request.ExecuteAsStreamAsync().ContinueWith(t =>
                    {
                        stream = t.Result;
                    }, TaskContinuationOptions.OnlyOnRanToCompletion).Wait();
                    Assert.AreNotEqual(Thread.CurrentThread.ManagedThreadId, handler.ThreadId);
                }
                else
                {
                    stream = request.ExecuteAsStream();
                    Assert.AreEqual(Thread.CurrentThread.ManagedThreadId, handler.ThreadId);
                }

                // read the object
                var str = ExtractStringFromStream(stream);
                response = service.Serializer.Deserialize <MockResponse>(str);

                Assert.That(handler.Calls, Is.EqualTo(1));
                Assert.That(response, Is.EqualTo(handler.ResponseObject));
            }
        }
        /// <summary> A subtest for testing GZip and sync-async calls. </summary>
        private void SubtestExecute_GZip(bool gzip, bool async)
        {
            var handler = new TestBodyMessageHnalder()
            {
                GZipEnabled    = gzip,
                ResponseObject = new MockResponse {
                    Id = 100, Name = "sample name"
                },
                ExpectedRequestObject = new MockRequest {
                    Name = "long long name"
                }
            };
            var initializer = new BaseClientService.Initializer()
            {
                GZipEnabled       = gzip,
                HttpClientFactory = new MockHttpClientFactory(handler)
            };

            using (var service = new MockClientService(initializer))
            {
                handler.Serializer = service.Serializer;

                var          request  = new TestClientServiceRequest(service, "POST", handler.ExpectedRequestObject);
                MockResponse response = null;
                if (async)
                {
                    var task = request.ExecuteAsync();
                    response = task.Result;
                    Assert.AreNotEqual(Thread.CurrentThread.ManagedThreadId, handler.ThreadId);
                }
                else
                {
                    response = request.Execute();
                    Assert.AreEqual(Thread.CurrentThread.ManagedThreadId, handler.ThreadId);
                }

                // NOTICE: even if GZipEnabled is true, we don't need to extract the real string from the GZip stream,
                // because in a real request we use HttpClientHandler which its AutomaticDecompression is set to
                // System.Net.DecompressionMethods.GZip.

                Assert.That(handler.Calls, Is.EqualTo(1));
                // the returned response should contain ETag, check that the service add the right ETag property on
                // the response
                handler.ResponseObject.ETag = handler.ResponseETag;
                Assert.That(response, Is.EqualTo(handler.ResponseObject));
            }
        }