public void AddToQueue()
        {
            HttpWebRequest request = HttpWebRequest.Create("http://www.google.com") as HttpWebRequest;

            AsyncRequestProcessor.PurgeQueue();
            AsyncRequestProcessor.PauseProcessing();
            Thread.Sleep(10);
            int qCnt = AsyncRequestProcessor.QueueLength();

            try
            {
                Assert.AreEqual(0, qCnt, "Queue not initially empty");
                IAsyncResult resultHook = AsyncRequestProcessor.EnqueueRequest(request);
                Assert.Greater(AsyncRequestProcessor.QueueLength(), qCnt);
                AsyncRequestProcessor.ResumeProcessing();
                Thread.Sleep(10);
                WaitHandle evt = resultHook.AsyncWaitHandle;
                evt.WaitOne(10000);
                Assert.IsTrue(resultHook.IsCompleted, "Not flagged as complete after wait event");
                Assert.AreEqual(0, AsyncRequestProcessor.QueueLength(), "Queue not emptied");
            }
            finally
            {
                AsyncRequestProcessor.ResumeProcessing();
                AsyncRequestProcessor.ReleaseResources();
            }
        }
        public void LotsOfRequestsClearQuickly()
        {
            AsyncRequestProcessor.PurgeQueue();
            string[] urls = new string[] {
                "http://www.cnn.com",
                "http://www.cnet.com",
                "http://www.expedia.com",
                "http://www.yahoo.com",
                "http://m.yahoo.com",
                "http://www.cbs.com",
                "http://google.com",
                "http://www.myspace.com",
                "http://www.facebook.com"
            };
            long startTicks             = DateTime.Now.Ticks;
            List <IAsyncResult> handles = new List <IAsyncResult>();

            for (int i = 0; i < urls.Length; i++)
            {
                handles.Add(AsyncRequestProcessor.EnqueueRequest(HttpWebRequest.Create(urls[i]) as HttpWebRequest));
            }
            IAsyncResult rslt = handles[handles.Count - 1];
            WaitHandle   hook = rslt.AsyncWaitHandle;

            hook.WaitOne(5000);
            Assert.IsTrue(rslt.IsCompleted, "Request is not complete after WaitEvent releases");
            RequestResult result = AsyncRequestProcessor.EndRequest(rslt);

            Assert.IsNotNull(result);
            Assert.IsFalse(string.IsNullOrEmpty(result.ResponseString), "Response is empty");

            bool ok = true;

            for (int i = 0; i < handles.Count - 1; i++)
            {
                IAsyncResult result2 = handles[i];
                if (!result2.IsCompleted)
                {
                    result2.AsyncWaitHandle.WaitOne(500);
                }
                if (!result2.IsCompleted)
                {
                    ok = false;
                }
                else
                {
                    result = AsyncRequestProcessor.EndRequest(result2);
                    Assert.IsNotNull(result.ResponseString);
                }
            }

            Assert.IsTrue(ok, "All processing not complete");
            TimeSpan t = new TimeSpan(DateTime.Now.Ticks - startTicks);

            Assert.Less(t.Seconds, 5, "Requests took more than five seconds");
            AsyncRequestProcessor.ReleaseResources();
        }
        public void FullRequestQueueClears()
        {
            AsyncRequestProcessor.PauseProcessing();

            List <IAsyncResult> handles = new List <IAsyncResult>();

            for (int i = 0; i < AsyncRequestProcessor.MAX_POOL_SIZE; i++)
            {
                handles.Add(AsyncRequestProcessor.EnqueueRequest(HttpWebRequest.Create("http://www.google.com") as HttpWebRequest));
            }

            HttpWebRequest requestCnn = HttpWebRequest.Create("http://www.cnn.com") as HttpWebRequest;

            IAsyncResult hook      = AsyncRequestProcessor.EnqueueRequest(requestCnn);
            WaitHandle   waitEvent = hook.AsyncWaitHandle;

            AsyncRequestProcessor.ResumeProcessing();
            bool wr = waitEvent.WaitOne(5000);

            //Assert.IsTrue(wr, "WaitOne timed out");
            Assert.IsTrue(hook.IsCompleted, "Request is not complete after WaitEvent releases");
            RequestResult result = AsyncRequestProcessor.EndRequest(hook);

            Assert.IsNotNull(result);
            Assert.IsFalse(string.IsNullOrEmpty(result.ResponseString), "Response is empty");
            Assert.IsTrue(result.ResponseString.Contains("cnn"), "CNN doesn't appear to recognize its self");
            List <WaitHandle> whs = new List <WaitHandle>();

            foreach (IAsyncResult item in handles)
            {
                //if (!item.IsCompleted)
                //{
                whs.Add(item.AsyncWaitHandle);
                //				}
            }
            if (whs.Count > 0)
            {
                wr = WaitHandle.WaitAll(whs.ToArray(), 5000);
                //Assert.IsTrue(wr, "WaitAll timed out");
            }
            foreach (IAsyncResult item in handles)
            {
                Assert.IsTrue(item.IsCompleted, "Item did not complete");

                RequestResult x = AsyncRequestProcessor.EndRequest(item);
                Assert.AreEqual(200, x.ResponseCode, "Didn't get a 200 back");
                if (x == null || x.ResponseString == null)
                {
                    Assert.Fail("Empty result");
                }
                Assert.Greater(x.ResponseString.Length, 10, "Response appears empty");
            }
            Assert.IsTrue(AsyncRequestProcessor.QueueLength() == 0, "Queue is not empty");
            AsyncRequestProcessor.ReleaseResources();
        }
        public void QueueRequestWithStrings()
        {
            AsyncRequestProcessor.ResumeProcessing();

            IAsyncResult resultHandle = AsyncRequestProcessor.EnqueueRequest("http://www.cnet.com");
            WaitHandle   waitHandle   = resultHandle.AsyncWaitHandle;

            waitHandle.WaitOne(5000);
            Assert.IsTrue(resultHandle.IsCompleted, "Request is not complete after WaitEvent releases");

            RequestResult result = AsyncRequestProcessor.EndRequest(resultHandle);

            Assert.IsNotNull(result);
            Assert.IsFalse(string.IsNullOrEmpty(result.ResponseString), "Response is empty");
            Assert.IsTrue(result.ResponseString.Contains("cnet"), "Response doesn't have cnet");
        }
        public void QueueRequest()
        {
            AsyncRequestProcessor.ResumeProcessing();
            HttpWebRequest request = HttpWebRequest.Create("http://www.google.com") as HttpWebRequest;

            IAsyncResult resultHandle = AsyncRequestProcessor.EnqueueRequest(request);
            WaitHandle   waitHandle   = resultHandle.AsyncWaitHandle;

            waitHandle.WaitOne(5000);
            Assert.IsTrue(resultHandle.IsCompleted, "Request is not complete after WaitEvent releases");

            RequestResult result = AsyncRequestProcessor.EndRequest(resultHandle);

            Assert.IsNotNull(result);
            Assert.IsFalse(string.IsNullOrEmpty(result.ResponseString), "Response is empty");
        }
