@@ -1149,4 +1149,165 @@ mod tests {
11491149
11501150 let log_contexts = LogContext :: parse_logs ( & raw_logs, "" . to_string ( ) , & programs_selector, 216778028 , "KDhFgTogstghe9P1jVjVepnwfR9ZbcU8a6D21jXBh3PPyfkkd92MmevsWW7qb6QtfmfmWxAPYnL3xZR81xVCmeQ" . to_string ( ) ) ;
11511151 }
1152+
1153+
1154+ #[ test]
1155+ fn log_parser_empty_logs_test ( ) {
1156+ let logs: Vec < String > = vec ! [ ] ;
1157+ let programs_selector = ProgramsSelector :: new_all_programs ( ) ;
1158+
1159+ let log_contexts = LogContext :: parse_logs (
1160+ & logs,
1161+ "" . to_string ( ) ,
1162+ & programs_selector,
1163+ 1 ,
1164+ "12345" . to_string ( ) ,
1165+ ) ;
1166+
1167+ assert ! ( log_contexts. is_empty( ) ) ;
1168+ }
1169+
1170+ #[ test]
1171+ fn log_parser_nested_invocations_test ( ) {
1172+ let logs: Vec < String > = vec ! [
1173+ "Program A111111111111111111111111111111111111111 invoke [1]" . to_string( ) ,
1174+ "Program B222222222222222222222222222222222222222 invoke [2]" . to_string( ) ,
1175+ "Program C333333333333333333333333333333333333333 invoke [3]" . to_string( ) ,
1176+ "Program C333333333333333333333333333333333333333 success" . to_string( ) ,
1177+ "Program B222222222222222222222222222222222222222 success" . to_string( ) ,
1178+ "Program A111111111111111111111111111111111111111 success" . to_string( ) ,
1179+ ] ;
1180+ let programs_selector = ProgramsSelector :: new_all_programs ( ) ;
1181+
1182+ let log_contexts = LogContext :: parse_logs (
1183+ & logs,
1184+ "" . to_string ( ) ,
1185+ & programs_selector,
1186+ 1 ,
1187+ "12345" . to_string ( ) ,
1188+ ) ;
1189+
1190+ assert_eq ! ( log_contexts. len( ) , 3 ) ;
1191+ assert_eq ! ( log_contexts[ 0 ] . program_id, "A111111111111111111111111111111111111111" ) ;
1192+ assert_eq ! ( log_contexts[ 1 ] . program_id, "B222222222222222222222222222222222222222" ) ;
1193+ assert_eq ! ( log_contexts[ 2 ] . program_id, "C333333333333333333333333333333333333333" ) ;
1194+ assert_eq ! ( log_contexts[ 0 ] . depth, 1 ) ;
1195+ assert_eq ! ( log_contexts[ 1 ] . depth, 2 ) ;
1196+ assert_eq ! ( log_contexts[ 2 ] . depth, 3 ) ;
1197+ }
1198+
1199+ #[ test]
1200+ fn log_parser_mismatched_invoke_success_test ( ) {
1201+ let logs: Vec < String > = vec ! [
1202+ "Program A111111111111111111111111111111111111111 invoke [1]" . to_string( ) ,
1203+ "Program B222222222222222222222222222222222222222 invoke [2]" . to_string( ) ,
1204+ "Program A111111111111111111111111111111111111111 success" . to_string( ) ,
1205+ ] ;
1206+ let programs_selector = ProgramsSelector :: new_all_programs ( ) ;
1207+
1208+ let log_contexts = LogContext :: parse_logs (
1209+ & logs,
1210+ "" . to_string ( ) ,
1211+ & programs_selector,
1212+ 1 ,
1213+ "12345" . to_string ( ) ,
1214+ ) ;
1215+
1216+ assert_eq ! ( log_contexts. len( ) , 2 ) ;
1217+ assert_eq ! ( log_contexts[ 0 ] . program_id, "A111111111111111111111111111111111111111" ) ;
1218+ assert_eq ! ( log_contexts[ 1 ] . program_id, "B222222222222222222222222222222222222222" ) ;
1219+ }
1220+
1221+ #[ test]
1222+ fn log_parser_program_return_test ( ) {
1223+ let logs: Vec < String > = vec ! [
1224+ "Program A111111111111111111111111111111111111111 invoke [1]" . to_string( ) ,
1225+ "Program return: A111111111111111111111111111111111111111 SomeReturnValue" . to_string( ) ,
1226+ "Program A111111111111111111111111111111111111111 success" . to_string( ) ,
1227+ ] ;
1228+ let programs_selector = ProgramsSelector :: new_all_programs ( ) ;
1229+
1230+ let log_contexts = LogContext :: parse_logs (
1231+ & logs,
1232+ "" . to_string ( ) ,
1233+ & programs_selector,
1234+ 1 ,
1235+ "12345" . to_string ( ) ,
1236+ ) ;
1237+
1238+ assert_eq ! ( log_contexts. len( ) , 1 ) ;
1239+ assert_eq ! ( log_contexts[ 0 ] . program_id, "A111111111111111111111111111111111111111" ) ;
1240+ assert_eq ! ( log_contexts[ 0 ] . invoke_result, "SomeReturnValue" ) ;
1241+ }
1242+
1243+ #[ test]
1244+ fn log_parser_program_consumption_test ( ) {
1245+ let logs: Vec < String > = vec ! [
1246+ "Program A111111111111111111111111111111111111111 invoke [1]" . to_string( ) ,
1247+ "Program consumption: 50000" . to_string( ) ,
1248+ "Program A111111111111111111111111111111111111111 success" . to_string( ) ,
1249+ ] ;
1250+ let programs_selector = ProgramsSelector :: new_all_programs ( ) ;
1251+
1252+ let log_contexts = LogContext :: parse_logs (
1253+ & logs,
1254+ "" . to_string ( ) ,
1255+ & programs_selector,
1256+ 1 ,
1257+ "12345" . to_string ( ) ,
1258+ ) ;
1259+
1260+ assert_eq ! ( log_contexts. len( ) , 1 ) ;
1261+ assert_eq ! ( log_contexts[ 0 ] . program_id, "A111111111111111111111111111111111111111" ) ;
1262+ assert_eq ! ( log_contexts[ 0 ] . raw_logs. len( ) , 3 ) ;
1263+ assert ! ( log_contexts[ 0 ] . raw_logs. contains( & "Program consumption: 50000" . to_string( ) ) ) ;
1264+ }
1265+
1266+ #[ test]
1267+ fn log_parser_multiple_instructions_test ( ) {
1268+ let logs: Vec < String > = vec ! [
1269+ "Program A111111111111111111111111111111111111111 invoke [1]" . to_string( ) ,
1270+ "Program A111111111111111111111111111111111111111 success" . to_string( ) ,
1271+ "Program B222222222222222222222222222222222222222 invoke [1]" . to_string( ) ,
1272+ "Program B222222222222222222222222222222222222222 success" . to_string( ) ,
1273+ ] ;
1274+ let programs_selector = ProgramsSelector :: new_all_programs ( ) ;
1275+
1276+ let log_contexts = LogContext :: parse_logs (
1277+ & logs,
1278+ "" . to_string ( ) ,
1279+ & programs_selector,
1280+ 1 ,
1281+ "12345" . to_string ( ) ,
1282+ ) ;
1283+
1284+ assert_eq ! ( log_contexts. len( ) , 2 ) ;
1285+ assert_eq ! ( log_contexts[ 0 ] . program_id, "A111111111111111111111111111111111111111" ) ;
1286+ assert_eq ! ( log_contexts[ 1 ] . program_id, "B222222222222222222222222222222222222222" ) ;
1287+ assert_eq ! ( log_contexts[ 0 ] . instruction_index, 0 ) ;
1288+ assert_eq ! ( log_contexts[ 1 ] . instruction_index, 1 ) ;
1289+ }
1290+
1291+ #[ test]
1292+ fn log_parser_transaction_error_test ( ) {
1293+ let logs: Vec < String > = vec ! [
1294+ "Program A111111111111111111111111111111111111111 invoke [1]" . to_string( ) ,
1295+ "Program A111111111111111111111111111111111111111 failed: custom program error: 0x1" . to_string( ) ,
1296+ ] ;
1297+ let programs_selector = ProgramsSelector :: new_all_programs ( ) ;
1298+
1299+ let log_contexts = LogContext :: parse_logs (
1300+ & logs,
1301+ "Transaction failed" . to_string ( ) ,
1302+ & programs_selector,
1303+ 1 ,
1304+ "12345" . to_string ( ) ,
1305+ ) ;
1306+
1307+ assert_eq ! ( log_contexts. len( ) , 1 ) ;
1308+ assert_eq ! ( log_contexts[ 0 ] . program_id, "A111111111111111111111111111111111111111" ) ;
1309+ assert_eq ! ( log_contexts[ 0 ] . transaction_error, "Transaction failed" ) ;
1310+ assert_eq ! ( log_contexts[ 0 ] . errors. len( ) , 1 ) ;
1311+ assert_eq ! ( log_contexts[ 0 ] . errors[ 0 ] , "custom program error: 0x1" ) ;
1312+ }
11521313}
0 commit comments