public void Consumer_CanAuthorizeUserAsync()
        {
            //arrange
            options.RequestTokenResponseCallbackUrl =  TU.GenerateLocalHostBaseAddress();
            IConsumer consumer = new ConsumerFactory(options)
                .CreateConsumer();
            string verifier = null;
            var lisnrManualResetEvent = new ManualResetEvent(false);
            var requestLoginManualEvent = new ManualResetEvent(false);
            var authorizeUserManualEvent = new ManualResetEvent(false);

            Task<Uri> task = consumer.RequestLoginAsync();
            task.ContinueWith(uri => requestLoginManualEvent.Set());
            requestLoginManualEvent.WaitOne();

            Process.Start(task.Result.ToString());

            var listener = new HttpListener();
            listener.Prefixes.Add(options.RequestTokenResponseCallbackUrl);
            listener.Start();

            listener.BeginGetContext(
                ((r) =>
                {
                    var lisnr = (HttpListener)r.AsyncState;
                    var context = lisnr.EndGetContext(r);
                    var rq = context.Request.GetRequestParameters();
                    verifier = rq.Where(p => p.Name == "oauth_verifier")
                        .Select(p => p.Value)
                        .First();

                    lisnrManualResetEvent.Set();
                }),
            listener);

            lisnrManualResetEvent.WaitOne();
            ((IDisposable)listener).Dispose();

            //act
            //assert

            Task<TokenInfo> authorizeUserTask = consumer.AuthorizeUserAsync(verifier);
            task.ContinueWith(token => authorizeUserManualEvent.Set());
            authorizeUserManualEvent.WaitOne();

            //assert
            Assert.IsFalse(authorizeUserTask.IsFaulted);
            Assert.IsNull(authorizeUserTask.Exception);
            Assert.IsNotNull(authorizeUserTask.Result);
        }
        public void Consumer_CannotRequestLoginAsync_InvalidConsumerKey_TaskFaultedWithException()
        {
            //arrange
            options.ConsumerKey = "InvalidConsumerKey";
            IConsumer consumer = new ConsumerFactory(options)
                .CreateConsumer();

            try
            {
                //act
                Task<Uri> task = consumer.RequestLoginAsync();
                task.Wait();
            }
            catch (AggregateException ex)
            {
                //assert
                Assert.IsNotNull(ex.InnerException);
                Assert.IsInstanceOfType(ex.InnerException, typeof(CommunicationException));
            }
        }
        public void Consumer_CanRequestLoginAsync()
        {
            //arrange
            IConsumer consumer = new ConsumerFactory(options)
                .CreateConsumer();
            var manualResetEvent = new ManualResetEvent(false);

            //act
            Task<Uri> task = consumer.RequestLoginAsync();
            task.ContinueWith(uri => manualResetEvent.Set());
            manualResetEvent.WaitOne();

            //assert
            Assert.IsFalse(task.IsFaulted);
            Assert.IsNull(task.Exception);
            Assert.IsNotNull(task.Result);
        }
        public void Consumer_CannotRequestLoginAsync_InvalidTokenPath_TaskFaultedWithException()
        {
            //arrange
            options.RequestTokenUrl = "http://invalid";
            IConsumer consumer = new ConsumerFactory(options)
                .CreateConsumer();

            try
            {
                Task task = consumer.RequestLoginAsync();
                task.Wait();
            }
            catch (AggregateException ex)
            {
                Assert.IsNotNull(ex.InnerException);
                Assert.IsInstanceOfType(ex.InnerException, typeof(CommunicationException));
                return;
            }
            Assert.Fail("Expected communication excepton.");
        }