Back to Repositories

Testing Embedded Canal Server File Mode Configuration in alibaba/canal

This test suite verifies the file-mode configuration and functionality of Canal Server in embedded mode. It focuses on testing the standalone server setup with local file meta-mode and memory storage implementation.

Test Coverage Overview

The test coverage encompasses Canal server configuration in file mode, focusing on local metadata storage and memory-based processing. Key functionality includes:

  • Local file meta-mode configuration
  • Memory storage implementation with 32KB buffer
  • MySQL sourcing type setup
  • Database connection parameters and timeouts
  • Heartbeat-based HA mode configuration

Implementation Analysis

The testing approach implements a standalone server test configuration using the embedded Canal server framework. It establishes specific patterns for:

  • Meta file persistence with 1000ms flush period
  • Memory-based index mode with failback capability
  • Dual MySQL address configuration
  • Specific journal position tracking

Technical Details

Testing infrastructure includes:

  • JUnit test framework with @Ignore annotation
  • Canal Parameter configuration for storage and meta modes
  • InetSocketAddress implementation for database connectivity
  • UTF-8 character encoding
  • Configurable buffer sizes (8KB for send/receive)

Best Practices Demonstrated

The test exhibits several quality testing practices:

  • Comprehensive parameter configuration
  • Clear separation of concerns in test setup
  • Explicit timeout and retry configurations
  • Structured approach to HA mode testing
  • Detailed documentation of test parameters

alibaba/canal

server/src/test/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded_FileModeTest.java

            
package com.alibaba.otter.canal.server.embedded;

import java.net.InetSocketAddress;
import java.util.Arrays;

import com.alibaba.otter.canal.instance.manager.model.Canal;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.*;
import org.junit.Ignore;

@Ignore
public class CanalServerWithEmbedded_FileModeTest extends BaseCanalServerWithEmbededTest {

    protected Canal buildCanal() {
        Canal canal = new Canal();
        canal.setId(1L);
        canal.setName(DESTINATION);
        canal.setDesc("my standalone server test ");

        CanalParameter parameter = new CanalParameter();

        parameter.setMetaMode(MetaMode.LOCAL_FILE);
        parameter.setDataDir("./conf");
        parameter.setMetaFileFlushPeriod(1000);
        parameter.setHaMode(HAMode.HEARTBEAT);
        parameter.setIndexMode(IndexMode.MEMORY_META_FAILBACK);

        parameter.setStorageMode(StorageMode.MEMORY);
        parameter.setMemoryStorageBufferSize(32 * 1024);

        parameter.setSourcingType(SourcingType.MYSQL);
        parameter.setDbAddresses(Arrays.asList(new InetSocketAddress(MYSQL_ADDRESS, 3306),
            new InetSocketAddress(MYSQL_ADDRESS, 3306)));
        parameter.setDbUsername(USERNAME);
        parameter.setDbPassword(PASSWORD);
        parameter.setPositions(Arrays.asList("{\"journalName\":\"mysql-bin.000001\",\"position\":332L,\"timestamp\":\"1505998863000\"}",
            "{\"journalName\":\"mysql-bin.000001\",\"position\":332L,\"timestamp\":\"1505998863000\"}"));

        parameter.setSlaveId(1234L);

        parameter.setDefaultConnectionTimeoutInSeconds(30);
        parameter.setConnectionCharset("UTF-8");
        parameter.setReceiveBufferSize(8 * 1024);
        parameter.setSendBufferSize(8 * 1024);

        parameter.setDetectingEnable(false);
        parameter.setDetectingIntervalInSeconds(10);
        parameter.setDetectingRetryTimes(3);
        parameter.setDetectingSQL(DETECTING_SQL);

        canal.setCanalParameter(parameter);
        return canal;
    }
}