1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru**********************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Copyright (c) 2002-2007, International Business Machines
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others.  All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru**********************************************************************
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef _UPERF_H
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define _UPERF_H
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unistr.h"
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/testtype.h"
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utimer.h"
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucbuf.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Forward declarations from uoptions.h.
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct UOption;
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct UOption UOption;
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_CONVERSION
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_USE
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Use the TESTCASE macro in subclasses of IntlTest.  Define the
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// runIndexedTest method in this fashion:
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| void MyTest::runIndexedTest(int32_t index, UBool exec,
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//|                             const char* &name, char* /*par*/) {
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//|     switch (index) {
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//|         TESTCASE(0,TestSomething);
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//|         TESTCASE(1,TestSomethingElse);
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//|         TESTCASE(2,TestAnotherThing);
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//|         default:
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//|             name = "";
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//|             return NULL;
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//|     }
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//| }
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TESTCASE(id,test)                       \
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    case id:                                    \
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        name = #test;                           \
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (exec) {                             \
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fprintf(stdout,#test "---");        \
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            fprintf(stdout,"\n");               \
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return test();                      \
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }                                       \
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        break
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TESTCASE(id,test)                       \
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    case id:                                    \
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        name = #test;                           \
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (exec) {                             \
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return test();                      \
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }                                       \
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        break
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Subclasses of PerfTest will need to create subclasses of
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Function that define a call() method which contains the code to
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * be timed.  They then call setTestFunction() in their "Test..."
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * method to establish this as the current test functor.
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass T_CTEST_EXPORT_API UPerfFunction {
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Subclasses must implement this method to do the action to be
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * measured.
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void call(UErrorCode* status)=0;
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Subclasses must implement this method to return positive
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * integer indicating the number of operations in a single
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * call to this object's call() method.
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual long getOperationsPerIteration()=0;
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Subclasses should override this method to return either positive
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * or negative integer indicating the number of events in a single
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * call to this object's call() method, if applicable
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * e.g: Number of breaks / iterations for break iterator
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual long getEventsPerIteration(){
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return -1;
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * destructor
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~UPerfFunction() {}
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Call call() n times in a tight loop and return the elapsed
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * milliseconds.  If n is small and call() is fast the return
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * result may be zero.  Small return values have limited
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * meaningfulness, depending on the underlying CPU and OS.
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     virtual double time(int32_t n, UErrorCode* status) {
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UTimer start, stop;
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utimer_getTime(&start);
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        while (n-- > 0) {
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            call(status);
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utimer_getTime(&stop);
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return utimer_getDeltaSeconds(&start,&stop); // ms
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass T_CTEST_EXPORT_API UPerfTest {
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool run();
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool runTest( char* name = NULL, char* par = NULL ); // not to be overidden
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual void usage( void ) ;
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual ~UPerfTest();
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void setCaller( UPerfTest* callingTest ); // for internal use only
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void setPath( char* path ); // for internal use only
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ULine* getLines(UErrorCode& status);
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* getBuffer(int32_t& len,UErrorCode& status);
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprotected:
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UPerfTest(int32_t argc, const char* argv[], UErrorCode& status);
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UPerfTest(int32_t argc, const char* argv[],
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              UOption addOptions[], int32_t addOptionsCount,
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              const char *addUsage,
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              UErrorCode& status);
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void init(UOption addOptions[], int32_t addOptionsCount,
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              UErrorCode& status);
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UPerfFunction* runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); // overide !
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UBool runTestLoop( char* testname, char* par );
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    virtual UBool callTest( UPerfTest& testToBeCalled, char* par );
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t      _argc;
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char** _argv;
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char * _addUsage;
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char*        resolvedFileName;
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCHARBUF*    ucharBuf;
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char*  encoding;
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool        uselen;
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char*  fileName;
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char*  sourceDir;
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t      _remainingArgc;
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ULine*       lines;
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t      numLines;
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool        line_mode;
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* buffer;
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t      bufferLen;
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool        verbose;
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool        bulk_mode;
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t      passes;
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t      iterations;
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t      time;
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char*  locale;
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UPerfTest*   caller;
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char*        path;           // specifies subtests
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// static members
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static UPerfTest* gTest;
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char gUsageString[];
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
180