Merge pull request #189 from d53d4f7ff2cc77b71/tests-2

Add tests for Messages in p2p/eth
This commit is contained in:
Roman Mandeleil 2015-01-06 10:35:57 +02:00
commit 02e7c28ffd
6 changed files with 327 additions and 4 deletions

View File

@ -1,5 +1,11 @@
package test.ethereum.net;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import java.lang.System;
import org.ethereum.net.message.ReasonCode;
import org.ethereum.net.p2p.DisconnectMessage;
@ -48,5 +54,59 @@ public class DisconnectMessageTest {
assertEquals(ReasonCode.INCOMPATIBLE_NETWORK, disconnectMessage.getReason());
}
@Test //handling boundary-high
public void test_4() {
String disconnectMessageRaw = "C28080";
byte[] payload = Hex.decode(disconnectMessageRaw);
DisconnectMessage disconnectMessage = new DisconnectMessage(payload);
System.out.println(disconnectMessage);
assertEquals(disconnectMessage.getReason(), ReasonCode.REQUESTED); //high numbers are zeroed
}
@Test //handling boundary-low
public void test_5() {
String disconnectMessageRaw = "C20000";
byte[] payload = Hex.decode(disconnectMessageRaw);
DisconnectMessage disconnectMessage = new DisconnectMessage(payload);
System.out.println(disconnectMessage);
assertEquals(disconnectMessage.getReason(), ReasonCode.REQUESTED);
}
@Test //handling boundary-low minus 1 (error)
public void test_6() {
String disconnectMessageRaw = "C19999";
byte[] payload = Hex.decode(disconnectMessageRaw);
try{
DisconnectMessage disconnectMessage = new DisconnectMessage(payload);
disconnectMessage.toString(); //throws exception
assertTrue("Valid raw encoding for disconnectMessage", false);
} catch (RuntimeException e) {
assertTrue("Invalid raw encoding for disconnectMessage", true);
}
}
@Test //handling boundary-high plus 1 (error)
public void test_7() {
String disconnectMessageRaw = "C28081";
byte[] payload = Hex.decode(disconnectMessageRaw);
try{
DisconnectMessage disconnectMessage = new DisconnectMessage(payload);
disconnectMessage.toString(); //throws exception
assertTrue("Valid raw encoding for disconnectMessage", false);
} catch (RuntimeException e) {
assertTrue("Invalid raw encoding for disconnectMessage", true);
}
}
}

View File

@ -0,0 +1,36 @@
package test.ethereum.net;
import static org.junit.Assert.assertEquals;
import org.spongycastle.util.encoders.Hex;
import org.ethereum.net.p2p.P2pMessageCodes;
import org.ethereum.net.p2p.GetPeersMessage;
import org.junit.Test;
public class GetPeersMessageTest {
/* GETPEERS_MESSAGE */
@Test
public void testGetPeers() {
//Init
GetPeersMessage getPeersMessage = new GetPeersMessage();
//System.out.println(getPeersMessage.getEncoded());
//toString
assertEquals("[GET_PEERS]", getPeersMessage.toString());
//getEncoded
assertEquals("C104", Hex.toHexString( getPeersMessage.getEncoded() ).toUpperCase() );
//getAnswerMessage
assertEquals(null, getPeersMessage.getAnswerMessage());
//getCommand
assertEquals(P2pMessageCodes.GET_PEERS, getPeersMessage.getCommand());
}
}

View File

