public void CanPurgeAndSHutdown()
        {
            //#FIXME - not a test - just an excercise - need to expose internals so we can peek the request queue
            var server = new CassiniDevServer();
            server.StartServer(ContentLocation);
            string root = server.RootUrl.TrimEnd('/');
            var client = new ClientBase(new Serializer());

            try
            {

                for (int i = 0; i < 50; i++)
                {
                    client.BeginRequest(RequestMethod.GET, root, "/SampleClientHandler.ashx?foo={foo}", null, new Dictionary<string, object>() { { "foo", "foo" + i } }, ContentType.TEXT, ContentType.JSON, TimeSpan.FromSeconds(1), 3000, 0, ar => { }, null);
                }

                var handle = client.ShutDown();
                if (!handle.WaitOne(20000))
                {
                    throw new Exception("timed out");
                }

            }
            finally
            {
                server.Dispose();
            }

        }
Exemple #2
0
        public void CheckNetLatency()
        {
            Console.WriteLine("Checking .net latency");

            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo");

            DateTimeOffset requestRecieved = DateTimeOffset.MinValue;
            RequestCompletedEventArgs requestInfo = null;
            ctx.RequestCompleted += (i, e) =>
                                        {
                                            requestInfo = e;
                                        };
            server.Server.ProcessRequest += (i, e) =>
                                                {
                                                    e.Continue = false;
                                                    e.Response = LoggedIn;
                                                    e.ResponseStatus = 200;
                                                    requestRecieved = DateTimeOffset.UtcNow;

                                                };


            try
            {
                ctx.LogIn(Settings.RpcUserName, Settings.RpcPassword);
            }
            finally
            {
                server.Dispose();
            }

            Console.WriteLine("elapsed   {0}", requestInfo.Info.Watch.ElapsedMilliseconds);

            // #TODO: not sure i like the complete removal of temporal data

            //Console.WriteLine("issued   {0}", requestInfo.Info.Issued.Ticks);
            //Console.WriteLine("recieved {0}", requestRecieved.Ticks);
            //Console.WriteLine("competed {0}", requestInfo.Info.Completed.Ticks);

            //Console.WriteLine("issued to recieved {0}", TimeSpan.FromTicks(requestRecieved.Ticks - requestInfo.Info.Issued.Ticks));
            //Console.WriteLine("recieved to completed {0}", TimeSpan.FromTicks(requestInfo.Info.Completed.Ticks - requestRecieved.Ticks));
            //Console.WriteLine("issued to completed {0}", TimeSpan.FromTicks(requestInfo.Info.Completed.Ticks - requestInfo.Info.Issued.Ticks));


            

            Assert.IsNotNullOrEmpty(ctx.Session);



            ctx.Dispose();
        }
        static void Main(string[] args)
        {

            var gate = new AutoResetEvent(false);
            Exception exception = null;
            
            var server = new CassiniDevServer();
            var path = new ContentLocator("WcfRestService1").LocateContent();
            server.StartServer(path);

            var client = new SampleClient(server.NormalizeUrl("").TrimEnd('/'));
            var recorder = new Recorder(client);
            recorder .Start();



            client.BeginListService1(ar =>
                                         {
                                             try
                                             {
                                                 List<SampleItem> result = client.EndListService1(ar);
                                                 Console.WriteLine(DateTime.Now + " " + result.Count);
                                             }
                                             catch (Exception ex)
                                             {

                                                 exception = ex;
                                             }
                                             finally
                                             {
                                                 gate.Set();
                                             }


                                         }, null);


            Wait(exception, gate);


            server.StopServer();
            server.Dispose();


            var recording = recorder.GetRequests();
            recorder.Dispose();

            var serializedRecording = client.Serializer.SerializeObject(recording);

            client.Dispose();

            File.WriteAllText("output.txt", serializedRecording);
        }
        public void CanRetryFailedRequests()
        {

            var server = new CassiniDevServer();
            server.StartServer(ContentLocation);

            var gate = new AutoResetEvent(false);

            var client = new SampleClient(server.RootUrl);
            Exception exception = null;
            client.BeginGetTestClassWithException(ar =>
            {

                try
                {
                    var result = client.EndGetTestClassWithException(ar);
                }
                catch (Exception ex)
                {

                    exception = ex;

                }
                finally
                {
                    server.Dispose();
                }
                gate.Set();
            }, null);

            if (!gate.WaitOne(10000))
            {
                throw new Exception("timed out");
            }
            if (exception == null)
            {
                Assert.Fail("was expecting an exception after retrying");
            }
            Console.WriteLine(exception.ToString());
            Assert.IsTrue(Regex.IsMatch(exception.Message, "failed 3 times"));

        }
        public void aTestServer()
        {
            var server = new CassiniDevServer();
            server.StartServer(ContentLocation);

            var gate = new AutoResetEvent(false);
            Exception exception = null;
            var client = new SampleClient(server.RootUrl);
            client.BeginGetTestClass(ar =>
            {

                try
                {
                    var result = client.EndGetTestClass(ar);
                }
                catch (Exception ex)
                {
                    exception = ex;
                }
                finally
                {
                    server.Dispose();
                }
                gate.Set();
            }, null);

            if (!gate.WaitOne(10000))
            {
                throw new Exception("timed out");
            }
            if (exception != null)
            {
                throw exception;
            }
        }
        public void SpecificRequestExceptionsAreRetriedTheCorrectNumberOfTimes()
        {
            Console.WriteLine("SpecificRequestExceptionsAreRetriedTheCorrectNumberOfTimes");

            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var gate = new ManualResetEvent(false);


            const int EXPECTED_ATTEMPT_COUNT = 3;


            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo")
                          {
                              UserName = "******",
                              Session = "123"
                          };


            string jsonConvertSerializeObject = JsonConvert.SerializeObject(new ApiErrorResponseDTO() { HttpStatus = 500, ErrorMessage = "internal server error", ErrorCode = 500 });

            server.Server.ProcessRequest += (i, e) =>
            {
                e.Continue = false;

                e.Response = jsonConvertSerializeObject;
                e.ResponseStatus = 500;

            };



            Exception exception = null;
            ListNewsHeadlinesResponseDTO response = null;
            ctx.News.BeginListNewsHeadlinesWithSource("dj", "UK", 14, ar =>
                                                                          {
                                                                              try
                                                                              {
                                                                                  response = ctx.News.EndListNewsHeadlinesWithSource(ar);
                                                                              }
                                                                              catch (Exception ex)
                                                                              {
                                                                                  exception = ex;
                                                                              }
                                                                              finally
                                                                              {
                                                                                  gate.Set();
                                                                              }
                                                                          }, null);

            gate.WaitOne(TimeSpan.FromSeconds(30));

            server.Dispose();

            Assert.IsNotNull(exception, "expected exception, got none");
            string expectedMessage = string.Format("(500) internal server error - failed {0} times", EXPECTED_ATTEMPT_COUNT);
            Assert.IsTrue(exception.Message.Contains(expectedMessage), "error message incorrect. got " + exception.Message);
        }
        public void ShouldThrowExceptionIfRequestTimesOut()
        {

            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo");


            server.Server.ProcessRequest += (i, e) =>
            {
                e.Continue = false;
                e.Response = "";
                Thread.Sleep(TimeSpan.FromSeconds(40));

            };

            Exception ex = null;
            try
            {
                ctx.LogIn("foo", "bar");
            }
            catch (Exception ex2)
            {
                ex = ex2;
            }
            finally
            {
                server.Dispose();
            }

            Assert.IsNotNull(ex, "Expected an exception");
            Assert.IsInstanceOf(typeof(ReliableHttpException), ex);

        }
        public void NonRetryableExceptionFailsInsteadOfRetrying()
        {
            Console.WriteLine("NonRetryableExceptionFailsInsteadOfRetrying");
            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            Client ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo");

            string jsonConvertSerializeObject = JsonConvert.SerializeObject(new ApiErrorResponseDTO() { ErrorCode = 403 });


            EventHandler<RequestInfoArgs> mockingHandler = (i, e) =>
            {
                e.Continue = false;

                e.Response = jsonConvertSerializeObject;
                e.ResponseStatus = 403;

            };

            server.Server.ProcessRequest += mockingHandler;





            try
            {
                Assert.Throws<ForbiddenException>(() => ctx.LogIn("foo", "bar"));
            }
            finally
            {
                server.Dispose();
                Thread.Sleep(5000);
            }


        }
        public void DeserializationExceptionIsProperlySurfacedBySyncRequests()
        {
            Console.WriteLine("DeserializationExceptionIsProperlySurfacedBySyncRequests");
            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo")
            {
                UserName = "******",
                Session = "123"
            };

            EventHandler<RequestInfoArgs> mockingHandler = (i, e) =>
            {
                e.Continue = false;
                e.Response = BogusJson;

            };

            server.Server.ProcessRequest += mockingHandler;
            Exception ex = null;
            try
            {
                ctx.News.GetNewsDetail("dj", "foobar");
            }
            catch (Exception ex2)
            {
                ex = ex2;
            }

            finally
            {
                server.Dispose();
            }

            Assert.IsNotNull(ex, "Expected and exception");

            Assert.IsInstanceOf(typeof(ServerConnectionException), ex);
        }
        public void DeserializationExceptionIsProperlySurfacedByAsyncRequests()
        {
            Console.WriteLine("DeserializationExceptionIsProperlySurfacedByAsyncRequests");

            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);


            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo")
                          {
                              UserName = "******",
                              Session = "123"
                          };


            server.Server.ProcessRequest += (i, e) =>
            {
                e.Continue = false;
                e.Response = BogusJson;

            };




            var gate = new ManualResetEvent(false);
            Exception exception = null;
            ctx.News.BeginListNewsHeadlinesWithSource("dj", "UK", 14, ar =>
                                                                          {
                                                                              try
                                                                              {
                                                                                  ctx.News.EndListNewsHeadlinesWithSource(ar);
                                                                              }
                                                                              catch (Exception ex)
                                                                              {
                                                                                  exception = ex;
                                                                              }
                                                                              finally
                                                                              {
                                                                                  gate.Set();
                                                                              }
                                                                          }, null);

            gate.WaitOne();

            server.Dispose();
            Assert.IsNotNull(exception, "Expected an exception");
            Assert.IsInstanceOf(typeof(ServerConnectionException), exception, "expected ServerConnectionException but got " + exception.GetType().Name);
        }
        public void CanRecognize200JsonException()
        {
            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo")
            {
                UserName = "******",
                Session = "123"
            };


            var errorDto = new ApiErrorResponseDTO
                               {
                                   ErrorCode = (int)ErrorCode.InvalidCredentials,
                                   ErrorMessage = "InvalidCredentials"
                               };


            string jsonConvertSerializeObject = JsonConvert.SerializeObject(errorDto);

            server.Server.ProcessRequest += (i, e) =>
            {
                e.Continue = false;

                e.Response = jsonConvertSerializeObject;

            };

            ApiLogOnResponseDTO response = null;
            try
            {

                response = ctx.LogIn(Settings.RpcUserName, Settings.RpcPassword);
            }
            finally
            {
                server.Dispose();
            }

            Assert.IsNotNull(response);
        }
        public void CanLogout()
        {
            Console.WriteLine("CanLogout");
            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo")
                          {
                              UserName = "******",
                              Session = "123"
                          };


            server.Server.ProcessRequest += (i, e) =>
            {
                e.Continue = false;
                e.Response = LoggedOut;

            };


            bool response;
            try
            {
                response = ctx.LogOut();
            }
            finally
            {
                server.Dispose();
            }

            Assert.IsTrue(response);

        }
        public void CanGetNewsHeadlinesAsync()
        {
            Console.WriteLine("CanGetNewsHeadlinesAsync");

            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo")
                          {
                              UserName = "******",
                              Session = "123"
                          };


            server.Server.ProcessRequest += (i, e) =>
            {
                e.Continue = false;
                e.Response = NewsHeadlines14;

            };



            var gate = new ManualResetEvent(false);

            ListNewsHeadlinesResponseDTO response = null;
            Exception ex = null;
            ctx.News.BeginListNewsHeadlinesWithSource("dj", "UK", 14, ar =>
                                                                          {
                                                                              try
                                                                              {
                                                                                  response = ctx.News.EndListNewsHeadlinesWithSource(ar);
                                                                              }
                                                                              catch (Exception ex2)
                                                                              {
                                                                                  ex = ex2;
                                                                              }
                                                                              finally
                                                                              {
                                                                                  gate.Set();
                                                                              }

                                                                          }, null);

            gate.WaitOne();

            server.Dispose();

            Assert.AreEqual(14, response.Headlines.Length);

        }
        public void CanGetNewsHeadlines()
        {
            Console.WriteLine("CanGetNewsHeadlines");

            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo")
                          {
                              UserName = "******",
                              Session = "123"
                          };

            server.Server.ProcessRequest += (i, e) =>
            {
                e.Continue = false;
                e.Response = NewsHeadlines12;

            };


            ListNewsHeadlinesResponseDTO response = null;
            try
            {

                response = ctx.News.ListNewsHeadlinesWithSource("dj", "UK", 12);
            }
            finally
            {
                server.Dispose();
            }

            Assert.AreEqual(12, response.Headlines.Length);


        }
        public void ApiAuthenticationFailure()
        {
            Console.WriteLine("ApiAuthenticationFailure");

            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var errorDto = new ApiErrorResponseDTO
                               {
                                   ErrorCode = (int)ErrorCode.InvalidCredentials,
                                   ErrorMessage = "InvalidCredentials"
                               };



            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo")
                          {
                              UserName = "******",
                              Session = "123"
                          }; // authenticated

            server.Server.ProcessRequest += (i, e) =>
            {
                e.Continue = false;
                e.Response = JsonConvert.SerializeObject(errorDto);

            };


            Exception ex = null;
            try
            {
                ctx.LogIn("foo", "bar");
                Assert.Fail("Expected exception");
            }
            catch (Exception ex2)
            {
                ex = ex2;
            }
            finally
            {
                server.Dispose();
            }



            if (!(ex is ReliableHttpException))
            {
                Assert.Fail("Expected ReliableHttpException, got " + ex.GetType().FullName);
            }

            Assert.AreEqual("InvalidCredentials", ex.Message, "FIXME: the API is just setting 401. it needs to send ErrorResponseDTO json as well.");
            Assert.AreEqual("{\"HttpStatus\":0,\"ErrorMessage\":\"InvalidCredentials\",\"ErrorCode\":4010}", ((ReliableHttpException)ex).ResponseText);

        }
        public void CanLogin()
        {
            Console.WriteLine("CanLogin");

            var server = new CassiniDevServer();
            server.StartServer(Environment.CurrentDirectory);

            var ctx = new Client(new Uri(server.NormalizeUrl("/")), new Uri(server.NormalizeUrl("/")), "foo");


            server.Server.ProcessRequest += (i, e) =>
            {
                e.Continue = false;
                e.Response = LoggedIn;
                e.ResponseStatus = 200;

            };


            try
            {
                ctx.LogIn(Settings.RpcUserName, Settings.RpcPassword);
            }
            finally
            {
                server.Dispose();
            }



            Assert.IsNotNullOrEmpty(ctx.Session);

        }