|
31 | 31 | import java.sql.Statement; |
32 | 32 | import java.util.Arrays; |
33 | 33 | import java.util.List; |
| 34 | +import java.util.Map; |
34 | 35 |
|
35 | 36 | public class Mysql2DorisE2ECase extends AbstractE2EService { |
36 | 37 | private static final Logger LOG = LoggerFactory.getLogger(Mysql2DorisE2ECase.class); |
@@ -581,6 +582,117 @@ public void testMySQL2DorisMultiDatabase2OneSync() throws Exception { |
581 | 582 | cancelE2EJob(jobName); |
582 | 583 | } |
583 | 584 |
|
| 585 | + @Test |
| 586 | + public void testMySQL2DorisEnvVar() throws Exception { |
| 587 | + String jobName = "testMySQL2DorisEnvVar"; |
| 588 | + String resourcePath = "container/e2e/mysql2doris/testMySQL2DorisEnvVar.txt"; |
| 589 | + |
| 590 | + // Set environment variables for testing |
| 591 | + setEnvironmentVariable("TABLE_PREFIX", "env_"); |
| 592 | + setEnvironmentVariable("TABLE_SUFFIX", "_test"); |
| 593 | + |
| 594 | + try { |
| 595 | + initEnvironment(jobName, "container/e2e/mysql2doris/testMySQL2DorisEnvVar_init.sql"); |
| 596 | + startMysql2DorisJob(jobName, resourcePath); |
| 597 | + |
| 598 | + // wait 2 times checkpoint |
| 599 | + Thread.sleep(20000); |
| 600 | + LOG.info("Start to verify create table result with environment variable resolution."); |
| 601 | + String tblQuery = |
| 602 | + String.format( |
| 603 | + "SELECT TABLE_NAME \n" |
| 604 | + + "FROM INFORMATION_SCHEMA.TABLES \n" |
| 605 | + + "WHERE TABLE_SCHEMA = '%s'", |
| 606 | + "test_e2e_mysql_env"); |
| 607 | + // Verify that tables are created with env variable resolved prefix and suffix |
| 608 | + List<String> expectedTables = |
| 609 | + Arrays.asList( |
| 610 | + "env_tbl1_test", "env_tbl2_test", "env_tbl3_test", "env_tbl5_test"); |
| 611 | + ContainerUtils.checkResult( |
| 612 | + getDorisQueryConnection(), LOG, expectedTables, tblQuery, 1, false); |
| 613 | + |
| 614 | + LOG.info("Start to verify init result with environment variable resolution."); |
| 615 | + List<String> expected = |
| 616 | + Arrays.asList( |
| 617 | + "doris_env_1,1", "doris_env_2,2", "doris_env_3,3", "doris_env_5,5"); |
| 618 | + String sql1 = |
| 619 | + "select * from ( select * from test_e2e_mysql_env.env_tbl1_test union all select * from test_e2e_mysql_env.env_tbl2_test union all select * from test_e2e_mysql_env.env_tbl3_test union all select * from test_e2e_mysql_env.env_tbl5_test) res order by 1"; |
| 620 | + ContainerUtils.checkResult(getDorisQueryConnection(), LOG, expected, sql1, 2); |
| 621 | + |
| 622 | + // add incremental data to verify CDC continues working with env vars |
| 623 | + ContainerUtils.executeSQLStatement( |
| 624 | + getMySQLQueryConnection(), |
| 625 | + LOG, |
| 626 | + "insert into test_e2e_mysql_env.tbl1 values ('doris_env_1_1',10)", |
| 627 | + "insert into test_e2e_mysql_env.tbl2 values ('doris_env_2_1',11)", |
| 628 | + "update test_e2e_mysql_env.tbl1 set age=18 where name='doris_env_1'", |
| 629 | + "delete from test_e2e_mysql_env.tbl2 where name='doris_env_2'"); |
| 630 | + Thread.sleep(20000); |
| 631 | + |
| 632 | + LOG.info( |
| 633 | + "Start to verify incremental data result with environment variable resolution."); |
| 634 | + List<String> expected2 = |
| 635 | + Arrays.asList( |
| 636 | + "doris_env_1,18", |
| 637 | + "doris_env_1_1,10", |
| 638 | + "doris_env_2_1,11", |
| 639 | + "doris_env_3,3"); |
| 640 | + String sql2 = |
| 641 | + "select * from ( select * from test_e2e_mysql_env.env_tbl1_test union all select * from test_e2e_mysql_env.env_tbl2_test union all select * from test_e2e_mysql_env.env_tbl3_test ) res order by 1"; |
| 642 | + ContainerUtils.checkResult(getDorisQueryConnection(), LOG, expected2, sql2, 2); |
| 643 | + |
| 644 | + cancelE2EJob(jobName); |
| 645 | + } finally { |
| 646 | + // Clean up environment variables |
| 647 | + unsetEnvironmentVariable("TABLE_PREFIX"); |
| 648 | + unsetEnvironmentVariable("TABLE_SUFFIX"); |
| 649 | + } |
| 650 | + } |
| 651 | + |
| 652 | + /** Set environment variable using reflection (for testing purposes only) */ |
| 653 | + @SuppressWarnings("unchecked") |
| 654 | + private void setEnvironmentVariable(String key, String value) { |
| 655 | + try { |
| 656 | + Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); |
| 657 | + java.lang.reflect.Field theEnvironmentField = |
| 658 | + processEnvironmentClass.getDeclaredField("theEnvironment"); |
| 659 | + theEnvironmentField.setAccessible(true); |
| 660 | + Map<String, String> env = (Map<String, String>) theEnvironmentField.get(null); |
| 661 | + env.put(key, value); |
| 662 | + |
| 663 | + java.lang.reflect.Field theCaseInsensitiveEnvironmentField = |
| 664 | + processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment"); |
| 665 | + theCaseInsensitiveEnvironmentField.setAccessible(true); |
| 666 | + Map<String, String> cienv = |
| 667 | + (Map<String, String>) theCaseInsensitiveEnvironmentField.get(null); |
| 668 | + cienv.put(key, value); |
| 669 | + } catch (Exception e) { |
| 670 | + LOG.warn("Failed to set environment variable: " + key + "=" + value, e); |
| 671 | + } |
| 672 | + } |
| 673 | + |
| 674 | + /** Unset environment variable using reflection (for testing purposes only) */ |
| 675 | + @SuppressWarnings("unchecked") |
| 676 | + private void unsetEnvironmentVariable(String key) { |
| 677 | + try { |
| 678 | + Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); |
| 679 | + java.lang.reflect.Field theEnvironmentField = |
| 680 | + processEnvironmentClass.getDeclaredField("theEnvironment"); |
| 681 | + theEnvironmentField.setAccessible(true); |
| 682 | + Map<String, String> env = (Map<String, String>) theEnvironmentField.get(null); |
| 683 | + env.remove(key); |
| 684 | + |
| 685 | + java.lang.reflect.Field theCaseInsensitiveEnvironmentField = |
| 686 | + processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment"); |
| 687 | + theCaseInsensitiveEnvironmentField.setAccessible(true); |
| 688 | + Map<String, String> cienv = |
| 689 | + (Map<String, String>) theCaseInsensitiveEnvironmentField.get(null); |
| 690 | + cienv.remove(key); |
| 691 | + } catch (Exception e) { |
| 692 | + LOG.warn("Failed to unset environment variable: " + key, e); |
| 693 | + } |
| 694 | + } |
| 695 | + |
584 | 696 | @After |
585 | 697 | public void close() { |
586 | 698 | try { |
|
0 commit comments