package com.taobao.tddl.qatest; import java.lang.reflect.Field; import java.sql.ResultSet; import java.text.MessageFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import com.taobao.diamond.mockserver.MockServer; import com.taobao.tddl.atom.TAtomDataSource; import com.taobao.tddl.atom.common.TAtomConstants; import com.taobao.tddl.atom.config.TAtomConfParser; import com.taobao.tddl.atom.config.TAtomDsConfDO; import com.taobao.tddl.config.ConfigServerHelper; import com.taobao.tddl.group.jdbc.TGroupDataSource; import com.taobao.tddl.qatest.util.DateUtil; import com.taobao.tddl.qatest.util.FixDataSource; import com.taobao.tddl.qatest.util.LoadPropsUtil; @Ignore(value = "提供初始化环境的实际方法") public class BaseAtomGroupTestCase extends BaseTestCase { protected static final String QATEST_DATASOURCE_PATH = "classpath:atom/tddl_qatest_db.xml"; protected static FixDataSource fixDataSource; static { if (fixDataSource == null) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { QATEST_DATASOURCE_PATH }); fixDataSource = (FixDataSource) context.getBean("fixDataSource"); } } public static final int INTERVAL_TIME = 2; public static final int SLEEP_TIME = INTERVAL_TIME * 3; public static final String PASSWD_PATH_FULL = "atom/passwd.properties"; public static final String GLOBAL_PATH_SUFFIX = "/global.properties"; public static final String APP_PATH_SUFFIX = "/app.properties"; public static Map<String, String> dataMap = null; // --------------------mysql orcle共用 public static final String APPNAME = "tddl_qatest"; public static final String APPNAME_UTE = "UTE"; public static final String TDDL_DBGROUPS = "tddl_dbgroups"; public static final String PROPERTIES_FILE = ".properties"; // ---------------------mysql public static final String ATOM_PATH = "atom/"; public static final String GROUP_PATH = "group/"; public static final String MATRIX_PATH = "matrix/"; public static final String ATOM_NORMAL_0_PATH = "atom/qatest_normal_0"; public static final String ATOM_NORMAL_1_PATH = "atom/qatest_normal_1"; public static final String ATOM_NORMAL_2_PATH = "atom/qatest_normal_2"; public static final String ATOM_NORMAL_0_BAC_PATH = "atom/qatest_normal_0_bac"; public static final String ATOM_NORMAL_1_BAC_PATH = "atom/qatest_normal_1_bac"; public static final String ATOM_NORMAL_2_BAC_PATH = "atom/qatest_normal_2_bac"; public static final String GROUP_NORMAL_0_PATH = "group/tddl_group_0.properties"; public static final String GROUP_NORMAL_1_PATH = "group/tddl_group_1.properties"; public static final String GROUP_NORMAL_2_PATH = "group/tddl_group_2.properties"; public static final String GROUP_NORMAL_COMPLEX_PATH = "group/tddl_group_complex.properties"; public static final String MATRIX_DBGROUPS_PATH = "matrix/tddl_dbgroups.properties"; public static final String MATRIX_SQLEXECUTOR_PATH = "matrix/rules/tddl_sqlexecutor.properties"; public static final String MATRIX_RULE_PROPS_PATH = "matrix/rules/tddl_rule.properties"; public static final String MATRIX_RULE_XML_PATH = "classpath:matrix/rules/tddl_rule.xml"; public static final String MATRIX_IBATIS_CONTEXT_PATH = "classpath:matrix/ibatis/spring_context.xml"; public static final String MATRIX_IBATIS_RULE_PATH = "classpath:matrix/ibatis/tddl_rule_complex.xml"; public static final String MATRIX_RULE_FULLTBLSCAN_PATH = "matrix/rules/tddl_rule_fulltblscan.properties"; public static final String DBKEY_0 = "qatest_normal_0"; public static final String DBKEY_1 = "qatest_normal_1"; public static final String DBKEY_2 = "qatest_normal_2"; public static final String DBKEY_0_BAC = "qatest_normal_0_bac"; public static final String DBKEY_1_BAC = "qatest_normal_1_bac"; public static final String DBKEY_2_BAC = "qatest_normal_2_bac"; public static final String GROUPKEY_0 = "tddl_group_0"; public static final String GROUPKEY_1 = "tddl_group_1"; public static final String GROUPKEY_2 = "tddl_group_2"; public static final String GROUPKEY_COMPLEX = "tddl_group_complex"; public static final String DBTYPE_MYSQL = "mysql"; // ----------------------------oracle protected static final String DBTYPE_ORACLE = "oracle"; protected static final String DBKEY_ORA_0 = "qatest_normal_ora_0"; protected static final String DBKEY_ORA_1 = "qatest_normal_ora_1"; protected static final String DBKEY_ORA_0_BAC = "qatest_normal_ora_0_bac"; protected static final String DBKEY_ORA_1_BAC = "qatest_normal_ora_1_bac"; protected static final String GROUPKEY_ORA_0 = "tddl_group_ora_0"; protected static final String GROUPKEY_ORA_1 = "tddl_group_ora_1"; protected static final String ATOM_ORA_PATH = "atom/oracle/"; protected static final String GROUP_ORA_PATH = "group/oracle/"; protected static final String MATRIX_DBGROUPS_ORA_PATH = "matrix/groups/tddl_dbgroups_ora.properties"; protected static final String MATRIX_RULE_ORA_XML_PATH = "classpath:matrix/rules/tddl_rule_ora.xml"; protected static final String MATRIX_RULE_ORA_FULLTBLSCAN_PATH = "matrix/rules/tddl_rule_fulltblscan_ora.properties"; // -----------------------------公共变量 protected static final int RANDOM_ID = Integer.valueOf(RandomStringUtils.randomNumeric(8)); protected static String time = DateUtil.formatDate(new Date(), DateUtil.DATE_FULLHYPHEN); protected static String nextDay = DateUtil.getDiffDate(1, DateUtil.DATE_FULLHYPHEN); protected static int resultSetType = ResultSet.TYPE_FORWARD_ONLY; ; protected static int resultSetConcurrency = ResultSet.CONCUR_READ_ONLY; protected static int holdablity = -1; protected static boolean SOME_SHOULD_NOT_BE_TEST = true; protected static boolean ASTATICISM_TEST = true; // 新规则 protected static final String NEW_NUMBER_MOD_RULES_PATH = "classpath:matrix/rules/newrules/number_mod_rules.xml"; protected static final String NEW_DATE_MOD_RULES_PATH = "classpath:matrix/rules/newrules/date_mod_rule.xml"; protected static final String NEW_GROOVY_SCRIPT_RULES_PATH = "classpath:matrix/rules/newrules/groovy_script_rule.xml"; @BeforeClass public static void atomSetUp() { TAtomDataSource.cleanAllDataSource(); } @AfterClass public static void atomTearDown() { TAtomDataSource.cleanAllDataSource(); } protected static void initAtomConfig(String path, String appName, String dbKey) throws Exception { String globaStr = LoadPropsUtil.loadProps2Str(path + GLOBAL_PATH_SUFFIX); dataMap.put(TAtomConstants.getGlobalDataId(dbKey), globaStr); String appStr = LoadPropsUtil.loadProps2Str(path + APP_PATH_SUFFIX); dataMap.put(TAtomConstants.getAppDataId(appName, dbKey), appStr); TAtomDsConfDO tAtomDsConfDO = TAtomConfParser.parserTAtomDsConfDO(globaStr, appStr); String passwdStr = LoadPropsUtil.loadProps2Str(PASSWD_PATH_FULL); dataMap.put(TAtomConstants.getPasswdDataId(tAtomDsConfDO.getDbName(), tAtomDsConfDO.getDbType(), tAtomDsConfDO.getUserName()), passwdStr); } protected static void setMatrixMockInfo(String groupsPath, String key) throws Exception { setMatrixMockInfo(groupsPath, key, false); } protected static void setMatrixMockInfo(String groupsPath, String key, boolean isOracle) throws Exception { // -----------------获取groups信息 String groupsStr = LoadPropsUtil.loadProps2OneLine(groupsPath, key); if (groupsStr == null || StringUtils.isBlank(groupsStr)) { throw new Exception("指定path = " + groupsPath + ",key = " + key + "的groups信息为null或者为空字符。"); } // -----------------oracle or mysql String groupPath = BaseAtomGroupTestCase.GROUP_PATH; String atomPath = BaseAtomGroupTestCase.ATOM_PATH; if (isOracle) { groupPath = BaseAtomGroupTestCase.GROUP_ORA_PATH; atomPath = BaseAtomGroupTestCase.ATOM_ORA_PATH; } // -----------------获取group信息 BaseAtomGroupTestCase.dataMap = new HashMap<String, String>(); String[] groupArr = groupsStr.split(","); for (String group : groupArr) { group = group.trim(); String groupStr = ""; groupStr = LoadPropsUtil.loadProps2OneLine(groupPath + group + BaseAtomGroupTestCase.PROPERTIES_FILE, group); if (groupsStr != null && StringUtils.isNotBlank(groupsStr)) { // 获取atom信息 String[] atomArr = groupStr.split(","); for (String atom : atomArr) { atom = atom.trim(); atom = atom.substring(0, atom.indexOf(":")); BaseAtomGroupTestCase.initAtomConfig(atomPath + atom, BaseAtomGroupTestCase.APPNAME, atom); } // 获取groupkey BaseAtomGroupTestCase.dataMap.put(TGroupDataSource.getFullDbGroupKey(group), groupStr); } } // -----------------dbgroups BaseAtomGroupTestCase.dataMap.put(new MessageFormat(ConfigServerHelper.DATA_ID_DB_GROUP_KEYS).format(new Object[] { BaseAtomGroupTestCase.APPNAME }), groupsStr); // 建立MockServer MockServer.setConfigInfos(BaseAtomGroupTestCase.dataMap); } protected static void clearData(JdbcTemplate tddlJTX, String sql, Object[] args) { if (args == null) { args = new Object[] {}; } // 确保数据清除成功 try { tddlJTX.update(sql, args); } catch (Exception e) { tddlJTX.update(sql, args); } } protected static void prepareData(JdbcTemplate tddlJTX, String sql, Object[] args) { if (args == null) { args = new Object[] {}; } // 确保数据准备成功 try { int rs = tddlJTX.update(sql, args); if (rs <= 0) { tddlJTX.update(sql, args); } } catch (Exception e) { int rs = tddlJTX.update(sql, args); if (rs <= 0) { tddlJTX.update(sql, args); } } } protected String buildupParamMarks(Object[] objArr) { StringBuilder marks = new StringBuilder(); String comma = ""; for (int i = 0; i < objArr.length; i++) { marks.append(comma).append("?"); comma = ","; } return marks.toString(); } protected String buildupParams(Object[] objArr) { StringBuilder params = new StringBuilder(); String comma = ""; for (Object id : objArr) { params.append(comma).append(id); comma = ","; } return params.toString(); } /** * 取平均值 */ protected Double getAvg(Object[] objArr) { Double sum = new Double(0); for (Object id : objArr) { sum = sum + new Double(id.toString()); } return sum * 1.0 / objArr.length; } /** * 取得总和值 */ protected Double getSum(Object[] objArr) { Double sum = new Double(0); for (Object id : objArr) { sum = sum + new Double(id.toString()); } return sum; } /** * 取得总和值 */ protected int[] getSumWithOddOrEven(Integer[] idArr) { int[] result = new int[2]; int oddSum = 0; int evenSum = 0; for (int id : idArr) { if (id / 4 % 2 == 0) { evenSum = evenSum + id; } else { oddSum = oddSum + id; } } result[0] = oddSum < evenSum ? oddSum : evenSum; result[1] = oddSum > evenSum ? oddSum : evenSum; return result; } protected Object getValue(Object target, String fieldName) { Class<? extends Object> targetClass = target.getClass(); try { Field field = targetClass.getDeclaredField(fieldName); field.setAccessible(true); return field.get(target); } catch (Exception e) { try { targetClass = targetClass.getSuperclass(); Field field = targetClass.getDeclaredField(fieldName); field.setAccessible(true); return field.get(target); } catch (Exception e1) { e.printStackTrace(); } } return null; } }