diff --git a/src/test/java/com/alibaba/druid/bvt/stat/DruidStatServiceTest.java b/src/test/java/com/alibaba/druid/bvt/stat/DruidStatServiceTest.java index 4676c94152..49e1368049 100644 --- a/src/test/java/com/alibaba/druid/bvt/stat/DruidStatServiceTest.java +++ b/src/test/java/com/alibaba/druid/bvt/stat/DruidStatServiceTest.java @@ -15,6 +15,12 @@ */ package com.alibaba.druid.bvt.stat; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertThat; + import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -24,8 +30,19 @@ import java.util.Map; import junit.framework.Assert; import junit.framework.TestCase; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.mock.web.MockFilterChain; +import org.springframework.mock.web.MockFilterConfig; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.mock.web.MockServletContext; + import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.stat.DruidStatService; +import com.alibaba.druid.stat.spring.UserService; +import com.alibaba.druid.support.http.WebStatFilter; import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.druid.util.JdbcUtils; @@ -47,7 +64,6 @@ public class DruidStatServiceTest extends TestCase { JdbcUtils.close(dataSource); } - @SuppressWarnings("unchecked") public void test_statService_getSqlList() throws Exception { String sql = "select 1"; Connection conn = dataSource.getConnection(); @@ -73,34 +89,39 @@ public class DruidStatServiceTest extends TestCase { Assert.assertEquals(1, sqlStat.get("ExecuteCount")); Assert.assertEquals(1, sqlStat.get("FetchRowCount")); Assert.assertEquals(0, sqlStat.get("EffectedRowCount")); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); } - - @SuppressWarnings("unchecked") + public void test_statService_getSqlById() throws Exception { String sql = "select 1"; Connection conn = dataSource.getConnection(); - + PreparedStatement stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); rs.next(); rs.close(); stmt.close(); - + conn.close(); - - String result = DruidStatService.getInstance().service("/sql-" + dataSource.getSqlStatMap().values().iterator().next().getId() + ".json"); + + String result = DruidStatService.getInstance().service("/sql-" + + dataSource.getSqlStatMap().values().iterator().next().getId() + + ".json"); Map resultMap = (Map) JSONUtils.parse(result); - + Map sqlStat = (Map) resultMap.get("Content"); - + Assert.assertEquals(0, sqlStat.get("RunningCount")); Assert.assertEquals(1, sqlStat.get("ExecuteCount")); Assert.assertEquals(1, sqlStat.get("FetchRowCount")); Assert.assertEquals(0, sqlStat.get("EffectedRowCount")); - + String result2 = DruidStatService.getInstance().service("/sql-" + Integer.MAX_VALUE + ".json"); resultMap = (Map) JSONUtils.parse(result2); Assert.assertNull(resultMap.get("Content")); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); } public void test_statService_getDataSourceList() throws Exception { @@ -126,5 +147,399 @@ public class DruidStatServiceTest extends TestCase { Assert.assertEquals(1, dataSourceStat.get("PoolingCount")); Assert.assertEquals(0, dataSourceStat.get("ActiveCount")); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getDataSourceIdList() throws Exception { + String sql = "select 1"; + Connection conn = dataSource.getConnection(); + + PreparedStatement stmt = conn.prepareStatement(sql); + ResultSet rs = stmt.executeQuery(); + rs.next(); + rs.close(); + stmt.close(); + conn.close(); + + String result = DruidStatService.getInstance().service("/datasource.json"); + Map resultMap = (Map) JSONUtils.parse(result); + List> dataSourceList = (List>) resultMap.get("Content"); + Map dataSourceStat = dataSourceList.get(0); + assertThat(dataSourceStat, is(not(nullValue()))); + int id = (Integer) dataSourceStat.get("Identity"); + + String resultId = DruidStatService.getInstance().service("/datasource-" + id + ".json"); + Map resultIdMap = (Map) JSONUtils.parse(resultId); + Map dataSourceIdStat = (Map) resultIdMap.get("Content"); + assertThat((Integer) dataSourceIdStat.get("PoolingCount"), equalTo(1)); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + /** + * Test basic.json request + * + * @throws Exception + */ + public void test_statService_getBasic() throws Exception { + String result = DruidStatService.getInstance().service("/basic.json"); + Map resultMap = (Map) JSONUtils.parse(result); + Map contentMap = (Map) resultMap.get("Content"); + + assertThat(contentMap.get("Version"), is(not(nullValue()))); + assertThat(contentMap.get("Drivers"), is(not(nullValue()))); + assertThat((Boolean) contentMap.get("ResetEnable"), is(true)); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getActiveConnectionStackTrace() throws Exception { + String sql = "select 1"; + dataSource.setRemoveAbandoned(true);// initiative close connection. + dataSource.setRemoveAbandonedTimeout(Integer.MAX_VALUE); + Connection conn = dataSource.getConnection(); + + PreparedStatement stmt = conn.prepareStatement(sql); + ResultSet rs = stmt.executeQuery(); + rs.next(); + rs.close(); + + String result = DruidStatService.getInstance().service("/activeConnectionStackTrace.json"); + Map resultMap = (Map) JSONUtils.parse(result); + List contentList = (List) resultMap.get("Content"); + + assertThat(contentList.get(0), is(not(nullValue()))); + // close connection at last. + stmt.close(); + conn.close(); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getActiveConnectionStackTraceId() throws Exception { + String sql = "select 1"; + dataSource.setRemoveAbandoned(true); + dataSource.setRemoveAbandonedTimeout(Integer.MAX_VALUE); + Connection conn = dataSource.getConnection(); + + PreparedStatement stmt = conn.prepareStatement(sql); + ResultSet rs = stmt.executeQuery(); + rs.next(); + rs.close(); + // get data source. + String dsResult = DruidStatService.getInstance().service("/datasource.json"); + Map dsResultMap = (Map) JSONUtils.parse(dsResult); + List> dataSourceList = (List>) dsResultMap.get("Content"); + Map dataSourceStat = dataSourceList.get(0); + assertThat(dataSourceStat, is(not(nullValue()))); + // get data source id. + int id = (Integer) dataSourceStat.get("Identity"); + + String result = DruidStatService.getInstance().service("/activeConnectionStackTrace-" + id + ".json"); + Map resultMap = (Map) JSONUtils.parse(result); + List contentList = (List) resultMap.get("Content"); + + assertThat(contentList.get(0), is(not(nullValue()))); + stmt.close(); + conn.close(); + + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_returnJSONActiveConnectionStackTrace() throws Exception{ + String result = DruidStatService.getInstance().service("/activeConnectionStackTrace-1.json"); + Map resultMap = (Map) JSONUtils.parse(result); + assertThat((Integer)resultMap.get("ResultCode"), equalTo(-1)); + + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getWebURIList() throws Exception { + String uri = "/"; + MockServletContext servletContext = new MockServletContext(); + MockFilterConfig filterConfig = new MockFilterConfig(servletContext); + WebStatFilter filter = new WebStatFilter(); + filter.init(filterConfig); + // first request test + MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain chain = new MockFilterChain(); + filter.doFilter(request, response, chain); + + String result = DruidStatService.getInstance().service("/weburi.json"); + Map resultMap = (Map) JSONUtils.parse(result); + List> webURIList = (List>) resultMap.get("Content"); + assertThat(webURIList.size(), equalTo(1)); + Map webURI = webURIList.get(0); + assertThat((String) webURI.get("URI"), equalTo(uri)); + assertThat((Integer) webURI.get("RequestCount"), equalTo(1)); + + // second request test + MockHttpServletRequest request2 = new MockHttpServletRequest("GET", uri); + MockHttpServletResponse response2 = new MockHttpServletResponse(); + MockFilterChain chain2 = new MockFilterChain(); + filter.doFilter(request2, response2, chain2); + + result = DruidStatService.getInstance().service("/weburi.json"); + resultMap = (Map) JSONUtils.parse(result); + webURIList = (List>) resultMap.get("Content"); + assertThat(webURIList.size(), equalTo(1)); + webURI = webURIList.get(0); + assertThat((String) webURI.get("URI"), equalTo(uri)); + assertThat((Integer) webURI.get("RequestCount"), equalTo(2)); + filter.destroy(); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getWebURIById() throws Exception { + String uri = "/"; + MockServletContext servletContext = new MockServletContext(); + MockFilterConfig filterConfig = new MockFilterConfig(servletContext); + WebStatFilter filter = new WebStatFilter(); + filter.init(filterConfig); + // first request test + MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain chain = new MockFilterChain(); + filter.doFilter(request, response, chain); + + String result = DruidStatService.getInstance().service("/weburi-" + uri + ".json"); + Map resultMap = (Map) JSONUtils.parse(result); + Map contentMap = (Map) resultMap.get("Content"); + assertThat((Integer) contentMap.get("RequestCount"), equalTo(1)); + // second request test + MockHttpServletRequest request2 = new MockHttpServletRequest("GET", uri); + MockHttpServletResponse response2 = new MockHttpServletResponse(); + MockFilterChain chain2 = new MockFilterChain(); + filter.doFilter(request2, response2, chain2); + + result = DruidStatService.getInstance().service("/weburi-" + uri + ".json"); + resultMap = (Map) JSONUtils.parse(result); + contentMap = (Map) resultMap.get("Content"); + assertThat((Integer) contentMap.get("RequestCount"), equalTo(2)); + filter.destroy(); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getWebApp() throws Exception { + String uri = "/"; + MockServletContext servletContext = new MockServletContext(); + MockFilterConfig filterConfig = new MockFilterConfig(servletContext); + WebStatFilter filter = new WebStatFilter(); + filter.init(filterConfig); + // first request test + MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain chain = new MockFilterChain(); + filter.doFilter(request, response, chain); + + String result = DruidStatService.getInstance().service("/webapp.json"); + Map resultMap = (Map) JSONUtils.parse(result); + List> contentList = (List>) resultMap.get("Content"); + assertThat(contentList.size(), equalTo(1)); + Map contentMap = contentList.get(0); + assertThat((Integer) contentMap.get("RequestCount"), equalTo(1)); + // second request test + MockHttpServletRequest request2 = new MockHttpServletRequest("GET", uri); + MockHttpServletResponse response2 = new MockHttpServletResponse(); + MockFilterChain chain2 = new MockFilterChain(); + filter.doFilter(request2, response2, chain2); + + result = DruidStatService.getInstance().service("/webapp.json"); + resultMap = (Map) JSONUtils.parse(result); + contentList = (List>) resultMap.get("Content"); + assertThat(contentList.size(), equalTo(1)); + contentMap = contentList.get(0); + assertThat((Integer) contentMap.get("RequestCount"), equalTo(2)); + filter.destroy(); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getWebSession() throws Exception { + String uri = "/"; + MockServletContext servletContext = new MockServletContext(); + MockFilterConfig filterConfig = new MockFilterConfig(servletContext); + + WebStatFilter filter = new WebStatFilter(); + filter.init(filterConfig); + // first request test + MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); + MockHttpSession session = new MockHttpSession(); + request.setSession(session); + String sessionId = session.getId(); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain chain = new MockFilterChain(); + filter.doFilter(request, response, chain); + + String result = DruidStatService.getInstance().service("/websession.json"); + Map resultMap = (Map) JSONUtils.parse(result); + List> contentList = (List>) resultMap.get("Content"); + assertThat(contentList.size(), equalTo(1)); + Map contentMap = contentList.get(0); + assertThat((String) contentMap.get("SESSIONID"), equalTo(sessionId)); + // second request test + MockHttpServletRequest request2 = new MockHttpServletRequest("GET", uri); + MockHttpSession session2 = new MockHttpSession(); + request2.setSession(session2); + String sessionId2 = session2.getId(); + MockHttpServletResponse response2 = new MockHttpServletResponse(); + MockFilterChain chain2 = new MockFilterChain(); + filter.doFilter(request2, response2, chain2); + + result = DruidStatService.getInstance().service("/websession.json"); + resultMap = (Map) JSONUtils.parse(result); + contentList = (List>) resultMap.get("Content"); + assertThat(contentList.size(), equalTo(2)); + contentMap = contentList.get(1); + assertThat((String) contentMap.get("SESSIONID"), equalTo(sessionId2)); + filter.destroy(); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getSpring() throws Exception { + ApplicationContext context = new ClassPathXmlApplicationContext( + "classpath:com/alibaba/druid/stat/spring-config-stat.xml"); + UserService userService = (UserService) context.getBean("userService"); + userService.save(); + String result = DruidStatService.getInstance().service("/spring.json"); + Map resultMap = (Map) JSONUtils.parse(result); + List> contentList = (List>) resultMap.get("Content"); + assertThat(contentList.size(), equalTo(1)); + Map contentMap = contentList.get(0); + assertThat((String) contentMap.get("Class"), is(not(nullValue()))); + assertThat((Integer) contentMap.get("ExecuteCount"), equalTo(1)); + // second test + userService.save(); + result = DruidStatService.getInstance().service("/spring.json"); + resultMap = (Map) JSONUtils.parse(result); + contentList = (List>) resultMap.get("Content"); + assertThat(contentList.size(), equalTo(1)); + contentMap = contentList.get(0); + assertThat((String) contentMap.get("Class"), is(not(nullValue()))); + assertThat((Integer) contentMap.get("ExecuteCount"), equalTo(2)); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getSpringDetail() throws Exception { + ApplicationContext context = new ClassPathXmlApplicationContext( + "classpath:com/alibaba/druid/stat/spring-config-stat.xml"); + UserService userService = (UserService) context.getBean("userService"); + userService.save(); + String result = DruidStatService.getInstance().service("/spring-detail.json?class=com.alibaba.druid.stat.spring.UserService&method=save()"); + Map resultMap = (Map) JSONUtils.parse(result); + Map contentMap = (Map) resultMap.get("Content"); + assertThat((Integer) contentMap.get("ExecuteCount"), equalTo(1)); + // second test + userService.save(); + result = DruidStatService.getInstance().service("/spring-detail.json?class=com.alibaba.druid.stat.spring.UserService&method=save()"); + resultMap = (Map) JSONUtils.parse(result); + contentMap = (Map) resultMap.get("Content"); + assertThat((Integer) contentMap.get("ExecuteCount"), equalTo(2)); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService_getResetAll() throws Exception { + + // data source mock + String sql = "select 1"; + Connection conn = dataSource.getConnection(); + + PreparedStatement stmt = conn.prepareStatement(sql); + ResultSet rs = stmt.executeQuery(); + rs.next(); + rs.close(); + stmt.close(); + conn.close(); + + String resultSQL = DruidStatService.getInstance().service("/sql.json"); + Map resultSQLMap = (Map) JSONUtils.parse(resultSQL); + List> sqlList = (List>) resultSQLMap.get("Content"); + assertThat(sqlList.size(), equalTo(1)); + Map sqlStat = sqlList.get(0); + assertThat((Integer) sqlStat.get("RunningCount"), equalTo(0)); + // http request mock + String uri = "/"; + MockServletContext servletContext = new MockServletContext(); + MockFilterConfig filterConfig = new MockFilterConfig(servletContext); + + WebStatFilter filter = new WebStatFilter(); + filter.init(filterConfig); + // first request test + MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); + MockHttpSession session = new MockHttpSession(); + request.setSession(session); + String sessionId = session.getId(); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain chain = new MockFilterChain(); + filter.doFilter(request, response, chain); + + String resultWebSession = DruidStatService.getInstance().service("/websession.json"); + Map resultWebSessionMap = (Map) JSONUtils.parse(resultWebSession); + List> contentWebSessionList = (List>) resultWebSessionMap.get("Content"); + assertThat(contentWebSessionList.size(), equalTo(1)); + Map contentWebSessionMap = contentWebSessionList.get(0); + assertThat((String) contentWebSessionMap.get("SESSIONID"), equalTo(sessionId)); + + // spring mock + ApplicationContext context = new ClassPathXmlApplicationContext( + "classpath:com/alibaba/druid/stat/spring-config-stat.xml"); + UserService userService = (UserService) context.getBean("userService"); + userService.save(); + String resultSpring = DruidStatService.getInstance().service("/spring.json"); + Map resultSpringMap = (Map) JSONUtils.parse(resultSpring); + List> contentSpringList = (List>) resultSpringMap.get("Content"); + assertThat(contentSpringList.size(), equalTo(1)); + Map contentMap = contentSpringList.get(0); + assertThat((String) contentMap.get("Class"), is(not(nullValue()))); + assertThat((Integer) contentMap.get("ExecuteCount"), equalTo(1)); + // reset all test + String result = DruidStatService.getInstance().service("/reset-all.json"); + Map resultMap = (Map) JSONUtils.parse(result); + assertThat(resultMap.get("content"), is(nullValue())); + // assert sql + resultSQL = DruidStatService.getInstance().service("/sql.json"); + resultSQLMap = (Map) JSONUtils.parse(resultSQL); + sqlList = (List>) resultSQLMap.get("Content"); + assertThat(sqlList, is(nullValue())); + // assert web session + resultWebSession = DruidStatService.getInstance().service("/websession.json"); + resultWebSessionMap = (Map) JSONUtils.parse(resultWebSession); + contentWebSessionList = (List>) resultWebSessionMap.get("Content"); + assertThat(contentWebSessionList, is(nullValue())); + // assert spring + resultSpring = DruidStatService.getInstance().service("/spring.json"); + resultSpringMap = (Map) JSONUtils.parse(resultSpring); + contentSpringList = (List>) resultSpringMap.get("Content"); + assertThat(contentSpringList, is(nullValue())); + // DruidStatService is singleton, reset all for other testcase. + DruidStatService.getInstance().service("/reset-all.json"); + } + + public void test_statService() throws Exception { + String result = DruidStatService.getInstance().service("/bad.json"); + Map resultMap = (Map) JSONUtils.parse(result); + assertThat((Integer)resultMap.get("ResultCode"), equalTo(-1)); + } + + public void test_statService_getParameters() throws Exception { + String url = "?x=a&y=b"; + Map parameters = DruidStatService.getParameters(url); + assertThat(parameters.get("x"), equalTo("a")); + assertThat(parameters.get("y"), equalTo("b")); + url = null; + parameters = DruidStatService.getParameters(url); + assertThat(parameters.isEmpty(), is(true)); + url = "/%E4%B8%AD%E6%96%87"; + parameters = DruidStatService.getParameters(url); + assertThat(parameters.isEmpty(), is(true)); } } diff --git a/src/test/java/com/alibaba/druid/stat/spring/UserService.java b/src/test/java/com/alibaba/druid/stat/spring/UserService.java new file mode 100644 index 0000000000..f1a21f1486 --- /dev/null +++ b/src/test/java/com/alibaba/druid/stat/spring/UserService.java @@ -0,0 +1,6 @@ +package com.alibaba.druid.stat.spring; + +public interface UserService { + + public void save(); +} diff --git a/src/test/java/com/alibaba/druid/stat/spring/UserServiceImpl.java b/src/test/java/com/alibaba/druid/stat/spring/UserServiceImpl.java new file mode 100644 index 0000000000..361c9f40b0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/stat/spring/UserServiceImpl.java @@ -0,0 +1,12 @@ +package com.alibaba.druid.stat.spring; + +import org.springframework.stereotype.Component; + +@Component("userService") +public class UserServiceImpl implements UserService { + + @Override + public void save() { + // do nothing + } +} diff --git a/src/test/resources/com/alibaba/druid/stat/spring-config-stat.xml b/src/test/resources/com/alibaba/druid/stat/spring-config-stat.xml new file mode 100644 index 0000000000..952f7f6d89 --- /dev/null +++ b/src/test/resources/com/alibaba/druid/stat/spring-config-stat.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + druid-stat-interceptor + + + + +