@ -1,8 +1,17 @@
package test.ethereum.net;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import org.ethereum.net.client.Capability;
import org.ethereum.net.eth.EthHandler;
import org.ethereum.net.p2p.HelloMessage;
import org.ethereum.net.p2p.P2pMessageCodes;
import org.ethereum.net.p2p.P2pHandler;
import org.ethereum.net.shh.ShhHandler;
import org.junit.Test;
import org.slf4j.Logger;
@ -17,7 +26,7 @@ public class HelloMessageTest {
/* HELLO_MESSAGE */
private static final Logger logger = LoggerFactory.getLogger("test");
//Parsing from raw bytes
@Test
public void test1() {
String helloMessageRaw = "f87a8002a5457468657265756d282b2b292f76302e372e392f52656c656173652f4c696e75782f672b2bccc58365746827c583736868018203e0b8401fbf1e41f08078918c9f7b6734594ee56d7f538614f602c71194db0a1af5a77f9b86eb14669fe7a8a46a2dd1b7d070b94e463f4ecd5b337c8b4d31bbf8dd5646";
@ -37,6 +46,55 @@ public class HelloMessageTest {
}
//Instantiate from constructor
@Test
public void test2() {
//Init
byte version = 2;
String clientStr = "Ethereum(++)/v0.7.9/Release/Linux/g++";
List<Capability> capabilities = Arrays.asList(
new Capability( Capability.ETH, EthHandler.VERSION),
new Capability( Capability.SHH, ShhHandler.VERSION),
new Capability( Capability.P2P, P2pHandler.VERSION) );
int listenPort = 992;
String peerId = "1fbf1e41f08078918c9f7b6734594ee56d7f538614f602c71194db0a1af5a";
HelloMessage helloMessage = new HelloMessage(version, clientStr, capabilities, listenPort, peerId);
logger.info(helloMessage.toString());
}
assertEquals(P2pMessageCodes.HELLO, helloMessage.getCommand());
assertEquals(version, helloMessage.getP2PVersion());
assertEquals(clientStr, helloMessage.getClientId());
assertEquals( 3 , helloMessage.getCapabilities().size());
assertEquals( listenPort , helloMessage.getListenPort());
assertEquals( peerId , helloMessage.getPeerId());
//TODO tostring?
}
//Fail test
@Test
public void test3() {
//Init
byte version = -1; //invalid version
String clientStr = ""; //null id
List<Capability> capabilities = Arrays.asList(
new Capability( null, (byte) 0 ),
new Capability( null, (byte) 0 ),
null, //null here causes NullPointerException when using toString
new Capability( null, (byte) 0 ) ); //encoding null capabilities
int listenPort = 99999; //invalid port
String peerId = ""; //null id
HelloMessage helloMessage = new HelloMessage(version, clientStr, capabilities, listenPort, peerId);
//logger.info(helloMessage.toString());
assertEquals(P2pMessageCodes.HELLO, helloMessage.getCommand());
assertEquals(version, helloMessage.getP2PVersion());
assertEquals(clientStr, helloMessage.getClientId());
assertEquals( 4 , helloMessage.getCapabilities().size());
assertEquals( listenPort , helloMessage.getListenPort());
assertEquals( peerId , helloMessage.getPeerId());
}
}

View File

@ -0,0 +1,57 @@
package test.ethereum.net;
import static org.junit.Assert.assertEquals;
import org.ethereum.net.client.Capability;
import org.ethereum.net.p2p.Peer;
import org.spongycastle.util.encoders.Hex;
import java.net.InetAddress;
import java.util.List;
import java.util.ArrayList;
import org.junit.Test;
public class PeerTest {
/* PEER */
@Test
public void testPeer() {
//Init
InetAddress address = InetAddress.getLoopbackAddress();
List<Capability> capabilities = new ArrayList<>();
int port = 1010;
String peerId = "1010";
Peer peerCopy = new Peer(address, port, peerId );
//Peer
Peer peer = new Peer(address, port, peerId );
//getAddress
assertEquals( "127.0.0.1" , peer.getAddress().getHostAddress() );
//getPort
assertEquals( port , peer.getPort() );
//getPeerId
assertEquals( peerId , peer.getPeerId() );
//getCapabilities
assertEquals( capabilities , peer.getCapabilities() );
//getEncoded
assertEquals("CC847F0000018203F2821010C0", Hex.toHexString( peer.getEncoded() ).toUpperCase() );
//toString
assertEquals("[ip=" + address.getHostAddress() + " port=" + Integer.toString( port ) + " peerId=" + peerId + "]", peer.toString() );
//equals
assertEquals(true, peer.equals( peerCopy ) );
assertEquals(false, peer.equals( null ) );
//hashCode
assertEquals(-1, peer.hashCode());
}
}

View File

