#include #include /* fprintf */ #include /* strcmp */ #include "transmission.h" #include "bitfield.h" #include "ConvertUTF.h" /* tr_utf8_validate*/ #include "platform.h" #include "crypto.h" #include "utils.h" #include "web.h" /* #define VERBOSE */ #undef VERBOSE #define NUM_LOOPS 1 #define SPEED_TEST 0 #if SPEED_TEST #define VERBOSE #undef NUM_LOOPS #define NUM_LOOPS 200 #endif static int test = 0; #ifdef VERBOSE #define check( A ) \ { \ ++test; \ if( A ){ \ fprintf( stderr, "PASS test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \ } else { \ fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \ return test; \ } \ } #else #define check( A ) \ { \ ++test; \ if( !( A ) ){ \ fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \ return test; \ } \ } #endif static int test_bitfield_count_range( void ) { int i; int n; int begin; int end; int count1; int count2; const int bitCount = 100 + tr_cryptoWeakRandInt( 1000 ); tr_bitfield bf; /* generate a random bitfield */ tr_bitfieldConstruct( &bf, bitCount ); for( i=0, n=tr_cryptoWeakRandInt(bitCount); i= 21 ) ) ); /* test tr_bitfieldRemRange on the boundaries */ tr_bitfieldAddRange( &field, 0, 64 ); tr_bitfieldRemRange( &field, 8, 24 ); for( i = 0; i < 64; ++i ) check( tr_bitfieldHas( &field, i ) == ( ( i < 8 ) || ( i >= 24 ) ) ); /* test tr_bitfieldRemRange when begin & end is on the same word */ tr_bitfieldAddRange( &field, 0, 64 ); tr_bitfieldRemRange( &field, 4, 5 ); for( i = 0; i < 64; ++i ) check( tr_bitfieldHas( &field, i ) == ( ( i < 4 ) || ( i >= 5 ) ) ); /* test tr_bitfieldAddRange */ tr_bitfieldRemRange( &field, 0, 64 ); tr_bitfieldAddRange( &field, 4, 21 ); for( i = 0; i < 64; ++i ) check( tr_bitfieldHas( &field, i ) == ( ( 4 <= i ) && ( i < 21 ) ) ); /* test tr_bitfieldAddRange on the boundaries */ tr_bitfieldRemRange( &field, 0, 64 ); tr_bitfieldAddRange( &field, 8, 24 ); for( i = 0; i < 64; ++i ) check( tr_bitfieldHas( &field, i ) == ( ( 8 <= i ) && ( i < 24 ) ) ); /* test tr_bitfieldAddRange when begin & end is on the same word */ tr_bitfieldRemRange( &field, 0, 64 ); tr_bitfieldAddRange( &field, 4, 5 ); for( i = 0; i < 64; ++i ) check( tr_bitfieldHas( &field, i ) == ( ( 4 <= i ) && ( i < 5 ) ) ); tr_bitfieldDestruct( &field ); return 0; } static int test_strip_positional_args( void ) { const char * in; const char * out; const char * expected; in = "Hello %1$s foo %2$.*f"; expected = "Hello %s foo %.*f"; out = tr_strip_positional_args( in ); check( out != NULL ) check( !strcmp( out, expected ) ) in = "Hello %1$'d foo %2$'f"; expected = "Hello %d foo %f"; out = tr_strip_positional_args( in ); check( out != NULL ) check( !strcmp( out, expected ) ) return 0; } static int test_strstrip( void ) { char *in, *out; /* strstrip */ in = tr_strdup( " test " ); out = tr_strstrip( in ); check( in == out ); check( !strcmp( in, "test" ) ); tr_free( in ); /* strstrip */ in = tr_strdup( " test test " ); out = tr_strstrip( in ); check( in == out ); check( !strcmp( in, "test test" ) ); tr_free( in ); /* strstrip */ in = tr_strdup( "test" ); out = tr_strstrip( in ); check( in == out ); check( !strcmp( in, "test" ) ); tr_free( in ); return 0; } static int test_buildpath( void ) { char * out; out = tr_buildPath( "foo", "bar", NULL ); check( !strcmp( out, "foo" TR_PATH_DELIMITER_STR "bar" ) ); tr_free( out ); out = tr_buildPath( "", "foo", "bar", NULL ); check( !strcmp( out, TR_PATH_DELIMITER_STR "foo" TR_PATH_DELIMITER_STR "bar" ) ); tr_free( out ); return 0; } static int test_utf8( void ) { const char * in; char * out; in = "hello world"; out = tr_utf8clean( in, -1 ); check( out != NULL ) check( !strcmp( out, in ) ) tr_free( out ); in = "hello world"; out = tr_utf8clean( in, 5 ); check( out != NULL ) check( !strcmp( out, "hello" ) ) tr_free( out ); /* this version is not utf-8 */ in = "Òðóäíî áûòü Áîãîì"; out = tr_utf8clean( in, 17 ); check( out != NULL ) check( ( strlen( out ) == 17 ) || ( strlen( out ) == 32 ) ) check( tr_utf8_validate( out, -1, NULL ) ) tr_free( out ); /* same string, but utf-8 clean */ in = "Òðóäíî áûòü Ãîãîì"; out = tr_utf8clean( in, -1 ); check( out != NULL ) check( tr_utf8_validate( out, -1, NULL ) ) check ( !strcmp( in, out ) ) tr_free( out ); return 0; } static int test_numbers( void ) { int i; int count; int * numbers; numbers = tr_parseNumberRange( "1-10,13,16-19", -1, &count ); check( count == 15 ); check( numbers != NULL ); check( numbers[0] == 1 ); check( numbers[5] == 6 ); check( numbers[9] == 10 ); check( numbers[10] == 13 ); check( numbers[11] == 16 ); check( numbers[14] == 19 ); tr_free( numbers ); numbers = tr_parseNumberRange( "1-5,3-7,2-6", -1, &count ); check( count == 7 ); check( numbers != NULL ); for( i=0; i= 0 ); check( val < 100 ); } /* simple bitfield tests */ for( l = 0; l < NUM_LOOPS; ++l ) if( ( i = test_bitfields( ) ) ) return i; /* bitfield count range */ for( l=0; l<10000; ++l ) if(( i = test_bitfield_count_range( ))) return i; return 0; }