public void SubscriberService_PublishToAll_DisconnectedClients()
        {
            using (var host = new WcfHost())
            {
                _sw.Start();

                //Register clients
                List<Client> clients = new List<Client>();
                for (int i = 0; i < 500; i++)
                {
                    clients.Add(new Client(i.ToString()));
                }
                Thread.Sleep(100);//Wait for wcf to finish registrations
                Assert.AreEqual(500, host.ActiveClients, "Active clients on the server should be 500");
                Trace.TraceInformation("Client register took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Simulate loosing some clients
                for (int i = 0; i < 500; i++)
                {
                    if (i.ToString().Contains("5") || i.ToString().Contains("2"))
                        clients[i].Dispose();
                }

                //Publish Data
                host.instance.PublishToAll("Roman");
                Trace.TraceInformation("Publishing to clients took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Wait for all data to come in
                clients.ForEach(a => a.OnData.WaitOne(100));
                Trace.TraceInformation("Waiting for data on the client side took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Check All data is received
                int clientsWithData = 0;
                clients.ForEach(a =>
                    {
                        if (a.Data != "closed")
                        {
                            Assert.AreEqual("Roman", a.Data);
                            clientsWithData++;
                        }
                    });
                Trace.TraceInformation("Clients with data {0}", clientsWithData);
                Trace.TraceInformation("Checking client data took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Check open clients on server
                Assert.IsTrue(host.ActiveClients < 500, "Active clients should be less than 500");
                Assert.AreEqual(clientsWithData, host.ActiveClients, "Active clients on server does not match clients");

                //Close clients
                clients.ForEach(a => a.Dispose());
                Trace.TraceInformation("Client disconnect took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();
            }
            Trace.TraceInformation("Shutting down host took {0} ms", _sw.ElapsedMilliseconds);
            _sw.Stop();
        }
        public void TestWhenWCFCallBackIsNotOpen()
        {
            using (var host = new WcfHost())
            {
                Client client = new Client("Roman");
                Thread.Sleep(100);

                var state = host.GetClientChannel().State;
                Assert.AreEqual(CommunicationState.Opened, state, "Initial state");

                client.Kill();
                state = host.GetClientChannel().State;
                Assert.AreEqual(CommunicationState.Opened, state, "stale state");

                host.instance.PublishToAll("Test");
                Thread.Sleep(300);

                state = host.GetClientChannel().State;
                Assert.AreEqual(CommunicationState.Closed, state, "Final state");

                Assert.AreEqual(1, host.ActiveClients, "Active clients should be 1");

                host.instance.PublishToAll("Test");
                Thread.Sleep(300);

                Assert.AreEqual(0, host.ActiveClients, "Active clients should be 0");
            }
        }
        public void SubscriberService_SubscribeUnsubscribeTest()
        {
            using (var host = new WcfHost())
            {
                List <Client> clients = new List <Client>();
                try
                {
                    string data1 = "First Publish";
                    string data2 = "Publish Again";

                    clients.Add(new Client("Client1"));
                    clients.Add(new Client("Client2"));

                    Assert.AreEqual(2, host.ActiveClients, "SHould have 2 subscribers");
                    host.instance.PublishToAllSerial(data1);

                    clients.ForEach(a => a.OnData.WaitOne(100));
                    Thread.Sleep(100);

                    clients.ForEach(a => Assert.AreEqual(data1, a.Data, "Initial publish does not match"));

                    clients.Last().Unsubscribe();
                    Thread.Sleep(100);//Wait for unsubscribe


                    Assert.AreEqual(1, host.ActiveClients, "SHould have 1 subscribers");
                    host.instance.PublishToAllSerial(data2);

                    clients.ForEach(a => a.OnData.WaitOne(100));
                    Thread.Sleep(100);
                    Assert.AreEqual(data2, clients.First().Data, "Client1 should get new data");
                    Assert.AreEqual(data1, clients.Last().Data, "Client2 should have old data");
                }
                finally
                {
                    //Close clients
                    clients.ForEach(a => a.Dispose());
                }
            }
        }
        public void SubscriberService_PublishToAll_AllClientsTest()
        {
            using (var host = new WcfHost())
            {
                _sw.Start();

                //Register clients
                List <Client> clients = new List <Client>();
                for (int i = 0; i < 500; i++)
                {
                    clients.Add(new Client(i.ToString()));
                }
                Trace.TraceInformation("Client register took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Publish Data
                host.instance.PublishToAll("Roman");
                Trace.TraceInformation("Publishing to clients took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Wait for all data to come in
                clients.ForEach(a => a.OnData.WaitOne(100));
                Trace.TraceInformation("Waiting for data on the client side took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Check All data is received
                clients.ForEach(a => Assert.AreEqual("Roman", a.Data));
                Trace.TraceInformation("Checking client data took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Close clients
                clients.ForEach(a => a.Dispose());
                Trace.TraceInformation("Client disconnect took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();
            }
            Trace.TraceInformation("Shutting down host took {0} ms", _sw.ElapsedMilliseconds);
            _sw.Stop();
        }
        public void SubscriberService_PublishToAll_AllClientsTest()
        {
            using (var host = new WcfHost())
            {
                _sw.Start();

                //Register clients
                List<Client> clients = new List<Client>();
                for (int i = 0; i < 500; i++)
                {
                    clients.Add(new Client(i.ToString()));
                }
                Trace.TraceInformation("Client register took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Publish Data
                host.instance.PublishToAll("Roman");
                Trace.TraceInformation("Publishing to clients took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Wait for all data to come in
                clients.ForEach(a => a.OnData.WaitOne(100));
                Trace.TraceInformation("Waiting for data on the client side took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Check All data is received
                clients.ForEach(a => Assert.AreEqual("Roman", a.Data));
                Trace.TraceInformation("Checking client data took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Close clients
                clients.ForEach(a => a.Dispose());
                Trace.TraceInformation("Client disconnect took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();
            }
            Trace.TraceInformation("Shutting down host took {0} ms", _sw.ElapsedMilliseconds);
            _sw.Stop();
        }
        public void SubscriberService_PublishToAll_DisconnectedClients()
        {
            using (var host = new WcfHost())
            {
                _sw.Start();

                //Register clients
                List <Client> clients = new List <Client>();
                for (int i = 0; i < 500; i++)
                {
                    clients.Add(new Client(i.ToString()));
                }
                Thread.Sleep(100);//Wait for wcf to finish registrations
                Assert.AreEqual(500, host.ActiveClients, "Active clients on the server should be 500");
                Trace.TraceInformation("Client register took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Simulate loosing some clients
                for (int i = 0; i < 500; i++)
                {
                    if (i.ToString().Contains("5") || i.ToString().Contains("2"))
                    {
                        clients[i].Dispose();
                    }
                }

                //Publish Data
                host.instance.PublishToAll("Roman");
                Trace.TraceInformation("Publishing to clients took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Wait for all data to come in
                clients.ForEach(a => a.OnData.WaitOne(100));
                Trace.TraceInformation("Waiting for data on the client side took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Check All data is received
                int clientsWithData = 0;
                clients.ForEach(a =>
                {
                    if (a.Data != "closed")
                    {
                        Assert.AreEqual("Roman", a.Data);
                        clientsWithData++;
                    }
                });
                Trace.TraceInformation("Clients with data {0}", clientsWithData);
                Trace.TraceInformation("Checking client data took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();

                //Check open clients on server
                Assert.IsTrue(host.ActiveClients < 500, "Active clients should be less than 500");
                Assert.AreEqual(clientsWithData, host.ActiveClients, "Active clients on server does not match clients");

                //Close clients
                clients.ForEach(a => a.Dispose());
                Trace.TraceInformation("Client disconnect took {0} ms", _sw.ElapsedMilliseconds);
                _sw.Restart();
            }
            Trace.TraceInformation("Shutting down host took {0} ms", _sw.ElapsedMilliseconds);
            _sw.Stop();
        }
        public void SubscriberService_PublishToAll_StaleClients()
        {
            using (var host = new WcfHost())
            {
                List <Client> clients = new List <Client>();
                try
                {
                    _sw.Start();

                    //Register clients
                    for (int i = 0; i < 500; i++)
                    {
                        clients.Add(new Client(i.ToString()));
                    }
                    Thread.Sleep(100);//Wait for wcf to finish registrations
                    Assert.AreEqual(500, host.ActiveClients, "Active clients on the server should be 500");
                    Trace.TraceInformation("Client register took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();

                    //Simulate loosing some clients
                    List <Client> toRemove = new List <Client>();
                    for (int i = 0; i < 500; i++)
                    {
                        if (i.ToString().Contains("5") || i.ToString().Contains("2"))
                        {
                            clients[i].Kill();
                        }
                    }
                    Trace.TraceInformation("Simulating dead clients took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();

                    //Publish Data
                    host.instance.PublishToAll("Roman");
                    Trace.TraceInformation("Publishing to clients took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();

                    //Wait for all data to come in
                    clients.ForEach(a => a.OnData.WaitOne(1000));
                    Trace.TraceInformation("Waiting for data on the client side took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();
                    Thread.Sleep(1000);

                    //Check All data is received
                    int clientsWithData = 0;
                    int rogueClients    = 0;
                    clients.ForEach(a =>
                    {
                        if (a.Data != "dead")
                        {
                            //Assert.AreEqual("Roman", a.Data);
                            if (a.Data != "Roman")
                            {
                                rogueClients++;
                            }
                            clientsWithData++;
                        }
                    });
                    Trace.TraceInformation("Clients with WRONG DATA {0}", rogueClients);
                    Trace.TraceInformation("Clients with data {0}", clientsWithData);
                    Trace.TraceInformation("Checking client data took {0} ms", _sw.ElapsedMilliseconds);
                    Trace.Flush();
                    _sw.Restart();

                    //Re-Publish to clean up dead clients
                    Assert.IsTrue(host.instance.PublishToAllSerial("Again", 20000), "Previous publish is in progress");

                    //Check open clients on server
                    Trace.TraceInformation("Active clients {0}, Clients with Data {1}", host.ActiveClients, clientsWithData);
                    Assert.IsTrue(host.ActiveClients < 500, "Active clients should be less than 500");
                    Assert.AreEqual(clientsWithData, host.ActiveClients, "Active clients on server does not match clients");
                }
                finally
                {
                    //Close clients
                    clients.ForEach(a => a.Dispose());
                    Trace.TraceInformation("Client disconnect took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();
                }
            }
            Trace.TraceInformation("Shutting down host took {0} ms", _sw.ElapsedMilliseconds);
            _sw.Stop();
        }
        public void TestWhenWCFCallBackIsNotOpen()
        {
            using (var host = new WcfHost())
            {
                Client client = new Client("Roman");
                Thread.Sleep(100);

                var state = host.GetClientChannel().State;
                Assert.AreEqual(CommunicationState.Opened, state, "Initial state");

                client.Kill();
                state = host.GetClientChannel().State;
                Assert.AreEqual(CommunicationState.Opened, state, "stale state");

                host.instance.PublishToAll("Test");
                Thread.Sleep(300);

                state = host.GetClientChannel().State;
                Assert.AreEqual(CommunicationState.Closed, state, "Final state");

                Assert.AreEqual(1, host.ActiveClients, "Active clients should be 1");

                host.instance.PublishToAll("Test");
                Thread.Sleep(300);

                Assert.AreEqual(0, host.ActiveClients, "Active clients should be 0");

            }
        }
        public void SubscriberService_SubscribeUnsubscribeTest()
        {
            using (var host = new WcfHost())
            {
                List<Client> clients = new List<Client>();
                try
                {
                    string data1 = "First Publish";
                    string data2 = "Publish Again";

                    clients.Add(new Client("Client1"));
                    clients.Add(new Client("Client2"));

                    Assert.AreEqual(2, host.ActiveClients, "SHould have 2 subscribers");
                    host.instance.PublishToAllSerial(data1);

                    clients.ForEach(a => a.OnData.WaitOne(100));
                    Thread.Sleep(100);

                    clients.ForEach(a => Assert.AreEqual(data1, a.Data, "Initial publish does not match"));

                    clients.Last().Unsubscribe();
                    Thread.Sleep(100);//Wait for unsubscribe

                    Assert.AreEqual(1, host.ActiveClients, "SHould have 1 subscribers");
                    host.instance.PublishToAllSerial(data2);

                    clients.ForEach(a => a.OnData.WaitOne(100));
                    Thread.Sleep(100);
                    Assert.AreEqual(data2, clients.First().Data, "Client1 should get new data");
                    Assert.AreEqual(data1, clients.Last().Data, "Client2 should have old data");
                }
                finally
                {
                    //Close clients
                    clients.ForEach(a => a.Dispose());
                }
            }
        }
        public void SubscriberService_PublishToAll_StaleClients()
        {
            using (var host = new WcfHost())
            {
                List<Client> clients = new List<Client>();
                try
                {
                    _sw.Start();

                    //Register clients
                    for (int i = 0; i < 500; i++)
                    {
                        clients.Add(new Client(i.ToString()));
                    }
                    Thread.Sleep(100);//Wait for wcf to finish registrations
                    Assert.AreEqual(500, host.ActiveClients, "Active clients on the server should be 500");
                    Trace.TraceInformation("Client register took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();

                    //Simulate loosing some clients
                    List<Client> toRemove = new List<Client>();
                    for (int i = 0; i < 500; i++)
                    {
                        if (i.ToString().Contains("5") || i.ToString().Contains("2"))
                            clients[i].Kill();
                    }
                    Trace.TraceInformation("Simulating dead clients took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();

                    //Publish Data
                    host.instance.PublishToAll("Roman");
                    Trace.TraceInformation("Publishing to clients took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();

                    //Wait for all data to come in
                    clients.ForEach(a => a.OnData.WaitOne(1000));
                    Trace.TraceInformation("Waiting for data on the client side took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();
                    Thread.Sleep(1000);

                    //Check All data is received
                    int clientsWithData = 0;
                    int rogueClients = 0;
                    clients.ForEach(a =>
                    {
                        if (a.Data != "dead")
                        {
                            //Assert.AreEqual("Roman", a.Data);
                            if (a.Data != "Roman") rogueClients++;
                            clientsWithData++;
                        }
                    });
                    Trace.TraceInformation("Clients with WRONG DATA {0}", rogueClients);
                    Trace.TraceInformation("Clients with data {0}", clientsWithData);
                    Trace.TraceInformation("Checking client data took {0} ms", _sw.ElapsedMilliseconds);
                    Trace.Flush();
                    _sw.Restart();

                    //Re-Publish to clean up dead clients
                    Assert.IsTrue(host.instance.PublishToAllSerial("Again", 20000), "Previous publish is in progress");

                    //Check open clients on server
                    Trace.TraceInformation("Active clients {0}, Clients with Data {1}", host.ActiveClients, clientsWithData);
                    Assert.IsTrue(host.ActiveClients < 500, "Active clients should be less than 500");
                    Assert.AreEqual(clientsWithData, host.ActiveClients, "Active clients on server does not match clients");

                }
                finally
                {
                    //Close clients
                    clients.ForEach(a => a.Dispose());
                    Trace.TraceInformation("Client disconnect took {0} ms", _sw.ElapsedMilliseconds);
                    _sw.Restart();
                }
            }
            Trace.TraceInformation("Shutting down host took {0} ms", _sw.ElapsedMilliseconds);
            _sw.Stop();
        }