001/**
002 * Copyright (c) 2015-2022, Michael Yang 杨福海 (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.apache.org/licenses/LICENSE-2.0
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package io.jboot.test.web;
017
018import com.jfinal.core.JFinal;
019import io.jboot.test.MockProxy;
020
021import javax.servlet.ServletOutputStream;
022import javax.servlet.WriteListener;
023import javax.servlet.http.Cookie;
024import javax.servlet.http.HttpServletResponse;
025import javax.servlet.http.HttpServletResponseWrapper;
026import java.io.*;
027import java.util.*;
028
029public class MockHttpServletResponse extends HttpServletResponseWrapper {
030
031    protected String contentString;
032    protected ByteArrayOutputStream stream = new ByteArrayOutputStream();
033
034    protected PrintWriter writer;
035    protected Map<String, String> headers = new HashMap<>();
036    protected Set<Cookie> cookies = new HashSet<>();
037
038    protected int status = 200;
039    protected String statusMessage = "OK";
040    protected Locale locale;
041    protected String contentType;
042    protected String characterEncoding = JFinal.me().getConstants().getEncoding();
043
044
045    public MockHttpServletResponse() {
046        super(MockProxy.create(HttpServletResponse.class));
047    }
048
049    public MockHttpServletResponse(ByteArrayOutputStream stream) {
050        super(MockProxy.create(HttpServletResponse.class));
051        this.stream = stream;
052    }
053
054    public MockHttpServletResponse(HttpServletResponse response) {
055        super(response);
056    }
057
058    public MockHttpServletResponse(HttpServletResponse response, ByteArrayOutputStream stream) {
059        super(response);
060        this.stream = stream;
061    }
062
063    @Override
064    public void addCookie(Cookie cookie) {
065        cookies.add(cookie);
066    }
067
068    public Set<Cookie> getCookies() {
069        return cookies;
070    }
071
072
073    @Override
074    public void addDateHeader(String key, long value) {
075        headers.put(key, "" + value);
076    }
077
078    @Override
079    public void addHeader(String key, String value) {
080        headers.put(key, value);
081    }
082
083    @Override
084    public void addIntHeader(String key, int value) {
085        headers.put(key, "" + value);
086    }
087
088    @Override
089    public boolean containsHeader(String key) {
090        return headers.containsKey(key);
091    }
092
093    @Override
094    public void sendError(int status) throws IOException {
095        this.setStatus(status);
096    }
097
098    @Override
099    public void sendError(int status, String statusMessage) throws IOException {
100        this.setStatus(status, statusMessage);
101    }
102
103    @Override
104    public void sendRedirect(String value) throws IOException {
105        if (status == 200) {
106            setStatus(302);
107        }
108        headers.put("Location", value);
109    }
110
111    @Override
112    public void setDateHeader(String key, long value) {
113        headers.put(key, "" + value);
114    }
115
116    @Override
117    public void setHeader(String key, String value) {
118        headers.put(key, value);
119    }
120
121    @Override
122    public void setIntHeader(String key, int value) {
123        headers.put(key, "" + value);
124    }
125
126    @Override
127    public void setStatus(int status) {
128        this.status = status;
129    }
130
131    @Override
132    public void setStatus(int status, String statusMessage) {
133        this.status = status;
134        this.statusMessage = statusMessage;
135    }
136
137    @Override
138    public void flushBuffer() throws IOException {
139        getWriter().flush();
140    }
141
142    @Override
143    public int getBufferSize() {
144        return stream.size();
145    }
146
147    @Override
148    public String getCharacterEncoding() {
149        return characterEncoding;
150    }
151
152    @Override
153    public String getContentType() {
154        return contentType;
155    }
156
157    @Override
158    public Locale getLocale() {
159        return locale;
160    }
161
162    @Override
163    public ServletOutputStream getOutputStream() throws IOException {
164        return new ServletOutputStream() {
165
166            @Override
167            public void write(int arg0) throws IOException {
168                stream.write(arg0);
169            }
170
171            @Override
172            public boolean isReady() {
173                return false;
174            }
175
176            @Override
177            public void setWriteListener(WriteListener writeListener) {
178            }
179        };
180    }
181
182    @Override
183    public PrintWriter getWriter() throws IOException {
184        if (writer == null) {
185            writer = new PrintWriter(new OutputStreamWriter(stream, characterEncoding));
186        }
187        return writer;
188    }
189
190    @Override
191    public void reset() {
192        stream.reset();
193    }
194
195    @Override
196    public void resetBuffer() {
197        stream.reset();
198    }
199
200
201    @Override
202    public void setCharacterEncoding(String characterEncoding) {
203        this.characterEncoding = characterEncoding;
204    }
205
206    @Override
207    public void setContentType(String contentType) {
208        this.contentType = contentType;
209    }
210
211    @Override
212    public void setLocale(Locale locale) {
213        this.locale = locale;
214    }
215
216    @Override
217    public int getStatus() {
218        return status;
219    }
220
221    public String getStatusMessage() {
222        return statusMessage;
223    }
224
225    public String getContentString() {
226        if (contentString == null) {
227            try {
228                getWriter().flush();
229                contentString = stream.toString(characterEncoding);
230            } catch (IOException e) {
231                throw new RuntimeException(e);
232            }
233        }
234        return contentString;
235    }
236
237    @Override
238    public String getHeader(String key) {
239        return headers.get(key);
240    }
241
242    @Override
243    public Collection<String> getHeaderNames() {
244        return headers.keySet();
245    }
246
247    @Override
248    public boolean isCommitted() {
249        return false;
250    }
251
252}