-
Notifications
You must be signed in to change notification settings - Fork 20
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[uss_qualifier/scenarios/netrid/nominal_behavior] Add checks for UA type in SP (NET0260) #865
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,3 +1,4 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import datetime | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import math | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from typing import List, Optional | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -47,11 +48,20 @@ def __init__( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def evaluate_sp_flight( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
injected_flight: injection.TestFlight, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
observed_flight: Flight, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
participant_id: ParticipantID, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamp: datetime.datetime, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"""Implements fragment documented in `common_dictionary_evaluator_sp_flight.md`.""" | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self._evaluate_ua_type( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
injected_flight.get("aircraft_type"), | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
observed_flight.aircraft_type, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[participant_id], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamp, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self._evaluate_operational_status( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
observed_flight.operational_status, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[participant_id], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -651,3 +661,77 @@ def _evaluate_operational_status( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
key="skip_reason", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
message=f"Unsupported version {self._rid_version}: skipping Operational Status evaluation", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def _evaluate_ua_type( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
injected_val: Optional[str], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
observed_val: Optional[str], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
participants: List[ParticipantID], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamp: datetime.datetime, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
with self._test_scenario.check( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"UA type is present and consistent with injected one", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
participants, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) as check: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if observed_val is None: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It seems like this is only valid if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The way I understand the standard is that the USS must always report the UA type because it is a required field, and if it is unknown (i.e. nothing was injected), it must report I'm not sure how to proceed given that. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, my mistake -- this is the SP-DP interface and this is a required field, so you're right that None is simply invalid regardless of injection. None should not be allowed past the parser, but doesn't hurt to double check here. The DP under test can't be at fault because uss_qualifier is acting as DP when querying the SP, so the DP under test isn't even involved. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Indeed.
I'm not sure your comment was regarding that, but do note that the function There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check.record_failed( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"UA type is missing", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
details="USS did not return any UA type", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamps=[query_timestamp], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif not observed_val: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check.record_failed( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"UA type is empty", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
details="USS returned an empty UA type", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamps=[query_timestamp], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
equivalent = {injection.UAType.HybridLift, injection.UAType.VTOL} | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if injected_val is None: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if observed_val != injection.UAType.NotDeclared: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check.record_failed( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this should actually raise an exception -- the injection attempt should be rejected if uss_qualifier doesn't follow the injection API and I think the injection API has the injected value as either omitted or a valid UAType, so there should be no way for us to reach this failure if uss_qualifier is working properly. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. OK will change (and also take into account for future checks) that we should raise exceptions in cases where we injected invalid data. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Actually what I propose is to just adapt that check to fail when there is no injected value and that the observed value is different from There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we want to fail as soon as possible whenever a contract is violated and injecting an invalid UAType violates the injection API contract. If we haven't already failed due to that contract failure, I think it's appropriate to fail here. Basically, my understanding is that we're evaluating a value in the SP or observation API in C1 or C2 below (where the test designer or uss_qualifier is at fault). Probably we shouldn't reach that point, but if we do, I don't think the failure responsibility somehow transfers to the SP or DP. I think the appropriate way to indicate a uss_qualifier or test design problem is to raise an exception. The table below is my understanding of who is at fault for what failure, and the priority of rows goes from top to bottom. Note the difference between C3 and C8 when reusing the same function to evaluate SP API responses and Observation API responses.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"UA type is inconsistent, expected 'NotDeclared' since no value was injected", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
details=f"USS returned the UA type {observed_val}, yet no value was injected, which should have been mapped to 'NotDeclared'.", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamps=[query_timestamp], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif injected_val in equivalent: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if observed_val not in equivalent: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check.record_failed( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"UA type is inconsistent with injected value", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
details=f"USS returned the UA type {observed_val}, yet the value {injected_val} was injected, given that {equivalent} are equivalent .", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamps=[query_timestamp], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif injected_val != observed_val: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check.record_failed( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"UA type is inconsistent with injected value", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
details=f"USS returned the UA type {observed_val}, yet the value {injected_val} was injected.", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamps=[query_timestamp], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
with self._test_scenario.check( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"UA type is consistent with Common Data Dictionary", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
participants, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) as check: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
injection.UAType(observed_val) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BenjaminPelletier marked this conversation as resolved.
Show resolved
Hide resolved
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
except ValueError: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check.record_failed( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"UA type is invalid", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
details=f"USS returned an invalid UA type: {observed_val}.", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamps=[query_timestamp], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self._rid_version == RIDVersion.f3411_19 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
and observed_val == injection.UAType.HybridLift | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) or ( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self._rid_version == RIDVersion.f3411_22a | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
and observed_val == injection.UAType.VTOL | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check.record_failed( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"UA type is inconsistent RID version", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
details=f"USS returned the UA type {observed_val} which is not supported by the RID version used ({self._rid_version}).", | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
query_timestamps=[query_timestamp], | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It would probably be helpful to clarify which participant(s) these are to make evaluation of the checks more straightforward -- perhaps "participant providing the API through which the value was observed" which would cover the SP-DP API in this PR and the Observation API in future PRs.