package com.alibaba.cobar.client; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.fail; import java.util.ArrayList; import java.util.List; import javax.sql.DataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.orm.ibatis.SqlMapClientTemplate; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeMethod; import com.alibaba.cobar.client.entities.Follower; import com.alibaba.cobar.client.support.vo.BatchInsertTask; public abstract class AbstractTestNGCobarClientTest { private transient final Logger logger = LoggerFactory .getLogger(AbstractTestNGCobarClientTest.class); public static final String CREATE_TABLE_COBAR_HA = "CREATE TABLE IF NOT EXISTS cobarha(timeflag TIMESTAMP)"; public static final String CREATE_TABLE_TWEETS = "CREATE TABLE IF NOT EXISTS tweets(id BIGINT IDENTITY PRIMARY KEY, tweet VARCHAR(140))"; public static final String CREATE_TABLE_FOLLOWERS = "CREATE TABLE IF NOT EXISTS followers(id BIGINT IDENTITY PRIMARY KEY,name VARCHAR(255))"; public static final String CREATE_TABLE_OFFERS = "CREATE TABLE IF NOT EXISTS offers(id BIGINT(20) AUTO_INCREMENT PRIMARY KEY, memberId VARCHAR(32), subject VARCHAR(512), gmtUpdated TIMESTAMP default CURRENT_TIMESTAMP())"; public static final String TRUNCATE_TABLE_COBARHA = "TRUNCATE TABLE cobarha"; public static final String TRUNCATE_TABLE_TWEETS = "TRUNCATE TABLE tweets"; public static final String TRUNCATE_TABLE_FOLLOWERS = "TRUNCATE TABLE followers"; public static final String TRUNCATE_TABLE_OFFERS = "TRUNCATE TABLE offers"; private ApplicationContext applicationContext; private SqlMapClientTemplate sqlMapClientTemplate; protected JdbcTemplate jt1m; protected JdbcTemplate jt1s; protected JdbcTemplate jt2m; protected JdbcTemplate jt2s; public AbstractTestNGCobarClientTest(String[] locations) { applicationContext = new ClassPathXmlApplicationContext(locations); ((AbstractApplicationContext) applicationContext).registerShutdownHook(); setSqlMapClientTemplate((SqlMapClientTemplate) applicationContext .getBean("sqlMapClientTemplate")); jt1m = new JdbcTemplate((DataSource) applicationContext.getBean("partition1_main")); jt1s = new JdbcTemplate((DataSource) applicationContext.getBean("partition1_standby")); jt2m = new JdbcTemplate((DataSource) applicationContext.getBean("partition2_main")); jt2s = new JdbcTemplate((DataSource) applicationContext.getBean("partition2_standby")); jt1m.execute(CREATE_TABLE_COBAR_HA); jt1m.execute(CREATE_TABLE_TWEETS); jt1m.execute(CREATE_TABLE_FOLLOWERS); jt1m.execute(CREATE_TABLE_OFFERS); jt1s.execute(CREATE_TABLE_COBAR_HA); jt1s.execute(CREATE_TABLE_TWEETS); jt1s.execute(CREATE_TABLE_FOLLOWERS); jt1s.execute(CREATE_TABLE_OFFERS); jt2m.execute(CREATE_TABLE_COBAR_HA); jt2m.execute(CREATE_TABLE_FOLLOWERS); jt2m.execute(CREATE_TABLE_TWEETS); jt2m.execute(CREATE_TABLE_OFFERS); jt2s.execute(CREATE_TABLE_COBAR_HA); jt2s.execute(CREATE_TABLE_FOLLOWERS); jt2s.execute(CREATE_TABLE_TWEETS); jt2s.execute(CREATE_TABLE_OFFERS); } @BeforeMethod(alwaysRun = true) public void setUpBeforeEachTestMethodRun() { jt1m.execute(TRUNCATE_TABLE_COBARHA); jt1m.execute(TRUNCATE_TABLE_TWEETS); jt1m.execute(TRUNCATE_TABLE_FOLLOWERS); jt1m.execute(TRUNCATE_TABLE_OFFERS); jt1s.execute(TRUNCATE_TABLE_COBARHA); jt1s.execute(TRUNCATE_TABLE_TWEETS); jt1s.execute(TRUNCATE_TABLE_FOLLOWERS); jt1s.execute(TRUNCATE_TABLE_OFFERS); jt2m.execute(TRUNCATE_TABLE_COBARHA); jt2m.execute(TRUNCATE_TABLE_FOLLOWERS); jt2m.execute(TRUNCATE_TABLE_TWEETS); jt2m.execute(TRUNCATE_TABLE_OFFERS); jt2s.execute(TRUNCATE_TABLE_COBARHA); jt2s.execute(TRUNCATE_TABLE_FOLLOWERS); jt2s.execute(TRUNCATE_TABLE_TWEETS); jt2s.execute(TRUNCATE_TABLE_OFFERS); } @AfterClass public void cleanup() { if (applicationContext != null) { logger.info("shut down Application Context to clean up."); ((AbstractApplicationContext) applicationContext).destroy(); } } protected void batchInsertMultipleFollowersAsFixture(String[] names) { List<Follower> followers = new ArrayList<Follower>(); for (String name : names) { followers.add(new Follower(name)); } BatchInsertTask task = new BatchInsertTask(followers); getSqlMapClientTemplate().insert("com.alibaba.cobar.client.entities.Follower.batchInsert", task); } protected void batchInsertMultipleFollowersAsFixtureWithJdbcTemplate(String[] names, JdbcTemplate jt) { for (String name : names) { String sql = "insert into followers(name) values('" + name + "')"; jt.update(sql); } } protected void verifyEntityNonExistenceOnSpecificDataSource(String sql, JdbcTemplate jt) { try { jt.queryForObject(sql, String.class); fail(); } catch (DataAccessException e) { // pass } } protected void verifyEntityExistenceOnSpecificDataSource(String sql, JdbcTemplate jt) { try { assertNotNull(jt.queryForObject(sql, String.class)); } catch (DataAccessException e) { fail(); } } public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } public ApplicationContext getApplicationContext() { return applicationContext; } public void setSqlMapClientTemplate(SqlMapClientTemplate sqlMapClientTemplate) { this.sqlMapClientTemplate = sqlMapClientTemplate; } public SqlMapClientTemplate getSqlMapClientTemplate() { return sqlMapClientTemplate; } }