void PipelineConfigWatcherUnittest::TestLoadUnchangedSingletonConfig()

in core/unittest/config/PipelineConfigWatcherUnittest.cpp [1188:1530]


void PipelineConfigWatcherUnittest::TestLoadUnchangedSingletonConfig() {
    { // case: unchanged -> added, first > second
        PrepareConfig();
        ofstream fout(configDir1 / "test1.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        size_t builtinPipelineCnt = 0;
#ifdef __ENTERPRISE__
        builtinPipelineCnt += EnterpriseConfigProvider::GetInstance()->GetAllBuiltInPipelineConfigs().size();
#endif
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(1U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt, allConfigNames.size());
        sort(allConfigNames.begin(), allConfigNames.end());
        APSARA_TEST_EQUAL_FATAL("test-other", allConfigNames[builtinPipelineCnt]);
        APSARA_TEST_EQUAL_FATAL("test1", allConfigNames[builtinPipelineCnt + 1]);
        ClearConfig();
    }
    { // case: unchanged -> added, first < second
        PrepareConfig();
        ofstream fout(configDir1 / "test1.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(1U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(2U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt, allConfigNames.size());
        sort(allConfigNames.begin(), allConfigNames.end());
        APSARA_TEST_EQUAL_FATAL("test-other", allConfigNames[builtinPipelineCnt]);
        APSARA_TEST_EQUAL_FATAL("test2", allConfigNames[builtinPipelineCnt + 1]);
        ClearConfig();
    }
    {
        // case: unchanged -> added, first > second -> first < second
        // should not happen
    }
    {
        // case: unchanged -> added, first < second -> first > second
        // should not happen
    }
    { // case: unchanged -> modified, first > second
        PrepareConfig();
        ofstream fout(configDir1 / "test1.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << modifiedLessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << modifiedOtherConfig;
        fout.close();
        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt, allConfigNames.size());
        sort(allConfigNames.begin(), allConfigNames.end());
        APSARA_TEST_EQUAL_FATAL("test-other", allConfigNames[builtinPipelineCnt]);
        APSARA_TEST_EQUAL_FATAL("test1", allConfigNames[builtinPipelineCnt + 1]);
        ClearConfig();
    }
    { // case: unchanged -> modified, first < second
        PrepareConfig();
        ofstream fout(configDir1 / "test1.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << modifiedGreaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << modifiedOtherConfig;
        fout.close();
        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(2U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt, allConfigNames.size());
        sort(allConfigNames.begin(), allConfigNames.end());
        APSARA_TEST_EQUAL_FATAL("test-other", allConfigNames[builtinPipelineCnt]);
        APSARA_TEST_EQUAL_FATAL("test2", allConfigNames[builtinPipelineCnt + 1]);
        ClearConfig();
    }
    { // case: unchanged -> modified, first > second -> first < second
        PrepareConfig();
        ofstream fout(configDir1 / "test1.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << modifiedOtherConfig;
        fout.close();
        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt, allConfigNames.size());
        sort(allConfigNames.begin(), allConfigNames.end());
        APSARA_TEST_EQUAL_FATAL("test-other", allConfigNames[builtinPipelineCnt]);
        APSARA_TEST_EQUAL_FATAL("test2", allConfigNames[builtinPipelineCnt + 1]);
        ClearConfig();
    }
    { // case: unchanged -> modified, first < second -> first > second
        PrepareConfig();
        ofstream fout(configDir1 / "test3.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << modifiedLessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << modifiedOtherConfig;
        fout.close();
        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt, allConfigNames.size());
        sort(allConfigNames.begin(), allConfigNames.end());
        APSARA_TEST_EQUAL_FATAL("test-other", allConfigNames[builtinPipelineCnt]);
        APSARA_TEST_EQUAL_FATAL("test3", allConfigNames[builtinPipelineCnt + 1]);
        ClearConfig();
    }
    { // case: unchanged -> removed, first > second
        PrepareConfig();
        ofstream fout(configDir1 / "test1.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        filesystem::remove(configDir2 / "test2.json");
        filesystem::remove(configDir2 / "test-other.json");
        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(1U + builtinPipelineCnt, allConfigNames.size());
        APSARA_TEST_EQUAL_FATAL("test1", allConfigNames[builtinPipelineCnt]);
        ClearConfig();
    }
    { // case: unchanged -> removed, first < second
        PrepareConfig();
        ofstream fout(configDir1 / "test1.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        filesystem::remove(configDir2 / "test2.json");
        filesystem::remove(configDir2 / "test-other.json");
        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(1U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(2U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(1U + builtinPipelineCnt, allConfigNames.size());
        APSARA_TEST_EQUAL_FATAL("test1", allConfigNames[0]);
        ClearConfig();
    }
    {
        // case: unchanged -> removed, first > second -> first < second
        // should not happen
    }
    {
        // case: unchanged -> removed, first < second -> first > second
        // should not happen
    }
    { // case: unchanged -> unchanged, first > second
        PrepareConfig();
        ofstream fout(configDir1 / "test1.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt, allConfigNames.size());
        sort(allConfigNames.begin(), allConfigNames.end());
        APSARA_TEST_EQUAL_FATAL("test-other", allConfigNames[builtinPipelineCnt]);
        APSARA_TEST_EQUAL_FATAL("test1", allConfigNames[builtinPipelineCnt + 1]);
        ClearConfig();
    }
    { // case: unchanged -> unchanged, first < second
        PrepareConfig();
        ofstream fout(configDir1 / "test1.json", ios::trunc);
        fout << lessPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test2.json", ios::trunc);
        fout << greaterPriorityConfig;
        fout.close();
        fout.open(configDir2 / "test-other.json", ios::trunc);
        fout << otherConfig;
        fout.close();
        auto diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());

        diff = PipelineConfigWatcher::GetInstance()->CheckConfigDiff();
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mAdded.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mModified.size());
        APSARA_TEST_EQUAL_FATAL(0U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        auto allConfigNames = PipelineManagerMock::GetInstance()->GetAllConfigNames();
        APSARA_TEST_EQUAL_FATAL(2U + builtinPipelineCnt, allConfigNames.size());
        sort(allConfigNames.begin(), allConfigNames.end());
        APSARA_TEST_EQUAL_FATAL("test-other", allConfigNames[builtinPipelineCnt]);
        APSARA_TEST_EQUAL_FATAL("test2", allConfigNames[builtinPipelineCnt + 1]);
        ClearConfig();
    }
    {
        // case: unchanged -> unchanged, first > second -> first < second
        // should not happen
    }
    { // case: unchanged -> unchanged, first < second -> first > second
      // should not happen
    }
}