/* * File: failed_events.c * Author: Vince Weaver */ /* This test tries adding events that don't exist */ /* We've had issues where the name resolution code might do weird */ /* things when passed invalid event names */ #include #include #include #include "papi.h" #include "papi_test.h" #define LARGE_NAME_SIZE 4096 char large_name[LARGE_NAME_SIZE]; int main( int argc, char **argv ) { int i, k, err_count = 0; int retval; PAPI_event_info_t info, info1; const PAPI_component_info_t* cmpinfo; int numcmp, cid; int quiet; int EventSet = PAPI_NULL; /* Set quiet variable */ quiet=tests_quiet( argc, argv ); /* Init PAPI library */ retval = PAPI_library_init( PAPI_VER_CURRENT ); if ( retval != PAPI_VER_CURRENT ) { test_fail( __FILE__, __LINE__, "PAPI_library_init", retval ); } if (!quiet) { printf("Test adding invalid events.\n"); } /* Create an eventset */ retval = PAPI_create_eventset( &EventSet ); if ( retval != PAPI_OK ) { test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval ); } /* Simple Event */ if (!quiet) { printf("+ Simple invalid event\t"); } retval=PAPI_add_named_event(EventSet,"INVALID_EVENT"); if (retval==PAPI_OK) { if (!quiet) { printf("Unexpectedly opened!\n"); err_count++; } } else { if (!quiet) printf("OK\n"); } /* Extra Colons */ if (!quiet) { printf("+ Extra colons\t"); } retval=PAPI_add_named_event(EventSet,"INV::::AL:ID:::_E=3V::E=NT"); if (retval==PAPI_OK) { if (!quiet) { printf("Unexpectedly opened!\n"); err_count++; } } else { if (!quiet) printf("OK\n"); } /* Large Invalid Event */ if (!quiet) { printf("+ Large invalid event\t"); } memset(large_name,'A',LARGE_NAME_SIZE); large_name[LARGE_NAME_SIZE-1]=0; retval=PAPI_add_named_event(EventSet,large_name); if (retval==PAPI_OK) { if (!quiet) { printf("Unexpectedly opened!\n"); err_count++; } } else { if (!quiet) printf("OK\n"); } /* Large Unterminated Invalid Event */ if (!quiet) { printf("+ Large unterminated invalid event\t"); } memset(large_name,'A',LARGE_NAME_SIZE); retval=PAPI_add_named_event(EventSet,large_name); if (retval==PAPI_OK) { if (!quiet) { printf("Unexpectedly opened!\n"); err_count++; } } else { if (!quiet) printf("OK\n"); } /* Randomly modifying valid events */ if (!quiet) { printf("+ Randomly modifying valid events\t"); } numcmp = PAPI_num_components( ); /* Loop through all components */ for( cid = 0; cid < numcmp; cid++ ) { cmpinfo = PAPI_get_component_info( cid ); if (cmpinfo == NULL) { test_fail( __FILE__, __LINE__, "PAPI_get_component_info", 2 ); } /* Include disabled components */ if (cmpinfo->disabled) { // continue; } /* For platform independence, always ASK FOR the first event */ /* Don't just assume it'll be the first numeric value */ i = 0 | PAPI_NATIVE_MASK; retval = PAPI_enum_cmp_event( &i, PAPI_ENUM_FIRST, cid ); do { retval = PAPI_get_event_info( i, &info ); k = i; if ( PAPI_enum_cmp_event(&k, PAPI_NTV_ENUM_UMASKS, cid )==PAPI_OK ) { do { retval = PAPI_get_event_info( k, &info1 ); /* Skip perf_raw event as it is hard to error out */ if (strstr(info1.symbol,"perf_raw")) { break; } // printf("%s\n",info1.symbol); if (strlen(info1.symbol)>5) { info1.symbol[strlen(info1.symbol)-4]^=0xa5; retval=PAPI_add_named_event(EventSet,info1.symbol); if (retval==PAPI_OK) { if (!quiet) { printf("Unexpectedly opened %s!\n", info1.symbol); err_count++; } } } } while ( PAPI_enum_cmp_event( &k, PAPI_NTV_ENUM_UMASKS, cid ) == PAPI_OK ); } else { /* Event didn't have any umasks */ // printf("%s\n",info1.symbol); if (strlen(info1.symbol)>5) { info1.symbol[strlen(info1.symbol)-4]^=0xa5; retval=PAPI_add_named_event(EventSet,info1.symbol); if (retval==PAPI_OK) { if (!quiet) { printf("Unexpectedly opened %s!\n", info1.symbol); err_count++; } } } } } while ( PAPI_enum_cmp_event( &i, PAPI_ENUM_EVENTS, cid ) == PAPI_OK ); } if ( err_count ) { if (!quiet) { printf( "%d Invalid events added.\n", err_count ); } test_fail( __FILE__, __LINE__, "Invalid events added", 1 ); } test_pass( __FILE__ ); return 0; }