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
Implementation Analysis
Technical Details
Best Practices Demonstrated
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);
}
}