diff --git a/tests/admin-module/test_admin_addPeer.py b/tests/admin-module/test_admin_addPeer.py new file mode 100644 index 0000000..df35b5c --- /dev/null +++ b/tests/admin-module/test_admin_addPeer.py @@ -0,0 +1,4 @@ +def test_admin_addPeer(web3, skip_if_testrpc): + skip_if_testrpc(web3) + + assert web3.admin.addPeer('enode://44826a5d6a55f88a18298bca4773fca5749cdc3a5c9f308aa7d810e9b31123f3e7c5fba0b1d70aac5308426f47df2a128a6747040a3815cc7dd7167d03be320d@127.0.0.1:30304') is True diff --git a/tests/admin-module/test_admin_nodeInfo.py b/tests/admin-module/test_admin_nodeInfo.py new file mode 100644 index 0000000..722f720 --- /dev/null +++ b/tests/admin-module/test_admin_nodeInfo.py @@ -0,0 +1,7 @@ +def test_admin_nodeInfo(web3, skip_if_testrpc): + skip_if_testrpc(web3) + + node_info = web3.admin.nodeInfo + + assert 'enode' in node_info + assert 'id' in node_info diff --git a/tests/admin-module/test_admin_peers.py b/tests/admin-module/test_admin_peers.py new file mode 100644 index 0000000..e585df7 --- /dev/null +++ b/tests/admin-module/test_admin_peers.py @@ -0,0 +1,4 @@ +def test_admin_peers(web3, skip_if_testrpc): + skip_if_testrpc(web3) + + assert web3.admin.peers == [] diff --git a/tests/admin-module/test_admin_setSolc.py b/tests/admin-module/test_admin_setSolc.py new file mode 100644 index 0000000..17a5201 --- /dev/null +++ b/tests/admin-module/test_admin_setSolc.py @@ -0,0 +1,18 @@ +import pytest +import subprocess + +from web3.utils.string import force_text + + +def test_admin_setSolc(web3, skip_if_testrpc): + skip_if_testrpc(web3) + + try: + solc_path = subprocess.check_output(['which', 'solc']).strip() + except subprocess.CalledProcessError: + pytest.skip('solc binary not found') + solc_version = subprocess.check_output(['solc', '--version']).strip() + + actual = web3.admin.setSolc(solc_path) + assert force_text(solc_version) in actual + assert force_text(solc_path) in actual diff --git a/tests/admin-module/test_admin_start_stop_methods.py b/tests/admin-module/test_admin_start_stop_methods.py new file mode 100644 index 0000000..500f12f --- /dev/null +++ b/tests/admin-module/test_admin_start_stop_methods.py @@ -0,0 +1,54 @@ +import pytest +from flaky import flaky + + +def get_open_port(): + import socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(("", 0)) + s.listen(1) + port = s.getsockname()[1] + s.close() + return port + + +@flaky(max_runs=3) +def test_admin_startRPC(web3_ipc_empty, skip_if_testrpc): + web3 = web3_ipc_empty + skip_if_testrpc(web3) + + with pytest.raises(ValueError): + web3.admin.startRPC() + assert web3.admin.stopRPC() + assert web3.admin.startRPC(port=get_open_port()) + + +@flaky(max_runs=3) +def test_admin_stopRPC(web3_ipc_empty, skip_if_testrpc): + web3 = web3_ipc_empty + skip_if_testrpc(web3) + + assert web3.admin.stopRPC() + with pytest.raises(ValueError): + web3.admin.stopRPC() + + +@flaky(max_runs=3) +def test_admin_startWS(web3_ipc_empty, skip_if_testrpc): + web3 = web3_ipc_empty + skip_if_testrpc(web3) + + with pytest.raises(ValueError): + web3.admin.startWS() + assert web3.admin.stopWS() + assert web3.admin.startWS(port=get_open_port()) + + +@flaky(max_runs=3) +def test_admin_stopWS(web3_ipc_empty, skip_if_testrpc): + web3 = web3_ipc_empty + skip_if_testrpc(web3) + + assert web3.admin.stopWS() + with pytest.raises(ValueError): + web3.admin.stopWS() diff --git a/web3/admin.py b/web3/admin.py new file mode 100644 index 0000000..44517a4 --- /dev/null +++ b/web3/admin.py @@ -0,0 +1,39 @@ +class Admin(object): + def __init__(self, request_manager): + self.request_manager = request_manager + + def addPeer(self, node_url): + return self.request_manager.request_blocking("admin_addPeer", [node_url]) + + @property + def datadir(self): + return self.request_manager.request_blocking("admin_datadir", []) + + @property + def nodeInfo(self): + return self.request_manager.request_blocking("admin_nodeInfo", []) + + @property + def peers(self): + return self.request_manager.request_blocking("admin_peers", []) + + def setSolc(self, solc_path): + return self.request_manager.request_blocking("admin_setSolc", [solc_path]) + + def startRPC(self, host='localhost', port='8545', cors="", apis="eth,net,web3"): + return self.request_manager.request_blocking( + "admin_startRPC", + [host, port, cors, apis], + ) + + def startWS(self, host='localhost', port='8546', cors="", apis="eth,net,web3"): + return self.request_manager.request_blocking( + "admin_startWS", + [host, port, cors, apis], + ) + + def stopRPC(self): + return self.request_manager.request_blocking("admin_stopRPC", []) + + def stopWS(self): + return self.request_manager.request_blocking("admin_stopWS", []) diff --git a/web3/main.py b/web3/main.py index dc31535..8d63d19 100644 --- a/web3/main.py +++ b/web3/main.py @@ -1,13 +1,14 @@ from __future__ import absolute_import -from web3.eth import Eth +from web3.admin import Admin from web3.db import Db -from web3.shh import Shh +from web3.eth import Eth +from web3.miner import Miner from web3.net import Net from web3.personal import Personal -from web3.version import Version +from web3.shh import Shh from web3.txpool import TxPool -from web3.miner import Miner +from web3.version import Version from web3.providers.rpc import ( RPCProvider, @@ -54,6 +55,7 @@ class Web3(object): self.version = Version(self._requestManager) self.txpool = TxPool(self._requestManager) self.miner = Miner(self._requestManager) + self.admin = Admin(self._requestManager) self.providers = { 'RPCProvider': RPCProvider,