Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 8146f0e

Browse files
committed
Fix broken logging tests
1 parent d97e955 commit 8146f0e

14 files changed

+79
-97
lines changed

ethereum/slogging.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,32 @@ class LogRecorder(object):
3535
"""
3636
max_capacity = 1000 * 1000 # check we are not forgotten or abused
3737

38-
def __init__(self):
38+
def __init__(self, disable_other_handlers=False, log_config=None):
3939
self._records = []
4040
log_listeners.append(self._add_log_record)
41+
self._saved_config = None
42+
if log_config:
43+
self._saved_config = get_configuration()
44+
configure(log_config)
45+
self._saved_handlers = []
46+
if disable_other_handlers:
47+
self._saved_handlers = rootLogger.handlers[:]
48+
rootLogger.handlers = []
4149

4250
def pop_records(self):
43-
# can only be called once
51+
# only returns records on the first call
4452
r = self._records[:]
45-
self._records = None
46-
log_listeners.remove(self._add_log_record)
53+
self._records = []
54+
try:
55+
log_listeners.remove(self._add_log_record)
56+
except ValueError:
57+
pass
58+
if self._saved_config:
59+
configure(**self._saved_config)
60+
self._saved_config = None
61+
if self._saved_handlers:
62+
rootLogger.handlers = self._saved_handlers[:]
63+
self._saved_handlers = []
4764
return r
4865

4966
def _add_log_record(self, msg):
@@ -59,9 +76,13 @@ def get_configuration():
5976
"""
6077
root = getLogger()
6178
name_levels = [('', logging.getLevelName(root.level))]
79+
name_levels.extend(
80+
(name, logging.getLevelName(logger.level))
81+
for name, logger
82+
in root.manager.loggerDict.items()
83+
if hasattr(logger, 'level')
84+
)
6285

63-
for name, logger in list(root.manager.loggerDict.items()):
64-
name_levels.append((name, logging.getLevelName(logger.level)))
6586
config_string = ','.join('%s:%s' % x for x in name_levels)
6687

6788
return dict(config_string=config_string, log_json=root.log_json)
@@ -222,6 +243,7 @@ def configure(config_string=None, log_json=False, log_file=None):
222243
if hasattr(logger, 'setLevel'):
223244
# Guard against `logging.PlaceHolder` instances
224245
logger.setLevel(logging.NOTSET)
246+
logger.propagate = True
225247

226248
for name_levels in config_string.split(','):
227249
name, _, level = name_levels.partition(':')

ethereum/tester.py

Lines changed: 39 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@
1313
import rlp
1414
from rlp.utils import decode_hex, encode_hex, ascii_chr
1515

16+
17+
TRACE_LVL_MAP = [
18+
':info',
19+
'eth.vm.log:trace',
20+
':info,eth.vm.log:trace,eth.vm.exit:trace',
21+
':info,eth.vm.log:trace,eth.vm.op:trace,eth.vm.stack:trace',
22+
':info,eth.vm.log:trace,eth.vm.op:trace,eth.vm.stack:trace,' +
23+
'eth.vm.storage:trace,eth.vm.memory:trace'
24+
]
25+
26+
1627
serpent = None
1728

