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"); }
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 { } } } }
/// <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); }