void PipelineConfigWatcherUnittest::TestLoadRemovedSingletonConfig()

in core/unittest/config/PipelineConfigWatcherUnittest.cpp [898:1186]


void PipelineConfigWatcherUnittest::TestLoadRemovedSingletonConfig() {
    { // case: removed -> 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());

        filesystem::remove(configDir1 / "test1.json");
        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(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: removed -> 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());

        filesystem::remove(configDir1 / "test1.json");
        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: removed -> added, first > second -> first < second
        // should not happen
    }
    {
        // case: removed -> added, first < second -> first > second
        // should not happen
    }
    { // case: removed -> 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());
        this_thread::sleep_for(chrono::milliseconds(1));

        filesystem::remove(configDir1 / "test1.json");
        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("test2", allConfigNames[builtinPipelineCnt + 1]);
        ClearConfig();
    }
    { // case: removed -> 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());
        this_thread::sleep_for(chrono::milliseconds(1));

        filesystem::remove(configDir1 / "test1.json");
        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: removed -> modified, first > second -> first < second
        // should not happen
    }
    {
        // case: removed -> modified, first < second -> first > second
        // should not happen
    }
    { // case: removed -> 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(configDir1 / "test1.json");
        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(2U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(0U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());
        ClearConfig();
    }
    { // case: removed -> 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(configDir1 / "test1.json");
        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(2U, diff.first.mRemoved.size());

        PipelineManagerMock::GetInstance()->UpdatePipelines(diff.first);
        APSARA_TEST_EQUAL_FATAL(0U + builtinPipelineCnt,
                                PipelineManagerMock::GetInstance()->GetAllConfigNames().size());
        ClearConfig();
    }
    {
        // case: removed -> removed, first > second -> first < second
        // should not happen
    }
    {
        // case: removed -> removed, first < second -> first > second
        // should not happen
    }
    { // case: removed -> 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());

        filesystem::remove(configDir1 / "test1.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(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: removed -> 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());

        filesystem::remove(configDir1 / "test1.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(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: removed -> unchanged, first > second -> first < second
        // should not happen
    }
    { // case: removed -> unchanged, first < second -> first > second
      // should not happen
    }
}