1829
u = ethereum.utils
@@ -199,31 +210,35 @@ def _send(self, sender, to, value, evmdata='', output=None,
199210
tx = t.Transaction(sendnonce, gas_price, gas_limit, to, value, evmdata)
200211
self.last_tx = tx
201212
tx.sign(sender)
213+
recorder = None
202214
if profiling > 1:
203-
set_logging_level(3)
204-
recorder = LogRecorder()
205-
(s, o) = pb.apply_transaction(self.block, tx)
206-
if not s:
207-
raise TransactionFailed()
208-
out = {"output": o}
209-
if profiling > 0:
210-
zero_bytes = tx.data.count(ascii_chr(0))
211-
non_zero_bytes = len(tx.data) - zero_bytes
212-
intrinsic_gas_used = opcodes.GTXCOST + \
213-
opcodes.GTXDATAZERO * zero_bytes + \
214-
opcodes.GTXDATANONZERO * non_zero_bytes
215-
ntm, ng = time.time(), self.block.gas_used
216-
out["time"] = ntm - tm
217-
out["gas"] = ng - g - intrinsic_gas_used
218-
if profiling > 1:
219-
trace = recorder.pop_records()
220-
set_logging_level(0)
221-
ops = [x['op'] for x in trace if x['event'] == 'vm']
222-
opdict = {}
223-
for op in ops:
224-
opdict[op] = opdict.get(op, 0) + 1
225-
out["ops"] = opdict
226-
return out
215+
recorder = LogRecorder(disable_other_handlers=True, log_config=TRACE_LVL_MAP[3])
216+
try:
217+
(s, o) = pb.apply_transaction(self.block, tx)
218+
if not s:
219+
raise TransactionFailed()
220+
out = {"output": o}
221+
if profiling > 0:
222+
zero_bytes = tx.data.count(ascii_chr(0))
223+
non_zero_bytes = len(tx.data) - zero_bytes
224+
intrinsic_gas_used = opcodes.GTXCOST + \
225+
opcodes.GTXDATAZERO * zero_bytes + \
226+
opcodes.GTXDATANONZERO * non_zero_bytes
227+
ntm, ng = time.time(), self.block.gas_used
228+
out["time"] = ntm - tm
229+
out["gas"] = ng - g - intrinsic_gas_used
230+
if profiling > 1:
231+
trace = recorder.pop_records()
232+
ops = [x['op'] for x in trace if x['event'] == 'vm']
233+
opdict = {}
234+
for op in ops:
235+
opdict[op] = opdict.get(op, 0) + 1
236+
out["ops"] = opdict
237+
return out
238+
finally:
239+
# ensure LogRecorder has been disabled
240+
if recorder:
241+
recorder.pop_records()
227242

228243
def profile(self, *args, **kwargs):
229244
kwargs['profiling'] = True
@@ -281,41 +296,6 @@ def revert(self, data):
281296
self.block._cached_rlp = None
282297
self.block.header._cached_rlp = None
283298

284-
# logging
285-
286-
287-
def set_logging_level(lvl=0):
288-
trace_lvl_map = [
289-
':info',
290-
'eth.vm.log:trace',
291-
':info,eth.vm.log:trace,eth.vm.exit:trace',
292-
':info,eth.vm.log:trace,eth.vm.op:trace,eth.vm.stack:trace',
293-
':info,eth.vm.log:trace,eth.vm.op:trace,eth.vm.stack:trace,' +
294-
'eth.vm.storage:trace,eth.vm.memory:trace'
295-
]
296-
configure_logging(config_string=trace_lvl_map[lvl])
297-
if lvl == 0:
298-
set_level(None, 'info')
299-
print('Set logging level: %d' % lvl)
300-
301-
302-
def set_log_trace(logger_names=[]):
303-
"""
304-
sets all named loggers to level 'trace'
305-
attention: vm.op.* are only active if vm.op is active
306-
"""
307-
for name in logger_names:
308-
assert name in slogging.get_logger_names()
309-
slogging.set_level(name, 'trace')
310-
311-
312-
def enable_logging():
313-
set_logging_level(1)
314-
315-
316-
def disable_logging():
317-
set_logging_level(0)
318-
319299

320300
gas_limit = 3141592
321301
gas_price = 1

ethereum/tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
# Connect catchlog's handler to slogging's root logger
10-
@pytest.hookimpl(hookwrapper=True)
10+
@pytest.hookimpl(hookwrapper=True, trylast=True)
1111
def pytest_runtest_call(item):
1212
catchlog_handler = getattr(item, CATCH_LOG_HANDLER_NAME, None)
1313
if catchlog_handler and catchlog_handler not in slogging.rootLogger.handlers:

ethereum/tests/test_chain.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
from ethereum.db import EphemDB
1111
from ethereum.tests.utils import new_db
1212

13-
from ethereum.slogging import get_logger, configure_logging
13+
from ethereum.slogging import get_logger
1414
logger = get_logger()
15-
# configure_logging('eth.vm:trace,eth.vm.memory:info')
1615

1716
_db = new_db()
1817

ethereum/tests/test_contracts.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,9 @@
88
from rlp.utils import decode_hex
99

1010
from ethereum import tester, utils, abi
11-
from ethereum.slogging import set_level
1211
from ethereum.utils import safe_ord, big_endian_to_int
1312

1413

15-
# customize VM log output to your needs
16-
# hint: use 'py.test' with the '-s' option to dump logs to the console
17-
tester.set_logging_level(0)
18-
19-
2014
# Test EVM contracts
2115
serpent_code = '''
2216
def main(a,b):
@@ -1056,7 +1050,6 @@ def sort(args:arr):
10561050

10571051
@pytest.mark.timeout(100)
10581052
def test_sort():
1059-
set_level(None, 'info')
10601053
s = tester.state()
10611054
c = s.abi_contract(sort_code)
10621055
assert c.sort([9]) == [9]
@@ -1081,7 +1074,6 @@ def test(args:arr):
10811074

10821075
@pytest.mark.timeout(100)
10831076
def test_indirect_sort():
1084-
set_level(None, 'info')
10851077
s = tester.state()
10861078
open(filename9, 'w').write(sort_code)
10871079
c = s.abi_contract(sort_tester_code)
@@ -1326,7 +1318,6 @@ def get_prevhashes(k):
13261318

13271319
@pytest.mark.timeout(100)
13281320
def test_prevhashes():
1329-
set_level(None, 'info')
13301321
s = tester.state()
13311322
c = s.abi_contract(prevhashes_code)
13321323
s.mine(7)

ethereum/tests/test_genesis.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
import ethereum.utils as utils
77
from rlp.utils import encode_hex
88
from ethereum.tests.utils import new_env
9-
from ethereum.slogging import get_logger, configure_logging
9+
from ethereum.slogging import get_logger
1010
logger = get_logger()
11-
# configure_logging(':trace')
1211

1312

1413
@pytest.fixture(scope="module")

ethereum/tests/test_logging.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ def test_basic(caplog, level_name):
1212
with caplog.at_level('TRACE'):
1313
getattr(log, level_name)(level_name)
1414

15-
assert len(caplog.records()) == 1
16-
assert caplog.records()[0].levelname == level_name.upper()
17-
assert level_name in caplog.records()[0].msg
15+
assert len(caplog.records) == 1
16+
assert caplog.records[0].levelname == level_name.upper()
17+
assert level_name in caplog.records[0].msg
1818

1919

2020
def test_initial_config():

ethereum/tests/test_remoteblocks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from ethereum.db import DB
2-
from ethereum.slogging import get_logger, configure_logging
2+
from ethereum.slogging import get_logger
33
from ethereum import testutils
44
import sys
55
logger = get_logger()

ethereum/tests/test_state.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import json
2-
import os
32
import sys
43
import ethereum.testutils as testutils
54

6-
from ethereum.slogging import get_logger, configure_logging, set_level
5+
from ethereum.slogging import get_logger, configure_logging
76
logger = get_logger()
87
# customize VM log output to your needs
98
# hint: use 'py.test' with the '-s' option to dump logs to the console
@@ -13,7 +12,6 @@
1312

1413

1514
def test_state(filename, testname, testdata):
16-
set_level(None, 'info')
1715
logger.debug('running test:%r in %r' % (testname, filename))
1816
testutils.check_state_test(testutils.fixture_to_bytes(testdata))
1917

ethereum/tests/test_transactions.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
import ethereum.config as config
88
import sys
99
import json
10-
import os
1110

12-
from ethereum.slogging import get_logger, configure_logging
11+
from ethereum.slogging import get_logger
1312
logger = get_logger()
1413
# customize VM log output to your needs
1514
# hint: use 'py.test' with the '-s' option to dump logs to the console

0 commit comments

Comments
 (0)