Added an assertion to catch an unexpected document state (no IESG state set). Updated the log.assertion() function to accept a "note" argument, for more informative assertion messages.

- Legacy-Id: 18479
This commit is contained in:
Henrik Levkowetz 2020-09-09 14:09:43 +00:00
parent f99d6fd38e
commit e86bf0194b
3 changed files with 14 additions and 4 deletions

View file

@ -205,9 +205,12 @@ class RgRfcFactory(RgDraftFactory):
obj.set_state(State.objects.get(type_id=state_type_id,slug=state_slug))
if not obj.get_state('draft-stream-irtf'):
obj.set_state(State.objects.get(type_id='draft-stream-irtf', slug='pub'))
if not obj.get_state('draft-iesg'):
obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists'))
else:
obj.set_state(State.objects.get(type_id='draft',slug='rfc'))
obj.set_state(State.objects.get(type_id='draft-stream-irtf', slug='pub'))
obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists'))
class CharterFactory(BaseDocumentFactory):

View file

@ -76,7 +76,7 @@ from ietf.meeting.utils import group_sessions, get_upcoming_manageable_sessions,
from ietf.review.models import ReviewAssignment
from ietf.review.utils import can_request_review_of_doc, review_assignments_to_list_for_docs
from ietf.review.utils import no_review_from_teams_on_doc
from ietf.utils import markup_txt
from ietf.utils import markup_txt, log
from ietf.utils.response import permission_denied
from ietf.utils.text import maybe_split
@ -174,6 +174,7 @@ def document_main(request, name, rev=None):
split_content = not ( request.GET.get('include_text') or request.COOKIES.get("full_draft", settings.USER_PREFERENCE_DEFAULTS["full_draft"]) == "on" )
iesg_state = doc.get_state("draft-iesg")
log.assertion('iesg_state', note="A document's 'draft-iesg' state should never be unset'. Failed for %s"%doc.name)
iesg_state_slug = iesg_state.slug if iesg_state else None
iesg_state_summary = doc.friendly_state()
irsg_state = doc.get_state("draft-stream-irtf")

View file

@ -119,7 +119,7 @@ def build_traceback(stack):
break
return tb
def assertion(statement, state=True):
def assertion(statement, state=True, note=None):
"""
This acts like an assertion. It uses the django logger in order to send
the failed assertion and a backtrace as for an internal server error.
@ -128,7 +128,10 @@ def assertion(statement, state=True):
value = eval(statement, frame.f_globals, frame.f_locals)
if bool(value) != bool(state):
if (settings.DEBUG is True) or (settings.SERVER_MODE == 'test') :
raise AssertionError("Assertion failed: '%s': %s != %s." % (statement, repr(value), state))
if note:
raise AssertionError("Assertion failed: '%s': %s != %s (%s)." % (statement, repr(value), state, note))
else:
raise AssertionError("Assertion failed: '%s': %s != %s." % (statement, repr(value), state))
else:
# build a simulated traceback object
tb = build_traceback(inspect.stack()[1:])
@ -137,7 +140,10 @@ def assertion(statement, state=True):
for key in [ 'request', 'status_code', ]:
if key in frame.f_locals:
extra[key] = frame.f_locals[key]
logger.error("Assertion failed: '%s': %s != %s", statement, repr(value), state, exc_info=(AssertionError, None, tb), extra=extra)
if note:
logger.error("Assertion failed: '%s': %s != %s (%s)", statement, repr(value), state, note, exc_info=(AssertionError, None, tb), extra=extra)
else:
logger.error("Assertion failed: '%s': %s != %s", statement, repr(value), state, exc_info=(AssertionError, None, tb), extra=extra)
def unreachable(date="(unknown)"):
"Raises an assertion or sends traceback to admins if executed."