[Infineon] Add a test trigger for CYW30739 to fill up event logging buffers. (#33382)

* [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.

* Fix string literals and the vendor event trigger value.

Change the vendor trigger kFillUpEventLoggingBuffer from
0xffffffff00000000 (-4294967296) to 0xffffffff13880000 (-3967287296).

* Move common trigger logics to GenericEventManagementTestEventTriggerHandler class.
diff --git a/examples/platform/infineon/cyw30739/BUILD.gn b/examples/platform/infineon/cyw30739/BUILD.gn
index 0673c55..8ec7003 100644
--- a/examples/platform/infineon/cyw30739/BUILD.gn
+++ b/examples/platform/infineon/cyw30739/BUILD.gn
@@ -20,8 +20,10 @@
 
 static_library("platform") {
   sources = [
+    "EventManagementTestEventTriggerHandler.h",
     "LEDWidget.h",
     "OTAConfig.h",
+    "SoftwareDiagnostics.h",
     "main.cpp",
   ]
 
diff --git a/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.cpp
new file mode 100644
index 0000000..c5320f1
--- /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/EventManagementTestEventTriggerHandler.h b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.h
new file mode 100644
index 0000000..b93109d
--- /dev/null
+++ b/examples/platform/infineon/cyw30739/EventManagementTestEventTriggerHandler.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/GenericEventManagementTestEventTriggerHandler.h>
+
+namespace chip {
+namespace DeviceLayer {
+namespace Infineon {
+namespace CYW30739 {
+
+class EventManagementTestEventTriggerHandler : public app::GenericEventManagementTestEventTriggerHandler
+{
+public:
+    static constexpr uint64_t kFillUpEventLoggingBuffer = 0xffff'ffff'1388'0000;
+
+    CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override;
+
+private:
+    virtual void TriggerSoftwareFaultEvent(const char * faultRecordString) override;
+};
+
+} // namespace CYW30739
+} // namespace Infineon
+} // namespace DeviceLayer
+} // namespace chip
diff --git a/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp b/examples/platform/infineon/cyw30739/SoftwareDiagnostics.cpp
new file mode 100644
index 0000000..ae41f82
--- /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("Matter"_span);
+    }
+    else if (DeviceLayer::ThreadStackMgrImpl().IsCurrentTask())
+    {
+        softwareFault.name.SetValue("Thread"_span);
+    }
+    else
+    {
+        softwareFault.name.SetValue("App"_span);
+    }
+
+    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 0000000..b076d6e
--- /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/cyw30739_example.gni b/examples/platform/infineon/cyw30739/cyw30739_example.gni
index df8e50e..ff07ff6 100644
--- a/examples/platform/infineon/cyw30739/cyw30739_example.gni
+++ b/examples/platform/infineon/cyw30739/cyw30739_example.gni
@@ -24,8 +24,10 @@
 
   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}/matter_config.cpp",
     ]
 
diff --git a/examples/platform/infineon/cyw30739/matter_config.cpp b/examples/platform/infineon/cyw30739/matter_config.cpp
index 16d2517..c30d55e 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 "EventManagementTestEventTriggerHandler.h"
 #ifdef BOARD_ENABLE_DISPLAY
 #include "GUI.h"
 #endif
@@ -208,8 +209,10 @@
     /* Start CHIP datamodel server */
     static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{};
     static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{};
+    static Infineon::CYW30739::EventManagementTestEventTriggerHandler sEventManagementTestEventTriggerHandler{};
     VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR);
     VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == 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 0eb7e14..4bb4a05 100644
--- a/src/app/BUILD.gn
+++ b/src/app/BUILD.gn
@@ -325,6 +325,8 @@
     "EventManagement.h",
     "FailSafeContext.cpp",
     "FailSafeContext.h",
+    "GenericEventManagementTestEventTriggerHandler.cpp",
+    "GenericEventManagementTestEventTriggerHandler.h",
     "OTAUserConsentCommon.h",
     "ReadHandler.cpp",
     "SafeAttributePersistenceProvider.h",
diff --git a/src/app/GenericEventManagementTestEventTriggerHandler.cpp b/src/app/GenericEventManagementTestEventTriggerHandler.cpp
new file mode 100644
index 0000000..9c4cc11
--- /dev/null
+++ b/src/app/GenericEventManagementTestEventTriggerHandler.cpp
@@ -0,0 +1,72 @@
+/*
+ *
+ *    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 "GenericEventManagementTestEventTriggerHandler.h"
+
+#include <app/clusters/general-diagnostics-server/general-diagnostics-server.h>
+#include <platform/GeneralFaults.h>
+
+namespace chip {
+namespace app {
+
+using namespace chip::DeviceLayer;
+using namespace chip::app::Clusters;
+
+CHIP_ERROR GenericEventManagementTestEventTriggerHandler::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);
+    }
+
+    /* Fill up the info logging buffer. */
+    FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE);
+
+    /* Fill up the debug logging buffer. */
+    FillUpEventLoggingBufferWithFakeSoftwareFault(CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE);
+
+    return CHIP_NO_ERROR;
+}
+
+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 0000000..da205a4
--- /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