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