Android patch: Android support for ICU4C tests.

On Android, the source tree is not available as the tests are cross
compiled. The ICU data itself is installed to a known system path, and
additional test data is found at paths relative to the test binary.

The upstream request is tracked at
https://unicode-org.atlassian.net/browse/ICU-13849.

Bug: 120776993
Test: treehugger
Change-Id: I750c88f72c3b19dbd0c29c22a57dbc68b31854ea
diff --git a/icu4c/source/tools/ctestfw/ctest.c b/icu4c/source/tools/ctestfw/ctest.c
index aac6e83..a04ef3c 100644
--- a/icu4c/source/tools/ctestfw/ctest.c
+++ b/icu4c/source/tools/ctestfw/ctest.c
@@ -18,6 +18,12 @@
 #include <ctype.h>
 #include <limits.h>
 
+#if defined(__ANDROID__)
+#include <errno.h>
+#include <libgen.h>
+#include <unistd.h>
+#endif
+
 #if defined(__linux__)
 #include <features.h>
 #endif
@@ -1345,7 +1351,23 @@
         return srcDir;
     }
 
-#if defined(U_TOPSRCDIR)
+#if defined(__ANDROID__)
+    /*
+     * On Android, the source tree is not available as the tests are cross
+     * compiled. Test data is found at paths relative to the test binary.
+     */
+    char exePath[PATH_MAX];
+    ssize_t len = readlink("/proc/self/exe", exePath, sizeof(exePath));
+    if (len == -1) {
+        fprintf(stderr, "Failed to read /proc/self/exe: %s\n", strerror(errno));
+        abort();
+    }
+    exePath[len] = '\0';
+
+    static char path[PATH_MAX];
+    snprintf(path, sizeof(path), "%s/", dirname(exePath));
+    srcDir = path;
+#elif defined(U_TOPSRCDIR)
     /* U_TOPSRCDIR is set by the makefiles on UNIXes when building cintltst and
      * intltst to point to the top of the build hierarchy, which may or may not
      * be the same as the source directory, depending on the configure options
@@ -1430,10 +1452,17 @@
         return path;
     }
 
+#if defined(__ANDROID__)
+    // Android has the ICU data installed to a known location on the device. Use
+    // that if ICU_DATA is not set.
+    snprintf(path, sizeof(path), "/system/usr/icu/");
+    return path;
+#else
     // But fallback to the source directory if needed.
     snprintf(path, sizeof(path), "%sout%s", ctest_dataSrcDir(),
              U_FILE_SEP_STRING);
     return path;
+#endif
 }
 
 const char* T_CTEST_EXPORT2