source: trunk/libtransmission/utils-test.c @ 7854

Last change on this file since 7854 was 7854, checked in by charles, 13 years ago

(trunk libT) #1671: transmission-remote --get option not including all files

File size: 6.6 KB
Line 
1#include <stdio.h> /* fprintf */
2#include <string.h> /* strcmp */
3#include "transmission.h"
4#include "ConvertUTF.h" /* tr_utf8_validate*/
5#include "platform.h"
6#include "utils.h"
7#include "crypto.h"
8
9#undef VERBOSE
10#define NUM_LOOPS 1
11#define SPEED_TEST 0
12
13#if SPEED_TEST
14 #define VERBOSE
15 #undef NUM_LOOPS
16 #define NUM_LOOPS 200
17#endif
18
19static int test = 0;
20
21#ifdef VERBOSE
22  #define check( A ) \
23    { \
24        ++test; \
25        if( A ){ \
26            fprintf( stderr, "PASS test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
27        } else { \
28            fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
29            return test; \
30        } \
31    }
32#else
33  #define check( A ) \
34    { \
35        ++test; \
36        if( !( A ) ){ \
37            fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
38            return test; \
39        } \
40    }
41#endif
42
43static int
44test_bitfields( void )
45{
46    unsigned int  i;
47    unsigned int  bitcount = 5000000;
48    tr_bitfield * field = tr_bitfieldNew( bitcount );
49
50    /* test tr_bitfieldAdd */
51    for( i = 0; i < bitcount; ++i )
52        if( !( i % 7 ) )
53            tr_bitfieldAdd( field, i );
54    for( i = 0; i < bitcount; ++i )
55        check( tr_bitfieldHas( field, i ) == ( !( i % 7 ) ) );
56
57    /* test tr_bitfieldAddRange */
58    tr_bitfieldAddRange( field, 0, bitcount );
59    for( i = 0; i < bitcount; ++i )
60        check( tr_bitfieldHas( field, i ) );
61
62    /* test tr_bitfieldRemRange in the middle of a boundary */
63    tr_bitfieldRemRange( field, 4, 21 );
64    for( i = 0; i < 64; ++i )
65        check( tr_bitfieldHas( field, i ) == ( ( i < 4 ) || ( i >= 21 ) ) );
66
67    /* test tr_bitfieldRemRange on the boundaries */
68    tr_bitfieldAddRange( field, 0, 64 );
69    tr_bitfieldRemRange( field, 8, 24 );
70    for( i = 0; i < 64; ++i )
71        check( tr_bitfieldHas( field, i ) == ( ( i < 8 ) || ( i >= 24 ) ) );
72
73    /* test tr_bitfieldRemRange when begin & end is on the same word */
74    tr_bitfieldAddRange( field, 0, 64 );
75    tr_bitfieldRemRange( field, 4, 5 );
76    for( i = 0; i < 64; ++i )
77        check( tr_bitfieldHas( field, i ) == ( ( i < 4 ) || ( i >= 5 ) ) );
78
79    /* test tr_bitfieldAddRange */
80    tr_bitfieldRemRange( field, 0, 64 );
81    tr_bitfieldAddRange( field, 4, 21 );
82    for( i = 0; i < 64; ++i )
83        check( tr_bitfieldHas( field, i ) == ( ( 4 <= i ) && ( i < 21 ) ) );
84
85    /* test tr_bitfieldAddRange on the boundaries */
86    tr_bitfieldRemRange( field, 0, 64 );
87    tr_bitfieldAddRange( field, 8, 24 );
88    for( i = 0; i < 64; ++i )
89        check( tr_bitfieldHas( field, i ) == ( ( 8 <= i ) && ( i < 24 ) ) );
90
91    /* test tr_bitfieldAddRange when begin & end is on the same word */
92    tr_bitfieldRemRange( field, 0, 64 );
93    tr_bitfieldAddRange( field, 4, 5 );
94    for( i = 0; i < 64; ++i )
95        check( tr_bitfieldHas( field, i ) == ( ( 4 <= i ) && ( i < 5 ) ) );
96
97    tr_bitfieldFree( field );
98    return 0;
99}
100
101static int
102test_strstrip( void )
103{
104    char *in, *out;
105
106    /* strstrip */
107    in = tr_strdup( "   test    " );
108    out = tr_strstrip( in );
109    check( in == out );
110    check( !strcmp( in, "test" ) );
111    tr_free( in );
112
113    /* strstrip */
114    in = tr_strdup( " test test " );
115    out = tr_strstrip( in );
116    check( in == out );
117    check( !strcmp( in, "test test" ) );
118    tr_free( in );
119
120    /* strstrip */
121    in = tr_strdup( "test" );
122    out = tr_strstrip( in );
123    check( in == out );
124    check( !strcmp( in, "test" ) );
125    tr_free( in );
126
127    return 0;
128}
129
130static int
131test_buildpath( void )
132{
133    char * out;
134
135    out = tr_buildPath( "foo", "bar", NULL );
136    check( !strcmp( out, "foo" TR_PATH_DELIMITER_STR "bar" ) );
137    tr_free( out );
138
139    out = tr_buildPath( "", "foo", "bar", NULL );
140    check( !strcmp( out, TR_PATH_DELIMITER_STR "foo" TR_PATH_DELIMITER_STR "bar" ) );
141    tr_free( out );
142
143    return 0;
144}
145
146static int
147test_utf8( void )
148{
149    const char * in;
150    char * out;
151    tr_bool err;
152
153    in = "hello world";
154    out = tr_utf8clean( in, -1, &err );
155    check( err == FALSE )
156    check( out != NULL )
157    check( !strcmp( out, in ) )
158    tr_free( out );
159
160    in = "hello world";
161    out = tr_utf8clean( in, 5, &err );
162    check( err == FALSE )
163    check( out != NULL )
164    check( !strcmp( out, "hello" ) )
165    tr_free( out );
166
167    /* this version is not utf-8 */
168    in = "Òðóäíî áûòü Áîãîì";
169    out = tr_utf8clean( in, 17, &err );
170    check( out != NULL )
171    check( err != 0 )
172    check( strlen( out ) == 17 )
173    check( tr_utf8_validate( out, -1, NULL ) )
174    tr_free( out );
175
176    /* same string, but utf-8 clean */
177    in = "ÒðóÀíî áûòÌ Áîãîì";
178    out = tr_utf8clean( in, -1, &err );
179    check( out != NULL )
180    check( !err );
181    check( tr_utf8_validate( out, -1, NULL ) )
182    check ( !strcmp( in, out ) )
183    tr_free( out );
184
185    return 0;
186}
187
188static int
189test_numbers( void )
190{
191    int i;
192    int count;
193    int * numbers;
194
195    numbers = tr_parseNumberRange( "1-10,13,16-19", -1, &count );
196    check( count == 15 );
197    check( numbers != NULL );
198    check( numbers[0] == 1 );
199    check( numbers[5] == 6 );
200    check( numbers[9] == 10 );
201    check( numbers[10] == 13 );
202    check( numbers[11] == 16 );
203    check( numbers[14] == 19 );
204    tr_free( numbers );
205
206    numbers = tr_parseNumberRange( "1-5,3-7,2-6", -1, &count );
207    check( count == 7 );
208    check( numbers != NULL );
209    for( i=0; i<count; ++i )
210        check( numbers[i] == i+1 );
211    tr_free( numbers );
212
213    numbers = tr_parseNumberRange( "1-Hello", -1, &count );
214    check( count == 0 );
215    check( numbers == NULL );
216
217    numbers = tr_parseNumberRange( "1-", -1, &count );
218    check( count == 0 );
219    check( numbers == NULL );
220
221    numbers = tr_parseNumberRange( "Hello", -1, &count );
222    check( count == 0 );
223    check( numbers == NULL );
224
225    return 0;
226}
227
228int
229main( void )
230{
231    char *in, *out;
232    int   len;
233    int   i;
234    int   l;
235
236    /* base64 */
237    out = tr_base64_encode( "YOYO!", -1, &len );
238    check( out );
239    check( !strcmp( out, "WU9ZTyE=\n" ) );
240    check( len == 9 );
241    in = tr_base64_decode( out, -1, &len );
242    check( in );
243    check( !strcmp( in, "YOYO!" ) );
244    check( len == 5 );
245    tr_free( in );
246    tr_free( out );
247
248    if( ( i = test_strstrip( ) ) )
249        return i;
250    if( ( i = test_buildpath( ) ) )
251        return i;
252    if( ( i = test_utf8( ) ) )
253        return i;
254    if( ( i = test_numbers( ) ) )
255        return i;
256
257    /* test that tr_cryptoRandInt() stays in-bounds */
258    for( i = 0; i < 100000; ++i )
259    {
260        const int val = tr_cryptoRandInt( 100 );
261        check( val >= 0 );
262        check( val < 100 );
263    }
264
265    /* simple bitfield tests */
266    for( l = 0; l < NUM_LOOPS; ++l )
267        if( ( i = test_bitfields( ) ) )
268            return i;
269
270    return 0;
271}
272
Note: See TracBrowser for help on using the repository browser.