Back to Repositories

Testing Aviater Filter Implementation in Canal

This test suite validates the Aviater filtering functionality in Canal, focusing on simple pattern matching, regex filtering, and expression language filtering capabilities. The tests ensure proper filtering behavior for database table operations and entry types.

Test Coverage Overview

The test suite provides comprehensive coverage of Canal’s filtering mechanisms:
  • Simple pattern matching for table names
  • Regular expression based filtering with complex patterns
  • Expression Language (EL) filtering for entry types
  • Edge cases including empty strings and disordered patterns

Implementation Analysis

The testing approach implements JUnit-based verification of three distinct filter types: AviaterSimpleFilter, AviaterRegexFilter, and AviaterELFilter. Each test method validates specific filtering patterns and scenarios using Assert statements to verify expected outcomes.

The implementation demonstrates systematic testing of pattern matching logic with increasing complexity levels.

Technical Details

Testing tools and configuration:
  • JUnit 4 testing framework
  • Aviater filtering library integration
  • CanalEntry protocol buffer implementation
  • Assert-based verification methodology

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Isolated test methods for different filter types
  • Comprehensive edge case coverage
  • Clear test method naming conventions
  • Systematic assertion patterns
  • Proper test organization and separation of concerns

alibaba/canal

filter/src/test/java/com/alibaba/otter/canal/filter/AviaterFilterTest.java

            
package com.alibaba.otter.canal.filter;

import org.junit.Assert;
import org.junit.Test;

import com.alibaba.otter.canal.filter.aviater.AviaterELFilter;
import com.alibaba.otter.canal.filter.aviater.AviaterRegexFilter;
import com.alibaba.otter.canal.filter.aviater.AviaterSimpleFilter;
import com.alibaba.otter.canal.protocol.CanalEntry;

public class AviaterFilterTest {

    @Test
    public void test_simple() {
        AviaterSimpleFilter filter = new AviaterSimpleFilter("s1.t1,s2.t2");
        boolean result = filter.filter("s1.t1");
        Assert.assertEquals(true, result);

        result = filter.filter("s1.t2");
        Assert.assertEquals(false, result);

        result = filter.filter("");
        Assert.assertEquals(true, result);

        result = filter.filter("s1.t1,s2.t2");
        Assert.assertEquals(false, result);

        result = filter.filter("s2.t2");
        Assert.assertEquals(true, result);
    }

    @Test
    public void test_regex() {
        AviaterRegexFilter filter = new AviaterRegexFilter("s1\\..*,s2\\..*");
        boolean result = filter.filter("s1.t1");
        Assert.assertEquals(true, result);

        result = filter.filter("s1.t2");
        Assert.assertEquals(true, result);

        result = filter.filter("");
        Assert.assertEquals(true, result);

        result = filter.filter("s12.t1");
        Assert.assertEquals(false, result);

        result = filter.filter("s2.t2");
        Assert.assertEquals(true, result);

        result = filter.filter("s3.t2");
        Assert.assertEquals(false, result);

        result = filter.filter("S1.S2");
        Assert.assertEquals(true, result);

        result = filter.filter("S2.S1");
        Assert.assertEquals(true, result);

        AviaterRegexFilter filter2 = new AviaterRegexFilter("s1\\..*,s2.t1");

        result = filter2.filter("s1.t1");
        Assert.assertEquals(true, result);

        result = filter2.filter("s1.t2");
        Assert.assertEquals(true, result);

        result = filter2.filter("s2.t1");
        Assert.assertEquals(true, result);

        AviaterRegexFilter filter3 = new AviaterRegexFilter("foooo,f.*t");

        result = filter3.filter("fooooot");
        Assert.assertEquals(true, result);

        AviaterRegexFilter filter4 = new AviaterRegexFilter("otter2.otter_stability1|otter1.otter_stability1|retl.retl_mark|retl.retl_buffer|retl.xdual");
        result = filter4.filter("otter1.otter_stability1");
        Assert.assertEquals(true, result);
    }

    @Test
    public void testDisordered() {
        AviaterRegexFilter filter = new AviaterRegexFilter("u\\..*,uvw\\..*,uv\\..*,a\\.x,a\\.xyz,a\\.xy,abc\\.x,abc\\.xyz,abc\\.xy,ab\\.x,ab\\.xyz,ab\\.xy");

        boolean result = filter.filter("u.abc");
        Assert.assertEquals(true, result);

        result = filter.filter("ab.x");
        Assert.assertEquals(true, result);

        result = filter.filter("ab.xyz1");
        Assert.assertEquals(false, result);

        result = filter.filter("abc.xyz");
        Assert.assertEquals(true, result);

        result = filter.filter("uv.xyz");
        Assert.assertEquals(true, result);

    }

    @Test
    public void test_el() {
        AviaterELFilter filter = new AviaterELFilter("str(entry.entryType) == 'ROWDATA'");

        CanalEntry.Entry.Builder entry = CanalEntry.Entry.newBuilder();
        entry.setEntryType(CanalEntry.EntryType.ROWDATA);

        boolean result = filter.filter(entry.build());
        Assert.assertEquals(true, result);
    }
}