diff mbox series

[v2] icu: Add ptest support

Message ID 20250706090152.1225921-1-yamane07ynct@gmail.com
State New
Headers show
Series [v2] icu: Add ptest support | expand

Commit Message

Daisuke Yamane July 6, 2025, 9:01 a.m. UTC
Add following patches.
  - 0001-test-Add-support-ptest.patch
    - Some default paths in test code are invalid at runtime and cause
    - test failures. So add a patch to adjust path to test data for ptest
    - environment.
  - 0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch
    - Since ICU-77.1, a test case (TestLargeMemory) that fails to build
    - in a 32-bit environment. So add a patch to skip this test case.
    - This bug has been reported to upstream. See https://unicode-org.atlassian.net/browse/ICU-23120.
Install icu test-suite to run it as a ptest.
Add icu to PTESTS_FAST because it takes 27sec (less than 30sec) to complete on
qemux86-64 with kvm enabled.

root@qemux86-64:~# ptest-runner icu
START: ptest-runner
2025-07-06T00:46
BEGIN: /usr/lib/icu/ptest
___(snip)___
--------------------------------------
Elapsed Time: 00:00:23.070
PASS: ./intltest
DURATION: 27
END: /usr/lib/icu/ptest
2025-07-06T00:47
STOP: ptest-runner
TOTAL: 1 FAIL: 0

Signed-off-by: Daisuke Yamane <yamane07ynct@gmail.com>
CC: Alexander Kanavin <alex.kanavin@gmail.com>
---
changes in v2:
- Modify do_install_ptest() to detect executable binaries in the test directory and install them.
- Simplified the processing of the run-ptest script.
- Move icu from PTESTS_SLOW to PTESTS_FAST according to the test results of qemux86_64 with kvm.
- Update the commit message to reflect the above changes.
---
 .../distro/include/ptest-packagelists.inc     |  1 +
 ...nicodeStringTest-TestLargeMemory-on-.patch | 28 +++++++
 .../icu/icu/0001-test-Add-support-ptest.patch | 84 +++++++++++++++++++
 meta/recipes-support/icu/icu/run-ptest        | 13 +++
 meta/recipes-support/icu/icu_77-1.bb          | 23 +++++
 5 files changed, 149 insertions(+)
 create mode 100644 meta/recipes-support/icu/icu/0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch
 create mode 100644 meta/recipes-support/icu/icu/0001-test-Add-support-ptest.patch
 create mode 100755 meta/recipes-support/icu/icu/run-ptest

Comments

Alexander Kanavin July 6, 2025, 5:21 p.m. UTC | #1
Thanks, I think this looks good. It still needs to pass Yocto CI, and
someone will tell if there are issues.

Alex