Example #6
0
        public void FetchMessageBundles()
        {
            if (!this.HasExternalMessageBundles())
            {
                return;
            }

            List <KeyValuePair <Locale, IAsyncResult> > fetchResults = new List <KeyValuePair <Locale, IAsyncResult> >();

            foreach (Locale locale in this.ModulePrefs.Locales)
            {
                fetchResults.Add(new KeyValuePair <Locale, IAsyncResult>(locale, AsyncRequestProcessor.EnqueueRequest(locale.MessageSrc)));
            }

            List <KeyValuePair <Locale, IAsyncResult> > failedFetch = new List <KeyValuePair <Locale, IAsyncResult> >();

            foreach (var keyset in fetchResults)
            {
                IAsyncResult resultHandle = keyset.Value;
                resultHandle.AsyncWaitHandle.WaitOne(800);                 //wait 800 ms
                if (!resultHandle.IsCompleted)
                {
                    failedFetch.Add(keyset);
                }
                else
                {
                    try
                    {
                        RequestResult thisResult = AsyncRequestProcessor.EndRequest(resultHandle);
                        if (thisResult.ResponseCode == 200)
                        {
                            keyset.Key.LoadMessageBundle(thisResult.ResponseString);
                        }
                    }
                    catch { }
                }
            }
            //retry failed
            foreach (var keyset in failedFetch)
            {
                IAsyncResult resultHandle = keyset.Value;
                resultHandle.AsyncWaitHandle.WaitOne(800);                 //wait 800 ms
                if (!resultHandle.IsCompleted)
                {
                    System.Diagnostics.Debug.WriteLine("Fetch failed twice: " + keyset.Key.Lang);
                    //failedFetch.Add(keyset);
                }
                else
                {
                    try
                    {
                        RequestResult thisResult = AsyncRequestProcessor.EndRequest(resultHandle);
                        if (thisResult.ResponseCode == 200)
                        {
                            keyset.Key.LoadMessageBundle(thisResult.ResponseString);
                        }
                    }
                    catch { }
                }
            }
        }
