44import static org .tron .protos .Protocol .Transaction .Result .contractResult .PRECOMPILED_CONTRACT ;
55import static org .tron .protos .Protocol .Transaction .Result .contractResult .SUCCESS ;
66
7+ import ch .qos .logback .classic .Level ;
8+ import ch .qos .logback .classic .Logger ;
9+ import ch .qos .logback .classic .spi .ILoggingEvent ;
10+ import ch .qos .logback .core .read .ListAppender ;
711import com .google .protobuf .ByteString ;
12+ import java .util .List ;
13+ import java .util .concurrent .TimeUnit ;
14+ import java .util .stream .Collectors ;
815import lombok .extern .slf4j .Slf4j ;
916import org .junit .Assert ;
1017import org .junit .Before ;
1118import org .junit .BeforeClass ;
1219import org .junit .Test ;
20+ import org .slf4j .LoggerFactory ;
1321import org .tron .common .BaseTest ;
1422import org .tron .common .TestConstants ;
1523import org .tron .common .utils .StringUtil ;
@@ -69,4 +77,61 @@ public void testRemoveRedundantRet() {
6977 Assert .assertEquals (1 , transactionCapsule .getInstance ().getRetCount ());
7078 Assert .assertEquals (SUCCESS , transactionCapsule .getInstance ().getRet (0 ).getContractRet ());
7179 }
80+
81+ @ Test
82+ public void slowVerify () {
83+ Logger capsuleLogger = (Logger ) LoggerFactory .getLogger ("capsule" );
84+ Level originalLevel = capsuleLogger .getLevel ();
85+ capsuleLogger .setLevel (Level .INFO );
86+ ListAppender <ILoggingEvent > appender = new ListAppender <>();
87+ appender .start ();
88+ capsuleLogger .addAppender (appender );
89+ try {
90+ TransactionCapsule cap = new TransactionCapsule (Transaction .newBuilder ().build ());
91+ long startNs = System .nanoTime () - TimeUnit .MILLISECONDS .toNanos (51 );
92+ cap .logSlowSigVerify (startNs );
93+
94+ List <ILoggingEvent > infos = appender .list .stream ()
95+ .filter (e -> e .getLevel () == Level .INFO )
96+ .collect (Collectors .toList ());
97+ Assert .assertEquals ("expected one INFO for a slow verify" , 1 , infos .size ());
98+ String rendered = infos .get (0 ).getFormattedMessage ();
99+ Assert .assertTrue ("INFO should mention slow verify: " + rendered ,
100+ rendered .contains ("slow verify" ));
101+ Assert .assertTrue ("INFO should echo the txId: " + rendered ,
102+ rendered .contains (cap .getTransactionId ().toString ()));
103+ Assert .assertTrue ("INFO should include sigCount: " + rendered ,
104+ rendered .contains ("sigCount=" ));
105+ Assert .assertTrue ("INFO should include cost in ms: " + rendered ,
106+ rendered .contains ("cost=" ));
107+ Assert .assertTrue ("INFO should render ms suffix: " + rendered ,
108+ rendered .contains (" ms" ));
109+ } finally {
110+ appender .stop ();
111+ capsuleLogger .detachAppender (appender );
112+ capsuleLogger .setLevel (originalLevel );
113+ }
114+ }
115+
116+ @ Test
117+ public void fastVerify () {
118+ Logger capsuleLogger = (Logger ) LoggerFactory .getLogger ("capsule" );
119+ Level originalLevel = capsuleLogger .getLevel ();
120+ capsuleLogger .setLevel (Level .INFO );
121+ ListAppender <ILoggingEvent > appender = new ListAppender <>();
122+ appender .start ();
123+ capsuleLogger .addAppender (appender );
124+ try {
125+ TransactionCapsule cap = new TransactionCapsule (Transaction .newBuilder ().build ());
126+ cap .logSlowSigVerify (System .nanoTime ());
127+ long infoCount = appender .list .stream ()
128+ .filter (e -> e .getLevel () == Level .INFO )
129+ .count ();
130+ Assert .assertEquals ("no INFO should fire below the threshold" , 0 , infoCount );
131+ } finally {
132+ appender .stop ();
133+ capsuleLogger .detachAppender (appender );
134+ capsuleLogger .setLevel (originalLevel );
135+ }
136+ }
72137}
0 commit comments