Back to Repositories

Validating Standalone Embedded Server Configuration in Canal

This test suite validates the standalone embedded configuration of Canal Server, focusing on server initialization and parameter settings. It extends the base embedded test class to verify Canal’s core functionality in a standalone deployment scenario.

Test Coverage Overview

The test suite covers standalone Canal Server configuration and initialization parameters.

Key functionality tested includes:
  • Canal parameter configuration including memory modes, HA settings, and storage options
  • MySQL source configuration and connectivity parameters
  • Network and buffer settings validation
  • Detection and monitoring configuration

Implementation Analysis

The testing approach uses JUnit to verify Canal Server’s embedded mode configuration. The implementation follows a builder pattern to construct a complete Canal instance with specific parameters.

Technical aspects include:
  • Memory-based storage and index configuration
  • Heartbeat-based HA mode setup
  • MySQL sourcing configuration with failover support
  • Connection parameter validation

Technical Details

Testing tools and configuration:
  • JUnit test framework
  • Canal Parameter model classes
  • MySQL connection settings
  • Memory storage configuration (32KB buffer)
  • Network parameters (8KB send/receive buffers)
  • UTF-8 character encoding
  • Slave ID configuration

Best Practices Demonstrated

The test demonstrates several quality testing practices for embedded server configuration.

Notable practices include:
  • Comprehensive parameter initialization
  • Clear separation of concerns in configuration
  • Explicit timeout and retry settings
  • Proper resource allocation for buffers
  • Structured configuration approach using builder pattern

alibaba/canal

server/src/test/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded_StandaloneTest.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.HAMode;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.IndexMode;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.MetaMode;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.SourcingType;
import com.alibaba.otter.canal.instance.manager.model.CanalParameter.StorageMode;
import org.junit.Ignore;

@Ignore
public class CanalServerWithEmbedded_StandaloneTest extends BaseCanalServerWithEmbededTest {

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

        CanalParameter parameter = new CanalParameter();

        parameter.setZkClusters(Arrays.asList("127.0.0.1:2188"));
        parameter.setMetaMode(MetaMode.MEMORY);
        parameter.setHaMode(HAMode.HEARTBEAT);
        parameter.setIndexMode(IndexMode.MEMORY);

        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.000003\",\"position\":14217L,\"timestamp\":\"1505998863000\"}",
            "{\"journalName\":\"mysql-bin.000003\",\"position\":14377L,\"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;
    }
}