package org.geoserver.monitor.rest;
import static org.geoserver.monitor.MonitorTestData.assertCovered;
import static org.geoserver.monitor.MonitorTestData.assertCoveredInOrder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.geoserver.monitor.MemoryMonitorDAO;
import org.geoserver.monitor.Monitor;
import org.geoserver.monitor.MonitorTestData;
import org.geoserver.monitor.RequestData;
import org.geoserver.rest.PageInfo;
import org.geotools.feature.type.DateUtil;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.restlet.data.Reference;
import org.restlet.data.Request;
import org.restlet.data.Response;
public class RequestResourceTest {
static Monitor monitor;
RequestResource resource;
@BeforeClass
public static void setUpData() throws Exception {
monitor = new Monitor(new MemoryMonitorDAO());
new MonitorTestData(monitor.getDAO()).setup();
}
@Before
public void setUp() throws Exception {
resource = new RequestResource(monitor);
}
@Test
public void testGetAll() throws Exception {
Request req = new Request();
Response res = new Response(req);
resource.init(null, req, res);
List<RequestData> datas = (List<RequestData>) resource.handleObjectGet();
assertEquals(monitor.getDAO().getRequests().size(), datas.size());
}
@Test
public void testGetAllHTML() throws Exception {
Request req = new Request();
PageInfo page = new PageInfo();
page.setBasePath("foo");
page.setPagePath("bar");
page.setBaseURL("baz");
req.getAttributes().put(PageInfo.KEY, page);
Response res = new Response(req);
RequestResource.HTMLFormat format = new RequestResource.HTMLFormat(req, res, resource);
ByteArrayOutputStream out = new ByteArrayOutputStream();
format.toRepresentation(monitor.getDAO().getRequests()).write(out);
assertTrue(new String(out.toByteArray()).startsWith("<html>"));
}
@Test
public void testGetAllCSV() throws Exception {
RequestResource.CSVFormat format = new RequestResource.CSVFormat(
new String[]{"id", "path", "startTime"});
ByteArrayOutputStream out = new ByteArrayOutputStream();
format.toRepresentation(monitor.getDAO().getRequests()).write(out);
BufferedReader in = new BufferedReader(new InputStreamReader(
new ByteArrayInputStream(out.toByteArray())));
String line = in.readLine();
assertEquals("id,path,startTime", line);
Iterator<RequestData> it = monitor.getDAO().getRequests().iterator();
while((line = in.readLine()) != null) {
assertTrue(it.hasNext());
RequestData data = it.next();
String expected = data.getId() + "," + data.getPath() + "," +
DateUtil.serializeDateTime(data.getStartTime());
assertEquals(expected, line);
}
assertFalse(it.hasNext());
}
@Test
public void testGetZIP() throws Exception {
RequestResource.CSVFormat csv = new RequestResource.CSVFormat(
new String[]{"id", "path", "startTime"});
RequestResource.ZIPFormat zip = new RequestResource.ZIPFormat(
Arrays.asList("id", "path", "startTime", "Error", "Body"), csv, monitor);
Date startTime = new Date();
Throwable throwable = new Throwable();
RequestData data = new RequestData();
data.setId(12345);
data.setPath("/foo");
data.setStartTime(startTime);
data.setBody("<foo></foo>".getBytes());
data.setError(throwable);
ByteArrayOutputStream out = new ByteArrayOutputStream();
zip.toRepresentation(data).write(out);
ZipInputStream zin = new ZipInputStream(new ByteArrayInputStream(out.toByteArray()));
ZipEntry entry = null;
boolean requests = false;
boolean body = false;
boolean error = false;
while((entry = zin.getNextEntry()) != null) {
if ("requests.csv".equals(entry.getName())) {
requests = true;
String expected = "id,path,startTime\n12345,/foo," + DateUtil.serializeDateTime(startTime);
assertEquals(expected, readEntry(zin));
}
else if ("body.txt".equals(entry.getName())) {
body = true;
assertEquals("<foo></foo>", readEntry(zin));
}
else if ("error.txt".equals(entry.getName())) {
error = true;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintStream stream = new PrintStream(bout);
throwable.printStackTrace(stream);
stream.flush();
assertEquals(new String(bout.toByteArray()).trim(), readEntry(zin));
}
}
assertTrue(requests);
assertTrue(body);
assertTrue(error);
}
String readEntry(ZipInputStream zin) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = -1;
while ((n = zin.read(buf)) != -1) {
out.write(buf, 0, n);
}
return new String(out.toByteArray()).trim();
}
@Test
public void testGetById() throws Exception {
Request req = new Request();
req.getAttributes().put("request", 2);
Response res = new Response(req);
resource.init(null, req, res);
RequestData data = (RequestData) resource.handleObjectGet();
assertEquals("/two", data.getPath());
}
@Test
public void testGetByIdHTML() throws Exception {
Request req = new Request();
Response res = new Response(req);
RequestResource.HTMLFormat format = new RequestResource.HTMLFormat(req, res, resource);
ByteArrayOutputStream out = new ByteArrayOutputStream();
format.toRepresentation(monitor.getDAO().getRequest(2)).write(out);
assertTrue(new String(out.toByteArray()).startsWith("<html>"));
}
@Test
public void testGetDateRange() throws Exception {
Request req = new Request();
setKVP(req, "from", "2010-07-23T15:56:44", "to", "2010-07-23T16:16:44");
Response res = new Response(req);
resource.init(null, req, res);
List<RequestData> datas = (List<RequestData>) resource.handleObjectGet();
assertCoveredInOrder(datas, 6, 5, 4);
}
@Test
public void testSorting() throws Exception {
Request req = new Request();
setKVP(req, "order", "path");
Response res = new Response(req);
resource.init(null, req, res);
List<RequestData> datas = (List<RequestData>) resource.handleObjectGet();
assertCoveredInOrder(datas, 8, 5, 4, 9, 1, 7, 6, 10, 3, 2);
setKVP(req, "order", "path;ASC");
res = new Response(req);
resource.init(null, req, res);
datas = (List<RequestData>) resource.handleObjectGet();
assertCoveredInOrder(datas, 8, 5, 4, 9, 1, 7, 6, 10, 3, 2);
setKVP(req, "order", "path;DESC");
res = new Response(req);
resource.init(null, req, res);
datas = (List<RequestData>) resource.handleObjectGet();
assertCoveredInOrder(datas, 2, 3, 10, 6, 7, 1, 9, 4, 5, 8);
}
@Test
public void testPaging() throws Exception {
Request req = new Request();
setKVP(req, "order", "startTime", "offset", "5", "count", "2");
Response res = new Response(req);
resource.init(null, req, res);
List<RequestData> datas = (List<RequestData>) resource.handleObjectGet();
assertCoveredInOrder(datas, 6, 7);
}
@Test
public void testLive() throws Exception {
Request req = new Request();
setKVP(req, "live", "yes");
Response res = new Response(req);
resource.init(null, req, res);
List<RequestData> datas = (List<RequestData>) resource.handleObjectGet();
assertCovered(datas, 1, 2, 5, 6, 9, 10);
}
void setKVP(Request req, String... kvp) {
Reference ref = new Reference();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < kvp.length; i += 2) {
sb.append(kvp[i]).append("=").append(kvp[i+1]).append("&");
}
sb.setLength(sb.length()-1);
ref.setQuery(sb.toString());
req.setResourceRef(ref);
}
}