/*
* 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.eth.handler;
import org.ethereum.core.BlockHeader;
import org.ethereum.net.eth.message.BlockHeadersMessage;
import org.ethereum.net.eth.message.GetBlockHeadersMessage;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Testing {@link org.ethereum.net.eth.handler.Eth62#isValid(BlockHeadersMessage, GetBlockHeadersMessageWrapper)}
*/
public class HeaderMessageValidationTest {
private byte[] EMPTY_ARRAY = new byte[0];
private class Eth62Tester extends Eth62 {
boolean blockHeaderMessageValid(BlockHeadersMessage msg, GetBlockHeadersMessageWrapper request) {
return super.isValid(msg, request);
}
}
private Eth62Tester ethHandler;
public HeaderMessageValidationTest() {
ethHandler = new Eth62Tester();
}
@Test
public void testSingleBlockResponse() {
long blockNumber = 0L;
BlockHeader blockHeader = new BlockHeader(new byte[] {11, 12}, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY,
EMPTY_ARRAY, blockNumber, EMPTY_ARRAY, 1L, 2L, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY);
List<BlockHeader> blockHeaders = new ArrayList<>();
blockHeaders.add(blockHeader);
BlockHeadersMessage msg = new BlockHeadersMessage(blockHeaders);
byte[] hash = blockHeader.getHash();
// Block number doesn't matter when hash is provided in request
GetBlockHeadersMessage requestHash = new GetBlockHeadersMessage(123L, hash, 1, 0, false);
GetBlockHeadersMessageWrapper wrapperHash = new GetBlockHeadersMessageWrapper(requestHash);
assert ethHandler.blockHeaderMessageValid(msg, wrapperHash);
// Getting same with block number request
GetBlockHeadersMessage requestNumber = new GetBlockHeadersMessage(blockNumber, null, 1, 0, false);
GetBlockHeadersMessageWrapper wrapperNumber = new GetBlockHeadersMessageWrapper(requestNumber);
assert ethHandler.blockHeaderMessageValid(msg, wrapperNumber);
// Getting same with reverse request
GetBlockHeadersMessage requestReverse = new GetBlockHeadersMessage(blockNumber, null, 1, 0, true);
GetBlockHeadersMessageWrapper wrapperReverse = new GetBlockHeadersMessageWrapper(requestReverse);
assert ethHandler.blockHeaderMessageValid(msg, wrapperReverse);
// Getting same with skip request
GetBlockHeadersMessage requestSkip = new GetBlockHeadersMessage(blockNumber, null, 1, 10, false);
GetBlockHeadersMessageWrapper wrapperSkip = new GetBlockHeadersMessageWrapper(requestSkip);
assert ethHandler.blockHeaderMessageValid(msg, wrapperSkip);
}
@Test
public void testFewBlocksNoSkip() {
List<BlockHeader> blockHeaders = new ArrayList<>();
long blockNumber1 = 0L;
BlockHeader blockHeader1 = new BlockHeader(new byte[] {11, 12}, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY,
EMPTY_ARRAY, blockNumber1, EMPTY_ARRAY, 1L, 2L, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY);
byte[] hash1 = blockHeader1.getHash();
blockHeaders.add(blockHeader1);
long blockNumber2 = 1L;
BlockHeader blockHeader2 = new BlockHeader(hash1, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY,
EMPTY_ARRAY, blockNumber2, EMPTY_ARRAY, 1L, 2L, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY);
byte[] hash2 = blockHeader2.getHash();
blockHeaders.add(blockHeader2);
BlockHeadersMessage msg = new BlockHeadersMessage(blockHeaders);
// Block number doesn't matter when hash is provided in request
GetBlockHeadersMessage requestHash = new GetBlockHeadersMessage(123L, hash1, 2, 0, false);
GetBlockHeadersMessageWrapper wrapperHash = new GetBlockHeadersMessageWrapper(requestHash);
assert ethHandler.blockHeaderMessageValid(msg, wrapperHash);
// Getting same with block number request
GetBlockHeadersMessage requestNumber = new GetBlockHeadersMessage(blockNumber1, null, 2, 0, false);
GetBlockHeadersMessageWrapper wrapperNumber = new GetBlockHeadersMessageWrapper(requestNumber);
assert ethHandler.blockHeaderMessageValid(msg, wrapperNumber);
// Reverse list
Collections.reverse(blockHeaders);
GetBlockHeadersMessage requestReverse = new GetBlockHeadersMessage(blockNumber2, null, 2, 0, true);
GetBlockHeadersMessageWrapper wrapperReverse = new GetBlockHeadersMessageWrapper(requestReverse);
assert ethHandler.blockHeaderMessageValid(msg, wrapperReverse);
}
@Test
public void testFewBlocksWithSkip() {
List<BlockHeader> blockHeaders = new ArrayList<>();
long blockNumber1 = 0L;
BlockHeader blockHeader1 = new BlockHeader(new byte[] {11, 12}, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY,
EMPTY_ARRAY, blockNumber1, EMPTY_ARRAY, 1L, 2L, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY);
blockHeaders.add(blockHeader1);
long blockNumber2 = 16L;
BlockHeader blockHeader2 = new BlockHeader(new byte[] {12, 13}, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY,
EMPTY_ARRAY, blockNumber2, EMPTY_ARRAY, 1L, 2L, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY);
blockHeaders.add(blockHeader2);
long blockNumber3 = 32L;
BlockHeader blockHeader3 = new BlockHeader(new byte[] {14, 15}, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY,
EMPTY_ARRAY, blockNumber3, EMPTY_ARRAY, 1L, 2L, EMPTY_ARRAY, EMPTY_ARRAY, EMPTY_ARRAY);
blockHeaders.add(blockHeader3);
BlockHeadersMessage msg = new BlockHeadersMessage(blockHeaders);
GetBlockHeadersMessage requestNumber = new GetBlockHeadersMessage(blockNumber1, null, 3, 15, false);
GetBlockHeadersMessageWrapper wrapperNumber = new GetBlockHeadersMessageWrapper(requestNumber);
assert ethHandler.blockHeaderMessageValid(msg, wrapperNumber);
// Requesting more than we have
GetBlockHeadersMessage requestMore = new GetBlockHeadersMessage(blockNumber1, null, 4, 15, false);
GetBlockHeadersMessageWrapper wrapperMore = new GetBlockHeadersMessageWrapper(requestMore);
assert ethHandler.blockHeaderMessageValid(msg, wrapperMore);
// Reverse list
Collections.reverse(blockHeaders);
GetBlockHeadersMessage requestReverse = new GetBlockHeadersMessage(blockNumber3, null, 3, 15, true);
GetBlockHeadersMessageWrapper wrapperReverse = new GetBlockHeadersMessageWrapper(requestReverse);
assert ethHandler.blockHeaderMessageValid(msg, wrapperReverse);
}
}