From 26bc3c8ed7aedc604b4decc1c9f4a440474eec1e Mon Sep 17 00:00:00 2001
From: Sid Hsu <sid.hsu@infineon.com>
Date: Thu, 9 May 2024 11:34:17 +0800
Subject: [PATCH 1/3] [Infineon] Add a test trigger for CYW30739 to fill up
 event logging buffers.

* Implement the TestEventTriggerDelegate class to provide a vendor
  trigger kFillUpEventLoggingBuffer as 0xffffffff00000000 (-4294967296)
  to fill up event logging buffers with HardwareFaultChange and
  SoftwareFault events.
* Implement the OnSoftwareFaultEventHandler method to build and log a
  SoftwareFault event.
---
 examples/platform/infineon/cyw30739/BUILD.gn  |  2 +
 .../infineon/cyw30739/SoftwareDiagnostics.cpp | 62 ++++++++++++++
 .../infineon/cyw30739/SoftwareDiagnostics.h   | 29 +++++++
 .../cyw30739/TestEventTriggerHandler.cpp      | 80 +++++++++++++++++++
 .../cyw30739/TestEventTriggerHandler.h        | 42 ++++++++++
 .../infineon/cyw30739/cyw30739_example.gni    |  2 +
 .../infineon/cyw30739/matter_config.cpp       |  3 +
 7 files changed, 220 insertions(+)
 create mode 100644 examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp
 create mode 100644 examples/platform/infineon/cyw30739/SoftwareDiagnostics.h
 create mode 100644 examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp
 create mode 100644 examples/platform/infineon/cyw30739/TestEventTriggerHandler.h