@ -1,5 +1,18 @@
package test.ethereum.net;
import static org.junit.Assert.assertEquals;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.ethereum.net.client.Capability;
import org.ethereum.net.p2p.GetPeersMessage;
import org.ethereum.net.p2p.P2pMessageCodes;
import org.ethereum.net.p2p.Peer;
@ -54,4 +67,58 @@ public class PeersMessageTest {
}
}
@Test /* PeersMessage 1 from constructor */
public void testPeers_2() {
//Init
InetAddress address = InetAddress.getLoopbackAddress();
List<Capability> capabilities = new ArrayList<>();
int port = 112;
String peerId = "36659c3656c488437cceb11abeb9b9fc69b8055144a7e7db3584d03e606083f90e" +
"17a1d3021d674579407cdaaafdfeef485872ab719db9f2b6283f498bb90a71";
Set<Peer> peers = new HashSet<>();
peers.add(new Peer(address, port, peerId ));
PeersMessage peersMessage= new PeersMessage(peers);
logger.info(peersMessage.toString());
assertEquals(1, peersMessage.getPeers().size());
Iterator<Peer> it = peersMessage.getPeers().iterator();
Peer peer = it.next();
assertEquals(P2pMessageCodes.PEERS, peersMessage.getCommand());
assertEquals("127.0.0.1", peer.getAddress().getHostAddress());
assertEquals(112, peer.getPort());
assertEquals("36659c3656c488437cceb11abeb9b9fc69b8055144a7e7db3584d03e6" +
"06083f90e17a1d3021d674579407cdaaafdfeef485872ab719db9f2b6283f498bb90a71", peer.getPeerId());
}
@Test /* failing test */
public void testPeers_3() {
//Init
InetAddress address = InetAddress.getLoopbackAddress();
List<Capability> capabilities = Arrays.asList(
new Capability( null, (byte) 0 ),
null //null here can cause NullPointerException when using toString
); //encoding null capabilities
int port = -1; //invalid port
String peerId = ""; //invalid peerid
Set<Peer> peers = new HashSet<>();
peers.add(new Peer(address, port, peerId ));
PeersMessage peersMessage= new PeersMessage(peers);
logger.info(peersMessage.toString());
assertEquals(1, peersMessage.getPeers().size());
Iterator<Peer> it = peersMessage.getPeers().iterator();
Peer peer = it.next();
assertEquals(P2pMessageCodes.PEERS, peersMessage.getCommand());
assertEquals("127.0.0.1", peer.getAddress().getHostAddress());
assertEquals(-1, peer.getPort());
assertEquals( "" , peer.getPeerId());
}
}

View File

@ -2,6 +2,8 @@ package test.ethereum.net;
import org.ethereum.net.eth.StatusMessage;
import java.math.BigInteger;
import org.junit.Test;
import org.slf4j.Logger;
@ -32,5 +34,48 @@ public class StatusMessageTest {
Hex.toHexString(statusMessage.getBestHash()));
}
@Test //from constructor
public void test2(){
//Init
byte version = 39;
byte netId = 0;
byte[] difficulty = new BigInteger("25c60144", 16).toByteArray();
byte[] bestHash = new BigInteger("832056d3c93ff2739ace7199952e5365aa29f18805be05634c4db125c5340216",16).toByteArray();
byte[] genesisHash = new BigInteger("955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cb",16).toByteArray();
StatusMessage statusMessage = new StatusMessage(version, netId, difficulty, bestHash, genesisHash);
logger.info(statusMessage.toString());
assertEquals(39, statusMessage.getProtocolVersion());
assertEquals("25c60144",
Hex.toHexString(statusMessage.getTotalDifficulty()));
assertEquals("00832056d3c93ff2739ace7199952e5365aa29f18805be05634c4db125c5340216",
Hex.toHexString(statusMessage.getBestHash()));
assertEquals("00955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cb",
Hex.toHexString(statusMessage.getGenesisHash()));
}
@Test //fail test
public void test3(){
//Init
byte version = -1; //invalid version
byte netId = -1; //invalid netid
byte[] difficulty = new BigInteger("-1000000", 16).toByteArray(); //negative difficulty
byte[] bestHash = new BigInteger("-100000000000000000000000000",16).toByteArray(); //invalid hash
byte[] genesisHash = new BigInteger("-1000000000000000000000000000000",16).toByteArray(); //invalid hash
StatusMessage statusMessage = new StatusMessage(version, netId, difficulty, bestHash, genesisHash);
logger.info(statusMessage.toString());
assertEquals(-1, statusMessage.getProtocolVersion());
assertEquals("ff000000",
Hex.toHexString(statusMessage.getTotalDifficulty()));
assertEquals("ff00000000000000000000000000",
Hex.toHexString(statusMessage.getBestHash()));
assertEquals("ff000000000000000000000000000000",
Hex.toHexString(statusMessage.getGenesisHash()));
}
}