diff --git a/tests/fuzzing/rlpx/thunk.nim b/tests/fuzzing/rlpx/thunk.nim new file mode 100644 index 0000000..6903e45 --- /dev/null +++ b/tests/fuzzing/rlpx/thunk.nim @@ -0,0 +1,35 @@ +import + chronos, eth/p2p, eth/p2p/rlpx, eth/p2p/private/p2p_types, + eth/p2p/rlpx_protocols/[whisper_protocol, eth_protocol], + ../fuzztest, ../p2p/p2p_test_helper + +proc recvMsgMock(msg: openArray[byte]): tuple[msgId: int, msgData: Rlp] = + var rlp = rlpFromBytes(@msg.toRange) + + let msgid = rlp.read(int) + return (msgId, rlp) + +var + node1: EthereumNode + node2: EthereumNode + peer: Peer + +# This is not a good example of a fuzzing test and it would be much better +# to mock more to get rid of anything sockets, async, etc. +# However, it can and has provided reasonably quick results anyhow. +init: + node1 = setupTestNode(eth, Whisper) + node2 = setupTestNode(eth, Whisper) + + node2.startListening() + peer = waitFor node1.rlpxConnect(newNode(initENode(node2.keys.pubKey, + node2.address))) + +test: + aflLoop: # This appears to have unstable results with afl-clang-fast, probably + # because of undeterministic behaviour due to usage of network/async. + try: + var (msgId, msgData) = recvMsgMock(payload) + waitFor peer.invokeThunk(msgId.int, msgData) + except CatchableError as e: + debug "Test caused CatchableError", exception=e.name, trace=e.repr, msg=e.msg