diff --git a/examples/platform/infineon/cyw30739/BUILD.gn b/examples/platform/infineon/cyw30739/BUILD.gn
index 0673c55c351de3..43d412b04fbf56 100644
--- a/examples/platform/infineon/cyw30739/BUILD.gn
+++ b/examples/platform/infineon/cyw30739/BUILD.gn
@@ -22,6 +22,8 @@ static_library("platform") {
   sources = [
     "LEDWidget.h",
     "OTAConfig.h",
+    "SoftwareDiagnostics.h",
+    "TestEventTriggerHandler.h",
     "main.cpp",
   ]
 
diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp
new file mode 100644
index 00000000000000..a73bffee7abb90
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp
@@ -0,0 +1,62 @@
+/*
+ *
+ *    Copyright (c) 2024 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include "SoftwareDiagnostics.h"
+
+#include <app/clusters/software-diagnostics-server/software-diagnostics-server.h>
+#include <app/util/config.h>
+#include <platform/CHIPDeviceLayer.h>
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+using namespace chip::app::Clusters;
+
+void OnSoftwareFaultEventHandler(const char * faultRecordString)
+{
+#ifdef MATTER_DM_PLUGIN_SOFTWARE_DIAGNOSTICS_SERVER
+    SoftwareDiagnostics::Events::SoftwareFault::Type softwareFault;
+
+    /* Unable to access thread ID in the application layer. */
+    softwareFault.id = 0;
+
+    if (DeviceLayer::PlatformMgrImpl().IsCurrentTask())
+    {
+        softwareFault.name.SetValue(CharSpan::fromCharString("Matter"));
+    }
+    else if (DeviceLayer::ThreadStackMgrImpl().IsCurrentTask())
+    {
+        softwareFault.name.SetValue(CharSpan::fromCharString("Thread"));
+    }
+    else
+    {
+        softwareFault.name.SetValue(CharSpan::fromCharString("App"));
+    }
+
+    softwareFault.faultRecording.SetValue(ByteSpan(Uint8::from_const_char(faultRecordString), strlen(faultRecordString)));
+
+    SoftwareDiagnosticsServer::Instance().OnSoftwareFaultDetect(softwareFault);
+#endif // MATTER_DM_PLUGIN_SOFTWARE_DIAGNOSTICS_SERVER
+}
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.h b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.h
new file mode 100644
index 00000000000000..b076d6e1bfe44c
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.h
@@ -0,0 +1,29 @@
+/*
+ *
+ *    Copyright (c) 2024 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+void OnSoftwareFaultEventHandler(const char * faultRecordString);
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp
new file mode 100644
index 00000000000000..7cf5321ee78d91
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp
@@ -0,0 +1,80 @@
+/*
+ *
+ *    Copyright (c) 2024 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include "TestEventTriggerHandler.h"
+
+#include "SoftwareDiagnostics.h"
+
+#include <app/clusters/general-diagnostics-server/general-diagnostics-server.h>
+#include <platform/CHIPDeviceLayer.h>
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+using namespace chip::app::Clusters;
+
+CHIP_ERROR TestEventTriggerHandler::HandleEventTrigger(uint64_t eventTrigger)
+{
+    switch (eventTrigger)
+    {
+    case kFillUpEventLoggingBuffer:
+        return HandleFillUpEventLoggingBufferEventTriger();
+    default:
+        return CHIP_ERROR_INVALID_ARGUMENT;
+    }
+}
+
+CHIP_ERROR TestEventTriggerHandler::HandleFillUpEventLoggingBufferEventTriger()
+{
+    /* Create a fake hardware fault list. */
+    GeneralFaults<kMaxHardwareFaults> hardwareFaults;
+    for (uint8_t hardwareFault = to_underlying(GeneralDiagnostics::HardwareFaultEnum::kUnspecified);
+         hardwareFault < kMaxHardwareFaults; hardwareFault++)
+    {
+        hardwareFaults.add(hardwareFault);
+    }
+
+    /* Fill up the critical logging buffer by 10 hardware faults. */
+    constexpr uint8_t kHardwareFaultCountForCriticalBuffer = 10;
+    for (uint8_t i = 0; i < kHardwareFaultCountForCriticalBuffer; i++)
+    {
+        GeneralDiagnosticsServer::Instance().OnHardwareFaultsDetect(hardwareFaults, hardwareFaults);
+    }
+
+    /* Create a fake fault message. */
+    constexpr uint64_t kEncodingOverhead        = 0x40;
+    constexpr uint64_t kMaxEventLoggingInfoSize = CHIP_DEVICE_CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE - kEncodingOverhead;
+    static char recordString[kMaxEventLoggingInfoSize + 1];
+    memset(recordString, 0x55, kMaxEventLoggingInfoSize);
+    recordString[kMaxEventLoggingInfoSize] = '\0';
+
+    /* Fill up the info logging buffer by a software fault. */
+    OnSoftwareFaultEventHandler(recordString);
+
+    /* Fill up the debug logging buffer by a software fault. */
+    OnSoftwareFaultEventHandler(recordString);
+
+    return CHIP_NO_ERROR;
+}
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h
new file mode 100644
index 00000000000000..67bddd9815e661
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h
@@ -0,0 +1,42 @@
+/*
+ *
+ *    Copyright (c) 2024 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#pragma once
+
+#include <app/TestEventTriggerDelegate.h>
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+class TestEventTriggerHandler : public chip::TestEventTriggerHandler
+{
+public:
+    static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'0000'0000;
+
+    CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override;
+
+private:
+    CHIP_ERROR HandleFillUpEventLoggingBufferEventTriger();
+};
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/cyw30739_example.gni b/examples/platform/infineon/cyw30739/cyw30739_example.gni
index df8e50ee68bf2f..c336e7407d7d07 100644
--- a/examples/platform/infineon/cyw30739/cyw30739_example.gni
+++ b/examples/platform/infineon/cyw30739/cyw30739_example.gni
@@ -26,6 +26,8 @@ template("cyw30739_example") {
     sources = [
       "${cyw30739_example_dir}/LEDWidget.cpp",
       "${cyw30739_example_dir}/OTAConfig.cpp",
+      "${cyw30739_example_dir}/SoftwareDiagnostics.cpp",
+      "${cyw30739_example_dir}/TestEventTriggerHandler.cpp",
       "${cyw30739_example_dir}/matter_config.cpp",
     ]
 
diff --git a/examples/platform/infineon/cyw30739/matter_config.cpp b/examples/platform/infineon/cyw30739/matter_config.cpp
index 6b0b56730edecd..0b3bbf5a85df81 100644
--- a/examples/platform/infineon/cyw30739/matter_config.cpp
+++ b/examples/platform/infineon/cyw30739/matter_config.cpp
@@ -19,6 +19,7 @@
 
 #include "matter_config.h"
 #include "AppTask.h"
+#include "TestEventTriggerHandler.h"
 #ifdef BOARD_ENABLE_DISPLAY
 #include "GUI.h"
 #endif
@@ -191,8 +192,10 @@ void CYW30739MatterConfig::InitApp(void)
     /* Start CHIP datamodel server */
     static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{};
     static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{};
