Add Attn config option for clearing Attn Interrupts

Added attn config option
Added UT for attn config object
Added UT for cli that uses attn config object

Signed-off-by: austinfcui <austinfcui@gmail.com>
Change-Id: I0e30ebf4d94de676814bf5e173691c4d1ee362cb
diff --git a/attn/attn_config.cpp b/attn/attn_config.cpp
index eae96f9..98ec388 100644
--- a/attn/attn_config.cpp
+++ b/attn/attn_config.cpp
@@ -29,6 +29,7 @@
     iv_flags.set(enCheckstop);
     iv_flags.set(enTerminate);
     iv_flags.set(enBreakpoints);
+    iv_flags.set(enClrAttnIntr);
 }
 
 /** @brief Clear configuration flag */
@@ -44,6 +45,7 @@
     iv_flags.reset(enCheckstop);
     iv_flags.reset(enTerminate);
     iv_flags.reset(enBreakpoints);
+    iv_flags.reset(enClrAttnIntr);
 }
 
 } // namespace attn
diff --git a/attn/attn_config.hpp b/attn/attn_config.hpp
index 7aad393..98a6606 100644
--- a/attn/attn_config.hpp
+++ b/attn/attn_config.hpp
@@ -12,6 +12,7 @@
     enTerminate   = 2,
     enBreakpoints = 3,
     dfltTi        = 4,
+    enClrAttnIntr = 5,
     lastFlag
 };
 
@@ -40,10 +41,6 @@
     /** @brief Clear all configuration flags */
     void clearFlagAll();
 
-    /** @brief Set state of all configuration data */
-    void setConfig(bool i_vital, bool i_checkstop, bool i_terminate,
-                   bool i_breakpoints);
-
   private:
     std::bitset<lastFlag> iv_flags; // configuration flags
 };
diff --git a/attn/attn_handler.cpp b/attn/attn_handler.cpp
index 59dfab3..3252078 100644
--- a/attn/attn_handler.cpp
+++ b/attn/attn_handler.cpp
@@ -78,8 +78,12 @@
  */
 void attnHandler(Config* i_config)
 {
-    // Clear attention interrupts that may still be active (MPIPL)
-    clearAttnInterrupts();
+    // Check if enClrAttnIntr is enabled
+    if (true == i_config->getFlag(enClrAttnIntr))
+    {
+        // Clear attention interrupts that may still be active (MPIPL)
+        clearAttnInterrupts();
+    }
 
     // Vector of active attentions to be handled
     std::vector<Attention> active_attentions;
diff --git a/cli.cpp b/cli.cpp
index 8ab8023..8129821 100644
--- a/cli.cpp
+++ b/cli.cpp
@@ -98,5 +98,18 @@
         {
             o_config->setFlag(attn::dfltTi);
         }
+
+        setting = getCliSetting(i_begin, i_end, "--clrattnintr");
+        if (nullptr != setting)
+        {
+            if (std::string("off") == setting)
+            {
+                o_config->clearFlag(attn::enClrAttnIntr);
+            }
+            if (std::string("on") == setting)
+            {
+                o_config->setFlag(attn::enClrAttnIntr);
+            }
+        }
     }
 }
diff --git a/test/meson.build b/test/meson.build
index e9b6e6e..0517032 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -65,6 +65,7 @@
   'test-pll-unlock',
   'test-resolution',
   'test-tod-step-check-fault',
+  'test-cli',
 ]
 
 foreach tc : testcases
diff --git a/test/test-attention.cpp b/test/test-attention.cpp
index f894535..2b33a6d 100644
--- a/test/test-attention.cpp
+++ b/test/test-attention.cpp
@@ -118,9 +118,7 @@
 
         EXPECT_NE(nullptr, target);
 
-        attr = std::numeric_limits<uint32_t>::max();
         attr = getTrgtType(target);
-
         EXPECT_EQ(TYPE_PROC, attr);
 
         attr = std::numeric_limits<uint32_t>::max();
@@ -142,7 +140,7 @@
     std::unique_ptr<Attention> pAttn;
     Config* config      = nullptr;
     pdbg_target* target = nullptr;
-    uint32_t attr;
+    uint32_t attr       = std::numeric_limits<uint32_t>::max();
 };
 
 TEST_F(AttentionTestProc, TestAttentionProc)
