/* Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved See License.txt in the project root for license information. */ package microsoft.aspnet.signalr.client.tests.util; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Semaphore; import microsoft.aspnet.signalr.client.http.HttpConnection; import microsoft.aspnet.signalr.client.http.HttpConnectionFuture; import microsoft.aspnet.signalr.client.http.HttpConnectionFuture.ResponseCallback; import microsoft.aspnet.signalr.client.http.Request; public class MockHttpConnection implements HttpConnection { Semaphore mSemaphore = new Semaphore(0); Queue<RequestEntry> mRequests = new ConcurrentLinkedQueue<RequestEntry>(); List<Thread> mThreads = new ArrayList<Thread>(); @Override public HttpConnectionFuture execute(Request request, ResponseCallback responseCallback) { RequestEntry entry = new RequestEntry(); entry.request = request; entry.callback = responseCallback; entry.future = new HttpConnectionFuture(); entry.response = new MockResponse(200); mRequests.add(entry); mSemaphore.release(); return entry.future; } public class RequestEntry { public Request request; public ResponseCallback callback; public HttpConnectionFuture future; public MockResponse response; private boolean mResponseTriggered = false; private Object mSync = new Object(); public void finishRequest() { Thread t = new Thread(new Runnable() { @Override public void run() { response.finishWriting(); future.setResult(null); } }); mThreads.add(t); t.start(); } public void triggerResponse() { synchronized (mSync) { if (!mResponseTriggered) { mResponseTriggered = true; Thread t = new Thread(new Runnable() { @Override public void run() { try { callback.onResponse(response); } catch (Exception e) { } } }); mThreads.add(t); t.start(); } } } } public RequestEntry getRequest() throws InterruptedException { mSemaphore.acquire(); return mRequests.poll(); } }