+    static Infineon::CYW30739::TestEventTriggerHandler sCYW30739TestEventTriggerHandler{};
     VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR);
     VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR);
+    VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sCYW30739TestEventTriggerHandler) == CHIP_NO_ERROR);
     // Create initParams with SDK example defaults here
     static chip::CommonCaseDeviceServerInitParams initParams;
     (void) initParams.InitializeStaticResourcesBeforeServerInit();

From 22b6a366849ead3aaede7ec271c775e3efaa6180 Mon Sep 17 00:00:00 2001
From: Sid Hsu <sid.hsu@infineon.com>
Date: Fri, 10 May 2024 18:16:32 +0800
Subject: [PATCH 2/3] Fix string literals and the vendor event trigger value.

Change the vendor trigger kFillUpEventLoggingBuffer from
0xffffffff00000000 (-4294967296) to 0xffffffff13880000 (-3967287296).
---
 examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp | 6 +++---
 .../platform/infineon/cyw30739/TestEventTriggerHandler.h    | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp
index a73bffee7abb90..ae41f82d14d526 100644
--- a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp
+++ b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp
@@ -39,15 +39,15 @@ void OnSoftwareFaultEventHandler(const char * faultRecordString)
 
     if (DeviceLayer::PlatformMgrImpl().IsCurrentTask())
     {
-        softwareFault.name.SetValue(CharSpan::fromCharString("Matter"));
+        softwareFault.name.SetValue("Matter"_span);
     }
     else if (DeviceLayer::ThreadStackMgrImpl().IsCurrentTask())
     {
-        softwareFault.name.SetValue(CharSpan::fromCharString("Thread"));
+        softwareFault.name.SetValue("Thread"_span);
     }
     else
     {
-        softwareFault.name.SetValue(CharSpan::fromCharString("App"));
+        softwareFault.name.SetValue("App"_span);
     }
 
     softwareFault.faultRecording.SetValue(ByteSpan(Uint8::from_const_char(faultRecordString), strlen(faultRecordString)));
