/*
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.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Semaphore;
import microsoft.aspnet.signalr.client.http.Response;
public class MockResponse implements Response {
Semaphore mSemaphore = new Semaphore(0);
Object mLinesLock = new Object();
Queue<String> mLines = new ConcurrentLinkedQueue<String>();
Map<String, List<String>> mHeaders = new HashMap<String, List<String>>();
int mStatus;
boolean mFinished = false;
public MockResponse(int status) {
mStatus = status;
}
public void setStatus(int status) {
mStatus = status;
}
public void writeLine(String line) {
if (line != null) {
synchronized (mLinesLock) {
mLines.add(line);
}
mSemaphore.release();
}
}
public void finishWriting() {
mFinished = true;
}
public void setHeaders(Map<String, List<String>> headers) {
mHeaders = new HashMap<String, List<String>>();
}
@Override
public Map<String, List<String>> getHeaders() {
return new HashMap<String, List<String>>(mHeaders);
}
@Override
public List<String> getHeader(String headerName) {
return mHeaders.get(headerName);
}
@Override
public String readToEnd() throws IOException {
StringBuilder sb = new StringBuilder();
while (!mFinished || !mLines.isEmpty()) {
String line = readLine();
sb.append(line);
sb.append("\n");
}
return sb.toString();
}
@Override
public String readLine() throws IOException {
if (mFinished) {
if (mLines.isEmpty()) {
return null;
} else {
synchronized (mLinesLock) {
return mLines.poll();
}
}
} else {
try {
mSemaphore.acquire();
} catch (InterruptedException e) {
}
synchronized (mLinesLock) {
String line = mLines.poll();
return line;
}
}
}
@Override
public int getStatus() {
return mStatus;
}
@Override
public byte[] readAllBytes() throws IOException {
return readToEnd().getBytes();
}
}