/*
* Copyright 1999-2017 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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;
import java.util.List;
import java.util.Map;
import org.junit.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.http.stat.WebAppStatManager;
import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.druid.util.JdbcUtils;
public class DruidStatServiceTest extends TestCase {
private DruidDataSource dataSource;
@Override
protected void setUp() throws Exception {
DruidStatService.getInstance().setResetEnable(true);
// DruidStatService is singleton, reset all for other testcase.
DruidStatService.getInstance().service("/reset-all.json");
// clear web app.
WebAppStatManager.getInstance().getWebAppStatSet().clear();
dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setFilters("mergeStat");
dataSource.setTestOnBorrow(false);
dataSource.init();
}
protected void tearDown() throws Exception {
JdbcUtils.close(dataSource);
}
public void test_statService_getSqlList() 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.json");
Map<String, Object> resultMap = (Map<String, Object>) JSONUtils.parse(result);
List<Map<String, Object>> sqlList = (List<Map<String, Object>>) resultMap.get("Content");
Assert.assertEquals(1, sqlList.size());
Map<String, Object> sqlStat = sqlList.get(0);
Assert.assertEquals(0, sqlStat.get("RunningCount"));
Assert.assertEquals(1, sqlStat.get("ExecuteCount"));
Assert.assertEquals(1, sqlStat.get("FetchRowCount"));
Assert.assertEquals(0, sqlStat.get("EffectedRowCount"));
}
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");
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"));
}
public void test_statService_getDataSourceList() throws Exception {
{
DruidStatService.getInstance().service("/reset-all.json");
}
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");
Assert.assertEquals(1, dataSourceList.size());
Map<String, Object> dataSourceStat = dataSourceList.get(0);
Assert.assertEquals(1, dataSourceStat.get("PoolingCount"));
Assert.assertEquals(0, dataSourceStat.get("ActiveCount"));
}
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));
}
/**
* 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));
}
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");
Object first = contentList.get(0);
assertThat(first, is(not(nullValue())));
// close connection at last.
stmt.close();
conn.close();
}
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();
}
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));
}
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();
}
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();
}
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();
}
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();
}
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));
}
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));
}
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()));
}
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));
}
}