22
33
44import static org .mockito .Mockito .mock ;
5+ import static org .tron .core .net .message .handshake .HelloMessage .getEndpointFromNode ;
56
67import com .google .protobuf .ByteString ;
78import java .lang .reflect .Field ;
3637import org .tron .p2p .connection .Channel ;
3738import org .tron .p2p .discover .Node ;
3839import org .tron .p2p .utils .NetUtil ;
40+ import org .tron .protos .Discover .Endpoint ;
3941import org .tron .protos .Protocol ;
42+ import org .tron .protos .Protocol .HelloMessage .Builder ;
4043import org .tron .protos .Protocol .ReasonCode ;
4144
4245public class MessageHandlerTest {
@@ -63,10 +66,14 @@ public static void init() throws Exception {
6366
6467
6568 @ Before
66- public void clearPeers () throws NoSuchFieldException , IllegalAccessException {
67- Field field = PeerManager .class .getDeclaredField ("peers" );
68- field .setAccessible (true );
69- field .set (PeerManager .class , Collections .synchronizedList (new ArrayList <>()));
69+ public void clearPeers () {
70+ try {
71+ Field field = PeerManager .class .getDeclaredField ("peers" );
72+ field .setAccessible (true );
73+ field .set (PeerManager .class , Collections .synchronizedList (new ArrayList <>()));
74+ } catch (NoSuchFieldException | IllegalAccessException e ) {
75+ //ignore
76+ }
7077 }
7178
7279 @ Test
@@ -115,30 +122,95 @@ public void testHelloMessage()
115122 Mockito .when (c1 .getInetSocketAddress ()).thenReturn (a1 );
116123 Mockito .when (c1 .getInetAddress ()).thenReturn (a1 .getAddress ());
117124 PeerManager .add (ctx , c1 );
125+ peer = PeerManager .getPeers ().get (0 );
118126
119127 Method method = p2pEventHandler .getClass ()
120- .getDeclaredMethod ("onMessage " , Channel .class , byte [].class );
128+ .getDeclaredMethod ("processMessage " , PeerConnection .class , byte [].class );
121129 method .setAccessible (true );
122130
123131 //ok
124- peer = PeerManager .getPeers ().get (0 );
125132 Node node = new Node (NetUtil .getNodeId (),
126133 a1 .getAddress ().getHostAddress (),
127134 null ,
128135 a1 .getPort ());
129136 HelloMessage helloMessage = new HelloMessage (node , System .currentTimeMillis (),
130137 ChainBaseManager .getChainBaseManager ());
131- method .invoke (p2pEventHandler , c1 , helloMessage .getSendBytes ());
138+ method .invoke (p2pEventHandler , peer , helloMessage .getSendBytes ());
132139
133140 //dup hello message
134141 peer .setHelloMessageReceive (helloMessage );
135- method .invoke (p2pEventHandler , c1 , helloMessage .getSendBytes ());
142+ method .invoke (p2pEventHandler , peer , helloMessage .getSendBytes ());
136143
137144 //dup peer
138145 peer .setHelloMessageReceive (null );
139146 Mockito .when (c1 .isDisconnect ()).thenReturn (true );
140- method .invoke (p2pEventHandler , c1 , helloMessage .getSendBytes ());
147+ method .invoke (p2pEventHandler , peer , helloMessage .getSendBytes ());
148+
149+ //invalid hello message
150+ try {
151+ Protocol .HelloMessage .Builder builder =
152+ getHelloMessageBuilder (node , System .currentTimeMillis (),
153+ ChainBaseManager .getChainBaseManager ());
154+
155+ BlockCapsule .BlockId hid = ChainBaseManager .getChainBaseManager ().getHeadBlockId ();
156+ Protocol .HelloMessage .BlockId hBlockId = Protocol .HelloMessage .BlockId .newBuilder ()
157+ .setHash (ByteString .copyFrom (new byte [0 ]))
158+ .setNumber (hid .getNum ())
159+ .build ();
160+ builder .setHeadBlockId (hBlockId );
161+ helloMessage = new HelloMessage (builder .build ().toByteArray ());
162+ Assert .assertTrue (!helloMessage .valid ());
163+ } catch (Exception e ) {
164+ Assert .fail ();
165+ }
166+
167+ //relay check service check failed
168+ Args .getInstance ().fastForward = true ;
169+ clearPeers ();
170+ try {
171+ Protocol .HelloMessage .Builder builder =
172+ getHelloMessageBuilder (node , System .currentTimeMillis (),
173+ ChainBaseManager .getChainBaseManager ());
174+ helloMessage = new HelloMessage (builder .build ().toByteArray ());
175+ method .invoke (p2pEventHandler , peer , helloMessage .getSendBytes ());
176+ } catch (Exception e ) {
177+ Assert .fail ();
178+ }
179+
180+ }
141181
142- // Assert.assertEquals(1, PeerManager.getPeers().size());
182+ private Protocol .HelloMessage .Builder getHelloMessageBuilder (Node from , long timestamp ,
183+ ChainBaseManager chainBaseManager ) throws Exception {
184+ Endpoint fromEndpoint = getEndpointFromNode (from );
185+
186+ BlockCapsule .BlockId gid = chainBaseManager .getGenesisBlockId ();
187+ Protocol .HelloMessage .BlockId gBlockId = Protocol .HelloMessage .BlockId .newBuilder ()
188+ .setHash (gid .getByteString ())
189+ .setNumber (gid .getNum ())
190+ .build ();
191+
192+ BlockCapsule .BlockId sid = chainBaseManager .getSolidBlockId ();
193+ Protocol .HelloMessage .BlockId sBlockId = Protocol .HelloMessage .BlockId .newBuilder ()
194+ .setHash (sid .getByteString ())
195+ .setNumber (sid .getNum ())
196+ .build ();
197+
198+ BlockCapsule .BlockId hid = chainBaseManager .getHeadBlockId ();
199+ Protocol .HelloMessage .BlockId hBlockId = Protocol .HelloMessage .BlockId .newBuilder ()
200+ .setHash (hid .getByteString ())
201+ .setNumber (hid .getNum ())
202+ .build ();
203+ Builder builder = Protocol .HelloMessage .newBuilder ();
204+ builder .setFrom (fromEndpoint );
205+ builder .setVersion (Args .getInstance ().getNodeP2pVersion ());
206+ builder .setTimestamp (timestamp );
207+ builder .setGenesisBlockId (gBlockId );
208+ builder .setSolidBlockId (sBlockId );
209+ builder .setHeadBlockId (hBlockId );
210+ builder .setNodeType (chainBaseManager .getNodeType ().getType ());
211+ builder .setLowestBlockNum (chainBaseManager .isLiteNode ()
212+ ? chainBaseManager .getLowestBlockNum () : 0 );
213+
214+ return builder ;
143215 }
144216}
0 commit comments