@@ -85,6 +85,7 @@ struct SSTrw{
8585};
8686
8787
88+ #if 1
8889TEST (ADParserTestConstructor, opensTimesoutCorrectlySST){
8990 std::string filename = " commfile" ;
9091 bool got_err= false ;
@@ -620,6 +621,7 @@ TEST(ADParserTestFuncDataIO, funcDataLocalToGlobalIndexReplacementWorks){
620621 psthr.join ();
621622 std::cout << " Main thread finished" << std::endl;
622623}
624+ #endif
623625
624626// Events same up to id string (set by parser) or idx (set by static count in unit test header)
625627bool same_up_to_id_string (const Event_t &l, const Event_t &r){
@@ -954,3 +956,116 @@ TEST(ADParserTest, CorrelationIDeventOrderCorrectly){
954956 }
955957 }
956958}
959+
960+
961+
962+
963+
964+ TEST (ADParserTest, CorrelationIDeventEdgeCases){
965+ std::unordered_map<int , std::string> event_types = { {0 ," ENTRY" }, {1 ," EXIT" }, {2 ," SEND" }, {3 ," RECV" } };
966+ std::unordered_map<int , std::string> func_names = { {12 ," MYFUNC" }, {13 ," OTHERFUNC" } };
967+ std::unordered_map<int , std::string> counter_names = { {99 ," Correlation ID" } };
968+
969+ int ENTRY = 0 ;
970+ int EXIT = 1 ;
971+ int SEND = 2 ;
972+ int RECV = 3 ;
973+ int CORRID = 99 ;
974+ int MYFUNC = 12 ;
975+ int OTHERFUNC = 13 ;
976+
977+ int pid=0 , tid=0 , rid=0 ;
978+
979+
980+ {
981+ std::cout << " Show that a function will claim a correlation ID if ENTRY, EXIT and COUNTER all have the same timestamp" << std::endl;
982+ // Usually an EXIT event will be prioritized over a COUNTER if they have the same timestamp and the counter is a corid
983+ // because corids are associated with ENTRY events, but the basic logic doesn't work for the case when all 3 have the same timestamp
984+ // We deal with this edge case explicitly
985+
986+ std::vector<Event_t> events = {
987+ createFuncEvent_t (pid, rid, tid, ENTRY, MYFUNC, 100 ),
988+ createFuncEvent_t (pid, rid, tid, EXIT, MYFUNC, 100 ),
989+ createCounterEvent_t (pid, rid, tid, CORRID, 1256 , 100 ), // correlation ID associated with function
990+ createFuncEvent_t (pid, rid, tid, ENTRY, OTHERFUNC, 101 ),
991+ createFuncEvent_t (pid, rid, tid, EXIT, OTHERFUNC, 102 )
992+ };
993+
994+ ADParser parser (" " ,0 ,rid," BPFile" );
995+ parser.setFuncDataCapacity (100 );
996+ parser.setCommDataCapacity (100 );
997+ parser.setCounterDataCapacity (100 );
998+ parser.setFuncMap (func_names);
999+ parser.setEventTypeMap (event_types);
1000+ parser.setCounterMap (counter_names);
1001+
1002+ for (int i=0 ;i<events.size ();i++){
1003+ if (events[i].type () == EventDataType::FUNC)
1004+ parser.addFuncData (events[i].get_ptr ());
1005+ else if (events[i].type () == EventDataType::COMM)
1006+ parser.addCommData (events[i].get_ptr ());
1007+ else if (events[i].type () == EventDataType::COUNT)
1008+ parser.addCounterData (events[i].get_ptr ());
1009+ else
1010+ FAIL () << " Invalid EventDataType" ;
1011+ }
1012+
1013+ std::vector<Event_t> events_out = parser.getEvents ();
1014+
1015+ EXPECT_EQ (events_out.size (), events.size ());
1016+
1017+ std::vector<int > order = {0 ,2 ,1 ,3 ,4 };
1018+ for (int i=0 ;i<5 ;i++){
1019+ std::cout << " Expect " << events[order[i]].get_json ().dump () << " got " << events_out[i].get_json ().dump () << std::endl;
1020+ EXPECT_TRUE ( same_up_to_id_string (events_out[i], events[order[i]]) );
1021+ }
1022+ }
1023+
1024+ {
1025+ std::cout << " Show that if an ENTRY, CORID, EXIT and the next ENTRY, CORID all coindice, the first function will claim only one of the CORIDs" << std::endl;
1026+ std::vector<Event_t> events = {
1027+ createFuncEvent_t (pid, rid, tid, ENTRY, MYFUNC, 100 ), // 0
1028+ createFuncEvent_t (pid, rid, tid, EXIT, MYFUNC, 100 ), // 1
1029+ createFuncEvent_t (pid, rid, tid, ENTRY, OTHERFUNC, 100 ), // 2
1030+ createFuncEvent_t (pid, rid, tid, EXIT, OTHERFUNC, 100 ), // 3
1031+ createFuncEvent_t (pid, rid, tid, ENTRY, MYFUNC, 100 ), // 4
1032+ createFuncEvent_t (pid, rid, tid, EXIT, MYFUNC, 100 ), // 5
1033+ createCounterEvent_t (pid, rid, tid, CORRID, 1256 , 100 ), // 6
1034+ createCounterEvent_t (pid, rid, tid, CORRID, 1257 , 100 ), // 7
1035+ createCounterEvent_t (pid, rid, tid, CORRID, 1258 , 100 ) // 8
1036+ };
1037+
1038+ ADParser parser (" " ,0 ,rid," BPFile" );
1039+ parser.setFuncDataCapacity (100 );
1040+ parser.setCommDataCapacity (100 );
1041+ parser.setCounterDataCapacity (100 );
1042+ parser.setFuncMap (func_names);
1043+ parser.setEventTypeMap (event_types);
1044+ parser.setCounterMap (counter_names);
1045+
1046+ for (int i=0 ;i<events.size ();i++){
1047+ if (events[i].type () == EventDataType::FUNC)
1048+ parser.addFuncData (events[i].get_ptr ());
1049+ else if (events[i].type () == EventDataType::COMM)
1050+ parser.addCommData (events[i].get_ptr ());
1051+ else if (events[i].type () == EventDataType::COUNT)
1052+ parser.addCounterData (events[i].get_ptr ());
1053+ else
1054+ FAIL () << " Invalid EventDataType" ;
1055+ }
1056+
1057+ std::vector<Event_t> events_out = parser.getEvents ();
1058+
1059+ EXPECT_EQ (events_out.size (), events.size ());
1060+
1061+ std::vector<int > order = {0 ,6 ,1 ,2 ,7 ,3 ,4 ,8 ,5 };
1062+ for (int i=0 ;i<order.size ();i++){
1063+ std::cout << " Expect " << events[order[i]].get_json ().dump () << " got " << events_out[i].get_json ().dump () << std::endl;
1064+ EXPECT_TRUE ( same_up_to_id_string (events_out[i], events[order[i]]) );
1065+ }
1066+ }
1067+
1068+
1069+
1070+
1071+ }
0 commit comments