21397019ed75e40d4e7b1f54fdf9177d5b6b80bd
[android/platform/packages/providers/DownloadProvider.git] / tests / src / tests / http / MockResponse.java
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package tests.http;
18
19 import static tests.http.MockWebServer.ASCII;
20
21 import java.io.ByteArrayOutputStream;
22 import java.io.IOException;
23 import java.io.UnsupportedEncodingException;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28
29 /**
30  * A scripted response to be replayed by the mock web server.
31  */
32 public class MockResponse {
33     private static final byte[] EMPTY_BODY = new byte[0];
34
35     private String status = "HTTP/1.1 200 OK";
36     private Map<String, String> headers = new HashMap<String, String>();
37     private byte[] body = EMPTY_BODY;
38     private boolean closeConnectionAfter = false;
39
40     public MockResponse() {
41         addHeader("Content-Length", 0);
42     }
43
44     /**
45      * Returns the HTTP response line, such as "HTTP/1.1 200 OK".
46      */
47     public String getStatus() {
48         return status;
49     }
50
51     public MockResponse setResponseCode(int code) {
52         this.status = "HTTP/1.1 " + code + " OK";
53         return this;
54     }
55
56     /**
57      * Returns the HTTP headers, such as "Content-Length: 0".
58      */
59     public List<String> getHeaders() {
60         List<String> headerStrings = new ArrayList<String>();
61         for (String header : headers.keySet()) {
62             headerStrings.add(header + ": " + headers.get(header));
63         }
64         return headerStrings;
65     }
66
67     public MockResponse addHeader(String header, String value) {
68         headers.put(header.toLowerCase(), value);
69         return this;
70     }
71
72     public MockResponse addHeader(String header, int value) {
73         return addHeader(header, Integer.toString(value));
74     }
75
76     /**
77      * Returns an input stream containing the raw HTTP payload.
78      */
79     public byte[] getBody() {
80         return body;
81     }
82
83     public MockResponse setBody(byte[] body) {
84         addHeader("Content-Length", body.length);
85         this.body = body;
86         return this;
87     }
88
89     public MockResponse setBody(String body) {
90         try {
91             return setBody(body.getBytes(ASCII));
92         } catch (UnsupportedEncodingException e) {
93             throw new AssertionError();
94         }
95     }
96
97     public MockResponse setChunkedBody(byte[] body, int maxChunkSize) throws IOException {
98         addHeader("Transfer-encoding", "chunked");
99
100         ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
101         int pos = 0;
102         while (pos < body.length) {
103             int chunkSize = Math.min(body.length - pos, maxChunkSize);
104             bytesOut.write(Integer.toHexString(chunkSize).getBytes(ASCII));
105             bytesOut.write("\r\n".getBytes(ASCII));
106             bytesOut.write(body, pos, chunkSize);
107             bytesOut.write("\r\n".getBytes(ASCII));
108             pos += chunkSize;
109         }
110         bytesOut.write("0\r\n".getBytes(ASCII));
111         this.body = bytesOut.toByteArray();
112         return this;
113     }
114
115     public MockResponse setChunkedBody(String body, int maxChunkSize) throws IOException {
116         return setChunkedBody(body.getBytes(ASCII), maxChunkSize);
117     }
118
119     @Override public String toString() {
120         return status;
121     }
122
123     public boolean shouldCloseConnectionAfter() {
124         return closeConnectionAfter;
125     }
126
127     public MockResponse setCloseConnectionAfter(boolean closeConnectionAfter) {
128         this.closeConnectionAfter = closeConnectionAfter;
129         return this;
130     }
131 }