/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.monitor;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.ServletInputStream;
import org.apache.commons.io.IOUtils;
import org.geoserver.monitor.MonitorServletRequest.MonitorInputStream;
import org.junit.Test;
import org.springframework.mock.web.DelegatingServletInputStream;
import org.springframework.mock.web.MockHttpServletRequest;
public class MonitorServletRequestTest {
static final String THE_REQUEST = "TheRequest";
static final class SingleInputCallRequest extends MockHttpServletRequest {
static final byte[] BUFFER = THE_REQUEST.getBytes();
AtomicBoolean called = new AtomicBoolean(false);
public javax.servlet.ServletInputStream getInputStream() {
checkCalled();
final ByteArrayInputStream bis = new ByteArrayInputStream(BUFFER);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bis.read();
}
};
}
@Override
public BufferedReader getReader() {
checkCalled();
return new BufferedReader(new InputStreamReader(new ByteArrayInputStream(BUFFER)));
}
private void checkCalled() {
if(called.get()) {
fail("Input got retrieved twice");
}
called.set(true);
}
}
@Test
public void testInputStreamMaxSizeZero() throws Exception {
byte[] data = data();
DelegatingServletInputStream mock = new DelegatingServletInputStream(new ByteArrayInputStream(data));
MonitorInputStream in = new MonitorInputStream(mock, 0);
byte[] read = read(in);
assertEquals(data.length, read.length);
byte[] buffer = in.getData();
assertEquals(0, buffer.length);
// ? why does this report 1 off ?
assertEquals(data.length - 1, in.getBytesRead());
}
@Test
public void testInputStream() throws Exception {
byte[] data = data();
DelegatingServletInputStream mock = new DelegatingServletInputStream(new ByteArrayInputStream(data));
MonitorInputStream in = new MonitorInputStream(mock, 1024);
byte[] read = read(in);
assertEquals(data.length, read.length);
byte[] buffer = in.getData();
assertEquals(1024, buffer.length);
for (int i = 0; i < buffer.length; i++) {
assertEquals(data[i], buffer[i]);
}
// ? why does this report 1 off ?
assertEquals(data.length - 1, in.getBytesRead());
}
static byte[] data() throws IOException {
InputStream in = MonitorServletRequest.class.getResourceAsStream("wms.xml");
return read(in);
}
static byte[] read(InputStream in) throws IOException {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;
while ((n = in.read(buf)) > 0) {
bytes.write(buf, 0, n);
}
in.close();
return bytes.toByteArray();
}
@Test
public void testGetReader() throws IOException {
MockHttpServletRequest mock = new SingleInputCallRequest();
MonitorServletRequest request = new MonitorServletRequest(mock, 1024);
try(BufferedReader reader = request.getReader()) {
assertEquals(THE_REQUEST, reader.readLine());
};
assertArrayEquals(THE_REQUEST.getBytes(), request.getBodyContent());
}
@Test
public void testGetInputStream() throws IOException {
MockHttpServletRequest mock = new SingleInputCallRequest();
MonitorServletRequest request = new MonitorServletRequest(mock, 1024);
try(InputStream is = request.getInputStream()) {
assertEquals(THE_REQUEST, IOUtils.toString(is));
};
assertArrayEquals(THE_REQUEST.getBytes(), request.getBodyContent());
}
}