diff --git a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h
index 67bddd9815e661..f83af762976640 100644
--- a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h
+++ b/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h
@@ -28,7 +28,7 @@ namespace CYW30739 {
 class TestEventTriggerHandler : public chip::TestEventTriggerHandler
 {
 public:
-    static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'0000'0000;
+    static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'1388'0000;
 
     CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override;
 

From 3336ccb754a8beecff04688ecd10e92646a6be70 Mon Sep 17 00:00:00 2001
From: Sid Hsu <sid.hsu@infineon.com>
Date: Wed, 22 May 2024 18:07:34 +0800
Subject: [PATCH 3/3] Move common trigger logics to
 GenericEventManagementTestEventTriggerHandler class.

---
 examples/platform/infineon/cyw30739/BUILD.gn  |  2 +-
 ...EventManagementTestEventTriggerHandler.cpp | 47 +++++++++++++++
 ... EventManagementTestEventTriggerHandler.h} |  6 +-
 .../infineon/cyw30739/cyw30739_example.gni    |  2 +-
 .../infineon/cyw30739/matter_config.cpp       |  6 +-
 src/app/BUILD.gn                              |  2 +
 ...EventManagementTestEventTriggerHandler.cpp | 58 ++++++++-----------
 ...icEventManagementTestEventTriggerHandler.h | 37 ++++++++++++
 8 files changed, 119 insertions(+), 41 deletions(-)
 create mode 100644 examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp
 rename examples/platform/infineon/cyw30739/{TestEventTriggerHandler.h => EventManagementTestEventTriggerHandler.h} (80%)
 rename examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp => src/app/GenericEventManagementTestEventTriggerHandler.cpp (55%)
 create mode 100644 src/app/GenericEventManagementTestEventTriggerHandler.h

diff --git a/examples/platform/infineon/cyw30739/BUILD.gn b/examples/platform/infineon/cyw30739/BUILD.gn
index 43d412b04fbf56..8ec7003633cd40 100644
--- a/examples/platform/infineon/cyw30739/BUILD.gn
+++ b/examples/platform/infineon/cyw30739/BUILD.gn
@@ -20,10 +20,10 @@ import("${cyw30739_sdk_build_root}/cyw30739_sdk.gni")
 
 static_library("platform") {
   sources = [
+    "EventManagementTestEventTriggerHandler.h",
     "LEDWidget.h",
     "OTAConfig.h",
     "SoftwareDiagnostics.h",
-    "TestEventTriggerHandler.h",
     "main.cpp",
   ]
 
diff --git a/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp
new file mode 100644
index 00000000000000..c5320f17f64bc4
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp
@@ -0,0 +1,47 @@
+/*
+ *
+ *    Copyright (c) 2024 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#include "EventManagementTestEventTriggerHandler.h"
+
+#include "SoftwareDiagnostics.h"
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+CHIP_ERROR EventManagementTestEventTriggerHandler::HandleEventTrigger(uint64_t eventTrigger)
+{
+    switch (eventTrigger)
+    {
+    case kFillUpEventLoggingBuffer:
+        return HandleFillUpEventLoggingBufferEventTriger();
+    default:
+        return CHIP_ERROR_INVALID_ARGUMENT;
+    }
+}
+
+void EventManagementTestEventTriggerHandler::TriggerSoftwareFaultEvent(const char * faultRecordString)
+{
+    OnSoftwareFaultEventHandler(faultRecordString);
+}
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h
similarity index 80%
rename from examples/platform/infineon/cyw30739/TestEventTriggerHandler.h
rename to examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h
index f83af762976640..b93109dae03dfa 100644
--- a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.h
+++ b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h
@@ -18,14 +18,14 @@
 
 #pragma once
 
-#include <app/TestEventTriggerDelegate.h>
+#include <app/GenericEventManagementTestEventTriggerHandler.h>
 
 namespace chip {
 namespace DeviceLayer {
 namespace Infineon {
 namespace CYW30739 {
 
-class TestEventTriggerHandler : public chip::TestEventTriggerHandler
+class EventManagementTestEventTriggerHandler : public app::GenericEventManagementTestEventTriggerHandler
 {
 public:
     static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'1388'0000;
@@ -33,7 +33,7 @@ class TestEventTriggerHandler : public chip::TestEventTriggerHandler
     CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override;
 
 private:
-    CHIP_ERROR HandleFillUpEventLoggingBufferEventTriger();
+    virtual void TriggerSoftwareFaultEvent(const char * faultRecordString) override;
 };
 
 } // namespace CYW30739
diff --git a/examples/platform/infineon/cyw30739/cyw30739_example.gni b/examples/platform/infineon/cyw30739/cyw30739_example.gni
index c336e7407d7d07..ff07ff6eb28633 100644
--- a/examples/platform/infineon/cyw30739/cyw30739_example.gni
+++ b/examples/platform/infineon/cyw30739/cyw30739_example.gni
@@ -24,10 +24,10 @@ template("cyw30739_example") {
 
   static_library(target_name) {
     sources = [
+      "${cyw30739_example_dir}/EventManagementTestEventTriggerHandler.cpp",
       "${cyw30739_example_dir}/LEDWidget.cpp",
       "${cyw30739_example_dir}/OTAConfig.cpp",
       "${cyw30739_example_dir}/SoftwareDiagnostics.cpp",
-      "${cyw30739_example_dir}/TestEventTriggerHandler.cpp",
       "${cyw30739_example_dir}/matter_config.cpp",
     ]
 
diff --git a/examples/platform/infineon/cyw30739/matter_config.cpp b/examples/platform/infineon/cyw30739/matter_config.cpp
index 0b3bbf5a85df81..7f8edcdfe25392 100644
--- a/examples/platform/infineon/cyw30739/matter_config.cpp
+++ b/examples/platform/infineon/cyw30739/matter_config.cpp
@@ -19,7 +19,7 @@
 
 #include "matter_config.h"
 #include "AppTask.h"
-#include "TestEventTriggerHandler.h"
+#include "EventManagementTestEventTriggerHandler.h"
 #ifdef BOARD_ENABLE_DISPLAY
 #include "GUI.h"
 #endif
@@ -192,10 +192,10 @@ void CYW30739MatterConfig::InitApp(void)
     /* Start CHIP datamodel server */
     static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{};
     static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{};
-    static Infineon::CYW30739::TestEventTriggerHandler sCYW30739TestEventTriggerHandler{};
+    static Infineon::CYW30739::EventManagementTestEventTriggerHandler sEventManagementTestEventTriggerHandler{};
     VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR);
     VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR);
