add test case for DruidStatService

This commit is contained in:
Zhanming Qi
2012-09-01 10:41:13 +08:00
parent 70d07acbd8
commit 42e24680d2
4 changed files with 472 additions and 10 deletions
@@ -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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
Map<String, Object> sqlStat = (Map<String, Object>) 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<String, Object>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
List<Map<String, Object>> dataSourceList = (List<Map<String, Object>>) resultMap.get("Content");
Map<String, Object> dataSourceStat = dataSourceList.get(0);
assertThat(dataSourceStat, is(not(nullValue())));
int id = (Integer) dataSourceStat.get("Identity");
String resultId = DruidStatService.getInstance().service("/datasource-" + id + ".json");
Map<String, Object> resultIdMap = (Map<String, Object>) JSONUtils.parse(resultId);
Map<String, Object> dataSourceIdStat = (Map<String, Object>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
Map<String, Object> contentMap = (Map<String, Object>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
List<String> contentList = (List<String>) 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<String, Object> dsResultMap = (Map<String, Object>) JSONUtils.parse(dsResult);
List<Map<String, Object>> dataSourceList = (List<Map<String, Object>>) dsResultMap.get("Content");
Map<String, Object> 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
List<String> contentList = (List<String>) 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<String, Object> resultMap = (Map<String, Object>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
List<Map<String, Object>> webURIList = (List<Map<String, Object>>) resultMap.get("Content");
assertThat(webURIList.size(), equalTo(1));
Map<String, Object> 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<String, Object>) JSONUtils.parse(result);
webURIList = (List<Map<String, Object>>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
Map<String, Object> contentMap = (Map<String, Object>) 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<String, Object>) JSONUtils.parse(result);
contentMap = (Map<String, Object>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
List<Map<String, Object>> contentList = (List<Map<String, Object>>) resultMap.get("Content");
assertThat(contentList.size(), equalTo(1));
Map<String, Object> 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<String, Object>) JSONUtils.parse(result);
contentList = (List<Map<String, Object>>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
List<Map<String, Object>> contentList = (List<Map<String, Object>>) resultMap.get("Content");
assertThat(contentList.size(), equalTo(1));
Map<String, Object> 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<String, Object>) JSONUtils.parse(result);
contentList = (List<Map<String, Object>>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
List<Map<String, Object>> contentList = (List<Map<String, Object>>) resultMap.get("Content");
assertThat(contentList.size(), equalTo(1));
Map<String, Object> 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<String, Object>) JSONUtils.parse(result);
contentList = (List<Map<String, Object>>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
Map<String, Object> contentMap = (Map<String, Object>) 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<String, Object>) JSONUtils.parse(result);
contentMap = (Map<String, Object>) 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<String, Object> resultSQLMap = (Map<String, Object>) JSONUtils.parse(resultSQL);
List<Map<String, Object>> sqlList = (List<Map<String, Object>>) resultSQLMap.get("Content");
assertThat(sqlList.size(), equalTo(1));
Map<String, Object> 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<String, Object> resultWebSessionMap = (Map<String, Object>) JSONUtils.parse(resultWebSession);
List<Map<String, Object>> contentWebSessionList = (List<Map<String, Object>>) resultWebSessionMap.get("Content");
assertThat(contentWebSessionList.size(), equalTo(1));
Map<String, Object> 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<String, Object> resultSpringMap = (Map<String, Object>) JSONUtils.parse(resultSpring);
List<Map<String, Object>> contentSpringList = (List<Map<String, Object>>) resultSpringMap.get("Content");
assertThat(contentSpringList.size(), equalTo(1));
Map<String, Object> 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
assertThat(resultMap.get("content"), is(nullValue()));
// assert sql
resultSQL = DruidStatService.getInstance().service("/sql.json");
resultSQLMap = (Map<String, Object>) JSONUtils.parse(resultSQL);
sqlList = (List<Map<String, Object>>) resultSQLMap.get("Content");
assertThat(sqlList, is(nullValue()));
// assert web session
resultWebSession = DruidStatService.getInstance().service("/websession.json");
resultWebSessionMap = (Map<String, Object>) JSONUtils.parse(resultWebSession);
contentWebSessionList = (List<Map<String, Object>>) resultWebSessionMap.get("Content");
assertThat(contentWebSessionList, is(nullValue()));
// assert spring
resultSpring = DruidStatService.getInstance().service("/spring.json");
resultSpringMap = (Map<String, Object>) JSONUtils.parse(resultSpring);
contentSpringList = (List<Map<String, Object>>) 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<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
assertThat((Integer)resultMap.get("ResultCode"), equalTo(-1));
}
public void test_statService_getParameters() throws Exception {
String url = "?x=a&y=b";
Map<String, String> 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));
}
}
@@ -0,0 +1,6 @@
package com.alibaba.druid.stat.spring;
public interface UserService {
public void save();
}
@@ -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
}
}
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
default-lazy-init="false">
<bean id="userService" class="com.alibaba.druid.stat.spring.UserServiceImpl"></bean>
<bean id="druid-stat-interceptor"
class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
</bean>
<bean id="druid-type-proxyCreator"
class="com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator">
<!-- 所有ABCInterface的派生类被拦截监控 -->
<property name="targetBeanType" value="com.alibaba.druid.stat.spring.UserService" />
<property name="interceptorNames">
<list>
<value>druid-stat-interceptor</value>
</list>
</property>
</bean>
</beans>