blob: 98987c0aadc558d693ebe93026d33687fad4c659 [file] [log] [blame] [view]
---
layout: default
title: Integration Tests
parent: Release & Milestone Tasks
grand_parent: Contributors
nav_order: 60
---
<!--
© 2021 and later: Unicode, Inc. and others.
License & terms of use: http://www.unicode.org/copyright.html
-->
# Integration Tests
{: .no_toc }
## Contents
{: .no_toc .text-delta }
1. TOC
{:toc}
---
## Run ICU4J Locale Service Provider tests
JDK 6 introduced the locale service provider interface. ICU4J release include a
special jar file (icu4j-localespi.jar) implementing the locale service provider
interface.
The test case for the ICU4J locale service provider requires JRE 6 or later
version. Otherwise, there is no extra settings except for the standard ant set
up ( necessary. To run the test cases, use ant with the top-level build.xml with
target "localespiCheck"
```sh
$ ant localespiCheck
```
You should get the output like below -
```
...
build:
_runLocalespiCheck:
[java] TestAll {
[java] BreakIteratorTest {
[java] TestGetInstance (7.581s) Passed
[java] TestICUEquivalent (0.832s) Passed
[java] } (8.669s) Passed
[java] CollatorTest {
[java] TestGetInstance (0.900s) Passed
[java] TestICUEquivalent (0.040s) Passed
[java] } (0.966s) Passed
[java] CurrencyNameTest {
[java] TestCurrencySymbols (2.682s) Passed
[java] } (2.683s) Passed
[java] DateFormatSymbolsTest {
[java] TestGetInstance (0.348s) Passed
[java] TestICUEquivalent (0.207s) Passed
[java] TestNynorsk (0.000s) Passed
[java] TestSetSymbols (0.071s) Passed
[java] } (0.631s) Passed
[java] DateFormatTest {
[java] TestGetInstance (0.456s) Passed
[java] TestICUEquivalent (0.113s) Passed
[java] TestThaiDigit (0.000s) Passed
[java] } (0.571s) Passed
[java] DecimalFormatSymbolsTest {
[java] TestGetInstance (0.098s) Passed
[java] TestICUEquivalent (0.000s) Passed
[java] TestSetSymbols (0.000s) Passed
[java] } (0.099s) Passed
[java] LocaleNameTest {
[java] TestCountryNames (2.500s) Passed
[java] TestLanguageNames (14.262s) Passed
[java] TestVariantNames (8.638s) Passed
[java] } (25.402s) Passed
[java] NumberFormatTest {
[java] TestGetInstance (0.266s) Passed
[java] TestICUEquivalent (0.209s) Passed
[java] } (0.475s) Passed
[java] TimeZoneNameTest {
[java] TestTimeZoneNames (17.766s) Passed
[java] } (17.766s) Passed
[java] } (57.268s) Passed
[java]
[java] Test cases taking excessive time (>10s):
[java] TestAll/LocaleNameTest/TestLanguageNames (14.262s)
[java] TestAll/TimeZoneNameTest/TestTimeZoneNames (17.766s)
[java]
BUILD SUCCESSFUL
Total time: 1 minute 46 seconds
```
---
## Run ICU4J Test cases with JDK TimeZone
ICU4J provides an option to alter TimeZone implementation to use the JRE's own
implementation. The test cases used for this is the regular ICU4J unit test
suite, except forcing ICU4J to use JRE TimeZone by special system property -
com.ibm.icu.util.TimeZone.DefaultTimeZoneType=JDK.
To run the test, you have to apply the latest time zone patch from a JRE vendor,
because some test cases are sensitive to actual time zone transitions. For
Oracle JRE, you should go to the J2SE download page
<http://www.oracle.com/technetwork/java/javase/downloads/index.html> and
download the latest JDK DST Timezone Update Tool and apply the patch to your
local JRE.
To run the test case, you just need to invoke the ant target "jdktzCheck".
```sh
$ ant jdktzCheck
```
**Note:** You might not be able to get the update tool matching the tzdata
version used by ICU. In this case, some test cases may reports failures.
Unfortunately, you have to walk though the failures to see if they are expected
or not manually in this case.
---
## Verify the Eclipse ICU4J plug-in
1. Make sure the Eclipse ICU4J plug-in binaries are successfully produced.
2. Run the ICU4J plug-in test cases.
3. Update license files, build version strings for the new release.
---
## Run Tests Without ICU Data
### ICU4C
ICU data should be removed, so that tests cannot access it. Both cintltst and
intltest should be run with -w option and they should not crash. Every crash
should be investigated and fixed.
To do this, build and test normally, then replace the ICU data shared library
with the stubdata library and run the tests again with the -w option.
Using an in-source build on Linux:
```sh
cd icu4c/source
./runConfigureICU Linux
make -j2 check
rm lib/libicudata.so*
cp -P stubdata/libicudata.so* lib/
cd test/intltest
INTLTEST_OPTS=-w make check
cd ../cintltst
CINTLTST_OPTS=-w make check
```
For debugging (for example using gdb) you cannot use `make check`. You need
to set the `LD_LIBRARY_PATH` for the lib folder and then run
`./cintltst -w` or `./intltest -w` etc. in the debugger.
Example (in-source build on Linux):
```sh
cd test/cintltst
export LD_LIBRARY_PATH=../../lib:../../tools/ctestfw
./cintltst -w
```
### ICU4J
ICU4J has the test target for this, but does not work as designed for now. For
now, this task is not required for ICU4J.
---
## Verify that ICU4C tests pass without collation rule strings
***ICU4C 53 and later***
Background: [ICU-10636](https://unicode-org.atlassian.net/browse/ICU-10636)
### Rebuild ICU data without collation rule strings
#### ICU 64+
You need to configure ICU with a data filter config file that removes collation
rule strings.
The file syntax is nicer with hjson rather than json.
```sh
sudo apt install python3-pip
pip3 install hjson
```
Use an `~/icu/coll-norules.hjson` config file like this:
```
{
  resourceFilters: [
    {
      categories: [
        coll_tree
      ]
      rules: [
        -/UCARules
        -/collations/*/Sequence
      ]
    }
  ]
}
```
Configure ICU using this file:
```sh
ICU_DATA_FILTER_FILE=~/icu/coll-norules.hjson ... runConfigureICU ...
```
Run "make clean" (or delete just the collation .res files), then test as below.
#### ICU 54..63
This should work: `make GENRBOPTS='-k --omitCollationRules'` (-k is --strict)
For ICU 54..63, I went into the build output folder and did:
```sh
cd data
ICUDT=icudt63l
rm out/build/$ICUDT/coll/*.res
make GENRBOPTS='-k --omitCollationRules'
```
If this does not work, then add this option to the configure'd data/Makefile,
see ticket [ICU-10636](https://unicode-org.atlassian.net/browse/ICU-10636).
### Run the tests with data-errors-as-warnings
`INTLTEST_OPTS=-w CINTLTST_OPTS=-w make -j5 check`
See that they pass, or fix them to pass. See ticket #10636 test code changes for
examples.
---
## Test ICU4J with only little-endian ICU4C data
*Only available since ICU 54.*
#### With ICU 64 and later:
* Reconfigure ICU4C with
<code><b>ICU_DATA_BUILDTOOL_OPTS=--include_uni_core_data</b>
./runConfigureICU Linux</code> or similar
* Should be little-endian for coverage
* Clean and build ICU4C: `make -j6 check`
* Make a clean directory for testing
* Find the .data file in the build output area, e.g.,
`icu4c/source/data/out/tmp/icudt64l.dat`
* Create a temporary directory such as `mkdir -p /tmp/icu4j_data_test`
* Copy the .`dat` file to the new directory.
* Build and test ICU4J without its own data: `ant clean && ant
-Dicu4c.data.path=/tmp/icu4j_data_test check`
* The configuration option sets the `ICUConfig.properties` data path
* Verify that all tests pass.
* If you get very many test failures, double-check that you enabled
unicore data in the ICU4C build (see first step).
#### With ICU 55 through ICU 63:
* Rebuild ICU4C with <code>make <b>INCLUDE_UNI_CORE_DATA=1</b> check</code> or
similar, and provide a path only for the .dat file.
* Should be little-endian for coverage
* Find the .data file in the build output area, e.g.,
`data/out/tmp/icudt59l.dat`
* Create a temporary directory such as `mkdir -p
/tmp/icu/build/data/out/tmp`
* Copy the .`dat` file to the new directory.
* Build and test ICU4J without its own data: `ant clean && ant
-Dicu4c.data.path=/tmp/icu/build/data/out/tmp check`
* The configuration option sets the `ICUConfig.properties` data path
* Verify that all tests pass.
#### ICU 54 method:
In `icu4j-core/src/com/ibm/icu/ICUConfig.properties` set
`com.ibm.icu.impl.ICUBinary.dataPath` to a list of paths with all of the ICU4C
data (should be little-endian for coverage), with a path to where the .dat file
is and a path to the source/data/in files for data that is hardcoded in ICU4C
and therefore not in the .dat file (e.g., uprops.icu).
Change `com.ibm.icu.impl.ICUData.logBinaryDataFromInputStream` to `true`, maybe
set a breakpoint where such a message is logged.
Run all of the ICU4J tests, maybe in the debugger for the breakpoint, or look
for logger output to the console.
Revert your config changes.
## Build and run testmap
Build and run the source/test/testmap project. (There is currently no Windows
project defined for it.)
```sh
$ cd <root of your ICU build tree>
$ CONFIG_FILES=test/testmap/Makefile CONFIG_HEADERS= ./config.status
$ cd test/testmap
$ make check
```
---
## Verify XLIFF conversion
<span style="background-color:orange">**Note:** The following instruction does not work. Please read the comments with
orange background. There are some issues in the current ICU XLIFF tools and the
test case below. See the comments in
[ticket ICU-6383](https://unicode-org.atlassian.net/browse/ICU-6383).</span>
Instructions for verifying the XLIFF conversion tools.
* Convert icu/source/test/testdata/ra.txt to XLIFF
`genrb -s icu/source/test/testdata -d icu/source/test/testdata/ -x -l en ra.txt`
<span style="background-color:orange">-d icu/source/test/testdata/ overwrite
the existing ra.xlf. Specify another directory.</span>
<span style="background-color:orange">ra.txt has the top level item "ra",
which is supposed to be the content language. Thus, with -l en, you'll get a
warning - "The top level tag in the resource and language specified are not
the same. Please check the input." We should use "-l ra" here.</span>
* Verify that the ra.xlf produced is identical to the one in CVS HEAD (except
for generation date)
<span style="background-color:orange">If you use "-l ra" above, you'll get
<file .... source-language = "ra" .... />, which is different from ra.xlf in
the repository. Also, new line codes is broken for imported contents.</span>
* Convert icu/source/test/testdata/ra.xlf back to ICU format
`java -cp icu4j/classes com.ibm.icu.dev.tool.localeconverter.XLIFF2ICUConverter -d . -t ra ra.xlf`
<span style="background-color:orange">The option "-t ra" does not work,
because ra.xlf does not contain target language data. Use "-c ra"
instead.</span>
* Verify that the ra.txt produced is identical to the one in CVS HEAD (except
for generation date)
<span style="background-color:orange">You cannot expect the generated ra.txt
exactly matches the original one because of table item re-ordering, new line
code changes, and explicit resource types (e.g. "ra {" vs. "ra:table
{").</span>
* Go through the steps given in
<http://icu.sourceforge.net/docs/papers/localize_with_XLIFF_and_ICU.pdf>
---
## Test sample and demo programs
Build and run all of the sample and demo apps that are included with ICU, on
each of the reference platforms. A list of them is in the
[readme](http://icu.sanjose.ibm.com/internal/checklist/icu-progs-list.html).
Also see the build system.
Another worthy test: Test suites and demos *from the previous release* should
also compile and run with the libraries of the current release, at least when
certain #defines are set (unless they test APIs that are deprecated and have
been removed since)!
---
## Test data portability
Test if the data portability (under common endianness & charset family) is ok.
On the ICU build server, you would use the "Build from source .dat archive"
option. When it's not available, you would do the following:
1. Build ICU4C on Win32.
2. Copy the icu/source/data/out/icudt<data_version>l.dat file into
icu/source/data/in
3. Delete non-essential directories from icu/source/data.
4. Package up a clean copy of ICU for a non-Windows machine, like Linux on x86.
5. Build ICU on the non-Windows machine from the newly created package.
6. Run all tests on that non-Windows machine.
---
## Run the environment tests
Run
[environmentTest.sh](https://github.com/unicode-org/icu/blob/main/tools/release/c/environmentTest.sh)
on a Linux machine which has many (all possible?) POSIX locales installed. This
test verifies that the ICU test suite will work regardless of a user's default
locale and timezone. This test should be run on a fast machine with several CPU
cores. This will take a long time to run. Here are the steps to run the test.
1. cd icu4c/source/
2. ./runConfigureICU Linux
3. make check
4. cd ../../tools/release/c/
5. ./environmentTest.sh
6. Wait a while for the tests to finish. The logs will be written in each test
directory. e.g. icu4c/source/test/intltest/intltest-\*.txt. A message will
be printed from each spawned test script when it finishes.
7. grep the logs for any test failures when the tests are done.
---
## Run Thread Sanitizer tests
Thread sanitizer testing is one of the standard Travis builds. If it is passing
there, nothing further is required.
To run manually, on a Linux system with clang,
```sh
cd icu4c/source
CPPFLAGS=-fsanitize=thread LDFLAGS=-fsanitize=thread ./runConfigureICU --enable-debug --disable-release Linux
make clean
make -j6 check
```
Errors are displayed at the point they occur, and stop further testing.
---
## Run Address Sanitizer tests
Address sanitizer testing is included in the standard Linux with Clang Travis
builds. If it is passing there, nothing further is required.
To run manually, on a Linux system with clang,
```sh
cd icu4c/source
CPPFLAGS=-fsanitize=address LDFLAGS=-fsanitize=address ./runConfigureICU --enable-debug --disable-release Linux
make clean
make -j6 check
```
Memory leaks are summarized at the end. Other errors are displayed at the point
they occur, and stop further testing.
---
## ICU4J Serialization Compatibility Test Data
The regular ICU4J unit test includes serialization compatibility tests. The test
case creates an ICU service object from serialized data created by a former
version of ICU. When we prepare a new release, the serialization compatibility
test data should be created and checked in for future testing. This task is
usually done just before publishing release candidate.
1. Run regular ICU4J unit tests - `ant check`
2. Make sure the unit tests pass successfully.
3. Run - `ant serialTestData`
4. Copy a folder with ICU version (e.g. ICU_61.1) generated under <icu4j
root>/out/serialTestData to <icu4j
root>/main/tests/core/src/com/ibm/icu/dev/test/serializable/data.
5. You may delete older serialization test data from the directory (but keep
the oldest one - ICU_3.6).
6. Run `ant check` again before committing the changes.