new file mode 100644
@@ -0,0 +1,132 @@
+From 47e77a544076270eea4c7a814b6d435d1b74d5fa Mon Sep 17 00:00:00 2001
+From: Jiaying Song <jiaying.song.cn@windriver.com>
+Date: Thu, 30 Oct 2025 17:26:39 +0800
+Subject: [PATCH] Make ICU ptest output compatible with Automake format
+
+- Change test result format to PASS/FAIL for Automake compatibility
+- Adjust indentation and timing output formatting
+
+Upstream-Status: Pending
+
+Signed-off-by: Jiaying Song <jiaying.song.cn@windriver.com>
+---
+ test/intltest/intltest.cpp | 24 ++++++++++--------------
+ tools/ctestfw/ctest.c | 14 +++++++-------
+ 2 files changed, 17 insertions(+), 21 deletions(-)
+
+diff --git a/test/intltest/intltest.cpp b/test/intltest/intltest.cpp
+index 33829b0..aa6c3ec 100644
+--- a/test/intltest/intltest.cpp
++++ b/test/intltest/intltest.cpp
+@@ -785,7 +785,7 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
+ IntlTest* saveTest = gTest;
+ gTest = this;
+ do {
+- this->runIndexedTest( index, false, name, par );
++ this->runIndexedTest(index, false, name, par );
+ if (strcmp(name,"skip") == 0) {
+ run_this_test = false;
+ } else {
+@@ -801,8 +801,9 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
+ lastErrorCount = errorCount;
+ execCount++;
+ char msg[256];
+- snprintf(msg, sizeof(msg), "%s {", name);
++ snprintf(msg, sizeof(msg), "Start the test %s ", name);
+ LL_message(UnicodeString(msg), true);
++ LL_indentlevel += 3;
+ UDate timeStart = uprv_getRawUTCtime();
+ strcpy(saveBaseLoc,name);
+ strcat(saveBaseLoc,"/");
+@@ -813,13 +814,9 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
+
+ UDate timeStop = uprv_getRawUTCtime();
+ rval = true; // at least one test has been called
+- char secs[256];
+- if(!no_time) {
+- snprintf(secs, sizeof(secs), "%f", (timeStop-timeStart)/1000.0);
+- } else {
+- secs[0]=0;
+- }
+-
++ char secs[256]= {0};
++ if(!no_time)
++ snprintf(secs, sizeof(secs), "%f", (timeStop-timeStart)/1000.0);
+
+ strcpy(saveBaseLoc,name);
+
+@@ -828,13 +825,14 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
+
+
+ saveBaseLoc[0]=0; /* reset path */
+-
++
++ LL_indentlevel -= 3;
+ if (lastErrorCount == errorCount) {
+- snprintf( msg, sizeof(msg), " } OK: %s ", name );
++ snprintf(msg, sizeof(msg), "PASS: %s ", name);
+ if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
+ lastTestFailed = false;
+ }else{
+- snprintf(msg, sizeof(msg), " } ERRORS (%li) in %s", static_cast<long>(errorCount - lastErrorCount), name);
++ snprintf(msg, sizeof(msg), "FAIL: %s (errors: %li)", name, static_cast<long>(errorCount - lastErrorCount));
+ if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
+
+ for(int i=0;i<LL_indentlevel;i++) {
+@@ -844,7 +842,6 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
+ errorList += "\n";
+ lastTestFailed = true;
+ }
+- LL_indentlevel -= 3;
+ if (lastTestFailed) {
+ LL_message({}, true);
+ }
+@@ -852,7 +849,6 @@ UBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
+ if (lastTestFailed) {
+ LL_message({}, true);
+ }
+- LL_indentlevel += 3;
+ }
+ index++;
+ }while(name);
+diff --git a/tools/ctestfw/ctest.c b/tools/ctestfw/ctest.c
+index 7634526..94abe05 100644
+--- a/tools/ctestfw/ctest.c
++++ b/tools/ctestfw/ctest.c
+@@ -359,16 +359,14 @@ static void iterateTestsWithLevel ( const TestNode* root,
+ strcat(pathToFunction, separatorString);
+ }
+ strcat(pathToFunction, nodeList[i]->name); /* including 'root' */
+-
+- /* print test name and space. */
+- INDENT_LEVEL = depth-1;
+- if(root->name[0]) {
++
++ if(root->test == NULL && root->name[0]) {
+ log_testinfo_i("%s ", root->name);
+- } else {
++ } else if(root->test == NULL) {
+ log_testinfo_i("(%s) ", ARGV_0);
++ } else {
++ ON_LINE = true;
+ }
+- ON_LINE = true; /* we are still on the line with the test name */
+-
+
+ if ( (mode == RUNTESTS) &&
+ (root->test != NULL)) /* if root is a leaf node, run it */
+@@ -413,9 +411,11 @@ static void iterateTestsWithLevel ( const TestNode* root,
+ ctest_xml_testcase(pathToFunction, pathToFunction, timeSeconds, (myERROR_COUNT!=ERROR_COUNT)?"error":NULL);
+
+ if (myERROR_COUNT != ERROR_COUNT) {
++ log_testinfo_i("FAIL: %s", root->name);
+ log_testinfo_i("} ---[%d ERRORS in %s] ", ERROR_COUNT - myERROR_COUNT, pathToFunction);
+ strcpy(ERROR_LOG[ERRONEOUS_FUNCTION_COUNT++], pathToFunction);
+ } else {
++ log_testinfo_i("PASS: %s", root->name);
+ if(!ON_LINE) { /* had some output */
+ int spaces = FLAG_INDENT-(depth-1);
+ log_testinfo_i("} %*s[OK] ", spaces, "---");
+--
+2.34.1
+
@@ -122,6 +122,7 @@ SRC_URI = "${BASE_SRC_URI};name=code \
file://0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch \
file://0001-test-Add-support-ptest.patch \
file://run-ptest \
+ file://0001-Make-ICU-ptest-output-compatible-with-Automake-forma.patch \
"
SRC_URI:append:class-target = "\