Skip to content

ICU-22913 Fix coverity warning in wrtxml.cpp #1135

ICU-22913 Fix coverity warning in wrtxml.cpp

ICU-22913 Fix coverity warning in wrtxml.cpp #1135

Workflow file for this run

# Copyright (C) 2021 and later: Unicode, Inc. and others.
# License & terms of use: http://www.unicode.org/copyright.html
#
# GitHub Action continuous integration script for ICU post-merge tasks.
name: GHA ICU Merge CI
on:
push:
branches:
- main
- 'maint/maint*'
workflow_dispatch:
# To trigger the Env Test workflow manually, follow the instructions in
# https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow
# For non-release branches (namely: PRs), only run CI on the most recent commit. Cancel
# runs on previous commits mid-flight when new commits are pushed.
# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-only-cancel-in-progress-jobs-on-specific-branches
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ !contains(github.ref, 'maint/') && github.ref != 'main' }}
env:
SHARED_MVN_ARGS: '--show-version --no-transfer-progress'
permissions:
contents: read
jobs:
# Initialize the Maven artifact cache
# Uses Java 8 because Java version not deemed significant for downloading
# artifacts
#
# This job is created according to the cache strategy of reuse from a single job:
# https://github.com/actions/cache/blob/main/caching-strategies.md#make-cache-read-only--reuse-cache-from-centralized-job
icu4j-mvn-init-cache:
runs-on: ubuntu-latest
steps:
- name: Checkout and setup
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
lfs: true
- name: Checkout lfs objects
run: git lfs pull
- name: Cache local Maven repository
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
- uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
with:
distribution: 'temurin'
java-version: '8'
# Download all of the artifacts needed for the code and build plugins
- name: Download all artifacts
run: |
cd icu4j;
mvn ${SHARED_MVN_ARGS} dependency:go-offline -P '!old_jdk_taglet'
# Test ICU4J with little-endian ICU4C data only
icu4j-little-endian-data-test:
needs: icu4j-mvn-init-cache
runs-on: ubuntu-latest
steps:
- name: Checkout and setup
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
lfs: true
- name: Checkout lfs objects
run: git lfs pull
- name: Lookup read-only cache of local Maven repository
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
lookup-only: true
- uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
with:
distribution: 'temurin'
java-version: '11'
- name: ICU4J little-endian
run: |
cd icu4c/source;
ICU_DATA_BUILDTOOL_OPTS=--include_uni_core_data ./runConfigureICU Linux;
make -j -l4.5 check;
mkdir /tmp/icu4j_data_test;
cp -P data/out/tmp/icudt*l* /tmp/icu4j_data_test/
cd ../../icu4j;
mvn ${SHARED_MVN_ARGS} clean;
mvn ${SHARED_MVN_ARGS} -Dicu4c.data.path=/tmp/icu4j_data_test install
# Compile libraries used by all ICU4C performance tests.
icu4c-store-perf-libs:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Build ICU libraries
run: |
cd icu4c/source;
./runConfigureICU Linux;
make -j -l4.5 all;
cd lib;
cp -Ps ../tools/ctestfw/libicutest* .
- name: Upload ICU libraries
uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4
with:
name: icu-perf-libs
path: icu4c/source/lib
retention-days: 1
# Assorted ICU4C performance tests
icu4c-performance-tests:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
needs: icu4c-store-perf-libs
strategy:
fail-fast: false
matrix:
perf: [charperf, usetperf, utfperf]
include:
- perf: charperf
tests: TestIsAlpha TestIsUpper TestIsLower TestIsDigit TestIsSpace TestIsAlphaNumeric TestIsPrint TestIsControl TestToLower TestToUpper TestIsWhiteSpace
- perf: usetperf
tests: titlecase_letter_add titlecase_letter_contains titlecase_letter_iterator unassigned_add unassigned_contains unassigned_iterator pattern1 pattern2 pattern3
- perf: utfperf
tests: Roundtrip FromUnicode FromUTF8
file: "-f ../../icu4j/perf-tests/data/conversion/xuzhimo.txt"
flag: "-e gb18030"
permissions:
contents: write
deployments: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Create directory for lib files
run: mkdir icu4c/source/perflib
- name: Get ICU libs
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: icu-perf-libs
path: icu4c/source/lib
- name: Build and run ICU4C perf tests
run: |
cd icu4c/source;
./runConfigureICU Linux;
(cd test/perf && make -j -l4.5 everything && mkdir -p results && mkdir -p results/${{ matrix.perf }})
LD_LIBRARY_PATH=lib ./test/perf/${{ matrix.perf }}/${{ matrix.perf }} ${{ matrix.flag }} -t 5 -p 10 ${{ matrix.file }} ${{ matrix.tests }} | tee test/perf/results/${{ matrix.perf }}/output.txt
- name: Store performance test results
uses: gregtatum/github-action-benchmark@d3f06f738e9612988d575db23fae5ca0008d3d12
with:
# The perf tests result data is in ndjson format.
tool: 'ndjson'
output-file-path: icu4c/source/test/perf/results/${{ matrix.perf }}/output.txt
# Tentative setting.
alert-threshold: '200%'
fail-on-alert: true
gh-pages-branch: perfdata
benchmark-data-dir-path: perf/results/${{ matrix.perf }}
auto-push: true
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: true
# Assorted ICU4C performance tests using data files
icu4c-performance-tests-with-files:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
needs: icu4c-store-perf-libs
strategy:
fail-fast: false
# Matrix of test drivers and test data and, if applicable, flags. Note
# that GHA first excludes the 'exclude:' items from the total of
# combinations and then adds the 'include:' items.
matrix:
perf: [collperf, ustrperf, normperf]
data: [TestNames_Asian, TestNames_Chinese, TestNames_Japanese, TestNames_Japanese_h, TestNames_Japanese_k, TestNames_Korean, TestNames_Latin, TestNames_Russian, TestNames_SerbianSH, TestNames_SerbianSR, TestNames_Simplified_Chinese, TestNames_Thai, th18057, thesis, vfear11a]
include:
- perf: collperf
tests: TestIcu_KeyGen_null TestIcu_qsort_strcoll_null TestIcu_qsort_usekey TestIcu_BinarySearch_strcoll_null TestIcu_BinarySearch_usekey
- perf: ustrperf
tests: TestCtor TestCtor1 TestCtor2 TestCtor3 TestAssign TestAssign1 TestAssign2 TestGetch TestCatenate TestScan TestScan1 TestScan2
flag: "-l -u"
- perf: normperf
tests: TestICU_NFC_NFD_Text TestICU_NFC_NFC_Text TestICU_NFC_Orig_Text TestICU_NFD_NFD_Text TestICU_NFD_NFC_Text TestICU_NFD_Orig_Text
exclude:
- perf: collperf
data: th18057
- perf: collperf
data: thesis
- perf: collperf
data: vfear11a
- perf: ustrperf
data: TestNames_Japanese
- perf: ustrperf
data: thesis
- perf: ustrperf
data: vfear11a
- perf: normperf
data: TestNames_Simplified_Chinese
permissions:
contents: write
deployments: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Create directory for lib files
run: mkdir icu4c/source/perflib
- name: Get ICU libs
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: icu-perf-libs
path: icu4c/source/lib
- name: Build and run ICU4C perf tests
env:
DATA_FILE_PATH: ../../icu4j/perf-tests/data/collation
run: |
cd icu4c/source;
./runConfigureICU Linux;
(cd test/perf && make -j -l4.5 everything && mkdir -p results && mkdir -p results/${{ matrix.perf }} && mkdir -p results/${{ matrix.perf }}/${{ matrix.data }})
LD_LIBRARY_PATH=lib ./test/perf/${{ matrix.perf }}/${{ matrix.perf }} ${{ matrix.flag }} -t 5 -p 10 -f $DATA_FILE_PATH/${{ matrix.data }}.txt ${{ matrix.tests }} | tee test/perf/results/${{ matrix.perf }}/${{ matrix.data }}/output.txt
- name: Store performance test results
uses: gregtatum/github-action-benchmark@d3f06f738e9612988d575db23fae5ca0008d3d12
with:
# The perf tests result data is in ndjson format.
tool: 'ndjson'
output-file-path: icu4c/source/test/perf/results/${{ matrix.perf }}/${{ matrix.data }}/output.txt
# Tentative setting.
alert-threshold: '200%'
fail-on-alert: true
gh-pages-branch: perfdata
benchmark-data-dir-path: perf/results/${{ matrix.perf }}/${{ matrix.data }}
auto-push: true
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: true
# String search performance test
icu4c-strsrchperf:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
needs: icu4c-store-perf-libs
strategy:
fail-fast: false
# Matrix of locales and corresponding test data.
matrix:
locale: [de, en, fr, ja, ru, th, zh]
include:
- locale: de
data: udhr_deu_1996
- locale: en
data: udhr_eng
- locale: fr
data: udhr_fra
- locale: ja
data: udhr_jpn
- locale: ru
data: udhr_rus
- locale: th
data: udhr_tha
- locale: zh
data: udhr_cmn_hans
permissions:
contents: write
deployments: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Create directory for lib files
run: mkdir icu4c/source/perflib
- name: Get ICU libs
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: icu-perf-libs
path: icu4c/source/lib
- name: Build and run strschrperf test
env:
DATA_FILE_PATH: ../../icu4j/perf-tests/data/udhr
run: |
cd icu4c/source;
./runConfigureICU Linux;
(cd test/perf && make -j -l4.5 everything && mkdir -p results && mkdir -p results/strsrchperf && mkdir -p results/strsrchperf/${{ matrix.locale }})
LD_LIBRARY_PATH=lib ./test/perf/strsrchperf/strsrchperf -b Test_ICU_Forward_Search Test_ICU_Backward_Search -t 5 -p 10 -L ${{ matrix.locale }} -f $DATA_FILE_PATH/${{ matrix.data }}.txt | tee test/perf/results/strsrchperf/${{ matrix.locale }}/output.txt
- name: Store performance test results
uses: gregtatum/github-action-benchmark@d3f06f738e9612988d575db23fae5ca0008d3d12
with:
# The perf tests result data is in ndjson format.
tool: 'ndjson'
output-file-path: icu4c/source/test/perf/results/strsrchperf/${{ matrix.locale }}/output.txt
# Tentative setting.
alert-threshold: '200%'
fail-on-alert: true
gh-pages-branch: perfdata
benchmark-data-dir-path: perf/results/strsrchperf/${{ matrix.locale }}
auto-push: true
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: true
# ICU4J performance test for Unicode sets
icu4j-unicodesetperf:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
needs: icu4j-mvn-init-cache
strategy:
fail-fast: false
matrix:
perf: [UnicodeSetAdd, UnicodeSetContains, UnicodeSetIterate]
permissions:
contents: write
deployments: write
runs-on: ubuntu-latest
steps:
- name: Checkout and setup
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
lfs: true
- name: Checkout lfs objects
run: git lfs pull
- name: Lookup read-only cache of local Maven repository
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
lookup-only: true
- uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
with:
distribution: 'temurin'
java-version: '8'
- name: Build and run unicodesetperf test
run: |
# This file needs to be restored otherwise GHA cannot
# check-out the perfdata branch. Setting up this task with GH lfs
# modifies the file but the details of why and how are unknown.
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
cd icu4j;
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
git status
cd perf-tests;
mkdir -p perf/results/j_unicodesetperf/${{ matrix.perf }};
java -cp ./target/*:./target/dependency/* com.ibm.icu.dev.test.perf.UnicodeSetPerf ${{ matrix.perf }} -a -t 2 -p 4 [:Lt:] | tee perf/results/j_unicodesetperf/${{ matrix.perf }}/output.txt
- name: Store performance test results
uses: gregtatum/github-action-benchmark@d3f06f738e9612988d575db23fae5ca0008d3d12
with:
# The perf tests result data is in ndjson format.
tool: 'ndjson'
output-file-path: icu4j/perf-tests/perf/results/j_unicodesetperf/${{ matrix.perf }}/output.txt
# Tentative setting.
alert-threshold: '200%'
fail-on-alert: true
gh-pages-branch: perfdata
benchmark-data-dir-path: perf/results/j_unicodesetperf/${{ matrix.perf }}
auto-push: true
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: true
# ICU4J performance test for character APIs
icu4j-ucharacterperf:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
needs: icu4j-mvn-init-cache
strategy:
fail-fast: false
permissions:
contents: write
deployments: write
runs-on: ubuntu-latest
steps:
- name: Checkout and setup
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
lfs: true
- name: Checkout lfs objects
run: git lfs pull
- name: Lookup read-only cache of local Maven repository
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
lookup-only: true
- uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
with:
distribution: 'temurin'
java-version: '8'
- name: Build and run ucharacterperf test
run: |
# This file needs to be restored otherwise GHA cannot
# check-out the perfdata branch. Setting up this task with GH lfs
# modifies the file but the details of why and how are unknown.
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
cd icu4j;
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
cd perf-tests;
mkdir -p perf/results/j_ucharacterperf;
java -cp ./target/*:./target/dependency/* com.ibm.icu.dev.test.perf.UCharacterPerf -a -t 2 -p 4 0 ffff | tee perf/results/j_ucharacterperf/output.txt
- name: Store performance test results
uses: gregtatum/github-action-benchmark@d3f06f738e9612988d575db23fae5ca0008d3d12
with:
# The perf tests result data is in ndjson format.
tool: 'ndjson'
output-file-path: icu4j/perf-tests/perf/results/j_ucharacterperf/output.txt
# Tentative setting.
alert-threshold: '200%'
fail-on-alert: true
gh-pages-branch: perfdata
benchmark-data-dir-path: perf/results/j_ucharacterperf
auto-push: true
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: true
# ICU4J performance test for decimal formatting
icu4j-decimalformatperf:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
needs: icu4j-mvn-init-cache
strategy:
fail-fast: false
matrix:
perf: [TestICUConstruction, TestICUParse, TestICUFormat]
locale: [en_US, de_DE]
permissions:
contents: write
deployments: write
runs-on: ubuntu-latest
steps:
- name: Checkout and setup
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
lfs: true
- name: Checkout lfs objects
run: git lfs pull
- name: Lookup read-only cache of local Maven repository
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
lookup-only: true
- uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
with:
distribution: 'temurin'
java-version: '8'
- name: Build and run decimalformatperf
run: |
# This file needs to be restored otherwise GHA cannot
# check-out the perfdata branch. Setting up this task with GH lfs
# modifies the file but the details of why and how are unknown.
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
cd icu4j;
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
cd perf-tests;
mkdir -p perf/results/j_decimalformatperf/${{ matrix.locale }}/${{ matrix.perf }};
# Delay execution by random number of seconds. Spreading execution of multiple
# tests over 180 secs. minimizes the possibility of push conflicts when storing
# tests results in the data branch.
sleep $(($RANDOM % 180));
java -cp ./target/*:./target/dependency/* com.ibm.icu.dev.test.perf.DecimalFormatPerformanceTest ${{ matrix.perf }} -a -t 2 -p 4 -L ${{ matrix.locale }} "#,###.##" "1.234,56" -r 1 | tee perf/results/j_decimalformatperf/${{ matrix.locale }}/${{ matrix.perf }}/output.txt
- name: Store performance test results
uses: gregtatum/github-action-benchmark@d3f06f738e9612988d575db23fae5ca0008d3d12
with:
# The perf tests result data is in ndjson format.
tool: 'ndjson'
output-file-path: icu4j/perf-tests/perf/results/j_decimalformatperf/${{ matrix.locale }}/${{ matrix.perf }}/output.txt
# Tentative setting.
alert-threshold: '200%'
fail-on-alert: true
gh-pages-branch: perfdata
benchmark-data-dir-path: perf/results/j_decimalformatperf/${{ matrix.locale }}/${{ matrix.perf }}
auto-push: true
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: true
# ICU4J performance test for normalization
icu4j-normperf:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
needs: icu4j-mvn-init-cache
strategy:
fail-fast: false
matrix:
perf: [TestICU_NFD_NFC_Text, TestICU_NFC_NFC_Text, TestICU_NFC_Orig_Text, TestICU_NFD_NFC_Text, TestICU_NFD_NFD_Text, TestICU_NFD_Orig_Text]
source_text: [TestNames_Asian, TestNames_Chinese, TestNames_SerbianSH]
mode: [-l]
permissions:
contents: write
deployments: write
runs-on: ubuntu-latest
steps:
- name: Checkout and setup
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
lfs: true
- name: Checkout lfs objects
run: git lfs pull
- name: Lookup read-only cache of local Maven repository
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
lookup-only: true
- uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
with:
distribution: 'temurin'
java-version: '8'
- name: Build and run normperf
env:
DATA_FILE_PATH: data/collation
run: |
# This file needs to be restored otherwise GHA cannot
# check-out the perfdata branch. Setting up this task with GH lfs
# modifies the file but the details of why and how are unknown.
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
cd icu4j;
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
cd perf-tests;
mkdir -p perf/results/j_normperf/${{ matrix.source_text }}/${{ matrix.perf }};
# Delay execution by random number of seconds. Spreading execution of multiple
# tests over 180 secs. minimizes the possibility of push conflicts when storing
# tests results in the data branch.
sleep $(($RANDOM % 180));
java -cp ./target/*:./target/dependency/* com.ibm.icu.dev.test.perf.NormalizerPerformanceTest ${{ matrix.perf }} -a -t 2 -p 4 -f $DATA_FILE_PATH/${{ matrix.source_text }}.txt -e UTF-8 ${{ matrix.mode }} | tee perf/results/j_normperf/${{ matrix.source_text }}/${{ matrix.perf }}/output.txt
cat perf/results/j_normperf/${{ matrix.source_text }}/${{ matrix.perf }}/output.txt
- name: Store performance test results
uses: gregtatum/github-action-benchmark@d3f06f738e9612988d575db23fae5ca0008d3d12
with:
# The perf tests result data is in ndjson format.
tool: 'ndjson'
output-file-path: icu4j/perf-tests/perf/results/j_normperf/${{ matrix.source_text }}/${{ matrix.perf }}/output.txt
# Tentative setting.
alert-threshold: '200%'
fail-on-alert: true
gh-pages-branch: perfdata
benchmark-data-dir-path: perf/results/j_normperf/${{ matrix.source_text }}/${{ matrix.perf }}
auto-push: true
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: true
# ICU4J performance test for encoding conversion
icu4j-converterperf:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
needs: icu4j-mvn-init-cache
strategy:
fail-fast: false
matrix:
source_text: [arabic, english, french, greek, hebrew, hindi, japanese, korean, s-chinese]
perf: [TestCharsetDecoderICU, TestCharsetEncoderICU]
test_enc: [UTF-8]
include:
- test_enc: csisolatinarabic
source_text: arabic
perf: TestCharsetDecoderICU
- test_enc: csisolatinarabic
source_text: arabic
perf: TestCharsetEncoderICU
- test_enc: csisolatin1
source_text: french
perf: TestCharsetDecoderICU
- test_enc: csisolatin1
source_text: french
perf: TestCharsetEncoderICU
- test_enc: csisolatingreek
source_text: greek
perf: TestCharsetDecoderICU
- test_enc: csisolatingreek
source_text: greek
perf: TestCharsetEncoderICU
- test_enc: csisolatinhebrew
source_text: hebrew
perf: TestCharsetDecoderICU
- test_enc: csisolatinhebrew
source_text: hebrew
perf: TestCharsetEncoderICU
- test_enc: EUC-JP
source_text: japanese
perf: TestCharsetDecoderICU
- test_enc: EUC-JP
source_text: japanese
perf: TestCharsetEncoderICU
- test_enc: csiso2022jp
source_text: japanese
perf: TestCharsetDecoderICU
- test_enc: csiso2022jp
source_text: japanese
perf: TestCharsetEncoderICU
- test_enc: csiso2022kr
source_text: korean
perf: TestCharsetDecoderICU
- test_enc: csiso2022kr
source_text: korean
perf: TestCharsetEncoderICU
- test_enc: EUC-CN
source_text: s-chinese
perf: TestCharsetDecoderICU
- test_enc: EUC-CN
source_text: s-chinese
perf: TestCharsetEncoderICU
- test_enc: UTF-16BE
source_text: french
perf: TestCharsetDecoderICU
- test_enc: UTF-16BE
source_text: french
perf: TestCharsetEncoderICU
- test_enc: UTF-16LE
source_text: french
perf: TestCharsetDecoderICU
- test_enc: UTF-16LE
source_text: french
perf: TestCharsetEncoderICU
- test_enc: US-ASCII
source_text: english
perf: TestCharsetDecoderICU
- test_enc: US-ASCII
source_text: english
perf: TestCharsetEncoderICU
permissions:
contents: write
deployments: write
runs-on: ubuntu-latest
steps:
- name: Checkout and setup
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
lfs: true
- name: Checkout lfs objects
run: git lfs pull
- name: Lookup read-only cache of local Maven repository
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
lookup-only: true
- uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
with:
distribution: 'temurin'
java-version: '8'
- name: Build and run converterperf
env:
DATA_FILE_PATH: data/conversion
run: |
# This file needs to be restored otherwise GHA cannot
# check-out the perfdata branch. Setting up this task with GH lfs
# modifies the file but the details of why and how are unknown.
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2;
cd icu4j;
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
cd perf-tests;
mkdir -p perf/results/j_converterperf/${{ matrix.source_text }}/${{ matrix.test_enc }}/${{ matrix.perf }};
# Delay execution by random number of seconds. Spreading execution of multiple
# tests over 180 secs. minimizes the possibility of push conflicts when storing
# tests results in the data branch.
sleep $(($RANDOM % 180));
java -cp ./target/*:./target/dependency/*:../main/charset/target/* com.ibm.icu.dev.test.perf.ConverterPerformanceTest ${{ matrix.perf }} -a -t 2 -p 4 -f $DATA_FILE_PATH/${{ matrix.source_text }}.txt -e UTF-8 -T ${{ matrix.test_enc }} | tee perf/results/j_converterperf/${{ matrix.source_text }}/${{ matrix.test_enc }}/${{ matrix.perf }}/output.txt
- name: Store performance test results
uses: gregtatum/github-action-benchmark@d3f06f738e9612988d575db23fae5ca0008d3d12
with:
# The perf tests result data is in ndjson format.
tool: 'ndjson'
output-file-path: icu4j/perf-tests/perf/results/j_converterperf/${{ matrix.source_text }}/${{ matrix.test_enc }}/${{ matrix.perf }}/output.txt
# Tentative setting.
alert-threshold: '200%'
fail-on-alert: true
gh-pages-branch: perfdata
benchmark-data-dir-path: perf/results/j_converterperf/${{ matrix.source_text }}/${{ matrix.test_enc }}/${{ matrix.perf }}
auto-push: true
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: true
# ICU4J performance test for date formatting
icu4j-dateformatperf:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
needs: icu4j-mvn-init-cache
strategy:
fail-fast: false
matrix:
perf: [TestICUConstruction, TestICUParse, TestICUFormat]
locale: [en_US]
# The parameters don't make for good directory names. Add an identifying digit
# at the end to be used as directory name for the results.
parms: ['"dddd MMM yyyy" "15 Jan 2007" 1', '"HH:mm" "13:13" 2', '"HH:mm zzzz" "13:13 Pacific Standard Time" 3', '"HH:mm z" "13:13 PST" 4', '"HH:mm Z" "13:13 -0800" 5']
include:
- locale: sw_KE
parms: '"dddd MMM yyyy" "15 Jan 2007" 1'
perf: TestICUConstruction
- locale: sw_KE
parms: '"dddd MMM yyyy" "15 Jan 2007" 1'
perf: TestICUParse
- locale: sw_KE
parms: '"dddd MMM yyyy" "15 Jan 2007" 1'
perf: TestICUFormat
permissions:
contents: write
deployments: write
runs-on: ubuntu-latest
steps:
- name: Checkout and setup
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
lfs: true
- name: Checkout lfs objects
run: git lfs pull
- name: Lookup read-only cache of local Maven repository
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
lookup-only: true
- uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4.2.1
with:
distribution: 'temurin'
java-version: '8'
- name: Extract identifying digit and parameter.
run: |
ddir='${{ matrix.parms }}';
echo "PARM=${ddir:: -2}" >> $GITHUB_ENV;
echo "DDIR=${ddir: -1}" >> $GITHUB_ENV
- name: Build and run dateformatperf
run: |
# This file needs to be restored otherwise GHA cannot
# check-out the perfdata branch. Setting up this task with GH lfs
# modifies the file but the details of why and how are unknown.
git restore --staged tools/multi/proj/icu4cscan/old-xmls.tar.bz2
git restore tools/multi/proj/icu4cscan/old-xmls.tar.bz2
cd icu4j;
mvn ${SHARED_MVN_ARGS} verify -DskipITs -DskipTests;
cd perf-tests;
mkdir -p perf/results/j_dateformatperf/${{ matrix.locale }}/${{ matrix.perf }}/${{ env.DDIR }};
# Delay execution by random number of seconds. Spreading execution of multiple
# tests over 180 secs. minimizes the possibility of push conflicts when storing
# tests results in the data branch.
sleep $(($RANDOM % 180));
java -cp ./target/*:./target/dependency/* com.ibm.icu.dev.test.perf.DateFormatPerformanceTest ${{ matrix.perf }} -a -t 2 -p 4 -L ${{ matrix.locale }} ${{ env.PARM }} -r 1 | tee perf/results/j_dateformatperf/${{ matrix.locale }}/${{ matrix.perf }}/${{ env.DDIR }}/output.txt
- name: Store performance test results
uses: gregtatum/github-action-benchmark@d3f06f738e9612988d575db23fae5ca0008d3d12
with:
# The perf tests result data is in ndjson format.
tool: 'ndjson'
output-file-path: icu4j/perf-tests/perf/results/j_dateformatperf/${{ matrix.locale }}/${{ matrix.perf }}/${{ env.DDIR }}/output.txt
# Tentative setting.
alert-threshold: '200%'
fail-on-alert: true
gh-pages-branch: perfdata
benchmark-data-dir-path: perf/results/j_dateformatperf/${{ matrix.locale }}/${{ matrix.perf }}/${{ env.DDIR }}
auto-push: true
github-token: ${{ secrets.GITHUB_TOKEN }}
comment-on-alert: true
# Retrieve performance test results and upload results to remote repository
perf-test-data-move:
# Run performance tests only on the main branch of the ICU repository.
if: github.repository == 'unicode-org/icu' && github.ref == 'refs/heads/main'
name: Copy perf data to remote repo for visualization
needs: [icu4c-performance-tests, icu4c-performance-tests-with-files, icu4c-strsrchperf, icu4j-unicodesetperf, icu4j-ucharacterperf, icu4j-decimalformatperf, icu4j-normperf, icu4j-converterperf, icu4j-dateformatperf]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Switch to benchmark data storage branch.
run: |
git fetch
git checkout perfdata
- name: Publish data
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
with:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
external_repository: unicode-org/icu-perf
publish_branch: main
publish_dir: ./perf
keep_files: true
# Build ICU and tests sample on some windows configurations
icu4c-windows-msvc-postmerge:
runs-on: windows-2022
timeout-minutes: 30
strategy:
matrix:
arch: [x64, x86]
config: [Debug, Release]
include:
- arch: x86
platform: Win32
- arch: x64
platform: x64
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up MSBuild
uses: microsoft/setup-msbuild@v2
- name: Build Solution
run: msbuild icu4c/source/allinone/allinone.sln /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }}
- name: Run Tests (icucheck.bat)
run: icu4c/source/allinone/icucheck.bat ${{ matrix.arch }} ${{ matrix.config }}
- name: Build Sample Solution
run: msbuild icu4c/source/samples/all/all.sln /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.arch }}
- name: Test Samples (samplecheck.bat)
run: icu4c/source/samples/all/samplecheck.bat ${{ matrix.arch }} ${{ matrix.config }}
icu4c-windows-cygwin-gcc:
runs-on: windows-latest
timeout-minutes: 50
env:
ICU_CI_CACHE: c:\icu-ci-cache
CYG_URL: https://cygwin.com/setup-x86_64.exe
CYG_MIRROR: http://mirrors.kernel.org/sourceware/cygwin/
CYG_PACKAGES: automake,gcc-core,gcc-g++,make,pkg-config,perl,python3
CYG_ROOT: c:\cygwin-root
CYG_CACHE: 'c:\icu-ci-cache\cygwin64-v3'
CYG_CACHED_SETUP: 'c:\icu-ci-cache\cygwin64-v3\setup.exe'
CYG_VERSION_KEY: cygwin-3.2
defaults:
run:
shell: cmd
steps:
- name: Configure Git to checkout with Unix line endings (LF)
run: |
git config --global core.autocrlf input
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Restore Cygwin cache
uses: actions/cache@v4
with:
path: ${{ env.CYG_CACHE }}
key: ${{ hashFiles('.github/workflows/icu_merge_ci.yml') }}
- name: Download Cygwin setup
shell: pwsh
run: |
if ( !(Test-Path "${{ env.CYG_CACHED_SETUP }}" -NewerThan (Get-Date).AddDays(-7)) )
{
Write-Host "Cached Cygwin setup does not exist or is older than 7 days, downloading from external site."
New-Item -Force -Type Directory ${{ env.CYG_CACHE }}
Write-Host "Downloading Cygwin setup..."
$start_time = Get-Date
(New-Object System.Net.WebClient).DownloadFile("${{ env.CYG_URL }}", "${{ env.CYG_CACHED_SETUP }}")
Write-Output "Download took: $((Get-Date).Subtract($start_time).Seconds) second(s)."
}
- name: Install Cygwin
run: |
${{ env.CYG_CACHED_SETUP }} --no-verify --quiet-mode --no-shortcuts --no-startmenu --no-desktop --upgrade-also --only-site --site "${{ env.CYG_MIRROR }}" --root "${{ env.CYG_ROOT }}" --local-package-dir "${{ env.CYG_CACHE }}" --packages "${{ env.CYG_PACKAGES }}"
- name: Check Cygwin environment
run: |
${{ env.CYG_ROOT }}/bin/sh -lc 'echo Hello' && ${{ env.CYG_ROOT }}/bin/sh -lc 'uname -a'
- name: Build ICU (source and test)
run: |
${{ env.CYG_ROOT }}/bin/bash -lc "cd $(cygpath \"${{ github.workspace }}\") && cd icu4c/source && ./runConfigureICU Cygwin && make tests -j -l4.5"
env:
CC: gcc
CXX: g++
- name: Run Tests
run: |
${{ env.CYG_ROOT }}/bin/bash -lc "cd $(cygpath \"${{ github.workspace }}\") && cd icu4c/source && make -j -l4.5 check"
env:
CC: gcc
CXX: g++