@@ -168,4 +166,37 @@
     EXPECT_EQ(false, config_tmp->getFlag(gAttnFlag));
     config_tmp->setFlag(gAttnFlag);
     EXPECT_EQ(true, config_tmp->getFlag(gAttnFlag));
+}
+
+TEST(AttnConfig, TestAttnConfig)
+{
+    Config* config = new Config();
+
+    // Test clearFlagAll() function.
+    config->clearFlagAll();
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enVital));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enCheckstop));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enTerminate));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enBreakpoints));
+    // The dfltTi flag is not impacted.
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enClrAttnIntr));
+
+    // Test setFlagAll() function.
+    config->setFlagAll();
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enVital));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enCheckstop));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enTerminate));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enBreakpoints));
+    // The dfltTi flag is not impacted.
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enClrAttnIntr));
+
+    // Test setFlag() and getFlag() functions.
+    // Only test one flag.
+    config->clearFlagAll();
+    config->setFlag(enVital);
+    EXPECT_EQ(true, config->getFlag(enVital));
+
+    delete config;
 }
\ No newline at end of file
diff --git a/test/test-cli.cpp b/test/test-cli.cpp
new file mode 100644
index 0000000..08595e4
--- /dev/null
+++ b/test/test-cli.cpp
@@ -0,0 +1,94 @@
+#include <cli.hpp>
+
+#include "gtest/gtest.h"
+
+using namespace attn;
+
+TEST(TestCli, TestCliOptAll)
+{
+
+    // Test --all on options
+    Config* config = new Config();
+    char* argv[2];
+    int i     = 0;
+    argv[i++] = (char*)"--all";
+    argv[i++] = (char*)"on";
+    parseConfig(argv, argv + i, config);
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enVital));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enCheckstop));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enTerminate));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enBreakpoints));
+    // The dfltTi flag is cleared by default and is not updated in the function.
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enClrAttnIntr));
+
+    // Test --all off options
+    // Set the dfltTi flag to default value.
+    config->clearFlag(dfltTi);
+    i         = 0;
+    argv[i++] = (char*)"--all";
+    argv[i++] = (char*)"off";
+    parseConfig(argv, argv + i, config);
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enVital));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enCheckstop));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enTerminate));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enBreakpoints));
+    // The same, the dfltTi flag is not updated in the function.
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enClrAttnIntr));
+    delete config;
+}
+
+TEST(TestCli, TestCliNonAll)
+{
+    // Test options with on switch.
+    Config* config = new Config();
+    char* argv[11];
+    int i     = 0;
+    argv[i++] = (char*)"--vital";
+    argv[i++] = (char*)"on";
+    argv[i++] = (char*)"--checkstop";
+    argv[i++] = (char*)"on";
+    argv[i++] = (char*)"--terminate";
+    argv[i++] = (char*)"on";
+    argv[i++] = (char*)"--breakpoints";
+    argv[i++] = (char*)"on";
+    argv[i++] = (char*)"--clrattnintr";
+    argv[i++] = (char*)"on";
+    // The --defaultti option does not have on/off switch.
+    // If this option is specified, it is enabled.
+    argv[i++] = (char*)"--defaultti";
+
+    parseConfig(argv, argv + i, config);
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enVital));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enCheckstop));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enTerminate));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enBreakpoints));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::enClrAttnIntr));
+    EXPECT_EQ(true, config->getFlag(AttentionFlag::dfltTi));
+
+    // Test options with off switch.
+    // Set the dfltTi flag to default value.
+    config->clearFlag(dfltTi);
+    i         = 0;
+    argv[i++] = (char*)"--vital";
+    argv[i++] = (char*)"off";
+    argv[i++] = (char*)"--checkstop";
+    argv[i++] = (char*)"off";
+    argv[i++] = (char*)"--terminate";
+    argv[i++] = (char*)"off";
+    argv[i++] = (char*)"--breakpoints";
+    argv[i++] = (char*)"off";
+    argv[i++] = (char*)"--clrattnintr";
+    argv[i++] = (char*)"off";
+
+    parseConfig(argv, argv + i, config);
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enVital));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enCheckstop));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enTerminate));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enBreakpoints));
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::enClrAttnIntr));
+    // If the --defaultti option is not specified, it is disabled by default.
+    EXPECT_EQ(false, config->getFlag(AttentionFlag::dfltTi));
+    delete config;
+}