-    VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sCYW30739TestEventTriggerHandler) == CHIP_NO_ERROR);
+    VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sEventManagementTestEventTriggerHandler) == CHIP_NO_ERROR);
     // Create initParams with SDK example defaults here
     static chip::CommonCaseDeviceServerInitParams initParams;
     (void) initParams.InitializeStaticResourcesBeforeServerInit();
diff --git a/src/app/BUILD.gn b/src/app/BUILD.gn
index e40847403cd01f..25a5775874f52f 100644
--- a/src/app/BUILD.gn
+++ b/src/app/BUILD.gn
@@ -324,6 +324,8 @@ static_library("app") {
     "EventManagement.h",
     "FailSafeContext.cpp",
     "FailSafeContext.h",
+    "GenericEventManagementTestEventTriggerHandler.cpp",
+    "GenericEventManagementTestEventTriggerHandler.h",
     "OTAUserConsentCommon.h",
     "ReadHandler.cpp",
     "SafeAttributePersistenceProvider.h",
diff --git a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp b/src/app/GenericEventManagementTestEventTriggerHandler.cpp
similarity index 55%
rename from examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp
rename to src/app/GenericEventManagementTestEventTriggerHandler.cpp
index 7cf5321ee78d91..9c4cc11c8851a9 100644
--- a/examples/platform/infineon/cyw30739/TestEventTriggerHandler.cpp
+++ b/src/app/GenericEventManagementTestEventTriggerHandler.cpp
@@ -16,32 +16,18 @@
  *    limitations under the License.
  */
 
-#include "TestEventTriggerHandler.h"
-
-#include "SoftwareDiagnostics.h"
+#include "GenericEventManagementTestEventTriggerHandler.h"
 
 #include <app/clusters/general-diagnostics-server/general-diagnostics-server.h>
-#include <platform/CHIPDeviceLayer.h>
+#include <platform/GeneralFaults.h>
 
 namespace chip {
-namespace DeviceLayer {
-namespace Infineon {
-namespace CYW30739 {
+namespace app {
 
+using namespace chip::DeviceLayer;
 using namespace chip::app::Clusters;
 
-CHIP_ERROR TestEventTriggerHandler::HandleEventTrigger(uint64_t eventTrigger)
-{
-    switch (eventTrigger)
-    {
-    case kFillUpEventLoggingBuffer:
-        return HandleFillUpEventLoggingBufferEventTriger();
-    default:
-        return CHIP_ERROR_INVALID_ARGUMENT;
-    }
-}
-
-CHIP_ERROR TestEventTriggerHandler::HandleFillUpEventLoggingBufferEventTriger()
+CHIP_ERROR GenericEventManagementTestEventTriggerHandler::HandleFillUpEventLoggingBufferEventTriger()
 {
     /* Create a fake hardware fault list. */
     GeneralFaults<kMaxHardwareFaults> hardwareFaults;
@@ -58,23 +44,29 @@ CHIP_ERROR TestEventTriggerHandler::HandleFillUpEventLoggingBufferEventTriger()
         GeneralDiagnosticsServer::Instance().OnHardwareFaultsDetect(hardwareFaults, hardwareFaults);
     }
 
-    /* Create a fake fault message. */
-    constexpr uint64_t kEncodingOverhead        = 0x40;
-    constexpr uint64_t kMaxEventLoggingInfoSize = CHIP_DEVICE_CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE - kEncodingOverhead;
-    static char recordString[kMaxEventLoggingInfoSize + 1];
-    memset(recordString, 0x55, kMaxEventLoggingInfoSize);
-    recordString[kMaxEventLoggingInfoSize] = '\0';
+    /* Fill up the info logging buffer. */
+    FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE);
 
-    /* Fill up the info logging buffer by a software fault. */
-    OnSoftwareFaultEventHandler(recordString);
-
-    /* Fill up the debug logging buffer by a software fault. */
-    OnSoftwareFaultEventHandler(recordString);
+    /* Fill up the debug logging buffer. */
+    FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE);
 
     return CHIP_NO_ERROR;
 }
 
-} // namespace CYW30739
-} // namespace Infineon
-} // namespace DeviceLayer
+void GenericEventManagementTestEventTriggerHandler::FillUpEventLoggingBufferWithFakeSoftwareFault(size_t bufferSize)
+{
+    /* Create a fake fault message. */
+    constexpr size_t kEncodingOverhead = 0x40;
+    const size_t recordSize            = bufferSize - kEncodingOverhead;
+    char * recordBuffer                = static_cast<char *>(Platform::MemoryAlloc(recordSize));
+    VerifyOrReturn(recordBuffer != nullptr);
+    std::unique_ptr<char, decltype(&Platform::MemoryFree)> recordString(recordBuffer, &Platform::MemoryFree);
+    memset(recordString.get(), 0x55, recordSize);
+    recordString.get()[recordSize - 1] = '\0';
+
+    /* Fill up the logging buffer by a software fault. */
+    TriggerSoftwareFaultEvent(recordString.get());
+}
+
+} // namespace app
 } // namespace chip
diff --git a/src/app/GenericEventManagementTestEventTriggerHandler.h b/src/app/GenericEventManagementTestEventTriggerHandler.h
new file mode 100644
index 00000000000000..da205a420bfaf3
--- /dev/null
+++ b/src/app/GenericEventManagementTestEventTriggerHandler.h
@@ -0,0 +1,37 @@
+/*
+ *
+ *    Copyright (c) 2024 Project CHIP Authors
+ *    All rights reserved.
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+
+#pragma once
+
+#include <app/TestEventTriggerDelegate.h>
+
+namespace chip {
+namespace app {
+
+class GenericEventManagementTestEventTriggerHandler : public TestEventTriggerHandler
+{
+protected:
+    CHIP_ERROR HandleFillUpEventLoggingBufferEventTriger();
+
+private:
+    void FillUpEventLoggingBufferWithFakeSoftwareFault(size_t bufferSize);
+    virtual void TriggerSoftwareFaultEvent(const char * faultRecordString) = 0;
+};
+
+} // namespace app
+} // namespace chip