Back to Repositories

Testing MySQL Metadata History Operations in Alibaba Canal

This test suite validates the MetaHistoryDAO functionality in Alibaba Canal’s MySQL metadata tracking system. It focuses on testing database operations for storing and retrieving binlog metadata history using an H2 database implementation.

Test Coverage Overview

The test suite covers core database operations for the MetaHistoryDAO component.

Key areas tested include:
  • Metadata insertion with complete binlog details
  • Timestamp-based deletion operations
  • Retrieval of historical metadata within specified time ranges
  • Integration with H2 test database configuration

Implementation Analysis

The testing approach utilizes Spring’s test context framework with JUnit4 integration. The implementation leverages Spring’s dependency injection for DAO access and uses the H2 database for isolation.

Notable patterns include:
  • Spring test context configuration via XML
  • Resource injection for DAO access
  • Timestamp-based data management

Technical Details

Testing infrastructure includes:
  • SpringJUnit4ClassRunner for test execution
  • H2 in-memory database for testing
  • XML-based Spring context configuration
  • MetaHistoryDAO for database operations
  • MetaHistoryDO data objects for metadata representation

Best Practices Demonstrated

The test implementation showcases several testing best practices.

Notable examples include:
  • Isolated test database configuration
  • Complete test data setup
  • Comprehensive operation verification
  • Clear test method organization
  • Proper Spring test context management

alibaba/canal

parse/src/test/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MetaHistoryDAOTest.java

            
package com.alibaba.otter.canal.parse.inbound.mysql.tsdb;

import java.util.List;

import javax.annotation.Resource;

import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.dao.MetaHistoryDAO;
import com.alibaba.otter.canal.parse.inbound.mysql.tsdb.dao.MetaHistoryDO;

/**
 * Created by wanshao Date: 2017/9/20 Time: 下午5:00
 **/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/tsdb/h2-tsdb.xml" })
@Ignore
public class MetaHistoryDAOTest {

    @Resource
    MetaHistoryDAO metaHistoryDAO;

    @Test
    public void testSimple() {
        MetaHistoryDO historyDO = new MetaHistoryDO();
        historyDO.setDestination("test");
        historyDO.setBinlogFile("000001");
        historyDO.setBinlogOffest(4L);
        historyDO.setBinlogMasterId("1");
        historyDO.setBinlogTimestamp(System.currentTimeMillis() - 7300 * 1000);
        historyDO.setSqlSchema("test");
        historyDO.setUseSchema("test");
        historyDO.setSqlTable("testTable");
        historyDO.setSqlTable("drop table testTable");
        metaHistoryDAO.insert(historyDO);

        int count = metaHistoryDAO.deleteByTimestamp("test", 7200);
        System.out.println(count);

        List<MetaHistoryDO> metaHistoryDOList = metaHistoryDAO.findByTimestamp("test", 0L, System.currentTimeMillis());
        for (MetaHistoryDO metaHistoryDO : metaHistoryDOList) {
            System.out.println(metaHistoryDO.getId());
        }
    }

}