/// <summary>
        /// The main runtime class
        /// </summary>
        public static void Main()
        {
            UnityCacheServer server = new UnityCacheServer();

            server.Start();

            logger.Info("Press any key to shutdown...");
            Console.ReadKey();
            logger.Info("Shutting down server...");
            server.Stop();
        }
        public void EndToEndTest()
        {
            signal = new ManualResetEvent(false);
            UnityCacheServer server = new UnityCacheServer();
            using (UnityCacheClient client = new UnityCacheClient("localhost"))
            {

                server.OnPutProcessed += server_OnPutProcessed;

                try
                {

                    // Start the server
                    Assert.AreEqual<ServerStatus>(server.Status, ServerStatus.Stopped);
                    server.Start();
                    Assert.AreEqual<ServerStatus>(server.Status, ServerStatus.Running);

                    client.Connect();

                    Guid id = Guid.NewGuid();
                    MD5 md5Hash;
                    string hash;

                    using (md5Hash = MD5.Create())
                    {
                         hash = UnityCacheUtilities.ByteArrayToString(md5Hash.ComputeHash(Encoding.UTF8.GetBytes(DateTime.Now.ToString())));
                    }

                    Console.WriteLine("Requesting ID: {0}, Hash {1}", id, hash);
                    UnityCacheClientGetResult result;

                    // Perform a get
                    for (int x = 0; x < 100; x++)
                    {
                        // Verify that sending the same command over and over works correctly
                        result = client.Get(id, hash);
                        Assert.AreEqual<CacheResult>(result.Result, CacheResult.CacheMiss);
                    }

                    // Perform a put
                    int dataLen = 1024 * 10 + DateTime.Now.Second % 2;          // Test that even/odd file lengths work correctly randomly
                    byte[] data = new byte[dataLen];
                    Random r = new Random();
                    for (int x = 0; x < data.Length; x++)
                    {
                        data[x] = (byte)r.Next();
                    }
                    client.Put(id, hash, data);

                    // Wait for the server to process the request since there isn't an ACK
                    signal.WaitOne();

                    // Fetch the file we just put
                    result = client.Get(id, hash);

                    Assert.AreEqual<CacheResult>(result.Result, CacheResult.CacheHit);
                    Assert.AreEqual(result.Data.Length, dataLen);

                    for (int x = 0; x < data.Length; x++)
                    {
                        Assert.AreEqual<byte>(data[x], result.Data[x], "Data does not match at position {0}", x);
                    }
                }
                finally
                {
                    if (server.Status == ServerStatus.Running)
                        server.Stop();
                }
            }
        }