package org.stagemonitor.web.rum; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.stagemonitor.core.metrics.metrics2.MetricName.name; import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.stagemonitor.core.metrics.metrics2.Metric2Registry; import org.stagemonitor.web.WebPlugin; import org.stagemonitor.web.monitor.rum.RumServlet; public class RumServletTest { private final Metric2Registry registry = new Metric2Registry(); private WebPlugin webPlugin = mock(WebPlugin.class); private RumServlet rumServlet = new RumServlet(registry, webPlugin); @Before public void setUp() throws Exception { when(webPlugin.isRealUserMonitoringEnabled()).thenReturn(true); } @Test public void testBeaconPerRequest() throws Exception { when(webPlugin.isCollectPageLoadTimesPerRequest()).thenReturn(true); final MockHttpServletRequest req = new MockHttpServletRequest(); final String requestName = "GET /test.html"; req.addParameter("requestName", requestName); req.addParameter("serverTime", "100"); req.addParameter("domProcessing", "10"); req.addParameter("pageRendering", "30"); req.addParameter("timeToFirstByte", "160"); final MockHttpServletResponse resp = new MockHttpServletResponse(); rumServlet.doGet(req, resp); assertEquals(200, resp.getStatus()); assertEquals("image/png", resp.getContentType()); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Dom Processing").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Page Rendering").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Dom Processing").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Page Rendering").build())); assertEquals(TimeUnit.MILLISECONDS.toNanos(10), registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Dom Processing").build()).getSnapshot().getMax()); assertEquals(TimeUnit.MILLISECONDS.toNanos(30), registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Page Rendering").build()).getSnapshot().getMax()); assertEquals(TimeUnit.MILLISECONDS.toNanos(10), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Dom Processing").build()).getSnapshot().getMax()); assertEquals(TimeUnit.MILLISECONDS.toNanos(30), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Page Rendering").build()).getSnapshot().getMax()); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Network").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Network").build())); // t_resp-serverTime assertEquals(TimeUnit.MILLISECONDS.toNanos(60), registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Network").build()).getSnapshot().getMax()); assertEquals(TimeUnit.MILLISECONDS.toNanos(60), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Network").build()).getSnapshot().getMax()); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("All").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("All").build())); // t_page + t_resp assertEquals(TimeUnit.MILLISECONDS.toNanos(200), registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("All").build()).getSnapshot().getMax()); assertEquals(TimeUnit.MILLISECONDS.toNanos(200), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("All").build()).getSnapshot().getMax()); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Server").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Server").build())); assertEquals(TimeUnit.MILLISECONDS.toNanos(100), registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Server").build()).getSnapshot().getMax()); assertEquals(TimeUnit.MILLISECONDS.toNanos(100), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Server").build()).getSnapshot().getMax()); } @Test public void testBeaconAggregate() throws Exception { when(webPlugin.isCollectPageLoadTimesPerRequest()).thenReturn(false); final MockHttpServletRequest req = new MockHttpServletRequest(); final String requestName = "GET /test.html"; req.addParameter("requestName", requestName); req.addParameter("serverTime", "100"); req.addParameter("domProcessing", "10"); req.addParameter("pageRendering", "30"); req.addParameter("timeToFirstByte", "160"); final MockHttpServletResponse resp = new MockHttpServletResponse(); rumServlet.doGet(req, resp); assertEquals(200, resp.getStatus()); assertNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Dom Processing").build())); assertNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Page Rendering").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Dom Processing").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Page Rendering").build())); assertEquals(TimeUnit.MILLISECONDS.toNanos(10), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Dom Processing").build()).getSnapshot().getMax()); assertEquals(TimeUnit.MILLISECONDS.toNanos(30), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Page Rendering").build()).getSnapshot().getMax()); assertNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Network").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Network").build())); // t_resp-serverTime assertEquals(TimeUnit.MILLISECONDS.toNanos(60), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Network").build()).getSnapshot().getMax()); assertNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("All").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("All").build())); // t_page + t_resp assertEquals(TimeUnit.MILLISECONDS.toNanos(200), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("All").build()).getSnapshot().getMax()); assertNull(registry.getTimers().get(name("response_time_rum").tag("request_name", requestName).layer("Server").build())); assertNotNull(registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Server").build())); assertEquals(TimeUnit.MILLISECONDS.toNanos(100), registry.getTimers().get(name("response_time_rum").tag("request_name", "All").layer("Server").build()).getSnapshot().getMax()); } @Test(expected = IllegalArgumentException.class) public void testMissingParam() throws Exception { final MockHttpServletRequest req = new MockHttpServletRequest(); req.addParameter("requestName", "GET /test.html"); req.addParameter("serverTime", "100"); req.addParameter("domProcessing", "10"); req.addParameter("pageRendering", "30"); rumServlet.doGet(req, new MockHttpServletResponse()); } @Test public void testRumDisabled() throws Exception { when(webPlugin.isRealUserMonitoringEnabled()).thenReturn(false); final MockHttpServletRequest req = new MockHttpServletRequest(); final MockHttpServletResponse resp = new MockHttpServletResponse(); rumServlet.doGet(req, resp); assertEquals(404, resp.getStatus()); } }