Example #7
0
        /// <summary>
        /// Loads any local templates
        /// </summary>
        /// <param name="gm"></param>
        /// <param name="gadgetFile"></param>
        private void LoadTemplates(GadgetMaster gm, string gadgetFile)
        {
            if (!gm.HasExternalTemplateLibraries())
            {
                return;
            }

            string gadgetPrivatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, RenderGadget.TEMPLATE_FILES + "\\" + gadgetFile + "\\");
            string templatePath      = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, RenderGadget.TEMPLATE_FILES);

            LinkedList <TemplateLibraryDef> siteTemplates = new LinkedList <TemplateLibraryDef>();
            LinkedList <TemplateLibraryDef> urlTemplates  = new LinkedList <TemplateLibraryDef>();

            foreach (var def in gm.TemplateLibraries.Libraries)
            {
                if (!string.IsNullOrEmpty(def.Uri))
                {
                    if (def.Uri.StartsWith("site:"))
                    {
                        siteTemplates.AddFirst(def);
                    }
                    else if (def.Uri.StartsWith("http"))
                    {
                        urlTemplates.AddFirst(def);
                    }
                }
            }

            if (urlTemplates.Count > 0)
            {
                List <KeyValuePair <TemplateLibraryDef, IAsyncResult> > fetchResults = new List <KeyValuePair <TemplateLibraryDef, IAsyncResult> >();
                foreach (var def in urlTemplates)
                {
                    fetchResults.Add(new KeyValuePair <TemplateLibraryDef, IAsyncResult>(def, AsyncRequestProcessor.EnqueueRequest(def.Uri)));
                }
                foreach (var keyset in fetchResults)
                {
                    IAsyncResult resultHandle = keyset.Value;
                    resultHandle.AsyncWaitHandle.WaitOne(800);                     //wait 800 ms
                    if (!resultHandle.IsCompleted)
                    {
                        //failedFetch.Add(keyset);
                    }
                    else
                    {
                        try
                        {
                            RequestResult thisResult = AsyncRequestProcessor.EndRequest(resultHandle);
                            if (thisResult.ResponseCode == 200)
                            {
                                gm.LoadTemplateLibrary(keyset.Key.Uri, thisResult.ResponseString);
                            }
                        }
                        catch { }
                    }
                }
            }

            //site templates
            if (siteTemplates.Count > 0)
            {
                foreach (var def in siteTemplates)
                {
                    int pos = def.Uri.IndexOf("site:");
                    if (pos == -1)
                    {
                        continue;
                    }
                    string part     = def.Uri.Substring(pos + 5);
                    string filePath = Path.Combine(templatePath, part);

                    if (File.Exists(filePath))
                    {
                        string templateString = null;
                        using (StreamReader sr = new StreamReader(filePath))
                        {
                            templateString = sr.ReadToEnd();
                        }
                        if (!string.IsNullOrEmpty(templateString))
                        {
                            gm.LoadTemplateLibrary(def.Uri, templateString);
                        }
                    }
                }
            }
        }
 public ProcessRequestsAsynchronously()
 {
     requestProcessor      = MockRepository.GenerateMock <IRequestProcessor>();
     asyncRequestProcessor = new AsyncRequestProcessor(requestProcessor);
 }