From 01731d9a22929f22e9729568347799e1ce7cebe0 Mon Sep 17 00:00:00 2001 From: Jen-Tse Huang Date: Thu, 19 Mar 2026 17:47:20 +0100 Subject: [PATCH 1/8] Make Info message under `verbose` and update unit tests --- tools/projmgr/include/ProjMgrLogger.h | 10 + tools/projmgr/src/ProjMgr.cpp | 1 + tools/projmgr/src/ProjMgrLogger.cpp | 3 +- .../data/TestLayers/ref/config.cbuild-idx.yml | 6 + .../TestLayers/ref/no_compiler.cbuild-idx.yml | 4 + .../data/TestLayers/ref/select.cbuild-idx.yml | 4 + .../test/src/ProjMgrGeneratorUnitTests.cpp | 10 +- tools/projmgr/test/src/ProjMgrUnitTests.cpp | 174 +++++++++++------- .../test/src/ProjMgrWorkerUnitTests.cpp | 3 + 9 files changed, 143 insertions(+), 72 deletions(-) diff --git a/tools/projmgr/include/ProjMgrLogger.h b/tools/projmgr/include/ProjMgrLogger.h index 0b9039c67..b107b2e6b 100644 --- a/tools/projmgr/include/ProjMgrLogger.h +++ b/tools/projmgr/include/ProjMgrLogger.h @@ -77,6 +77,12 @@ class ProjMgrLogger { */ static bool IsQuiet() { return m_quiet || m_silent; } + /** + * @brief check if in verbose mode + * @return true if verbose + */ + static bool IsVerbose() { return m_verbose; } + /** * @brief flag to suppress infos and warnings */ @@ -87,6 +93,10 @@ class ProjMgrLogger { */ static bool m_silent; + /** + * @brief flag to enable verbose for infos + */ + static bool m_verbose; /** * @brief get errors diff --git a/tools/projmgr/src/ProjMgr.cpp b/tools/projmgr/src/ProjMgr.cpp index eb653ea95..b7b6a7641 100644 --- a/tools/projmgr/src/ProjMgr.cpp +++ b/tools/projmgr/src/ProjMgr.cpp @@ -230,6 +230,7 @@ int ProjMgr::ParseCommandLine(int argc, char** argv) { m_cbuildgen = parseResult.count("cbuildgen"); m_worker.SetCbuild2Cmake(!m_cbuildgen); ProjMgrLogger::m_quiet = parseResult.count("quiet"); + ProjMgrLogger::m_verbose = m_verbose; m_rpcServer.SetContentLengthHeader(parseResult.count("content-length")); m_rpcServer.SetDebug(m_debug); m_locked = parseResult.count("locked"); diff --git a/tools/projmgr/src/ProjMgrLogger.cpp b/tools/projmgr/src/ProjMgrLogger.cpp index 085dbbd95..16bdd1224 100644 --- a/tools/projmgr/src/ProjMgrLogger.cpp +++ b/tools/projmgr/src/ProjMgrLogger.cpp @@ -22,6 +22,7 @@ static constexpr const char* PROJMGR_INFO = "info"; bool ProjMgrLogger::m_quiet = false; bool ProjMgrLogger::m_silent = false; +bool ProjMgrLogger::m_verbose = false; // singleton instance static unique_ptr theProjMgrLogger = 0; @@ -73,7 +74,7 @@ void ProjMgrLogger::Info(const string& msg, const string& context, const string mark = (line > 0 ? ":" + to_string(line) : "") + (column > 0 ? ":" + to_string(column) : ""); CollectionUtils::PushBackUniquely(m_infos[context], (file.empty() ? "" : RteUtils::ExtractFileName(file) + mark + " - ") + msg); - if (!IsQuiet() ) { + if (!IsQuiet() && IsVerbose()) { cout << (file.empty() ? "" : file + mark + " - ") << PROJMGR_INFO << PROJMGR_TOOL << msg << endl; } } diff --git a/tools/projmgr/test/data/TestLayers/ref/config.cbuild-idx.yml b/tools/projmgr/test/data/TestLayers/ref/config.cbuild-idx.yml index f28b93220..e8e54fc75 100644 --- a/tools/projmgr/test/data/TestLayers/ref/config.cbuild-idx.yml +++ b/tools/projmgr/test/data/TestLayers/ref/config.cbuild-idx.yml @@ -88,3 +88,9 @@ build-idx: configuration: .CompatibleLayers+RteTest_ARMCM3 clayers: - clayer: config.clayer.yml + messages: + info: + - "valid configuration #1: (context 'config.CompatibleLayers+RteTest_ARMCM3')\n ${DEVTOOLS(data)}/TestLayers/config.clayer.yml\n set: set1.select1 (connect R - set 1 select 1)\n ${DEVTOOLS(data)}/TestLayers/config.cproject.yml\n set: set1.select1 (project X - set 1 select 1)\n ${DEVTOOLS(packs)}/ARM/RteTest_DFP/0.2.0/Layers/config1.clayer.yml (layer type: Config1)\n set: set1.select1 (connect A - set 1 select 1)\n set: set2.select1 (connect C - set 2 select 1)\n ${DEVTOOLS(packs)}/ARM/RteTest_DFP/0.2.0/Layers/config2.clayer.yml (layer type: Config2)\n set: set1.select1 (connect F - set 1 select 1)\n" + - "valid configuration #2: (context 'config.CompatibleLayers+RteTest_ARMCM3')\n ${DEVTOOLS(data)}/TestLayers/config.clayer.yml\n set: set1.select1 (connect R - set 1 select 1)\n ${DEVTOOLS(data)}/TestLayers/config.cproject.yml\n set: set1.select1 (project X - set 1 select 1)\n ${DEVTOOLS(packs)}/ARM/RteTest_DFP/0.2.0/Layers/config1.clayer.yml (layer type: Config1)\n set: set1.select1 (connect A - set 1 select 1)\n set: set2.select1 (connect C - set 2 select 1)\n ${DEVTOOLS(packs)}/ARM/RteTest_DFP/0.2.0/Layers/config3.clayer.yml (layer type: Config2)\n set: set3.select1 (connect F - set 3 select 1)\n" + - "valid configuration #3: (context 'config.CompatibleLayers+RteTest_ARMCM3')\n ${DEVTOOLS(data)}/TestLayers/config.clayer.yml\n set: set1.select2 (connect S - set 1 select 2)\n ${DEVTOOLS(data)}/TestLayers/config.cproject.yml\n set: set1.select2 (project Y - set 1 select 2)\n ${DEVTOOLS(packs)}/ARM/RteTest_DFP/0.2.0/Layers/config1.clayer.yml (layer type: Config1)\n set: set1.select2 (connect B - set 1 select 2)\n set: set2.select2 (connect D - set 2 select 2)\n ${DEVTOOLS(packs)}/ARM/RteTest_DFP/0.2.0/Layers/config2.clayer.yml (layer type: Config2)\n set: set1.select2 (connect G - set 1 select 2)\n" + - "valid configuration #4: (context 'config.CompatibleLayers+RteTest_ARMCM3')\n ${DEVTOOLS(data)}/TestLayers/config.clayer.yml\n set: set1.select2 (connect S - set 1 select 2)\n ${DEVTOOLS(data)}/TestLayers/config.cproject.yml\n set: set1.select2 (project Y - set 1 select 2)\n ${DEVTOOLS(packs)}/ARM/RteTest_DFP/0.2.0/Layers/config1.clayer.yml (layer type: Config1)\n set: set1.select2 (connect B - set 1 select 2)\n set: set2.select2 (connect D - set 2 select 2)\n ${DEVTOOLS(packs)}/ARM/RteTest_DFP/0.2.0/Layers/config3.clayer.yml (layer type: Config2)\n set: set3.select2 (connect G - set 3 select 2)\n" diff --git a/tools/projmgr/test/data/TestLayers/ref/no_compiler.cbuild-idx.yml b/tools/projmgr/test/data/TestLayers/ref/no_compiler.cbuild-idx.yml index d7a2bfca6..85db971d3 100644 --- a/tools/projmgr/test/data/TestLayers/ref/no_compiler.cbuild-idx.yml +++ b/tools/projmgr/test/data/TestLayers/ref/no_compiler.cbuild-idx.yml @@ -30,3 +30,7 @@ build-idx: configuration: +RteTest_ARMCM3 clayers: - clayer: select.clayer.yml + messages: + info: + - "valid configuration #1: (context 'no_compiler+RteTest_ARMCM3')\n ${DEVTOOLS(data)}/TestLayers/no_compiler.cproject.yml\n set: set1.select1 (project X - set 1 select 1)\n ${DEVTOOLS(data)}/TestLayers/select.clayer.yml (layer type: Board)\n set: set1.select1 (provided connections A and B - set 1 select 1)\n" + - "valid configuration #2: (context 'no_compiler+RteTest_ARMCM3')\n ${DEVTOOLS(data)}/TestLayers/no_compiler.cproject.yml\n set: set1.select2 (project Y - set 1 select 2)\n ${DEVTOOLS(data)}/TestLayers/select.clayer.yml (layer type: Board)\n set: set1.select2 (provided connections B and C - set 1 select 2)\n" diff --git a/tools/projmgr/test/data/TestLayers/ref/select.cbuild-idx.yml b/tools/projmgr/test/data/TestLayers/ref/select.cbuild-idx.yml index dcd24f190..4622724d6 100644 --- a/tools/projmgr/test/data/TestLayers/ref/select.cbuild-idx.yml +++ b/tools/projmgr/test/data/TestLayers/ref/select.cbuild-idx.yml @@ -27,3 +27,7 @@ build-idx: configuration: +RteTest_ARMCM3 clayers: - clayer: select.clayer.yml + messages: + info: + - "valid configuration #1: (context 'select+RteTest_ARMCM3')\n ${DEVTOOLS(data)}/TestLayers/select.cproject.yml\n set: set1.select1 (project X - set 1 select 1)\n ${DEVTOOLS(data)}/TestLayers/select.clayer.yml (layer type: Board)\n set: set1.select1 (provided connections A and B - set 1 select 1)\n" + - "valid configuration #2: (context 'select+RteTest_ARMCM3')\n ${DEVTOOLS(data)}/TestLayers/select.cproject.yml\n set: set1.select2 (project Y - set 1 select 2)\n ${DEVTOOLS(data)}/TestLayers/select.clayer.yml (layer type: Board)\n set: set1.select2 (provided connections B and C - set 1 select 2)\n" diff --git a/tools/projmgr/test/src/ProjMgrGeneratorUnitTests.cpp b/tools/projmgr/test/src/ProjMgrGeneratorUnitTests.cpp index d6b8a4b96..b7f6874f3 100644 --- a/tools/projmgr/test/src/ProjMgrGeneratorUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrGeneratorUnitTests.cpp @@ -159,7 +159,7 @@ TEST_F(ProjMgrGeneratorUnitTests, DryRunIncapableGenerator) { } TEST_F(ProjMgrGeneratorUnitTests, DryRun) { - char* argv[7], *envp[2]; + char* argv[8], *envp[2]; string gcc = "GCC_TOOLCHAIN_11_2_1=" + testinput_folder; envp[0] = (char*)gcc.c_str(); envp[1] = (char*)'\0'; @@ -172,6 +172,7 @@ TEST_F(ProjMgrGeneratorUnitTests, DryRun) { argv[4] = (char*)"-g"; argv[5] = (char*)"RteTestGeneratorIdentifier"; argv[6] = (char*)"--dry-run"; + argv[7] = (char*)"--verbose"; const string generatorInputFile = testinput_folder + "/TestSolution/tmp/TestProject3_1.Debug+TypeA.cbuild-gen.yml"; const string generatorDestination = testinput_folder + "/TestSolution/TestProject3_1/gendir"; @@ -181,7 +182,7 @@ TEST_F(ProjMgrGeneratorUnitTests, DryRun) { RteFsUtils::RemoveDir(generatorDestination); RteFsUtils::RemoveDir(rteDir); - EXPECT_EQ(0, ProjMgr::RunProjMgr(7, argv, envp)); + EXPECT_EQ(0, ProjMgr::RunProjMgr(8, argv, envp)); ProjMgrTestEnv::CompareFile(testinput_folder + "/TestSolution/ref/TestProject3_1.Debug+TypeA.cbuild-gen.yml", generatorInputFile, ProjMgrTestEnv::StripAbsoluteFunc); @@ -208,7 +209,7 @@ TEST_F(ProjMgrGeneratorUnitTests, DryRun) { } TEST_F(ProjMgrGeneratorUnitTests, DryRunNoLdScript) { - char* argv[7], *envp[2]; + char* argv[8], *envp[2]; string gcc = "GCC_TOOLCHAIN_11_2_1=" + testinput_folder; envp[0] = (char*)gcc.c_str(); envp[1] = (char*)'\0'; @@ -221,6 +222,7 @@ TEST_F(ProjMgrGeneratorUnitTests, DryRunNoLdScript) { argv[4] = (char*)"-g"; argv[5] = (char*)"RteTestGeneratorIdentifier"; argv[6] = (char*)"--dry-run"; + argv[7] = (char*)"--verbose"; const string generatorInputFile = testinput_folder + "/TestSolution/tmp/TestProject3_5.Debug+TypeA.cbuild-gen.yml"; const string generatorDestination = testinput_folder + "/TestSolution/TestProject3_5/gendir"; @@ -230,7 +232,7 @@ TEST_F(ProjMgrGeneratorUnitTests, DryRunNoLdScript) { RteFsUtils::RemoveDir(generatorDestination); RteFsUtils::RemoveDir(rteDir); - EXPECT_EQ(0, ProjMgr::RunProjMgr(7, argv, envp)); + EXPECT_EQ(0, ProjMgr::RunProjMgr(8, argv, envp)); ProjMgrTestEnv::CompareFile(testinput_folder + "/TestSolution/ref/TestProject3_5.Debug+TypeA.cbuild-gen.yml", generatorInputFile, ProjMgrTestEnv::StripAbsoluteFunc); diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index e5500a04d..a6bd00ba3 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -95,16 +95,42 @@ TEST_F(ProjMgrUnitTests, Validate_Logger) { }; auto& ss = ProjMgrLogger::Get().GetStringStream(); - // Test quite mode - ProjMgrLogger::m_quiet = true; - string expErrMsg = "error csolution: error-1 test message\n\ + + // Test non-verbose mode + ProjMgrLogger::m_quiet = false; + ProjMgrLogger::m_verbose = false; + string expErrMsg = "debug csolution: debug-1 test message\n\ +warning csolution: warning-1 test message\n\ +test.warn - warning csolution: warning-2 test message\n\ +test.warn:1:1 - warning csolution: warning-3 test message\n\ +error csolution: error-1 test message\n\ test.err - error csolution: error-2 test message\n\ test.err:1:1 - error csolution: error-3 test message\n"; string expOutMsg = "cout test message\n"; printLogMsgs(); - auto outStr = streamRedirect.GetOutString(); - auto errStr = streamRedirect.GetErrorString(); + string outStr = streamRedirect.GetOutString(); + string errStr = streamRedirect.GetErrorString(); + EXPECT_STREQ(outStr.c_str(), expOutMsg.c_str()); + EXPECT_STREQ(errStr.c_str(), expErrMsg.c_str()); + EXPECT_EQ(ProjMgrLogger::Get().GetWarnsForContext().size(), 3); + EXPECT_EQ(ProjMgrLogger::Get().GetInfosForContext().size(), 3); + EXPECT_EQ(ProjMgrLogger::Get().GetErrorsForContext().size(), 3); + EXPECT_TRUE(ss.str().empty()); + + // Test quite mode with verbose on + ProjMgrLogger::Get().Clear(); + ProjMgrLogger::m_quiet = true; + ProjMgrLogger::m_verbose = true; + streamRedirect.ClearStringStreams(); + expErrMsg = "error csolution: error-1 test message\n\ +test.err - error csolution: error-2 test message\n\ +test.err:1:1 - error csolution: error-3 test message\n"; + expOutMsg = "cout test message\n"; + + printLogMsgs(); + outStr = streamRedirect.GetOutString(); + errStr = streamRedirect.GetErrorString(); EXPECT_STREQ(outStr.c_str(), expOutMsg.c_str()); EXPECT_STREQ(errStr.c_str(), expErrMsg.c_str()); EXPECT_TRUE(ss.str().empty()); @@ -112,7 +138,7 @@ test.err:1:1 - error csolution: error-3 test message\n"; EXPECT_EQ(ProjMgrLogger::Get().GetInfosForContext().size(), 3); EXPECT_EQ(ProjMgrLogger::Get().GetErrorsForContext().size(), 3); - // Test non-quite mode + // Test non-quite mode with verbose on ProjMgrLogger::Get().Clear(); ProjMgrLogger::m_quiet = false; streamRedirect.ClearStringStreams(); @@ -138,7 +164,7 @@ cout test message\n"; EXPECT_EQ(ProjMgrLogger::Get().GetErrorsForContext().size(), 3); EXPECT_TRUE(ss.str().empty()); - // Test silent mode + // Test silent mode with verbose on ProjMgrLogger::Get().Clear(); ProjMgrLogger::m_silent = true; streamRedirect.ClearStringStreams(); @@ -162,6 +188,7 @@ cout test message\n"; EXPECT_TRUE(ss.str().empty()); // return mode to normal to avoid affecting other tests ProjMgrLogger::m_silent = false; + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgr_EmptyOptions) { @@ -1088,7 +1115,7 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackNoPackList) { } TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFrozen) { - char* argv[8]; + char* argv[9]; StdStreamRedirect streamRedirect; // convert --solution solution.yml @@ -1104,26 +1131,28 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFrozen) { argv[4] = (char*)"-o"; argv[5] = (char*)output.c_str(); argv[6] = (char*)"--cbuildgen"; - argv[7] = (char*)"--frozen-packs"; + argv[7] = (char*)"--verbose"; + argv[8] = (char*)"--frozen-packs"; + // Ensure clean state when starting test ASSERT_TRUE(RteFsUtils::RemoveDir(rtePath)); // 1st run to verify that the cbuild-pack.yml content is stable - EXPECT_NE(0, RunProjMgr(8, argv, m_envp)); + EXPECT_NE(0, RunProjMgr(9, argv, m_envp)); EXPECT_NE(streamRedirect.GetErrorString().find(cbuildPack + " - error csolution: file not allowed to be updated"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPack, cbuildPack); EXPECT_FALSE(RteFsUtils::Exists(rtePath + "/Device")); // 2nd run to verify that the cbuild-pack.yml content is stable streamRedirect.ClearStringStreams(); - EXPECT_NE(0, RunProjMgr(8, argv, m_envp)); + EXPECT_NE(0, RunProjMgr(9, argv, m_envp)); EXPECT_NE(streamRedirect.GetErrorString().find(cbuildPack + " - error csolution: file not allowed to be updated"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPack, cbuildPack); EXPECT_FALSE(RteFsUtils::Exists(rtePath + "/Device")); // 3rd run without --frozen-packs to verify that the list can be updated streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(7, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(8, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRef, cbuildPack); EXPECT_TRUE(RteFsUtils::Exists(rtePath + "/Device")); @@ -1141,7 +1170,7 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFrozen) { // 4th run with --frozen-packs to verify that RTE directory can be generated ASSERT_TRUE(RteFsUtils::RemoveDir(rtePath)); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(8, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file is already up-to-date"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRef, cbuildPack); @@ -1199,7 +1228,7 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackReselectSelectedByPack) { TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackLoadArgument) { error_code ec; - char* argv[9]; + char* argv[10]; StdStreamRedirect streamRedirect; // convert --solution solution.yml @@ -1216,74 +1245,75 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackLoadArgument) { argv[4] = (char*)"-o"; argv[5] = (char*)output.c_str(); argv[6] = (char*)"--cbuildgen"; - argv[7] = (char*)"--load"; + argv[7] = (char*)"--verbose"; + argv[8] = (char*)"--load"; // Test with --load all and without cbuild-pack.yml file - argv[8] = (char*)"all"; + argv[9] = (char*)"all"; RteFsUtils::RemoveFile(cbuildPack); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackAll, cbuildPack); // Test with --load all and with cbuild-pack.yml file - argv[8] = (char*)"all"; + argv[9] = (char*)"all"; fs::copy(fs::path(expectedCbuildPackRequired), fs::path(cbuildPack), fs::copy_options::overwrite_existing, ec); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackAll, cbuildPack); // Test with --load latest and without cbuild-pack.yml file - argv[8] = (char*)"latest"; + argv[9] = (char*)"latest"; RteFsUtils::RemoveFile(cbuildPack); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackLatest, cbuildPack); // Test with --load latest and with cbuild-pack.yml file - argv[8] = (char*)"latest"; + argv[9] = (char*)"latest"; fs::copy(fs::path(expectedCbuildPackRequired), fs::path(cbuildPack), fs::copy_options::overwrite_existing, ec); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackLatest, cbuildPack); // Test with --load required and without cbuild-pack.yml file - argv[8] = (char*)"required"; + argv[9] = (char*)"required"; RteFsUtils::RemoveFile(cbuildPack); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackLatest, cbuildPack); // Test with --load required and with cbuild-pack.yml file - argv[8] = (char*)"required"; + argv[9] = (char*)"required"; fs::copy(fs::path(expectedCbuildPackRequired), fs::path(cbuildPack), fs::copy_options::overwrite_existing, ec); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file is already up-to-date"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequired, cbuildPack); // Test without --load and without cbuild-pack.yml file RteFsUtils::RemoveFile(cbuildPack); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(7, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(8, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackLatest, cbuildPack); // Test without --load but with cbuild-pack.yml file fs::copy(fs::path(expectedCbuildPackRequired), fs::path(cbuildPack), fs::copy_options::overwrite_existing, ec); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(7, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(8, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file is already up-to-date"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequired, cbuildPack); } TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFindUnspecifiedPackUsingLoadArgument) { error_code ec; - char* argv[9]; + char* argv[10]; StdStreamRedirect streamRedirect; // convert --solution solution.yml @@ -1301,54 +1331,55 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFindUnspecifiedPackUsingLoad argv[4] = (char*)"-o"; argv[5] = (char*)output.c_str(); argv[6] = (char*)"--cbuildgen"; - argv[7] = (char*)"--load"; + argv[7] = (char*)"--verbose"; + argv[8] = (char*)"--load"; // Test with --load all and without cbuild-pack.yml file - argv[8] = (char*)"all"; + argv[9] = (char*)"all"; RteFsUtils::RemoveFile(cbuildPack); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackAll, cbuildPack); // Test with --load all and with cbuild-pack.yml file - argv[8] = (char*)"all"; + argv[9] = (char*)"all"; fs::copy(fs::path(expectedCbuildPackRequired), fs::path(cbuildPack), fs::copy_options::overwrite_existing, ec); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackAll, cbuildPack); // Test with --load latest and without cbuild-pack.yml file - argv[8] = (char*)"latest"; + argv[9] = (char*)"latest"; RteFsUtils::RemoveFile(cbuildPack); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackLatest, cbuildPack); // Test with --load latest and with cbuild-pack.yml file - argv[8] = (char*)"latest"; + argv[9] = (char*)"latest"; fs::copy(fs::path(expectedCbuildPackRequired), fs::path(cbuildPack), fs::copy_options::overwrite_existing, ec); streamRedirect.ClearStringStreams(); - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackLatest, cbuildPack); // Test with --load required and without cbuild-pack.yml file - argv[8] = (char*)"required"; + argv[9] = (char*)"required"; RteFsUtils::RemoveFile(cbuildPack); streamRedirect.ClearStringStreams(); - EXPECT_EQ(1, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(1, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); EXPECT_NE(streamRedirect.GetErrorString().find("error csolution: component 'RteTest:ComponentLevel' not found in included packs"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequiredUpdated, cbuildPack); // Test with --load required and with cbuild-pack.yml file - argv[8] = (char*)"required"; + argv[9] = (char*)"required"; fs::copy(fs::path(expectedCbuildPackRequired), fs::path(cbuildPack), fs::copy_options::overwrite_existing, ec); streamRedirect.ClearStringStreams(); - EXPECT_EQ(1, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(1, RunProjMgr(10, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file is already up-to-date"), string::npos); EXPECT_NE(streamRedirect.GetErrorString().find("error csolution: component 'RteTest:ComponentLevel' not found in included packs"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequired, cbuildPack); @@ -1356,7 +1387,7 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFindUnspecifiedPackUsingLoad // Test without --load and without cbuild-pack.yml file RteFsUtils::RemoveFile(cbuildPack); streamRedirect.ClearStringStreams(); - EXPECT_EQ(1, RunProjMgr(7, argv, m_envp)); + EXPECT_EQ(1, RunProjMgr(8, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file generated successfully"), string::npos); EXPECT_NE(streamRedirect.GetErrorString().find("error csolution: component 'RteTest:ComponentLevel' not found in included packs"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequiredUpdated, cbuildPack); @@ -1364,7 +1395,7 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFindUnspecifiedPackUsingLoad // Test without --load but with cbuild-pack.yml file fs::copy(fs::path(expectedCbuildPackRequired), fs::path(cbuildPack), fs::copy_options::overwrite_existing, ec); streamRedirect.ClearStringStreams(); - EXPECT_EQ(1, RunProjMgr(7, argv, m_envp)); + EXPECT_EQ(1, RunProjMgr(8, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file is already up-to-date"), string::npos); EXPECT_NE(streamRedirect.GetErrorString().find("error csolution: component 'RteTest:ComponentLevel' not found in included packs"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequired, cbuildPack); @@ -1659,7 +1690,7 @@ TEST_F(ProjMgrUnitTests, ListLayersAll) { TEST_F(ProjMgrUnitTests, ListLayersCompatible) { StdStreamRedirect streamRedirect; - char* argv[8]; + char* argv[9]; const string& csolution = testinput_folder + "/TestLayers/genericlayers.csolution.yml"; const string& context = "genericlayers.CompatibleLayers+AnyBoard"; argv[1] = (char*)"list"; @@ -1669,7 +1700,8 @@ TEST_F(ProjMgrUnitTests, ListLayersCompatible) { argv[5] = (char*)"-c"; argv[6] = (char*)context.c_str(); argv[7] = (char*)"-d"; - EXPECT_EQ(0, RunProjMgr(8, argv, m_envp)); + argv[8] = (char*)"--verbose"; + EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); const string& expectedErrStr = "\ debug csolution: check for context 'genericlayers.CompatibleLayers\\+AnyBoard'\n\ @@ -1740,17 +1772,18 @@ info csolution: valid configuration #3: \\(context 'genericlayers.CompatibleLaye TEST_F(ProjMgrUnitTests, ListLayersConfigurations_update_idx_pack_layer) { StdStreamRedirect streamRedirect; - char* argv[6]; + char* argv[7]; const string& csolution = testinput_folder + "/TestLayers/config.csolution.yml"; - string expectedOutStr = ".*config.cbuild-idx.yml - info csolution: file generated successfully\\n"; + string expectedOutStr = "[\\s\\S]*config.cbuild-idx.yml - info csolution: file generated successfully\\n"; argv[1] = (char*)"list"; argv[2] = (char*)"layers"; argv[3] = (char*)"--solution"; argv[4] = (char*)csolution.c_str(); argv[5] = (char*)"--update-idx"; + argv[6] = (char*)"--verbose"; - EXPECT_EQ(0, RunProjMgr(6, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(7, argv, m_envp)); EXPECT_TRUE(regex_match(streamRedirect.GetOutString(), regex(expectedOutStr))); ProjMgrTestEnv::CompareFile(testinput_folder + "/TestLayers/ref/config.cbuild-idx.yml", @@ -1760,20 +1793,21 @@ TEST_F(ProjMgrUnitTests, ListLayersConfigurations_update_idx_pack_layer) { TEST_F(ProjMgrUnitTests, ListLayersConfigurations_update_idx_local_layer) { StdStreamRedirect streamRedirect; - char* argv[6]; + char* argv[7]; const string& csolution = testinput_folder + "/TestLayers/select.csolution.yml"; - string expectedOutStr = ".*select.cbuild-idx.yml - info csolution: file generated successfully\\n"; + string expectedOutStr = "[\\s\\S]*select.cbuild-idx.yml - info csolution: file generated successfully\\n"; argv[1] = (char*)"list"; argv[2] = (char*)"layers"; argv[3] = (char*)"--solution"; argv[4] = (char*)csolution.c_str(); argv[5] = (char*)"--update-idx"; + argv[6] = (char*)"--verbose"; - EXPECT_EQ(0, RunProjMgr(6, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(7, argv, m_envp)); EXPECT_TRUE(regex_match(streamRedirect.GetOutString(), regex(expectedOutStr))); ProjMgrTestEnv::CompareFile(testinput_folder + "/TestLayers/ref/select.cbuild-idx.yml", - testinput_folder + "/TestLayers/select.cbuild-idx.yml"); + testinput_folder + "/TestLayers/select.cbuild-idx.yml", ProjMgrTestEnv::StripAbsoluteFunc); EXPECT_TRUE(ProjMgrYamlSchemaChecker().Validate(testinput_folder + "/TestLayers/select.cbuild-idx.yml")); } @@ -1795,14 +1829,15 @@ TEST_F(ProjMgrUnitTests, ListLayersConfigurations_Error) { TEST_F(ProjMgrUnitTests, ListLayersConfigurations) { StdStreamRedirect streamRedirect; - char* argv[6]; + char* argv[7]; const string& csolution = testinput_folder + "/TestLayers/config.csolution.yml"; argv[1] = (char*)"list"; argv[2] = (char*)"layers"; argv[3] = (char*)"--solution"; argv[4] = (char*)csolution.c_str(); argv[5] = (char*)"-d"; - EXPECT_EQ(0, RunProjMgr(6, argv, m_envp)); + argv[6] = (char*)"--verbose"; + EXPECT_EQ(0, RunProjMgr(7, argv, m_envp)); const string& outStr = streamRedirect.GetOutString(); const string& errStr = streamRedirect.GetErrorString(); @@ -2020,7 +2055,7 @@ TEST_F(ProjMgrUnitTests, ListToolchains_with_unknown_toolchain) { TEST_F(ProjMgrUnitTests, ListLayersUniquelyCompatibleBoard) { StdStreamRedirect streamRedirect; - char* argv[8]; + char* argv[9]; const string& csolution = testinput_folder + "/TestLayers/genericlayers.csolution.yml"; const string& context = "genericlayers.CompatibleLayers+Board3"; argv[1] = (char*)"list"; @@ -2030,7 +2065,8 @@ TEST_F(ProjMgrUnitTests, ListLayersUniquelyCompatibleBoard) { argv[5] = (char*)"-c"; argv[6] = (char*)context.c_str(); argv[7] = (char*)"-d"; - EXPECT_EQ(0, RunProjMgr(8, argv, m_envp)); + argv[8] = (char*)"--verbose"; + EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); const string& expectedErrStr = "\ debug csolution: check for context 'genericlayers.CompatibleLayers\\+Board3'\n\ @@ -5016,7 +5052,7 @@ TEST_F(ProjMgrUnitTests, RunProjMgrInvalidContext) { TEST_F(ProjMgrUnitTests, RunProjMgrCovertMultipleContext) { StdStreamRedirect streamRedirect; - char* argv[11]; + char* argv[12]; // convert --solution solution.yml const string& csolution = testinput_folder + "/TestSolution/test.csolution.yml"; @@ -5030,8 +5066,9 @@ TEST_F(ProjMgrUnitTests, RunProjMgrCovertMultipleContext) { argv[8] = (char*)"-c"; argv[9] = (char*)"test1.Release+CM0"; argv[10] = (char*)"--cbuildgen"; + argv[11] = (char*)"--verbose"; - EXPECT_EQ(0, RunProjMgr(11, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(12, argv, m_envp)); auto outStr = streamRedirect.GetOutString(); EXPECT_NE(string::npos, outStr.find("test2.Debug+CM0.cprj")); EXPECT_NE(string::npos, outStr.find("test1.Release+CM0.cprj")); @@ -5068,7 +5105,7 @@ TEST_F(ProjMgrUnitTests, RunProjMgr_YamlEmitterFileCaseIssue) { TEST_F(ProjMgrUnitTests, RunProjMgr_Reverse_Context_Syntax) { StdStreamRedirect streamRedirect; - char* argv[11]; + char* argv[12]; // convert --solution solution.yml const string& csolution = testinput_folder + "/TestSolution/test.csolution.yml"; @@ -5082,8 +5119,9 @@ TEST_F(ProjMgrUnitTests, RunProjMgr_Reverse_Context_Syntax) { argv[8] = (char*)"-c"; argv[9] = (char*)"test1+CM0.Release"; argv[10] = (char*)"--cbuildgen"; + argv[11] = (char*)"--verbose"; - EXPECT_EQ(0, RunProjMgr(11, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(12, argv, m_envp)); auto outStr = streamRedirect.GetOutString(); EXPECT_NE(string::npos, outStr.find("test2.Debug+CM0.cprj - info csolution: file generated successfully")); EXPECT_NE(string::npos, outStr.find("test1.Release+CM0.cprj - info csolution: file generated successfully")); @@ -5328,8 +5366,9 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_cbuildset_file) { argv[6] = (char*)"-c"; argv[7] = (char*)"test1.Release+CM0"; argv[8] = (char*)"--cbuildgen"; + argv[9] = (char*)"--verbose"; - EXPECT_EQ(0, RunProjMgr(9, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(10, argv, m_envp)); auto outStr = streamRedirect.GetOutString(); EXPECT_NE(outStr.find("test1.Release+CM0.cprj - info csolution: file generated successfully"), string::npos); EXPECT_NE(outStr.find("test1.Release+CM0.cbuild.yml - info csolution: file generated successfully"), string::npos); @@ -6589,21 +6628,22 @@ TEST_F(ProjMgrUnitTests, RunProjMgr_conflict_cbuild_set) { TEST_F(ProjMgrUnitTests, ListLayers_update_idx_with_no_compiler_selected) { StdStreamRedirect streamRedirect; - char* argv[6]; + char* argv[7]; const string& csolution = testinput_folder + "/TestLayers/no_compiler.csolution.yml"; - string expectedOutStr = ".*no_compiler.cbuild-idx.yml - info csolution: file generated successfully\\n"; + string expectedOutStr = "[\\s\\S]*no_compiler.cbuild-idx.yml - info csolution: file generated successfully\\n"; argv[1] = (char*)"list"; argv[2] = (char*)"layers"; argv[3] = (char*)"--solution"; argv[4] = (char*)csolution.c_str(); argv[5] = (char*)"--update-idx"; + argv[6] = (char*)"--verbose"; - EXPECT_EQ(0, RunProjMgr(6, argv, m_envp)); + EXPECT_EQ(0, RunProjMgr(7, argv, m_envp)); EXPECT_TRUE(regex_match(streamRedirect.GetOutString(), regex(expectedOutStr))); ProjMgrTestEnv::CompareFile(testinput_folder + "/TestLayers/ref/no_compiler.cbuild-idx.yml", - testinput_folder + "/TestLayers/no_compiler.cbuild-idx.yml"); + testinput_folder + "/TestLayers/no_compiler.cbuild-idx.yml", ProjMgrTestEnv::StripAbsoluteFunc); EXPECT_TRUE(ProjMgrYamlSchemaChecker().Validate(testinput_folder + "/TestLayers/no_compiler.cbuild-idx.yml")); } diff --git a/tools/projmgr/test/src/ProjMgrWorkerUnitTests.cpp b/tools/projmgr/test/src/ProjMgrWorkerUnitTests.cpp index ce943d5e3..f236c3aea 100644 --- a/tools/projmgr/test/src/ProjMgrWorkerUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrWorkerUnitTests.cpp @@ -1520,6 +1520,7 @@ TEST_F(ProjMgrWorkerUnitTests, CheckAndGenerateRegionsHeader) { ContextItem context; LoadPacks(context); InitializeTarget(context); + ProjMgrLogger::m_verbose = true; // Generation fails context.directories.cprj = testoutput_folder; @@ -1547,6 +1548,8 @@ warning csolution: regions header file generation failed\n\ context.linker.regions = "./Device/RteTest_ARMCM0/regions_RteTest_ARMCM0.h"; CheckAndGenerateRegionsHeader(context); EXPECT_TRUE(streamRedirect.GetOutString().empty()); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; }; TEST_F(ProjMgrWorkerUnitTests, GetGeneratorDir) { From b131d6411265c78cd69cb9872ffef824586ff04b Mon Sep 17 00:00:00 2001 From: Jen-Tse Huang Date: Fri, 20 Mar 2026 09:10:19 +0100 Subject: [PATCH 2/8] Fix suggested by Copilot --- tools/projmgr/include/ProjMgrLogger.h | 12 ++++++------ tools/projmgr/test/src/ProjMgrUnitTests.cpp | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/projmgr/include/ProjMgrLogger.h b/tools/projmgr/include/ProjMgrLogger.h index b107b2e6b..5eeb3da80 100644 --- a/tools/projmgr/include/ProjMgrLogger.h +++ b/tools/projmgr/include/ProjMgrLogger.h @@ -59,7 +59,7 @@ class ProjMgrLogger { void Info(const std::string& msg, const std::string& context = std::string(), const std::string& file = std::string(), const int line = 0, const int column = 0); - /** + /** * @brief print debug * @param message */ @@ -84,17 +84,17 @@ class ProjMgrLogger { static bool IsVerbose() { return m_verbose; } /** - * @brief flag to suppress infos and warnings + * @brief flag to suppress infos and warnings */ static bool m_quiet; - /** - * @brief flag to suppress all output and redirect cout to string buffer + /** + * @brief flag to suppress all output and redirect cout to string buffer */ static bool m_silent; - /** - * @brief flag to enable verbose for infos + /** + * @brief flag to enable verbose for infos */ static bool m_verbose; diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index a6bd00ba3..0a748803d 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -118,7 +118,7 @@ test.err:1:1 - error csolution: error-3 test message\n"; EXPECT_EQ(ProjMgrLogger::Get().GetErrorsForContext().size(), 3); EXPECT_TRUE(ss.str().empty()); - // Test quite mode with verbose on + // Test quiet mode with verbose on ProjMgrLogger::Get().Clear(); ProjMgrLogger::m_quiet = true; ProjMgrLogger::m_verbose = true; @@ -138,7 +138,7 @@ test.err:1:1 - error csolution: error-3 test message\n"; EXPECT_EQ(ProjMgrLogger::Get().GetInfosForContext().size(), 3); EXPECT_EQ(ProjMgrLogger::Get().GetErrorsForContext().size(), 3); - // Test non-quite mode with verbose on + // Test non-quiet mode with verbose on ProjMgrLogger::Get().Clear(); ProjMgrLogger::m_quiet = false; streamRedirect.ClearStringStreams(); From fe7b7118dcc134fc34b83fcc129fcc79c4de1edd Mon Sep 17 00:00:00 2001 From: Jen-Tse Huang Date: Fri, 20 Mar 2026 09:37:28 +0100 Subject: [PATCH 3/8] Update tools/projmgr/test/src/ProjMgrUnitTests.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tools/projmgr/test/src/ProjMgrUnitTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index 0a748803d..3f2384caf 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -118,7 +118,7 @@ test.err:1:1 - error csolution: error-3 test message\n"; EXPECT_EQ(ProjMgrLogger::Get().GetErrorsForContext().size(), 3); EXPECT_TRUE(ss.str().empty()); - // Test quiet mode with verbose on + // Test quiet mode with verbose on ProjMgrLogger::Get().Clear(); ProjMgrLogger::m_quiet = true; ProjMgrLogger::m_verbose = true; From fc50409f3430cca8c901b78aea612c917eeecf35 Mon Sep 17 00:00:00 2001 From: Jen-Tse Huang Date: Fri, 20 Mar 2026 09:39:00 +0100 Subject: [PATCH 4/8] Update tools/projmgr/include/ProjMgrLogger.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tools/projmgr/include/ProjMgrLogger.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/projmgr/include/ProjMgrLogger.h b/tools/projmgr/include/ProjMgrLogger.h index 5eeb3da80..620951a12 100644 --- a/tools/projmgr/include/ProjMgrLogger.h +++ b/tools/projmgr/include/ProjMgrLogger.h @@ -94,7 +94,7 @@ class ProjMgrLogger { static bool m_silent; /** - * @brief flag to enable verbose for infos + * @brief flag to enable verbose for infos */ static bool m_verbose; From e0fc8d623bfc5d627211e51598801077e2f79c04 Mon Sep 17 00:00:00 2001 From: Jen-Tse Huang Date: Fri, 20 Mar 2026 13:27:00 +0100 Subject: [PATCH 5/8] Add validation of mutually exclusive command line options '-q' and '-v' --- tools/projmgr/src/ProjMgr.cpp | 6 ++++ tools/projmgr/test/src/ProjMgrUnitTests.cpp | 39 ++++++++++++++------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/tools/projmgr/src/ProjMgr.cpp b/tools/projmgr/src/ProjMgr.cpp index b7b6a7641..aeef2d896 100644 --- a/tools/projmgr/src/ProjMgr.cpp +++ b/tools/projmgr/src/ProjMgr.cpp @@ -314,6 +314,12 @@ int ProjMgr::ParseCommandLine(int argc, char** argv) { return PrintUsage(optionsDict, m_command, m_args) ? -1 : 1; } + // Validate mutually exclusive options + if (ProjMgrLogger::m_quiet && ProjMgrLogger::m_verbose) { + ProjMgrLogger::Get().Error("command line options '--quiet' and '--verbose' are mutually exclusive"); + return ErrorCode::ERROR; + } + // Set load packs policy if (!SetLoadPacksPolicy()) { return ErrorCode::ERROR; diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index 3f2384caf..75d1e067b 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -96,9 +96,10 @@ TEST_F(ProjMgrUnitTests, Validate_Logger) { auto& ss = ProjMgrLogger::Get().GetStringStream(); - // Test non-verbose mode + // Test verbose mode + ProjMgrLogger::Get().Clear(); ProjMgrLogger::m_quiet = false; - ProjMgrLogger::m_verbose = false; + ProjMgrLogger::m_verbose = true; string expErrMsg = "debug csolution: debug-1 test message\n\ warning csolution: warning-1 test message\n\ test.warn - warning csolution: warning-2 test message\n\ @@ -106,7 +107,10 @@ test.warn:1:1 - warning csolution: warning-3 test message\n\ error csolution: error-1 test message\n\ test.err - error csolution: error-2 test message\n\ test.err:1:1 - error csolution: error-3 test message\n"; - string expOutMsg = "cout test message\n"; + string expOutMsg = "info csolution: info-1 test message\n\ +test.info - info csolution: info-2 test message\n\ +test.info:1:1 - info csolution: info-3 test message\n\ +cout test message\n"; printLogMsgs(); string outStr = streamRedirect.GetOutString(); @@ -118,10 +122,10 @@ test.err:1:1 - error csolution: error-3 test message\n"; EXPECT_EQ(ProjMgrLogger::Get().GetErrorsForContext().size(), 3); EXPECT_TRUE(ss.str().empty()); - // Test quiet mode with verbose on + // Test quiet mode ProjMgrLogger::Get().Clear(); ProjMgrLogger::m_quiet = true; - ProjMgrLogger::m_verbose = true; + ProjMgrLogger::m_verbose = false; streamRedirect.ClearStringStreams(); expErrMsg = "error csolution: error-1 test message\n\ test.err - error csolution: error-2 test message\n\ @@ -138,7 +142,7 @@ test.err:1:1 - error csolution: error-3 test message\n"; EXPECT_EQ(ProjMgrLogger::Get().GetInfosForContext().size(), 3); EXPECT_EQ(ProjMgrLogger::Get().GetErrorsForContext().size(), 3); - // Test non-quiet mode with verbose on + // Test normal mode (non-quiet and non-verbose) ProjMgrLogger::Get().Clear(); ProjMgrLogger::m_quiet = false; streamRedirect.ClearStringStreams(); @@ -149,10 +153,7 @@ test.warn:1:1 - warning csolution: warning-3 test message\n\ error csolution: error-1 test message\n\ test.err - error csolution: error-2 test message\n\ test.err:1:1 - error csolution: error-3 test message\n"; - expOutMsg = "info csolution: info-1 test message\n\ -test.info - info csolution: info-2 test message\n\ -test.info:1:1 - info csolution: info-3 test message\n\ -cout test message\n"; + expOutMsg = "cout test message\n"; printLogMsgs(); outStr = streamRedirect.GetOutString(); @@ -164,7 +165,7 @@ cout test message\n"; EXPECT_EQ(ProjMgrLogger::Get().GetErrorsForContext().size(), 3); EXPECT_TRUE(ss.str().empty()); - // Test silent mode with verbose on + // Test silent mode ProjMgrLogger::Get().Clear(); ProjMgrLogger::m_silent = true; streamRedirect.ClearStringStreams(); @@ -188,7 +189,6 @@ cout test message\n"; EXPECT_TRUE(ss.str().empty()); // return mode to normal to avoid affecting other tests ProjMgrLogger::m_silent = false; - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgr_EmptyOptions) { @@ -7493,3 +7493,18 @@ TEST_F(ProjMgrUnitTests, DuplicateComponents) { } } } + +TEST_F(ProjMgrUnitTests, ParseCommandLine_MutualExclusionOptions) { + StdStreamRedirect streamRedirect; + const string csolution = testinput_folder + "/TestSolution/test.csolution.yml"; + char* argv[6]; + argv[1] = (char*)"convert"; + argv[2] = (char*)"--solution"; + argv[3] = (char*)csolution.c_str(); + argv[4] = (char*)"--quiet"; + argv[5] = (char*)"--verbose"; + + EXPECT_EQ(1, RunProjMgr(6, argv, m_envp)); + auto errStr = streamRedirect.GetErrorString(); + EXPECT_NE(string::npos, errStr.find("error csolution: command line options '--quiet' and '--verbose' are mutually exclusive")); +} From 9739f8200ee0f9fb0daf84895a8bd7711687756a Mon Sep 17 00:00:00 2001 From: Jen-Tse Huang Date: Fri, 20 Mar 2026 14:24:08 +0100 Subject: [PATCH 6/8] Make sure to reset logger flags after each unit test --- tools/projmgr/test/src/ProjMgrUnitTests.cpp | 47 +++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index 75d1e067b..b9c8cf43a 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -1183,6 +1183,8 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFrozen) { EXPECT_TRUE(RteFsUtils::Exists(testinput_folder + "/TestSolution/PackLocking/RTE/Device/RteTest_ARMCM3/system_ARMCM3.c.base@1.2.2")); RteFsUtils::RemoveFile(expectedCbuildPack); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFrozenNoPackFile) { @@ -1309,6 +1311,8 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackLoadArgument) { EXPECT_EQ(0, RunProjMgr(8, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file is already up-to-date"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequired, cbuildPack); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFindUnspecifiedPackUsingLoadArgument) { @@ -1399,6 +1403,8 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFindUnspecifiedPackUsingLoad EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file is already up-to-date"), string::npos); EXPECT_NE(streamRedirect.GetErrorString().find("error csolution: component 'RteTest:ComponentLevel' not found in included packs"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequired, cbuildPack); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgrSolution_CbuildPackLocalPackIgnored) { @@ -1767,6 +1773,8 @@ info csolution: valid configuration #3: \\(context 'genericlayers.CompatibleLaye "; const string& outStr = streamRedirect.GetOutString(); EXPECT_TRUE(regex_match(outStr, regex(expectedOutStr))); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } @@ -1789,6 +1797,8 @@ TEST_F(ProjMgrUnitTests, ListLayersConfigurations_update_idx_pack_layer) { ProjMgrTestEnv::CompareFile(testinput_folder + "/TestLayers/ref/config.cbuild-idx.yml", testinput_folder + "/TestLayers/config.cbuild-idx.yml", ProjMgrTestEnv::StripAbsoluteFunc); EXPECT_TRUE(ProjMgrYamlSchemaChecker().Validate(testinput_folder + "/TestLayers/config.cbuild-idx.yml")); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListLayersConfigurations_update_idx_local_layer) { @@ -1809,6 +1819,8 @@ TEST_F(ProjMgrUnitTests, ListLayersConfigurations_update_idx_local_layer) { ProjMgrTestEnv::CompareFile(testinput_folder + "/TestLayers/ref/select.cbuild-idx.yml", testinput_folder + "/TestLayers/select.cbuild-idx.yml", ProjMgrTestEnv::StripAbsoluteFunc); EXPECT_TRUE(ProjMgrYamlSchemaChecker().Validate(testinput_folder + "/TestLayers/select.cbuild-idx.yml")); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListLayersConfigurations_Error) { @@ -1861,6 +1873,8 @@ TEST_F(ProjMgrUnitTests, ListLayersConfigurations) { set: set3.select2 \\(connect G - set 3 select 2\\)\n\ "; EXPECT_TRUE(regex_search(outStr, regex(expectedOutStr))); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListLayersMultipleSelect) { @@ -1894,6 +1908,8 @@ info csolution: valid configuration #2: \\(context 'select\\+RteTest_ARMCM3'\\)\ const string& outStr = streamRedirect.GetOutString(); EXPECT_TRUE(regex_match(outStr, regex(expectedOutStr))); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListToolchains) { @@ -1976,6 +1992,8 @@ IAR@9.32.5\n\ const string& outStr = streamRedirect.GetOutString(); EXPECT_TRUE(regex_match(outStr, regex(expectedOutStr))); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListToolchainsSolution) { @@ -2103,6 +2121,8 @@ info csolution: valid configuration #1: \\(context 'genericlayers.CompatibleLaye const string& outStr = streamRedirect.GetOutString(); EXPECT_TRUE(regex_match(outStr, regex(expectedOutStr))); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListLayersIncompatible) { @@ -2399,6 +2419,8 @@ error csolution: no compatible software layer found. Review required connections errStr = streamRedirect.GetErrorString(); errStr.erase(std::remove(errStr.begin(), errStr.end(), '\n'), errStr.cend()); EXPECT_TRUE(regex_match(errStr, regex(expectedErrStr))); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_quiet = false; } TEST_F(ProjMgrUnitTests, LayerVariablesNotDefined_SearchPath) { @@ -4133,6 +4155,8 @@ TEST_F(ProjMgrUnitTests, Convert_ValidationResults_Quiet_Mode) { EXPECT_EQ(string::npos, errStr.find("warning csolution")); EXPECT_EQ(string::npos, errStr.find("debug csolution")); EXPECT_STREQ(errStr.c_str(), expectedMsg.c_str()); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_quiet = false; } TEST_F(ProjMgrUnitTests, OutputDirs) { @@ -4902,6 +4926,8 @@ info csolution: config files for each component:\n\ outStr = streamRedirect.GetOutString(); const string expected2 = "../.cmsis/test+CM0.dbgconf@0.0.2 (up to date)\n"; EXPECT_EQ(outStr, expected2); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgr_ListConfigsWithoutInput) { @@ -5074,6 +5100,8 @@ TEST_F(ProjMgrUnitTests, RunProjMgrCovertMultipleContext) { EXPECT_NE(string::npos, outStr.find("test1.Release+CM0.cprj")); EXPECT_EQ(string::npos, outStr.find("test1.Debug+CM0.cprj")); EXPECT_EQ(string::npos, outStr.find("test2.Debug+CM3.cprj")); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } /* @@ -5127,6 +5155,8 @@ TEST_F(ProjMgrUnitTests, RunProjMgr_Reverse_Context_Syntax) { EXPECT_NE(string::npos, outStr.find("test1.Release+CM0.cprj - info csolution: file generated successfully")); EXPECT_EQ(string::npos, outStr.find("test1.Debug+CM0.cprj")); EXPECT_EQ(string::npos, outStr.find("test2.Debug+CM3.cprj")); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, FileLanguageAndScope) { @@ -5374,6 +5404,8 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_cbuildset_file) { EXPECT_NE(outStr.find("test1.Release+CM0.cbuild.yml - info csolution: file generated successfully"), string::npos); EXPECT_TRUE(RteFsUtils::Exists(cbuildSetFile)); ProjMgrTestEnv::CompareFile(cbuildSetFile, testinput_folder + "/TestSolution/ref/cbuild/specific_contexts_test.cbuild-set.yml"); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } { @@ -5761,6 +5793,8 @@ RteTestExternalGenerator (Global Registered Generator)\n\ EXPECT_TRUE(outStr.find(expected) != string::npos); RteFsUtils::RemoveFile(dstGlobalGenerator); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ClassicGeneratorListVerbose) { @@ -5786,6 +5820,8 @@ RteTestGeneratorWithKey (RteTest Generator with Key Description)\n\ "; auto outStr = streamRedirect.GetOutString(); EXPECT_TRUE(outStr.find(expected) != string::npos); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, DeviceAttributes) { @@ -6645,6 +6681,8 @@ TEST_F(ProjMgrUnitTests, ListLayers_update_idx_with_no_compiler_selected) { ProjMgrTestEnv::CompareFile(testinput_folder + "/TestLayers/ref/no_compiler.cbuild-idx.yml", testinput_folder + "/TestLayers/no_compiler.cbuild-idx.yml", ProjMgrTestEnv::StripAbsoluteFunc); EXPECT_TRUE(ProjMgrYamlSchemaChecker().Validate(testinput_folder + "/TestLayers/no_compiler.cbuild-idx.yml")); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ConfigFilesUpdate) { @@ -7225,6 +7263,8 @@ PreIncludeEnvFolder@1.0.0 \\(ARM::RteTest@0.1.0\\)\n\ EXPECT_EQ(0, RunProjMgr(6, argv, 0)); outStr = streamRedirect.GetOutString(); EXPECT_TRUE(outStr.empty()); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } @@ -7281,6 +7321,8 @@ Board3 \\(ARM::RteTest_DFP@0.2.0\\)\n\ file: .*/ARM/RteTest_DFP/0.2.0/Templates/board3.csolution.yml\n\ copy-to: Template3\n\ "))); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ConvertActiveTargetSet) { @@ -7427,6 +7469,8 @@ CMSIS-DAP@pyOCD\n\ CMSIS-DAP@Arm-Debugger\n\ CMSIS-DAP@armdbg\n\ "))); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, WestSupport) { @@ -7507,4 +7551,7 @@ TEST_F(ProjMgrUnitTests, ParseCommandLine_MutualExclusionOptions) { EXPECT_EQ(1, RunProjMgr(6, argv, m_envp)); auto errStr = streamRedirect.GetErrorString(); EXPECT_NE(string::npos, errStr.find("error csolution: command line options '--quiet' and '--verbose' are mutually exclusive")); + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_quiet = false; + ProjMgrLogger::m_verbose = false; } From c688f434be6d657e3045af878c68ab8cfc4b146c Mon Sep 17 00:00:00 2001 From: Jen-Tse Huang Date: Fri, 20 Mar 2026 15:44:37 +0100 Subject: [PATCH 7/8] Reset logger flags using `TearDown()` --- .../test/src/ProjMgrGeneratorUnitTests.cpp | 7 +++ tools/projmgr/test/src/ProjMgrUnitTests.cpp | 51 ++----------------- .../test/src/ProjMgrWorkerUnitTests.cpp | 8 ++- 3 files changed, 16 insertions(+), 50 deletions(-) diff --git a/tools/projmgr/test/src/ProjMgrGeneratorUnitTests.cpp b/tools/projmgr/test/src/ProjMgrGeneratorUnitTests.cpp index b7f6874f3..195554a85 100644 --- a/tools/projmgr/test/src/ProjMgrGeneratorUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrGeneratorUnitTests.cpp @@ -6,6 +6,7 @@ #include "ProjMgr.h" #include "ProjMgrTestEnv.h" +#include "ProjMgrLogger.h" #include "RteFsUtils.h" #include "gtest/gtest.h" #include @@ -17,6 +18,12 @@ class ProjMgrGeneratorUnitTests : public ProjMgrGenerator, public ::testing::Tes protected: ProjMgrGeneratorUnitTests() {} virtual ~ProjMgrGeneratorUnitTests() {} + + void TearDown() { + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_quiet = false; + ProjMgrLogger::m_verbose = false; + } }; TEST_F(ProjMgrGeneratorUnitTests, GetStringFromVector) { diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index b9c8cf43a..019bf94b9 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -36,7 +36,9 @@ class ProjMgrUnitTests : public ProjMgr, public ::testing::Test { }; void TearDown() { - // reserved + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_quiet = false; + ProjMgrLogger::m_verbose = false; } void GetFilesInTree(const string& dir, set& files) { @@ -1183,8 +1185,6 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFrozen) { EXPECT_TRUE(RteFsUtils::Exists(testinput_folder + "/TestSolution/PackLocking/RTE/Device/RteTest_ARMCM3/system_ARMCM3.c.base@1.2.2")); RteFsUtils::RemoveFile(expectedCbuildPack); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFrozenNoPackFile) { @@ -1311,8 +1311,6 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackLoadArgument) { EXPECT_EQ(0, RunProjMgr(8, argv, m_envp)); EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file is already up-to-date"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequired, cbuildPack); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFindUnspecifiedPackUsingLoadArgument) { @@ -1403,8 +1401,6 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_LockPackFindUnspecifiedPackUsingLoad EXPECT_NE(streamRedirect.GetOutString().find(cbuildPack + " - info csolution: file is already up-to-date"), string::npos); EXPECT_NE(streamRedirect.GetErrorString().find("error csolution: component 'RteTest:ComponentLevel' not found in included packs"), string::npos); ProjMgrTestEnv::CompareFile(expectedCbuildPackRequired, cbuildPack); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgrSolution_CbuildPackLocalPackIgnored) { @@ -1773,8 +1769,6 @@ info csolution: valid configuration #3: \\(context 'genericlayers.CompatibleLaye "; const string& outStr = streamRedirect.GetOutString(); EXPECT_TRUE(regex_match(outStr, regex(expectedOutStr))); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } @@ -1797,8 +1791,6 @@ TEST_F(ProjMgrUnitTests, ListLayersConfigurations_update_idx_pack_layer) { ProjMgrTestEnv::CompareFile(testinput_folder + "/TestLayers/ref/config.cbuild-idx.yml", testinput_folder + "/TestLayers/config.cbuild-idx.yml", ProjMgrTestEnv::StripAbsoluteFunc); EXPECT_TRUE(ProjMgrYamlSchemaChecker().Validate(testinput_folder + "/TestLayers/config.cbuild-idx.yml")); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListLayersConfigurations_update_idx_local_layer) { @@ -1819,8 +1811,6 @@ TEST_F(ProjMgrUnitTests, ListLayersConfigurations_update_idx_local_layer) { ProjMgrTestEnv::CompareFile(testinput_folder + "/TestLayers/ref/select.cbuild-idx.yml", testinput_folder + "/TestLayers/select.cbuild-idx.yml", ProjMgrTestEnv::StripAbsoluteFunc); EXPECT_TRUE(ProjMgrYamlSchemaChecker().Validate(testinput_folder + "/TestLayers/select.cbuild-idx.yml")); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListLayersConfigurations_Error) { @@ -1873,8 +1863,6 @@ TEST_F(ProjMgrUnitTests, ListLayersConfigurations) { set: set3.select2 \\(connect G - set 3 select 2\\)\n\ "; EXPECT_TRUE(regex_search(outStr, regex(expectedOutStr))); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListLayersMultipleSelect) { @@ -1908,8 +1896,6 @@ info csolution: valid configuration #2: \\(context 'select\\+RteTest_ARMCM3'\\)\ const string& outStr = streamRedirect.GetOutString(); EXPECT_TRUE(regex_match(outStr, regex(expectedOutStr))); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListToolchains) { @@ -1992,8 +1978,6 @@ IAR@9.32.5\n\ const string& outStr = streamRedirect.GetOutString(); EXPECT_TRUE(regex_match(outStr, regex(expectedOutStr))); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListToolchainsSolution) { @@ -2121,8 +2105,6 @@ info csolution: valid configuration #1: \\(context 'genericlayers.CompatibleLaye const string& outStr = streamRedirect.GetOutString(); EXPECT_TRUE(regex_match(outStr, regex(expectedOutStr))); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ListLayersIncompatible) { @@ -2419,8 +2401,6 @@ error csolution: no compatible software layer found. Review required connections errStr = streamRedirect.GetErrorString(); errStr.erase(std::remove(errStr.begin(), errStr.end(), '\n'), errStr.cend()); EXPECT_TRUE(regex_match(errStr, regex(expectedErrStr))); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_quiet = false; } TEST_F(ProjMgrUnitTests, LayerVariablesNotDefined_SearchPath) { @@ -4155,8 +4135,6 @@ TEST_F(ProjMgrUnitTests, Convert_ValidationResults_Quiet_Mode) { EXPECT_EQ(string::npos, errStr.find("warning csolution")); EXPECT_EQ(string::npos, errStr.find("debug csolution")); EXPECT_STREQ(errStr.c_str(), expectedMsg.c_str()); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_quiet = false; } TEST_F(ProjMgrUnitTests, OutputDirs) { @@ -4926,8 +4904,6 @@ info csolution: config files for each component:\n\ outStr = streamRedirect.GetOutString(); const string expected2 = "../.cmsis/test+CM0.dbgconf@0.0.2 (up to date)\n"; EXPECT_EQ(outStr, expected2); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, RunProjMgr_ListConfigsWithoutInput) { @@ -5100,8 +5076,6 @@ TEST_F(ProjMgrUnitTests, RunProjMgrCovertMultipleContext) { EXPECT_NE(string::npos, outStr.find("test1.Release+CM0.cprj")); EXPECT_EQ(string::npos, outStr.find("test1.Debug+CM0.cprj")); EXPECT_EQ(string::npos, outStr.find("test2.Debug+CM3.cprj")); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } /* @@ -5155,8 +5129,6 @@ TEST_F(ProjMgrUnitTests, RunProjMgr_Reverse_Context_Syntax) { EXPECT_NE(string::npos, outStr.find("test1.Release+CM0.cprj - info csolution: file generated successfully")); EXPECT_EQ(string::npos, outStr.find("test1.Debug+CM0.cprj")); EXPECT_EQ(string::npos, outStr.find("test2.Debug+CM3.cprj")); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, FileLanguageAndScope) { @@ -5404,8 +5376,6 @@ TEST_F(ProjMgrUnitTests, RunProjMgrSolution_cbuildset_file) { EXPECT_NE(outStr.find("test1.Release+CM0.cbuild.yml - info csolution: file generated successfully"), string::npos); EXPECT_TRUE(RteFsUtils::Exists(cbuildSetFile)); ProjMgrTestEnv::CompareFile(cbuildSetFile, testinput_folder + "/TestSolution/ref/cbuild/specific_contexts_test.cbuild-set.yml"); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } { @@ -5793,8 +5763,6 @@ RteTestExternalGenerator (Global Registered Generator)\n\ EXPECT_TRUE(outStr.find(expected) != string::npos); RteFsUtils::RemoveFile(dstGlobalGenerator); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ClassicGeneratorListVerbose) { @@ -5820,8 +5788,6 @@ RteTestGeneratorWithKey (RteTest Generator with Key Description)\n\ "; auto outStr = streamRedirect.GetOutString(); EXPECT_TRUE(outStr.find(expected) != string::npos); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, DeviceAttributes) { @@ -6681,8 +6647,6 @@ TEST_F(ProjMgrUnitTests, ListLayers_update_idx_with_no_compiler_selected) { ProjMgrTestEnv::CompareFile(testinput_folder + "/TestLayers/ref/no_compiler.cbuild-idx.yml", testinput_folder + "/TestLayers/no_compiler.cbuild-idx.yml", ProjMgrTestEnv::StripAbsoluteFunc); EXPECT_TRUE(ProjMgrYamlSchemaChecker().Validate(testinput_folder + "/TestLayers/no_compiler.cbuild-idx.yml")); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ConfigFilesUpdate) { @@ -7263,8 +7227,6 @@ PreIncludeEnvFolder@1.0.0 \\(ARM::RteTest@0.1.0\\)\n\ EXPECT_EQ(0, RunProjMgr(6, argv, 0)); outStr = streamRedirect.GetOutString(); EXPECT_TRUE(outStr.empty()); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } @@ -7321,8 +7283,6 @@ Board3 \\(ARM::RteTest_DFP@0.2.0\\)\n\ file: .*/ARM/RteTest_DFP/0.2.0/Templates/board3.csolution.yml\n\ copy-to: Template3\n\ "))); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, ConvertActiveTargetSet) { @@ -7469,8 +7429,6 @@ CMSIS-DAP@pyOCD\n\ CMSIS-DAP@Arm-Debugger\n\ CMSIS-DAP@armdbg\n\ "))); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; } TEST_F(ProjMgrUnitTests, WestSupport) { @@ -7551,7 +7509,4 @@ TEST_F(ProjMgrUnitTests, ParseCommandLine_MutualExclusionOptions) { EXPECT_EQ(1, RunProjMgr(6, argv, m_envp)); auto errStr = streamRedirect.GetErrorString(); EXPECT_NE(string::npos, errStr.find("error csolution: command line options '--quiet' and '--verbose' are mutually exclusive")); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_quiet = false; - ProjMgrLogger::m_verbose = false; } diff --git a/tools/projmgr/test/src/ProjMgrWorkerUnitTests.cpp b/tools/projmgr/test/src/ProjMgrWorkerUnitTests.cpp index f236c3aea..d3a15e2c4 100644 --- a/tools/projmgr/test/src/ProjMgrWorkerUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrWorkerUnitTests.cpp @@ -21,6 +21,12 @@ class ProjMgrWorkerUnitTests : public ProjMgrWorker, public ::testing::Test { ProjMgrWorkerUnitTests() : ProjMgrWorker(&parser, nullptr) {} virtual ~ProjMgrWorkerUnitTests() {} + void TearDown() { + // return mode to normal to avoid affecting other tests + ProjMgrLogger::m_quiet = false; + ProjMgrLogger::m_verbose = false; + } + void SetCsolutionPacks(CsolutionItem* csolution, std::vector packs, std::string targetType); }; @@ -1548,8 +1554,6 @@ warning csolution: regions header file generation failed\n\ context.linker.regions = "./Device/RteTest_ARMCM0/regions_RteTest_ARMCM0.h"; CheckAndGenerateRegionsHeader(context); EXPECT_TRUE(streamRedirect.GetOutString().empty()); - // return mode to normal to avoid affecting other tests - ProjMgrLogger::m_verbose = false; }; TEST_F(ProjMgrWorkerUnitTests, GetGeneratorDir) { From 80237989d13ec061baa07130d8a65cc1a4af7e4f Mon Sep 17 00:00:00 2001 From: Jen-Tse Huang Date: Fri, 20 Mar 2026 16:04:35 +0100 Subject: [PATCH 8/8] Use spaces instead of tabs for consistency --- tools/projmgr/test/src/ProjMgrUnitTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/projmgr/test/src/ProjMgrUnitTests.cpp b/tools/projmgr/test/src/ProjMgrUnitTests.cpp index 019bf94b9..2d008d687 100644 --- a/tools/projmgr/test/src/ProjMgrUnitTests.cpp +++ b/tools/projmgr/test/src/ProjMgrUnitTests.cpp @@ -7503,7 +7503,7 @@ TEST_F(ProjMgrUnitTests, ParseCommandLine_MutualExclusionOptions) { argv[1] = (char*)"convert"; argv[2] = (char*)"--solution"; argv[3] = (char*)csolution.c_str(); - argv[4] = (char*)"--quiet"; + argv[4] = (char*)"--quiet"; argv[5] = (char*)"--verbose"; EXPECT_EQ(1, RunProjMgr(6, argv, m_envp));