16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 1996-2013, International Business Machines
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <assert.h>
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdarg.h>
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <ctype.h>
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utrace.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uclean.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "putilimp.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "udbgutil.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* NOTES:
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   3/20/1999 srl - strncpy called w/o setting nulls at the end
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAXTESTNAME 128
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAXTESTS  512
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAX_TEST_LOG 4096
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *  How may columns to indent the 'OK' markers.
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define FLAG_INDENT 45
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   How many lines of scrollage can go by before we need to remind the user what the test is.
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define PAGE_SIZE_LIMIT 25
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef SHOW_TIMES
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define SHOW_TIMES 1
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct TestNode
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void (*test)(void);
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  struct TestNode* sibling;
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  struct TestNode* child;
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  char name[1]; /* This is dynamically allocated off the end with malloc. */
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const struct TestNode* currentTest;
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef enum { RUNTESTS, SHOWTESTS } TestMode;
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_SEPARATOR '/'
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef C_TEST_IMPL
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define C_TEST_IMPL
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ctest.h"
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char ERROR_LOG[MAX_TEST_LOG][MAXTESTNAME];
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Local prototypes */
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic TestNode* addTestNode( TestNode *root, const char *name );
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic TestNode *createTestNode(const char* name, int32_t nameLen);
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int strncmp_nullcheck( const char* s1,
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  const char* s2,
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int n );
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void getNextLevel( const char* name,
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int* nameLen,
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const char** nextName );
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void iterateTestsWithLevel( const TestNode *root, int depth,
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   const TestNode** nodeList,
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   TestMode mode);
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void help ( const char *argv0 );
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Do the work of logging an error. Doesn't increase the error count.
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @prefix optional prefix prepended to message, or NULL.
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pattern printf style pattern
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param ap vprintf style arg list
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void vlog_err(const char *prefix, const char *pattern, va_list ap);
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void vlog_verbose(const char *prefix, const char *pattern, va_list ap);
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool vlog_knownIssue(const char *ticket, const char *pattern, va_list ap);
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Log test structure, with indent
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pattern printf pattern
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void log_testinfo_i(const char *pattern, ...);
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Log test structure, NO indent
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param pattern printf pattern
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void log_testinfo(const char *pattern, ...);
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* If we need to make the framework multi-thread safe
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   we need to pass around the following vars
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int ERRONEOUS_FUNCTION_COUNT = 0;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int ERROR_COUNT = 0; /* Count of errors from all tests. */
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int ONE_ERROR = 0; /* were there any other errors? */
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int DATA_ERROR_COUNT = 0; /* count of data related errors or warnings */
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int INDENT_LEVEL = 0;
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool NO_KNOWN = FALSE;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void *knownList = NULL;
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char gTestName[1024] = "";
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool ON_LINE = FALSE; /* are we on the top line with our test name? */
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool HANGING_OUTPUT = FALSE; /* did the user leave us without a trailing \n ? */
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int GLOBAL_PRINT_COUNT = 0; /* global count of printouts */
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint REPEAT_TESTS_INIT = 0; /* Was REPEAT_TESTS initialized? */
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint REPEAT_TESTS = 1; /* Number of times to run the test */
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint VERBOSITY = 0; /* be No-verbose by default */
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint ERR_MSG =1; /* error messages will be displayed by default*/
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint QUICK = 1;  /* Skip some of the slower tests? */
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint WARN_ON_MISSING_DATA = 0; /* Reduce data errs to warnings? */
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUTraceLevel ICU_TRACE = UTRACE_OFF;  /* ICU tracing level */
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgsize_t MINIMUM_MEMORY_SIZE_FAILURE = (size_t)-1; /* Minimum library memory allocation window that will fail. */
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgsize_t MAXIMUM_MEMORY_SIZE_FAILURE = (size_t)-1; /* Maximum library memory allocation window that will fail. */
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *ARGV_0 = "[ALL]";
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *XML_FILE_NAME=NULL;
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char XML_PREFIX[256];
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *SUMMARY_FILE = NULL;
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFILE *XML_FILE = NULL;
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*-------------------------------------------*/
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* strncmp that also makes sure there's a \0 at s2[0] */
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int strncmp_nullcheck( const char* s1,
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const char* s2,
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int n )
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (((int)strlen(s2) >= n) && s2[n] != 0) {
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 3; /* null check fails */
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return strncmp ( s1, s2, n );
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void getNextLevel( const char* name,
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int* nameLen,
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           const char** nextName )
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Get the next component of the name */
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *nextName = strchr(name, TEST_SEPARATOR);
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( *nextName != 0 )
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char n[255];
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *nameLen = (int)((*nextName) - name);
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (*nextName)++; /* skip '/' */
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strncpy(n, name, *nameLen);
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        n[*nameLen] = 0;
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*printf("->%s-< [%d] -> [%s]\n", name, *nameLen, *nextName);*/
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *nameLen = (int)strlen(name);
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic TestNode *createTestNode(const char* name, int32_t nameLen)
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TestNode *newNode;
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newNode = (TestNode*)malloc(sizeof(TestNode) + (nameLen + 1));
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newNode->test = NULL;
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newNode->sibling = NULL;
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newNode->child = NULL;
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strncpy( newNode->name, name, nameLen );
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newNode->name[nameLen] = 0;
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return  newNode;
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgcleanUpTestTree(TestNode *tn)
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(tn->child != NULL) {
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cleanUpTestTree(tn->child);
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(tn->sibling != NULL) {
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cleanUpTestTree(tn->sibling);
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    free(tn);
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgaddTest(TestNode** root,
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TestFunctionPtr test,
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char* name )
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TestNode *newNode;
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*if this is the first Test created*/
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*root == NULL)
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *root = createTestNode("", 0);
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newNode = addTestNode( *root, name );
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    assert(newNode != 0 );
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*  printf("addTest: nreName = %s\n", newNode->name );*/
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newNode->test = test;
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* non recursive insert function */
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic TestNode *addTestNode ( TestNode *root, const char *name )
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* nextName;
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TestNode *nextNode, *curNode;
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int nameLen; /* length of current 'name' */
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* remove leading slash */
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( *name == TEST_SEPARATOR )
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        name++;
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    curNode = root;
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(;;)
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Start with the next child */
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        nextNode = curNode->child;
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        getNextLevel ( name, &nameLen, &nextName );
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*      printf("* %s\n", name );*/
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* if nextNode is already null, then curNode has no children
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        -- add them */
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if( nextNode == NULL )
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Add all children of the node */
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            do
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Get the next component of the name */
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                getNextLevel(name, &nameLen, &nextName);
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* update curName to have the next name segment */
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                curNode->child = createTestNode(name, nameLen);
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* printf("*** added %s\n", curNode->child->name );*/
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                curNode = curNode->child;
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                name = nextName;
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            while( name != NULL );
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return curNode;
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Search across for the name */
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (strncmp_nullcheck ( name, nextNode->name, nameLen) != 0 )
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            curNode = nextNode;
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            nextNode = nextNode -> sibling;
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( nextNode == NULL )
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Did not find 'name' on this level. */
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                nextNode = createTestNode(name, nameLen);
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                curNode->sibling = nextNode;
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* nextNode matches 'name' */
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (nextName == NULL) /* end of the line */
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return nextNode;
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Loop again with the next item */
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        name = nextName;
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        curNode = nextNode;
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Log the time taken. May not output anything.
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param deltaTime change in time
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2 str_timeDelta(char *str, UDate deltaTime) {
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (deltaTime > 110000.0 ) {
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double mins = uprv_floor(deltaTime/60000.0);
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sprintf(str, "[(%.0fm %.1fs)]", mins, (deltaTime-(mins*60000.0))/1000.0);
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if (deltaTime > 1500.0) {
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sprintf(str, "((%.1fs))", deltaTime/1000.0);
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(deltaTime>900.0) {
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sprintf(str, "( %.2fs )", deltaTime/1000.0);
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(deltaTime > 5.0) {
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sprintf(str, " (%.0fms) ", deltaTime);
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str[0]=0; /* at least terminate it. */
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void print_timeDelta(UDate deltaTime) {
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  char str[256];
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  str_timeDelta(str, deltaTime);
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(str[0]) {
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("%s", str);
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Run or list tests (according to mode) in a subtree.
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param root root of the subtree to operate on
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param depth The depth of this tree (0=root)
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param nodeList an array of MAXTESTS depth that's used for keeping track of where we are. nodeList[depth] points to the 'parent' at depth depth.
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param mode what mode we are operating in.
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void iterateTestsWithLevel ( const TestNode* root,
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 int depth,
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 const TestNode** nodeList,
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 TestMode mode)
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char pathToFunction[MAXTESTNAME] = "";
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char separatorString[2] = { TEST_SEPARATOR, '\0'};
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if SHOW_TIMES
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate allStartTime = -1, allStopTime = -1;
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(depth<2) {
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      allStartTime = uprv_getRawUTCtime();
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( root == NULL )
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* record the current root node, and increment depth. */
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    nodeList[depth++] = root;
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* depth is now the depth of root's children. */
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Collect the 'path' to the current subtree. */
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( i=0;i<(depth-1);i++ )
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcat(pathToFunction, nodeList[i]->name);
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcat(pathToFunction, separatorString);
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strcat(pathToFunction, nodeList[i]->name); /* including 'root' */
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* print test name and space. */
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    INDENT_LEVEL = depth-1;
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(root->name[0]) {
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	log_testinfo_i("%s ", root->name);
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	log_testinfo_i("(%s) ", ARGV_0);
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ON_LINE = TRUE;  /* we are still on the line with the test name */
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( (mode == RUNTESTS) &&
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org		(root->test != NULL))  /* if root is a leaf node, run it */
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int myERROR_COUNT = ERROR_COUNT;
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int myGLOBAL_PRINT_COUNT = GLOBAL_PRINT_COUNT;
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if SHOW_TIMES
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate startTime, stopTime;
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char timeDelta[256];
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char timeSeconds[256];
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char timeDelta[] = "(unknown)";
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char timeSeconds[] = "0.000";
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        currentTest = root;
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        INDENT_LEVEL = depth;  /* depth of subitems */
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ONE_ERROR=0;
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        HANGING_OUTPUT=FALSE;
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if SHOW_TIMES
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        startTime = uprv_getRawUTCtime();
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strcpy(gTestName, pathToFunction);
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        root->test();   /* PERFORM THE TEST ************************/
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if SHOW_TIMES
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        stopTime = uprv_getRawUTCtime();
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(HANGING_OUTPUT) {
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_testinfo("\n");
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          HANGING_OUTPUT=FALSE;
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        INDENT_LEVEL = depth-1;  /* depth of root */
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        currentTest = NULL;
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if((ONE_ERROR>0)&&(ERROR_COUNT==0)) {
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          ERROR_COUNT++; /* There was an error without a newline */
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ONE_ERROR=0;
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if SHOW_TIMES
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str_timeDelta(timeDelta, stopTime-startTime);
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sprintf(timeSeconds, "%f", (stopTime-startTime)/1000.0);
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ctest_xml_testcase(pathToFunction, pathToFunction, timeSeconds, (myERROR_COUNT!=ERROR_COUNT)?"error":NULL);
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (myERROR_COUNT != ERROR_COUNT) {
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_testinfo_i("} ---[%d ERRORS in %s] ", ERROR_COUNT - myERROR_COUNT, pathToFunction);
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          strcpy(ERROR_LOG[ERRONEOUS_FUNCTION_COUNT++], pathToFunction);
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          if(!ON_LINE) { /* had some output */
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int spaces = FLAG_INDENT-(depth-1);
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_testinfo_i("} %*s[OK] ", spaces, "---");
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if((GLOBAL_PRINT_COUNT-myGLOBAL_PRINT_COUNT)>PAGE_SIZE_LIMIT) {
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              log_testinfo(" %s ", pathToFunction); /* in case they forgot. */
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          } else {
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* put -- out at 30 sp. */
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int spaces = FLAG_INDENT-(strlen(root->name)+depth);
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(spaces<0) spaces=0;
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_testinfo(" %*s[OK] ", spaces,"---");
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if SHOW_TIMES
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(timeDelta[0]) printf("%s", timeDelta);
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ON_LINE = TRUE; /* we are back on-line */
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    INDENT_LEVEL = depth-1; /* root */
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* we want these messages to be at 0 indent. so just push the indent level breifly. */
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(mode==SHOWTESTS) {
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	log_testinfo("---%s%c\n",pathToFunction, nodeList[i]->test?' ':TEST_SEPARATOR );
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    INDENT_LEVEL = depth;
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(root->child) {
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int myERROR_COUNT = ERROR_COUNT;
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int myGLOBAL_PRINT_COUNT = GLOBAL_PRINT_COUNT;
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(mode!=SHOWTESTS) {
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    		INDENT_LEVEL=depth-1;
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    		log_testinfo("{\n");
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    		INDENT_LEVEL=depth;
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	}
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	iterateTestsWithLevel ( root->child, depth, nodeList, mode );
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	if(mode!=SHOWTESTS) {
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    		INDENT_LEVEL=depth-1;
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    		log_testinfo_i("} "); /* TODO:  summarize subtests */
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    		if((depth>1) && (ERROR_COUNT > myERROR_COUNT)) {
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    			log_testinfo("[%d %s in %s] ", ERROR_COUNT-myERROR_COUNT, (ERROR_COUNT-myERROR_COUNT)==1?"error":"errors", pathToFunction);
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    		} else if((GLOBAL_PRINT_COUNT-myGLOBAL_PRINT_COUNT)>PAGE_SIZE_LIMIT || (depth<1)) {
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  if(pathToFunction[0]) {
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_testinfo(" %s ", pathToFunction); /* in case they forgot. */
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  } else {
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_testinfo(" / (%s) ", ARGV_0);
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  }
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    		ON_LINE=TRUE;
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	}
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	}
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    depth--;
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if SHOW_TIMES
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(depth<2) {
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      allStopTime = uprv_getRawUTCtime();
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      print_timeDelta(allStopTime-allStartTime);
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(mode!=SHOWTESTS && ON_LINE) {
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	log_testinfo("\n");
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( depth != 0 ) { /* DO NOT iterate over siblings of the root. TODO: why not? */
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        iterateTestsWithLevel ( root->sibling, depth, nodeList, mode );
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgshowTests ( const TestNode *root )
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* make up one for them */
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TestNode *nodeList[MAXTESTS];
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (root == NULL)
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("TEST CAN'T BE FOUND!");
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    iterateTestsWithLevel ( root, 0, nodeList, SHOWTESTS );
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgrunTests ( const TestNode *root )
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TestNode *nodeList[MAXTESTS];
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* make up one for them */
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (root == NULL)
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("TEST CAN'T BE FOUND!\n");
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ERRONEOUS_FUNCTION_COUNT = ERROR_COUNT = 0;
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    iterateTestsWithLevel ( root, 0, nodeList, RUNTESTS );
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*print out result summary*/
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ON_LINE=FALSE; /* just in case */
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(knownList != NULL) {
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if( udbg_knownIssue_print(knownList) ) {
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stdout, "(To run suppressed tests, use the -K option.) \n\n");
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      udbg_knownIssue_close(knownList);
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ERROR_COUNT)
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stdout,"\nSUMMARY:\n");
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	fflush(stdout);
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stdout,"******* [Total error count:\t%d]\n", ERROR_COUNT);
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	fflush(stdout);
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fprintf(stdout, " Errors in\n");
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i=0;i < ERRONEOUS_FUNCTION_COUNT; i++)
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fprintf(stdout, "[%s]\n",ERROR_LOG[i]);
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	if(SUMMARY_FILE != NULL) {
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	  FILE *summf = fopen(SUMMARY_FILE, "w");
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	  if(summf!=NULL) {
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	    for (i=0;i < ERRONEOUS_FUNCTION_COUNT; i++)
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	      fprintf(summf, "%s\n",ERROR_LOG[i]);
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	    fclose(summf);
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	  }
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	}
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_testinfo("\n[All tests passed successfully...]\n");
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(DATA_ERROR_COUNT) {
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(WARN_ON_MISSING_DATA==0) {
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	  log_testinfo("\t*Note* some errors are data-loading related. If the data used is not the \n"
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 "\tstock ICU data (i.e some have been added or removed), consider using\n"
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 "\tthe '-w' option to turn these errors into warnings.\n");
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      } else {
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	  log_testinfo("\t*WARNING* some data-loading errors were ignored by the -w option.\n");
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char* T_CTEST_EXPORT2
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetTestName(void)
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(currentTest != NULL) {
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return currentTest->name;
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst TestNode* T_CTEST_EXPORT2
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetTest(const TestNode* root, const char* name)
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char* nextName;
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TestNode *nextNode;
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TestNode* curNode;
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int nameLen; /* length of current 'name' */
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (root == NULL) {
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("TEST CAN'T BE FOUND!\n");
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* remove leading slash */
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( *name == TEST_SEPARATOR )
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        name++;
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    curNode = root;
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(;;)
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Start with the next child */
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        nextNode = curNode->child;
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        getNextLevel ( name, &nameLen, &nextName );
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*      printf("* %s\n", name );*/
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* if nextNode is already null, then curNode has no children
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        -- add them */
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if( nextNode == NULL )
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return NULL;
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Search across for the name */
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (strncmp_nullcheck ( name, nextNode->name, nameLen) != 0 )
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            curNode = nextNode;
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            nextNode = nextNode -> sibling;
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( nextNode == NULL )
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Did not find 'name' on this level. */
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return NULL;
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* nextNode matches 'name' */
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (nextName == NULL) /* end of the line */
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return nextNode;
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Loop again with the next item */
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        name = nextName;
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        curNode = nextNode;
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*  =========== io functions ======== */
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void go_offline_with_marker(const char *mrk) {
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool wasON_LINE = ON_LINE;
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(ON_LINE) {
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_testinfo(" {\n");
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ON_LINE=FALSE;
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!HANGING_OUTPUT || wasON_LINE) {
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(mrk != NULL) {
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fputs(mrk, stdout);
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void go_offline() {
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	go_offline_with_marker(NULL);
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void go_offline_err() {
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	go_offline();
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void first_line_verbose() {
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    go_offline_with_marker("v");
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void first_line_err() {
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    go_offline_with_marker("!");
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void first_line_info() {
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    go_offline_with_marker("\"");
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void first_line_test() {
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	fputs(" ", stdout);
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void vlog_err(const char *prefix, const char *pattern, va_list ap)
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( ERR_MSG == FALSE){
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fputs("!", stdout); /* col 1 - bang */
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stdout, "%-*s", INDENT_LEVEL,"" );
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(prefix) {
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fputs(prefix, stdout);
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    vfprintf(stdout, pattern, ap);
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fflush(stdout);
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_end(ap);
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((*pattern==0) || (pattern[strlen(pattern)-1]!='\n')) {
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	HANGING_OUTPUT=1;
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	HANGING_OUTPUT=0;
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GLOBAL_PRINT_COUNT++;
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool vlog_knownIssue(const char *ticket, const char *pattern, va_list ap)
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char buf[2048];
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool firstForTicket;
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool firstForWhere;
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(NO_KNOWN) return FALSE;
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pattern==NULL) pattern="";
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    vsprintf(buf, pattern, ap);
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    knownList = udbg_knownIssue_open(knownList, ticket, gTestName, buf,
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     &firstForTicket, &firstForWhere);
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(firstForTicket || firstForWhere) {
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_info("(Known issue #%s) %s", ticket, buf);
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_verbose("(Known issue #%s) %s", ticket, buf);
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvlog_info(const char *prefix, const char *pattern, va_list ap)
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	first_line_info();
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stdout, "%-*s", INDENT_LEVEL,"" );
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(prefix) {
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fputs(prefix, stdout);
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    vfprintf(stdout, pattern, ap);
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fflush(stdout);
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_end(ap);
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((*pattern==0) || (pattern[strlen(pattern)-1]!='\n')) {
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	HANGING_OUTPUT=1;
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	HANGING_OUTPUT=0;
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GLOBAL_PRINT_COUNT++;
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Log test structure, with indent
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void log_testinfo_i(const char *pattern, ...)
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_list ap;
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    first_line_test();
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stdout, "%-*s", INDENT_LEVEL,"" );
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_start(ap, pattern);
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    vfprintf(stdout, pattern, ap);
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fflush(stdout);
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_end(ap);
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GLOBAL_PRINT_COUNT++;
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Log test structure (no ident)
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void log_testinfo(const char *pattern, ...)
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_list ap;
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_start(ap, pattern);
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    first_line_test();
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    vfprintf(stdout, pattern, ap);
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fflush(stdout);
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_end(ap);
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GLOBAL_PRINT_COUNT++;
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void vlog_verbose(const char *prefix, const char *pattern, va_list ap)
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( VERBOSITY == FALSE )
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    first_line_verbose();
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stdout, "%-*s", INDENT_LEVEL,"" );
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(prefix) {
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fputs(prefix, stdout);
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    vfprintf(stdout, pattern, ap);
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fflush(stdout);
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_end(ap);
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GLOBAL_PRINT_COUNT++;
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if((*pattern==0) || (pattern[strlen(pattern)-1]!='\n')) {
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	HANGING_OUTPUT=1;
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	HANGING_OUTPUT=0;
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_err(const char* pattern, ...)
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_list ap;
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    first_line_err();
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(strchr(pattern, '\n') != NULL) {
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Count errors only if there is a line feed in the pattern
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * so that we do not exaggerate our error count.
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++ERROR_COUNT;
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	/* Count at least one error. */
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    	ONE_ERROR=1;
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_start(ap, pattern);
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    vlog_err(NULL, pattern, ap);
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool T_CTEST_EXPORT2
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_knownIssue(const char *ticket, const char *pattern, ...) {
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  va_list ap;
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  va_start(ap, pattern);
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return vlog_knownIssue(ticket, pattern, ap);
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_err_status(UErrorCode status, const char* pattern, ...)
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_list ap;
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_start(ap, pattern);
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR)) {
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ++DATA_ERROR_COUNT; /* for informational message at the end */
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (WARN_ON_MISSING_DATA == 0) {
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            first_line_err();
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Fatal error. */
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (strchr(pattern, '\n') != NULL) {
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ++ERROR_COUNT;
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ++ONE_ERROR;
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            vlog_err(NULL, pattern, ap); /* no need for prefix in default case */
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            vlog_info("[DATA] ", pattern, ap);
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        first_line_err();
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Fatal error. */
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(strchr(pattern, '\n') != NULL) {
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++ERROR_COUNT;
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++ONE_ERROR;
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        vlog_err(NULL, pattern, ap); /* no need for prefix in default case */
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_info(const char* pattern, ...)
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_list ap;
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_start(ap, pattern);
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    vlog_info(NULL, pattern, ap);
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_verbose(const char* pattern, ...)
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_list ap;
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_start(ap, pattern);
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    vlog_verbose(NULL, pattern, ap);
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_data_err(const char* pattern, ...)
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_list ap;
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    va_start(ap, pattern);
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    go_offline_err();
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++DATA_ERROR_COUNT; /* for informational message at the end */
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(WARN_ON_MISSING_DATA == 0) {
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Fatal error. */
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(strchr(pattern, '\n') != NULL) {
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++ERROR_COUNT;
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        vlog_err(NULL, pattern, ap); /* no need for prefix in default case */
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        vlog_info("[DATA] ", pattern, ap);
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Tracing functions.
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int traceFnNestingDepth = 0;
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV TraceEntry(const void *context, int32_t fnNumber) {
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char buf[500];
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() enter.\n", utrace_functionName(fnNumber));    buf[sizeof(buf)-1]=0;
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fputs(buf, stdout);
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    traceFnNestingDepth++;
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV TraceExit(const void *context, int32_t fnNumber, const char *fmt, va_list args) {    char buf[500];
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (traceFnNestingDepth>0) {
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        traceFnNestingDepth--;
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() ", utrace_functionName(fnNumber));    buf[sizeof(buf)-1]=0;
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fputs(buf, stdout);
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utrace_vformat(buf, sizeof(buf), traceFnNestingDepth*3, fmt, args);
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buf[sizeof(buf)-1]=0;
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fputs(buf, stdout);
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    putc('\n', stdout);
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV TraceData(const void *context, int32_t fnNumber,
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          int32_t level, const char *fmt, va_list args) {
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char buf[500];
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utrace_vformat(buf, sizeof(buf), traceFnNestingDepth*3, fmt, args);
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    buf[sizeof(buf)-1]=0;
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fputs(buf, stdout);
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    putc('\n', stdout);
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void *U_CALLCONV ctest_libMalloc(const void *context, size_t size) {
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*if (VERBOSITY) {
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printf("Allocated %ld\n", (long)size);
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }*/
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (MINIMUM_MEMORY_SIZE_FAILURE <= size && size <= MAXIMUM_MEMORY_SIZE_FAILURE) {
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return malloc(size);
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void *U_CALLCONV ctest_libRealloc(const void *context, void *mem, size_t size) {
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*if (VERBOSITY) {
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printf("Reallocated %ld\n", (long)size);
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }*/
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (MINIMUM_MEMORY_SIZE_FAILURE <= size && size <= MAXIMUM_MEMORY_SIZE_FAILURE) {
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*free(mem);*/ /* Realloc doesn't free on failure. */
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return realloc(mem, size);
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV ctest_libFree(const void *context, void *mem) {
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    free(mem);
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint T_CTEST_EXPORT2
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginitArgs( int argc, const char* const argv[], ArgHandlerPtr argHandler, void *context)
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int                i;
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int                argSkip = 0;
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    VERBOSITY = FALSE;
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ERR_MSG = TRUE;
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ARGV_0=argv[0];
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for( i=1; i<argc; i++)
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ( argv[i][0] == '/' )
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* We don't run the tests here. */
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if ((strcmp( argv[i], "-a") == 0) || (strcmp(argv[i],"-all") == 0))
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* We don't run the tests here. */
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-v" )==0 || strcmp( argv[i], "-verbose")==0)
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            VERBOSITY = TRUE;
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-l" )==0 )
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* doList = TRUE; */
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-e1") == 0)
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            QUICK = -1;
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-e") ==0)
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            QUICK = 0;
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-K") ==0)
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            NO_KNOWN = 1;
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strncmp( argv[i], "-E",2) ==0)
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	    SUMMARY_FILE=argv[i]+2;
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-w") ==0)
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            WARN_ON_MISSING_DATA = TRUE;
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-m") ==0)
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UErrorCode errorCode = U_ZERO_ERROR;
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (i+1 < argc) {
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                char *endPtr = NULL;
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                i++;
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                MINIMUM_MEMORY_SIZE_FAILURE = (size_t)strtol(argv[i], &endPtr, 10);
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (endPtr == argv[i]) {
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    printf("Can't parse %s\n", argv[i]);
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    help(argv[0]);
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    return 0;
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (*endPtr == '-') {
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    char *maxPtr = endPtr+1;
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    endPtr = NULL;
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    MAXIMUM_MEMORY_SIZE_FAILURE = (size_t)strtol(maxPtr, &endPtr, 10);
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (endPtr == argv[i]) {
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        printf("Can't parse %s\n", argv[i]);
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        help(argv[0]);
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        return 0;
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Use the default value */
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_setMemoryFunctions(NULL, ctest_libMalloc, ctest_libRealloc, ctest_libFree, &errorCode);
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(errorCode)) {
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                printf("u_setMemoryFunctions returned %s\n", u_errorName(errorCode));
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return 0;
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if(strcmp( argv[i], "-n") == 0 || strcmp( argv[i], "-no_err_msg") == 0)
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ERR_MSG = FALSE;
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-r") == 0)
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!REPEAT_TESTS_INIT) {
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                REPEAT_TESTS++;
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-x") == 0)
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          if(++i>=argc) {
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("* Error: '-x' option requires an argument. usage: '-x outfile.xml'.\n");
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return 0;
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          if(ctest_xml_setFileName(argv[i])) { /* set the name */
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return 0;
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-t_info") == 0) {
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ICU_TRACE = UTRACE_INFO;
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-t_error") == 0) {
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ICU_TRACE = UTRACE_ERROR;
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-t_warn") == 0) {
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ICU_TRACE = UTRACE_WARNING;
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-t_verbose") == 0) {
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ICU_TRACE = UTRACE_VERBOSE;
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-t_oc") == 0) {
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ICU_TRACE = UTRACE_OPEN_CLOSE;
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (strcmp( argv[i], "-h" )==0 || strcmp( argv[i], "--help" )==0)
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            help( argv[0] );
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return 0;
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (argHandler != NULL && (argSkip = argHandler(i, argc, argv, context)) > 0)
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            i += argSkip - 1;
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("* unknown option: %s\n", argv[i]);
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            help( argv[0] );
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return 0;
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ICU_TRACE != UTRACE_OFF) {
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utrace_setFunctions(NULL, TraceEntry, TraceExit, TraceData);
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utrace_setLevel(ICU_TRACE);
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 1; /* total error count */
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint T_CTEST_EXPORT2
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgrunTestRequest(const TestNode* root,
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int argc,
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             const char* const argv[])
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This main will parse the l, v, h, n, and path arguments
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TestNode*    toRun;
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int                i;
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int                doList = FALSE;
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int                subtreeOptionSeen = FALSE;
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int                errorCount = 0;
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    toRun = root;
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ctest_xml_init(ARGV_0)) {
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return 1; /* couldn't fire up XML thing */
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for( i=1; i<argc; i++)
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ( argv[i][0] == '/' )
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf("Selecting subtree '%s'\n", argv[i]);
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( argv[i][1] == 0 )
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                toRun = root;
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            else
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                toRun = getTest(root, argv[i]);
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( toRun == NULL )
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                printf("* Could not find any matching subtree\n");
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return -1;
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ON_LINE=FALSE; /* just in case */
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if( doList == TRUE)
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                showTests(toRun);
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            else
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                runTests(toRun);
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ON_LINE=FALSE; /* just in case */
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errorCount += ERROR_COUNT;
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            subtreeOptionSeen = TRUE;
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if ((strcmp( argv[i], "-a") == 0) || (strcmp(argv[i],"-all") == 0)) {
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            subtreeOptionSeen=FALSE;
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (strcmp( argv[i], "-l") == 0) {
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            doList = TRUE;
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* else option already handled by initArgs */
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( subtreeOptionSeen == FALSE) /* no other subtree given, run the default */
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ON_LINE=FALSE; /* just in case */
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if( doList == TRUE)
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            showTests(toRun);
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            runTests(toRun);
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ON_LINE=FALSE; /* just in case */
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errorCount += ERROR_COUNT;
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if( ( doList == FALSE ) && ( errorCount > 0 ) )
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            printf(" Total errors: %d\n", errorCount );
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    REPEAT_TESTS_INIT = 1;
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ctest_xml_fini()) {
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      errorCount++;
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return errorCount; /* total error count */
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Display program invocation arguments
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void help ( const char *argv0 )
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("Usage: %s [ -l ] [ -v ] [ -verbose] [-a] [ -all] [-n] [ -no_err_msg]\n"
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           "    [ -h ] [-t_info | -t_error | -t_warn | -t_oc | -t_verbose] [-m n[-q] ]\n"
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           "    [ /path/to/test ]\n",
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            argv0);
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -l  To get a list of test names\n");
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -e  to do exhaustive testing\n");
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -verbose To turn ON verbosity\n");
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -v  To turn ON verbosity(same as -verbose)\n");
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -x file.xml   Write junit format output to file.xml\n");
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -h  To print this message\n");
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -K  to turn OFF suppressing known issues\n");
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -n  To turn OFF printing error messages\n");
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -w  Don't fail on data-loading errs, just warn. Useful if\n"
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           "        user has reduced/changed the common set of ICU data \n");
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -t_info | -t_error | -t_warn | -t_oc | -t_verbose  Enable ICU tracing\n");
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -no_err_msg (same as -n) \n");
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -m n[-q] Min-Max memory size that will cause an allocation failure.\n");
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("        The default is the maximum value of size_t. Max is optional.\n");
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    -r  Repeat tests after calling u_cleanup \n");
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    [/subtest]  To run a subtest \n");
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printf("    eg: to run just the utility tests type: cintltest /tsutil) \n");
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t T_CTEST_EXPORT2
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orggetTestOption ( int32_t testOption ) {
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (testOption) {
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case VERBOSITY_OPTION:
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return VERBOSITY;
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case WARN_ON_MISSING_DATA_OPTION:
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return WARN_ON_MISSING_DATA;
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case QUICK_OPTION:
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return QUICK;
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case REPEAT_TESTS_OPTION:
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return REPEAT_TESTS;
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case ERR_MSG_OPTION:
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return ERR_MSG;
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case ICU_TRACE_OPTION:
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return ICU_TRACE;
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default :
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return 0;
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid T_CTEST_EXPORT2
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgsetTestOption ( int32_t testOption, int32_t value) {
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (value == DECREMENT_OPTION_VALUE) {
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        value = getTestOption(testOption);
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        --value;
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (testOption) {
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case VERBOSITY_OPTION:
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            VERBOSITY = value;
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case WARN_ON_MISSING_DATA_OPTION:
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            WARN_ON_MISSING_DATA = value;
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case QUICK_OPTION:
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            QUICK = value;
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case REPEAT_TESTS_OPTION:
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            REPEAT_TESTS = value;
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case ICU_TRACE_OPTION:
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ICU_TRACE = (UTraceLevel)value;
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default :
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ================== JUnit support ================================
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgT_CTEST_EXPORT2
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgctest_xml_setFileName(const char *name) {
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  XML_FILE_NAME=name;
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return 0;
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgT_CTEST_EXPORT2
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgctest_xml_init(const char *rootName) {
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!XML_FILE_NAME) return 0;
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  XML_FILE = fopen(XML_FILE_NAME,"w");
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!XML_FILE) {
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    perror("fopen");
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(stderr," Error: couldn't open XML output file %s\n", XML_FILE_NAME);
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 1;
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  while(*rootName&&!isalnum((int)*rootName)) {
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    rootName++;
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  strcpy(XML_PREFIX,rootName);
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  {
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *p = XML_PREFIX+strlen(XML_PREFIX);
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(p--;*p&&p>XML_PREFIX&&!isalnum((int)*p);p--) {
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      *p=0;
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* write prefix */
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fprintf(XML_FILE, "<testsuite name=\"%s\">\n", XML_PREFIX);
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return 0;
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgT_CTEST_EXPORT2
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgctest_xml_fini(void) {
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!XML_FILE) return 0;
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fprintf(XML_FILE, "</testsuite>\n");
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fclose(XML_FILE);
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  printf(" ( test results written to %s )\n", XML_FILE_NAME);
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  XML_FILE=0;
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return 0;
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgT_CTEST_EXPORT2
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgctest_xml_testcase(const char *classname, const char *name, const char *timeSeconds, const char *failMsg) {
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!XML_FILE) return 0;
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fprintf(XML_FILE, "\t<testcase classname=\"%s:%s\" name=\"%s:%s\" time=\"%s\"", XML_PREFIX, classname, XML_PREFIX, name, timeSeconds);
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(failMsg) {
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(XML_FILE, ">\n\t\t<failure type=\"err\" message=\"%s\"/>\n\t</testcase>\n", failMsg);
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fprintf(XML_FILE, "/>\n");
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return 0;
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1310