/* Copyright (c) 2001 - 2011 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.monitor.rest;
import static org.geoserver.monitor.MonitorTestData.assertCovered;
import static org.geoserver.monitor.MonitorTestData.assertCoveredInOrder;
import static org.geoserver.monitor.MonitorTestData.toDate;
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.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.geoserver.monitor.MemoryMonitorDAO;
import org.geoserver.monitor.Monitor;
import org.geoserver.monitor.Query;
import org.geoserver.monitor.MonitorTestData;
import org.geoserver.monitor.RequestData;
import org.geoserver.monitor.Query.Comparison;
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;
static MonitorTestData testData;
RequestResource resource;
@BeforeClass
public static void setUpData() throws Exception {
monitor = new Monitor(new MemoryMonitorDAO());
testData = new MonitorTestData(monitor.getDAO(), false);
testData.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);
Query q = (Query) resource.handleObjectGet();
assertEquals(monitor.getDAO().getRequests().size(),
monitor.getDAO().getRequests(q).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, monitor);
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"}, monitor);
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 testGetAllExcel() throws Exception {
RequestResource.ExcelFormat format = new RequestResource.ExcelFormat(
new String[]{"id", "path", "startTime"}, monitor);
ByteArrayOutputStream out = new ByteArrayOutputStream();
format.toRepresentation(monitor.getDAO().getRequests()).write(out);
HSSFWorkbook wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray()));
HSSFSheet sheet = wb.getSheet("requests");
Iterator<HSSFRow> rows = sheet.iterator();
Iterator<RequestData> it = monitor.getDAO().getRequests().iterator();
assertTrue(rows.hasNext());
HSSFRow row = rows.next();
assertEquals("id", row.getCell(0).getStringCellValue());
assertEquals("path", row.getCell(1).getStringCellValue());
assertEquals("startTime", row.getCell(2).getStringCellValue());
while(rows.hasNext()) {
row = rows.next();
assertTrue(it.hasNext());
RequestData data = it.next();
assertEquals((double) data.getId(), row.getCell(0).getNumericCellValue(), 0.1);
assertEquals(data.getPath(), row.getCell(1).getStringCellValue());
assertEquals(data.getStartTime(), row.getCell(2).getDateCellValue());
}
assertFalse(it.hasNext());
}
@Test
public void testGetZIP() throws Exception {
RequestResource.CSVFormat csv = new RequestResource.CSVFormat(
new String[]{"id", "path", "startTime"}, monitor);
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();
}
public void testGetAllCSVQuery() throws Exception {
RequestResource.CSVFormat format = new RequestResource.CSVFormat(
new String[]{"id", "path", "startTime"}, monitor);
ByteArrayOutputStream out = new ByteArrayOutputStream();
format.toRepresentation(new Query()).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 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, monitor);
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);
Query q = (Query) resource.handleObjectGet();
List<RequestData> datas = (List<RequestData>) monitor.getDAO().getRequests(q);
assertCoveredInOrder(datas, 6, 5, 4);
}
@Test
public void testGetDateRangeWithTimeZone() throws Exception {
Calendar c = Calendar.getInstance();
c.setTime(toDate("2010-07-23T15:56:44"));
long off = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
off = off / 1000 / 60 / 60;
String z = Math.abs(off) < 10 ? "0" + Math.abs(off) : ""+Math.abs(off);
z += "00";
z = off < 0 ? "-" + z : z;
Request req = new Request();
setKVP(req, "from", "2010-07-23T15:56:44+0000", "to", "2010-07-23T16:16:44+0000");
Response res = new Response(req);
resource.init(null, req, res);
Query q = (Query) resource.handleObjectGet();
List<RequestData> datas = (List<RequestData>) monitor.getDAO().getRequests(q);
assertCoveredInOrder(datas, 6, 5, 4);
}
@Test
public void testFilter() throws Exception {
Request req = new Request();
setKVP(req, "filter", "path:EQ:/seven");
Response res = new Response(req);
resource.init(null, req, res);
Query q = (Query) resource.handleObjectGet();
List<RequestData> datas = (List<RequestData>) monitor.getDAO().getRequests(q);
assertCoveredInOrder(datas, 7);
}
@Test
public void testFilterIn() throws Exception {
Request req = new Request();
setKVP(req, "filter", "path:IN:/seven,/six,/five");
Response res = new Response(req);
resource.init(null, req, res);
Query q = (Query) resource.handleObjectGet();
List<RequestData> datas = (List<RequestData>) monitor.getDAO().getRequests(q);
assertCovered(datas, 5, 6, 7);
}
@Test
public void testFilterStatus() throws Exception {
Request req = new Request();
setKVP(req, "filter", "status:EQ:WAITING");
Response res = new Response(req);
resource.init(null, req, res);
Query q = (Query) resource.handleObjectGet();
List<RequestData> datas = (List<RequestData>) monitor.getDAO().getRequests(q);
assertCovered(datas, 2,6);
}
@Test
public void testSorting() throws Exception {
Request req = new Request();
setKVP(req, "order", "path");
Response res = new Response(req);
resource.init(null, req, res);
Query q = (Query)resource.handleObjectGet();
List<RequestData> datas = monitor.getDAO().getRequests(q);
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);
q = (Query)resource.handleObjectGet();
datas = monitor.getDAO().getRequests(q);
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);
q = (Query)resource.handleObjectGet();
datas = monitor.getDAO().getRequests(q);
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);
Query q = (Query)resource.handleObjectGet();
List<RequestData> datas = monitor.getDAO().getRequests(q);
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);
Query q = (Query) resource.handleObjectGet();;
List<RequestData> datas = monitor.getDAO().getRequests(q);
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);
}
@Test
public void testToQueryString() throws Exception {
Date from = toDate("2010-07-23T15:56:44");
Date to = toDate("2010-07-23T16:16:44");
Query q = new Query().between(from, to);
q.filter("service", "WFS", Comparison.EQ).and("status", "RUNNING", Comparison.EQ)
.and("path", Arrays.asList("/foo", "/bar"), Comparison.IN);
String qs = RequestResource.toQueryString(q);
assertEquals('?', qs.charAt(0));
qs = qs.substring(1);
Map<String,String> kvp = new HashMap();
for (String s : qs.split("&")) {
kvp.put(s.split("=")[0], s.split("=")[1]);
}
assertEquals(from, RequestResource.DATE_FORMAT.parse(kvp.get("from")));
assertEquals(to, RequestResource.DATE_FORMAT.parse(kvp.get("to")));
assertEquals("service:EQ:WFS;status:EQ:RUNNING;path:IN:/foo,/bar", kvp.get("filter"));
}
}