/* * Copyright (c) [2016] [ <ether.camp> ] * This file is part of the ethereumJ library. * * The ethereumJ library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The ethereumJ library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>. */ package org.ethereum.net.rlpx; import com.google.common.collect.Lists; import org.ethereum.crypto.ECKey; import org.ethereum.net.client.Capability; import org.junit.Before; import org.junit.Test; import java.io.*; import java.security.SecureRandom; import static org.junit.Assert.*; /** * Created by devrandom on 2015-04-11. */ public class RlpxConnectionTest { private FrameCodec iCodec; private FrameCodec rCodec; private EncryptionHandshake initiator; private EncryptionHandshake responder; private HandshakeMessage iMessage; private PipedInputStream to; private PipedOutputStream toOut; private PipedInputStream from; private PipedOutputStream fromOut; @Before public void setUp() throws Exception { ECKey remoteKey = new ECKey(); ECKey myKey = new ECKey(); initiator = new EncryptionHandshake(remoteKey.getPubKeyPoint()); responder = new EncryptionHandshake(); AuthInitiateMessage initiate = initiator.createAuthInitiate(null, myKey); byte[] initiatePacket = initiator.encryptAuthMessage(initiate); byte[] responsePacket = responder.handleAuthInitiate(initiatePacket, remoteKey); initiator.handleAuthResponse(myKey, initiatePacket, responsePacket); to = new PipedInputStream(1024*1024); toOut = new PipedOutputStream(to); from = new PipedInputStream(1024*1024); fromOut = new PipedOutputStream(from); iCodec = new FrameCodec(initiator.getSecrets()); rCodec = new FrameCodec(responder.getSecrets()); byte[] nodeId = {1, 2, 3, 4}; iMessage = new HandshakeMessage( 123, "abcd", Lists.newArrayList( new Capability("zz", (byte) 1), new Capability("yy", (byte) 3) ), 3333, nodeId ); } @Test public void testFrame() throws Exception { byte[] payload = new byte[123]; new SecureRandom().nextBytes(payload); FrameCodec.Frame frame = new FrameCodec.Frame(12345, 123, new ByteArrayInputStream(payload)); iCodec.writeFrame(frame, toOut); FrameCodec.Frame frame1 = rCodec.readFrames(new DataInputStream(to)).get(0); byte[] payload1 = new byte[frame1.size]; assertEquals(frame.size, frame1.size); frame1.payload.read(payload1); assertArrayEquals(payload, payload1); assertEquals(frame.type, frame1.type); } @Test public void testMessageEncoding() throws IOException { byte[] wire = iMessage.encode(); HandshakeMessage message1 = HandshakeMessage.parse(wire); assertEquals(123, message1.version); assertEquals("abcd", message1.name); assertEquals(3333, message1.listenPort); assertArrayEquals(message1.nodeId, message1.nodeId); assertEquals(iMessage.caps, message1.caps); } @Test public void testHandshake() throws IOException { RlpxConnection iConn = new RlpxConnection(initiator.getSecrets(), from, toOut); RlpxConnection rConn = new RlpxConnection(responder.getSecrets(), to, fromOut); iConn.sendProtocolHandshake(iMessage); rConn.handleNextMessage(); HandshakeMessage receivedMessage = rConn.getHandshakeMessage(); assertNotNull(receivedMessage); assertArrayEquals(iMessage.nodeId, receivedMessage.nodeId); } }