On Sun, 6 Jul 2025 at 11:01, Daisuke Yamane <yamane07ynct@gmail.com> wrote:
>
> Add following patches.
>   - 0001-test-Add-support-ptest.patch
>     - Some default paths in test code are invalid at runtime and cause
>     - test failures. So add a patch to adjust path to test data for ptest
>     - environment.
>   - 0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch
>     - Since ICU-77.1, a test case (TestLargeMemory) that fails to build
>     - in a 32-bit environment. So add a patch to skip this test case.
>     - This bug has been reported to upstream. See https://unicode-org.atlassian.net/browse/ICU-23120.
> Install icu test-suite to run it as a ptest.
> Add icu to PTESTS_FAST because it takes 27sec (less than 30sec) to complete on
> qemux86-64 with kvm enabled.
>
> root@qemux86-64:~# ptest-runner icu
> START: ptest-runner
> 2025-07-06T00:46
> BEGIN: /usr/lib/icu/ptest
> ___(snip)___
> --------------------------------------
> Elapsed Time: 00:00:23.070
> PASS: ./intltest
> DURATION: 27
> END: /usr/lib/icu/ptest
> 2025-07-06T00:47
> STOP: ptest-runner
> TOTAL: 1 FAIL: 0
>
> Signed-off-by: Daisuke Yamane <yamane07ynct@gmail.com>
> CC: Alexander Kanavin <alex.kanavin@gmail.com>
> ---
> changes in v2:
> - Modify do_install_ptest() to detect executable binaries in the test directory and install them.
> - Simplified the processing of the run-ptest script.
> - Move icu from PTESTS_SLOW to PTESTS_FAST according to the test results of qemux86_64 with kvm.
> - Update the commit message to reflect the above changes.
> ---
>  .../distro/include/ptest-packagelists.inc     |  1 +
>  ...nicodeStringTest-TestLargeMemory-on-.patch | 28 +++++++
>  .../icu/icu/0001-test-Add-support-ptest.patch | 84 +++++++++++++++++++
>  meta/recipes-support/icu/icu/run-ptest        | 13 +++
>  meta/recipes-support/icu/icu_77-1.bb          | 23 +++++
>  5 files changed, 149 insertions(+)
>  create mode 100644 meta/recipes-support/icu/icu/0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch
>  create mode 100644 meta/recipes-support/icu/icu/0001-test-Add-support-ptest.patch
>  create mode 100755 meta/recipes-support/icu/icu/run-ptest
>
> diff --git a/meta/conf/distro/include/ptest-packagelists.inc b/meta/conf/distro/include/ptest-packagelists.inc
> index 4253c7b062..4451e00b48 100644
> --- a/meta/conf/distro/include/ptest-packagelists.inc
> +++ b/meta/conf/distro/include/ptest-packagelists.inc
> @@ -25,6 +25,7 @@ PTESTS_FAST = "\
>      gdk-pixbuf \
>      glib-networking \
>      gzip \
> +    icu \
>      json-c \
>      json-glib \
>      libconvert-asn1-perl \
> diff --git a/meta/recipes-support/icu/icu/0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch b/meta/recipes-support/icu/icu/0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch
> new file mode 100644
> index 0000000000..e2e9546679
> --- /dev/null
> +++ b/meta/recipes-support/icu/icu/0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch
> @@ -0,0 +1,28 @@
> +From 4b3e6888c2aaba6465f1bc96f61b17a2513050f3 Mon Sep 17 00:00:00 2001
> +From: David Seifert <soap@gentoo.org>
> +Date: Sat, 21 Jun 2025 12:28:15 +0200
> +Subject: [PATCH] ICU-23120 Mask UnicodeStringTest::TestLargeMemory on 32-bit
> + platforms
> +
> +Upstream-Status: Submitted [https://github.com/unicode-org/icu/pull/3496]
> +Signed-off-by: Daisuke Yamane <yamane07ynct@gmail.com>
> +---
> + test/intltest/ustrtest.cpp | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/test/intltest/ustrtest.cpp b/test/intltest/ustrtest.cpp
> +index 56976b3e3d2..26225f5b5b5 100644
> +--- a/test/intltest/ustrtest.cpp
> ++++ b/test/intltest/ustrtest.cpp
> +@@ -2353,7 +2353,7 @@ void UnicodeStringTest::TestUnicodeStringInsertAppendToSelf() {
> + }
> +
> + void UnicodeStringTest::TestLargeMemory() {
> +-#if U_PLATFORM_IS_LINUX_BASED || U_PLATFORM_IS_DARWIN_BASED
> ++#if (U_PLATFORM_IS_LINUX_BASED || U_PLATFORM_IS_DARWIN_BASED) && (UINTPTR_MAX == 0xFFFFFFFFFFFFFFFF)
> +     if(quick) { return; }
> +     IcuTestErrorCode status(*this, "TestLargeMemory");
> +     constexpr uint32_t len = 2147483643;
> +--
> +2.43.0
> +
> diff --git a/meta/recipes-support/icu/icu/0001-test-Add-support-ptest.patch b/meta/recipes-support/icu/icu/0001-test-Add-support-ptest.patch
> new file mode 100644
> index 0000000000..88350c0db5
> --- /dev/null
> +++ b/meta/recipes-support/icu/icu/0001-test-Add-support-ptest.patch
> @@ -0,0 +1,84 @@
> +From 783d9e0d3d7824fbca53c2c3a80e8e5e23eacc82 Mon Sep 17 00:00:00 2001
> +From: Daisuke Yamane <yamane07ynct@gmail.com>
> +Date: Tue, 1 Jul 2025 18:35:25 +0900
> +Subject: [PATCH] test: Add support ptest
> +
> +Upstream-Status: Inappropriate [oe-core specific]
> +
> +Signed-off-by: Daisuke Yamane <yamane07ynct@gmail.com>
> +---
> + test/cintltst/Makefile.in  | 2 +-
> + test/intltest/Makefile.in  | 2 +-
> + test/intltest/intltest.cpp | 2 +-
> + test/iotest/Makefile.in    | 2 +-
> + test/letest/Makefile.in    | 2 +-
> + 5 files changed, 5 insertions(+), 5 deletions(-)
> +
> +diff --git a/test/cintltst/Makefile.in b/test/cintltst/Makefile.in
> +index 552a105..9cf3071 100644
> +--- a/test/cintltst/Makefile.in
> ++++ b/test/cintltst/Makefile.in
> +@@ -39,7 +39,7 @@ CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/ct
> + ifdef QNX_TARGET
> + DEFS += -D'ICU_UNICODE_VERSION="$(UNICODE_VERSION)"' -D'ICU_VERSION="@VERSION@"' -D'ICUDATA_NAME="$(ICUDATA_PLATFORM_NAME)"' -D'U_TOPSRCDIR="/var/icu_tests"' -D'U_TOPBUILDDIR="/var/icu_tests/"'
> + else
> +-DEFS += -D'ICU_UNICODE_VERSION="$(UNICODE_VERSION)"' -D'ICU_VERSION="@VERSION@"' -D'ICUDATA_NAME="$(ICUDATA_PLATFORM_NAME)"' -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
> ++DEFS += -D'ICU_UNICODE_VERSION="$(UNICODE_VERSION)"' -D'ICU_VERSION="@VERSION@"' -D'ICUDATA_NAME="$(ICUDATA_PLATFORM_NAME)"' -D'U_TOPSRCDIR="$(PTEST_PATH)/"' -D'U_TOPBUILDDIR="$(PTEST_PATH)/"'
> + endif
> + LIBS = $(LIBCTESTFW) $(LIBICUI18N) $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
> +
> +diff --git a/test/intltest/Makefile.in b/test/intltest/Makefile.in
> +index 5d4a03b..ca4e4cd 100644
> +--- a/test/intltest/Makefile.in
> ++++ b/test/intltest/Makefile.in
> +@@ -39,7 +39,7 @@ CPPFLAGS += -DUNISTR_FROM_CHAR_EXPLICIT= -DUNISTR_FROM_STRING_EXPLICIT=
> + ifdef QNX_TARGET
> + DEFS += -D'U_TOPSRCDIR="/var/icu_tests"' -D'U_TOPBUILDDIR="/var/icu_tests/"'
> + else
> +-DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
> ++DEFS += -D'U_TOPSRCDIR="$(PTEST_PATH)/"' -D'U_TOPBUILDDIR="$(PTEST_PATH)/"'
> + endif
> + LIBS = $(LIBCTESTFW) $(LIBICUI18N) $(LIBICUUC) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M) $(LIB_THREAD)
> +
> +diff --git a/test/intltest/intltest.cpp b/test/intltest/intltest.cpp
> +index 3806d0f..33829b0 100644
> +--- a/test/intltest/intltest.cpp
> ++++ b/test/intltest/intltest.cpp
> +@@ -1713,7 +1713,7 @@ static bool fileExists(const char* fileName) {
> +  * Returns the path to icu/testdata/
> +  */
> + const char *IntlTest::getSharedTestData(UErrorCode& err) {
> +-#define SOURCE_TARBALL_TOP U_TOPSRCDIR U_FILE_SEP_STRING ".." U_FILE_SEP_STRING
> ++#define SOURCE_TARBALL_TOP U_TOPSRCDIR U_FILE_SEP_STRING
> + #define REPO_TOP SOURCE_TARBALL_TOP ".." U_FILE_SEP_STRING
> + #define FILE_NAME U_FILE_SEP_STRING "message2" U_FILE_SEP_STRING "valid-tests.json"
> +     const char *srcDataDir = nullptr;
> +diff --git a/test/iotest/Makefile.in b/test/iotest/Makefile.in
> +index 16c510f..9eeff4b 100644
> +--- a/test/iotest/Makefile.in
> ++++ b/test/iotest/Makefile.in
> +@@ -39,7 +39,7 @@ CPPFLAGS += -DUNISTR_FROM_CHAR_EXPLICIT= -DUNISTR_FROM_STRING_EXPLICIT=
> + ifdef QNX_TARGET
> + DEFS += -D'U_TOPSRCDIR="/var/icu_tests"' -D'U_TOPBUILDDIR="/var/icu_tests/"'
> + else
> +-DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
> ++DEFS += -D'U_TOPSRCDIR="$(PTEST_PATH)/"' -D'U_TOPBUILDDIR="$(PTEST_PATH)/"'
> + endif
> + LIBS = $(LIBCTESTFW) $(LIBICUTOOLUTIL) $(LIBICUIO) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
> +
> +diff --git a/test/letest/Makefile.in b/test/letest/Makefile.in
> +index 156c86f..555a820 100644
> +--- a/test/letest/Makefile.in
> ++++ b/test/letest/Makefile.in
> +@@ -30,7 +30,7 @@ BUILDDIR := $(BUILDDIR:test\\cintltst/../../=)
> + BUILDDIR := $(BUILDDIR:TEST\\CINTLTST/../../=)
> +
> + CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/ctestfw -I$(top_srcdir)/tools/toolutil -I$(top_srcdir)/layoutex $(ICULE_CFLAGS) $(ICULEHB_CFLAGS)
> +-DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
> ++DEFS += -D'U_TOPSRCDIR="$(PTEST_PATH)/"' -D'U_TOPBUILDDIR="$(PTEST_PATH)/"'
> + LIBS = $(LIBICULX) $(LIBICUUC) $(LIBICUI18N) $(LIBCTESTFW) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M) $(ICULEHB_LIBS)
> +
> + COMMONOBJECTS = SimpleFontInstance.o
> +--
> +2.43.0
> +
> diff --git a/meta/recipes-support/icu/icu/run-ptest b/meta/recipes-support/icu/icu/run-ptest
> new file mode 100755
> index 0000000000..e5bf27a822
> --- /dev/null
> +++ b/meta/recipes-support/icu/icu/run-ptest
> @@ -0,0 +1,13 @@
> +#!/bin/sh
> +
> +TOPDIR=$(dirname "$(realpath $0)")
> +cd ${TOPDIR}/test/tests
> +TESTS=$(find . -executable -type f)
> +for t in ${TESTS}; do
> +       ./$t
> +       if [ "$?" = "0" ]; then
> +               echo "PASS: $t"
> +       else
> +               echo "FAIL: $t"
> +       fi
> +done
> diff --git a/meta/recipes-support/icu/icu_77-1.bb b/meta/recipes-support/icu/icu_77-1.bb
> index e655b18ad2..cd81a6c729 100644
> --- a/meta/recipes-support/icu/icu_77-1.bb
> +++ b/meta/recipes-support/icu/icu_77-1.bb
> @@ -119,6 +119,9 @@ SRC_URI = "${BASE_SRC_URI};name=code \
>             ${DATA_SRC_URI};name=data \
>             file://filter.json \
>             file://0001-icu-Added-armeb-support.patch \
> +           file://0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch \
> +           file://0001-test-Add-support-ptest.patch \
> +           file://run-ptest \
>             "
>
>  SRC_URI:append:class-target = "\
> @@ -160,3 +163,23 @@ do_make_icudata() {
>  }
>
>  addtask make_icudata before do_configure after do_patch do_prepare_recipe_sysroot
> +
> +inherit ptest
> +RDEPENDS:${PN}-ptest += "bash"
> +
> +do_compile_ptest() {
> +    oe_runmake -C test everything PTEST_PATH=${PTEST_PATH}
> +}
> +
> +do_install_ptest() {
> +    install -d ${D}${PTEST_PATH}/test
> +    install -d ${D}${PTEST_PATH}/data
> +    cp -r ${S}/test/testdata ${D}/${PTEST_PATH}/test
> +    cp -r ${S}/data/unidata ${D}/${PTEST_PATH}/data/
> +    cp -r ${S}/data/sprep ${D}/${PTEST_PATH}/data/
> +    cp -r ${S}/../testdata ${D}/${PTEST_PATH}/
> +    cp -r ${B}/test/testdata/out ${D}/${PTEST_PATH}/test/testdata
> +
> +    install -d ${D}${PTEST_PATH}/test/tests
> +    find ${B}/test/ -type f -executable -exec cp {} ${D}${PTEST_PATH}/test/tests \;
> +}
diff mbox series

Patch

diff --git a/meta/conf/distro/include/ptest-packagelists.inc b/meta/conf/distro/include/ptest-packagelists.inc
index 4253c7b062..4451e00b48 100644
--- a/meta/conf/distro/include/ptest-packagelists.inc
+++ b/meta/conf/distro/include/ptest-packagelists.inc
@@ -25,6 +25,7 @@  PTESTS_FAST = "\
     gdk-pixbuf \
     glib-networking \
     gzip \
+    icu \
     json-c \
     json-glib \
     libconvert-asn1-perl \
diff --git a/meta/recipes-support/icu/icu/0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch b/meta/recipes-support/icu/icu/0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch
new file mode 100644
index 0000000000..e2e9546679
--- /dev/null
+++ b/meta/recipes-support/icu/icu/0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch
@@ -0,0 +1,28 @@ 
+From 4b3e6888c2aaba6465f1bc96f61b17a2513050f3 Mon Sep 17 00:00:00 2001
+From: David Seifert <soap@gentoo.org>
+Date: Sat, 21 Jun 2025 12:28:15 +0200
+Subject: [PATCH] ICU-23120 Mask UnicodeStringTest::TestLargeMemory on 32-bit
+ platforms
+
+Upstream-Status: Submitted [https://github.com/unicode-org/icu/pull/3496]
+Signed-off-by: Daisuke Yamane <yamane07ynct@gmail.com>
+---
+ test/intltest/ustrtest.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/test/intltest/ustrtest.cpp b/test/intltest/ustrtest.cpp
+index 56976b3e3d2..26225f5b5b5 100644
+--- a/test/intltest/ustrtest.cpp
++++ b/test/intltest/ustrtest.cpp
+@@ -2353,7 +2353,7 @@ void UnicodeStringTest::TestUnicodeStringInsertAppendToSelf() {
+ }
+ 
+ void UnicodeStringTest::TestLargeMemory() {
+-#if U_PLATFORM_IS_LINUX_BASED || U_PLATFORM_IS_DARWIN_BASED
++#if (U_PLATFORM_IS_LINUX_BASED || U_PLATFORM_IS_DARWIN_BASED) && (UINTPTR_MAX == 0xFFFFFFFFFFFFFFFF)
+     if(quick) { return; }
+     IcuTestErrorCode status(*this, "TestLargeMemory");
+     constexpr uint32_t len = 2147483643;
+-- 
+2.43.0
+
diff --git a/meta/recipes-support/icu/icu/0001-test-Add-support-ptest.patch b/meta/recipes-support/icu/icu/0001-test-Add-support-ptest.patch
new file mode 100644
index 0000000000..88350c0db5
--- /dev/null
+++ b/meta/recipes-support/icu/icu/0001-test-Add-support-ptest.patch
@@ -0,0 +1,84 @@ 
+From 783d9e0d3d7824fbca53c2c3a80e8e5e23eacc82 Mon Sep 17 00:00:00 2001
+From: Daisuke Yamane <yamane07ynct@gmail.com>
+Date: Tue, 1 Jul 2025 18:35:25 +0900
+Subject: [PATCH] test: Add support ptest
+
+Upstream-Status: Inappropriate [oe-core specific]
+
+Signed-off-by: Daisuke Yamane <yamane07ynct@gmail.com>
+---
+ test/cintltst/Makefile.in  | 2 +-
+ test/intltest/Makefile.in  | 2 +-
+ test/intltest/intltest.cpp | 2 +-
+ test/iotest/Makefile.in    | 2 +-
+ test/letest/Makefile.in    | 2 +-
+ 5 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/test/cintltst/Makefile.in b/test/cintltst/Makefile.in
+index 552a105..9cf3071 100644
+--- a/test/cintltst/Makefile.in
++++ b/test/cintltst/Makefile.in
+@@ -39,7 +39,7 @@ CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/ct
+ ifdef QNX_TARGET
+ DEFS += -D'ICU_UNICODE_VERSION="$(UNICODE_VERSION)"' -D'ICU_VERSION="@VERSION@"' -D'ICUDATA_NAME="$(ICUDATA_PLATFORM_NAME)"' -D'U_TOPSRCDIR="/var/icu_tests"' -D'U_TOPBUILDDIR="/var/icu_tests/"'
+ else
+-DEFS += -D'ICU_UNICODE_VERSION="$(UNICODE_VERSION)"' -D'ICU_VERSION="@VERSION@"' -D'ICUDATA_NAME="$(ICUDATA_PLATFORM_NAME)"' -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
++DEFS += -D'ICU_UNICODE_VERSION="$(UNICODE_VERSION)"' -D'ICU_VERSION="@VERSION@"' -D'ICUDATA_NAME="$(ICUDATA_PLATFORM_NAME)"' -D'U_TOPSRCDIR="$(PTEST_PATH)/"' -D'U_TOPBUILDDIR="$(PTEST_PATH)/"'
+ endif
+ LIBS = $(LIBCTESTFW) $(LIBICUI18N) $(LIBICUTOOLUTIL) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+ 
+diff --git a/test/intltest/Makefile.in b/test/intltest/Makefile.in
+index 5d4a03b..ca4e4cd 100644
+--- a/test/intltest/Makefile.in
++++ b/test/intltest/Makefile.in
+@@ -39,7 +39,7 @@ CPPFLAGS += -DUNISTR_FROM_CHAR_EXPLICIT= -DUNISTR_FROM_STRING_EXPLICIT=
+ ifdef QNX_TARGET
+ DEFS += -D'U_TOPSRCDIR="/var/icu_tests"' -D'U_TOPBUILDDIR="/var/icu_tests/"'
+ else
+-DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
++DEFS += -D'U_TOPSRCDIR="$(PTEST_PATH)/"' -D'U_TOPBUILDDIR="$(PTEST_PATH)/"'
+ endif
+ LIBS = $(LIBCTESTFW) $(LIBICUI18N) $(LIBICUUC) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M) $(LIB_THREAD)
+ 
+diff --git a/test/intltest/intltest.cpp b/test/intltest/intltest.cpp
+index 3806d0f..33829b0 100644
+--- a/test/intltest/intltest.cpp
++++ b/test/intltest/intltest.cpp
+@@ -1713,7 +1713,7 @@ static bool fileExists(const char* fileName) {
+  * Returns the path to icu/testdata/
+  */
+ const char *IntlTest::getSharedTestData(UErrorCode& err) {
+-#define SOURCE_TARBALL_TOP U_TOPSRCDIR U_FILE_SEP_STRING ".." U_FILE_SEP_STRING
++#define SOURCE_TARBALL_TOP U_TOPSRCDIR U_FILE_SEP_STRING
+ #define REPO_TOP SOURCE_TARBALL_TOP ".." U_FILE_SEP_STRING
+ #define FILE_NAME U_FILE_SEP_STRING "message2" U_FILE_SEP_STRING "valid-tests.json"
+     const char *srcDataDir = nullptr;
+diff --git a/test/iotest/Makefile.in b/test/iotest/Makefile.in
+index 16c510f..9eeff4b 100644
+--- a/test/iotest/Makefile.in
++++ b/test/iotest/Makefile.in
+@@ -39,7 +39,7 @@ CPPFLAGS += -DUNISTR_FROM_CHAR_EXPLICIT= -DUNISTR_FROM_STRING_EXPLICIT=
+ ifdef QNX_TARGET
+ DEFS += -D'U_TOPSRCDIR="/var/icu_tests"' -D'U_TOPBUILDDIR="/var/icu_tests/"'
+ else
+-DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
++DEFS += -D'U_TOPSRCDIR="$(PTEST_PATH)/"' -D'U_TOPBUILDDIR="$(PTEST_PATH)/"'
+ endif
+ LIBS = $(LIBCTESTFW) $(LIBICUTOOLUTIL) $(LIBICUIO) $(LIBICUI18N) $(LIBICUUC) $(DEFAULT_LIBS) $(LIB_M)
+ 
+diff --git a/test/letest/Makefile.in b/test/letest/Makefile.in
+index 156c86f..555a820 100644
+--- a/test/letest/Makefile.in
++++ b/test/letest/Makefile.in
+@@ -30,7 +30,7 @@ BUILDDIR := $(BUILDDIR:test\\cintltst/../../=)
+ BUILDDIR := $(BUILDDIR:TEST\\CINTLTST/../../=)
+ 
+ CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/tools/ctestfw -I$(top_srcdir)/tools/toolutil -I$(top_srcdir)/layoutex $(ICULE_CFLAGS) $(ICULEHB_CFLAGS)
+-DEFS += -D'U_TOPSRCDIR="$(top_srcdir)/"' -D'U_TOPBUILDDIR="$(BUILDDIR)"'
++DEFS += -D'U_TOPSRCDIR="$(PTEST_PATH)/"' -D'U_TOPBUILDDIR="$(PTEST_PATH)/"'
+ LIBS = $(LIBICULX) $(LIBICUUC) $(LIBICUI18N) $(LIBCTESTFW) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M) $(ICULEHB_LIBS)
+ 
+ COMMONOBJECTS = SimpleFontInstance.o
+-- 
+2.43.0
+
diff --git a/meta/recipes-support/icu/icu/run-ptest b/meta/recipes-support/icu/icu/run-ptest
new file mode 100755
index 0000000000..e5bf27a822
--- /dev/null
+++ b/meta/recipes-support/icu/icu/run-ptest
@@ -0,0 +1,13 @@ 
+#!/bin/sh
+
+TOPDIR=$(dirname "$(realpath $0)")
+cd ${TOPDIR}/test/tests
+TESTS=$(find . -executable -type f)
+for t in ${TESTS}; do
+	./$t
+	if [ "$?" = "0" ]; then
+		echo "PASS: $t"
+	else
+		echo "FAIL: $t"
+	fi
+done
diff --git a/meta/recipes-support/icu/icu_77-1.bb b/meta/recipes-support/icu/icu_77-1.bb
index e655b18ad2..cd81a6c729 100644
--- a/meta/recipes-support/icu/icu_77-1.bb
+++ b/meta/recipes-support/icu/icu_77-1.bb
@@ -119,6 +119,9 @@  SRC_URI = "${BASE_SRC_URI};name=code \
            ${DATA_SRC_URI};name=data \
            file://filter.json \
            file://0001-icu-Added-armeb-support.patch \
+           file://0001-ICU-23120-Mask-UnicodeStringTest-TestLargeMemory-on-.patch \
+           file://0001-test-Add-support-ptest.patch \
+           file://run-ptest \
            "
 
 SRC_URI:append:class-target = "\
@@ -160,3 +163,23 @@  do_make_icudata() {
 }
 
 addtask make_icudata before do_configure after do_patch do_prepare_recipe_sysroot
+
+inherit ptest
+RDEPENDS:${PN}-ptest += "bash"
+
+do_compile_ptest() {
+    oe_runmake -C test everything PTEST_PATH=${PTEST_PATH}
+}
+
+do_install_ptest() {
+    install -d ${D}${PTEST_PATH}/test
+    install -d ${D}${PTEST_PATH}/data
+    cp -r ${S}/test/testdata ${D}/${PTEST_PATH}/test
+    cp -r ${S}/data/unidata ${D}/${PTEST_PATH}/data/
+    cp -r ${S}/data/sprep ${D}/${PTEST_PATH}/data/
+    cp -r ${S}/../testdata ${D}/${PTEST_PATH}/
+    cp -r ${B}/test/testdata/out ${D}/${PTEST_PATH}/test/testdata
+
+    install -d ${D}${PTEST_PATH}/test/tests
+    find ${B}/test/ -type f -executable -exec cp {} ${D}${PTEST_PATH}/test/tests \;
+}