diff --git a/monitoring/monitorlib/fetch/rid.py b/monitoring/monitorlib/fetch/rid.py index d8122b5404..2c1142a54e 100644 --- a/monitoring/monitorlib/fetch/rid.py +++ b/monitoring/monitorlib/fetch/rid.py @@ -614,6 +614,17 @@ def notification_index(self) -> int: f"Cannot retrieve notification_index using RID version {self.rid_version}" ) + @property + def owner(self) -> str: + if self.rid_version == RIDVersion.f3411_19: + return self.v19_value.owner + elif self.rid_version == RIDVersion.f3411_22a: + return self.v22a_value.owner + else: + raise NotImplementedError( + f"Cannot retrieve owner using RID version {self.rid_version}" + ) + class RIDQuery(ImplicitDict): v19_query: Optional[Query] = None diff --git a/monitoring/uss_qualifier/requirements/interuss/f3411/dss_endpoints.md b/monitoring/uss_qualifier/requirements/interuss/f3411/dss_endpoints.md index 45d5cf8de9..2a8aef41ca 100644 --- a/monitoring/uss_qualifier/requirements/interuss/f3411/dss_endpoints.md +++ b/monitoring/uss_qualifier/requirements/interuss/f3411/dss_endpoints.md @@ -2,11 +2,7 @@ While neither ASTM F3411-19 nor F3411-22a explicitly require DSS implementations to implement all endpoints specified in Annex A4 (of each respective standard), InterUSS automated testing expects DSS implementations to implement all DSS endpoints specified in Annex A4. Specifically: -* PutISA: The DSS implementation under test must implement the ability to create and update an Identification Service Area by ID in accordance with the API specified in Annex A4 of the respective standard. * GetISA: The DSS implementation under test must implement the ability to retrieve an Identification Service Area by ID in accordance with the API specified in Annex A4 of the respective standard. -* DeleteISA: The DSS implementation under test must implement the ability to delete an Identification Service Area by ID in accordance with the API specified in Annex A4 of the respective standard. * SearchISAs: The DSS implementation under test must implement the ability to search for Identification Service Areas meeting the specified criteria in accordance with the API specified in Annex A4 of the respective standard. -* PutSubscription: The DSS implementation under test must implement the ability to create a subscription in accordance with the API specified in Annex A4 of the respective standard. -* GetSubscription: The DSS implementation under test must implement the ability to retrieve a Subscription by ID in accordance with the API specified in Annex A4 of the respective standard. -* DeleteSubscription: The DSS implementation under test must implement the ability to delete s Subscription in accordance with the API specified in Annex A4 of the respective standard. -* SearchSubscriptions: The DSS implementation under test must implement the ability to search for subscriptions in accordance with the API specified in Annex A4 of the respective standard. +* SubscriptionInitialNotificationIndex: The DSS implementation under test must set the `notification_index` at 0 for any newly created subscription. +* SubscriptionVersionFormat: The DSS implementation under test must use a string of 10 or more lower-cased alphanumeric characters for the `version` field of a subscription. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py index b2df764c7e..9e648fba71 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py @@ -2,8 +2,11 @@ from datetime import datetime, timedelta from typing import Dict, Any, List +import loguru import s2sphere +from monitoring.monitorlib.fetch.rid import Subscription +from monitoring.monitorlib.mutate.rid import ChangedSubscription from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.common_data_definitions import Severity from monitoring.uss_qualifier.resources import VerticesResource @@ -17,13 +20,30 @@ TIME_TOLERANCE_SEC = 1 +# TODO check if this is something that needs to be configurable. +USS_QUALIFIER_OWNER = "uss_qualifier" + class SubscriptionSimple(GenericTestScenario): """Based on prober/rid/v2/test_subscription_simple.py from the legacy prober tool.""" SUB_TYPE = register_resource_type(371, "Subscription") - _test_subscription_params: Dict[str, Any] + # Base identifier for the subscriptions that will be created + _base_sub_id: str + + _test_subscription_ids: List[str] + + # Base parameters used for subscription creation variations + _default_creation_params: Dict[str, Any] + + # Effective parameters used for each subscription, indexed by subscription ID + _sub_params_by_sub_id: Dict[str, Dict[str, Any]] + + # Keep track of the latest subscription returned by the DSS + _current_subscriptions: Dict[str, Subscription] + + # An area designed to be too big to be allowed to search by the DSS _problematically_big_area: List[s2sphere.LatLng] def __init__( @@ -45,7 +65,7 @@ def __init__( # This is an UTMClientSession self._dss = dss.dss_instance self._dss_wrapper = DSSWrapper(self, self._dss) - self._sub_id = id_generator.id_factory.make_id(self.SUB_TYPE) + self._base_sub_id = id_generator.id_factory.make_id(self.SUB_TYPE) self._isa = isa.specification self._isa_area = [vertex.as_s2sphere() for vertex in self._isa.footprint] # List of vertices that has the same first and last point: @@ -53,12 +73,17 @@ def __init__( self._isa_area_loop = self._isa_area.copy() self._isa_area_loop.append(self._isa_area_loop[0]) - self._test_subscription_params = self._isa.get_new_subscription_params( - sub_id=self._sub_id, - start_time=datetime.now().astimezone(), - duration=timedelta( - minutes=5 - ), # 5 minutes are enough to run through this test + # Prepare 4 different subscription ids: + self._test_subscription_ids = [ + self._base_sub_id[:-1] + f"{i}" for i in range(4) + ] + + self._default_creation_params = self._isa.get_new_subscription_params( + sub_id="", # subscription ID will need to be overwritten + # Set this slightly in the past: we will update the subscriptions + # to a later value that still needs to be roughly 'now' without getting into the future + start_time=datetime.now().astimezone() - timedelta(seconds=10), + duration=timedelta(minutes=10), ) self._problematically_big_area = [ @@ -69,31 +94,48 @@ def __init__( def run(self): self.begin_test_scenario() + loguru.logger.info("setup") self._setup_case() self.begin_test_case("Subscription Simple") self.begin_test_step("Create subscription validation") - self._create_and_validate_sub() + loguru.logger.info("create") + self._create_and_validate_subs() + + self.end_test_step() + + loguru.logger.info("mutate") + self.begin_test_step("Mutate Subscription") + + self._test_mutate_subscriptions_shift_time() + self._test_mutate_subscriptions_change_area() self.end_test_step() self.begin_test_step("Query Existing Subscription") + loguru.logger.info("get") self._test_get_sub() + loguru.logger.info("search") self._test_valid_search_sub() self._test_huge_area_search_sub() self.end_test_step() + self.begin_test_step("Delete Subscription") + loguru.logger.info("delete faulty") self._test_delete_sub_faulty() + loguru.logger.info("delete") self._test_delete_sub() self.end_test_step() self.begin_test_step("Query Deleted Subscription") + loguru.logger.info("get deleted") self._test_get_deleted_sub() + loguru.logger.info("search deleted") self._test_search_deleted_sub() self._test_loop_vertices_search_deleted_sub() @@ -105,65 +147,258 @@ def run(self): def _setup_case(self): self.begin_test_case("Setup") + # Multiple runs of the scenario seem to rely on the same instance of it: + # thus we need to reset the state of the scenario before running it. + self._current_subscriptions = {} + self._sub_params_by_sub_id = {} + self._ensure_clean_workspace_step() self.end_test_case() def _ensure_clean_workspace_step(self): self.begin_test_step("Ensure clean workspace") - self._ensure_test_sub_does_not_exist() + # Start by dropping any active sub + self._ensure_no_active_subs_exist() + # Check for subscriptions that will collide with our IDs and drop them + self._ensure_test_sub_ids_do_not_exist() self.end_test_step() - def _ensure_test_sub_does_not_exist(self): + def _ensure_test_sub_ids_do_not_exist(self): + """ + Ensures no subscription with the IDs we intend to use exist. + Note that expired subscriptions won't appear in searches, + which is why we need to explicitly test for their presence. + """ + for sub_id in self._test_subscription_ids: + # TODO migrate this to the two-check pattern when the utility has been migrated + with self.check( + "Ensure subscription with test ID does not exist", + [self._dss_wrapper.participant_id], + ) as check: + self._dss_wrapper.cleanup_sub(check, sub_id) + + def _ensure_no_active_subs_exist(self): + """Ensure that we don't currently have any other active subscriptions at the DSS: + as there is a limit on how many simultaneous subscriptions we can create, + we want to avoid potentially reaching the limit during this scenario.""" + with self.check( - "Ensure subscription with test ID does not exist", + "Search for all subscriptions in ISA area", [self._dss_wrapper.participant_id], ) as check: - self._dss_wrapper.cleanup_sub(check, self._sub_id) + subs_in_area = self._dss_wrapper.search_subs( + check, + self._isa_area, + ) + + for sub_id, sub in subs_in_area.subscriptions.items(): + with self.check( + "Subscription can be deleted", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.del_sub(check, sub_id, sub.version) + + def _create_and_validate_subs(self): + """ + Creates multiple subscriptions using the configured footprint and variants of undefined start and end time parameters: + + - no start and end time + - no start time, with end time + - with start time, no end time + - with both start and end time - def _create_and_validate_sub(self): - """Creates a subscription and ensures that the data obtained in the response is correct. - Note that this does not check for services areas in the response: this behavior is checked + Note that this does not check for service areas in the response: this behavior is checked in the isa_subscription_interactions scenario. + + When this function returns, four subscriptions are expected to be created at the DSS """ + + # TODO the existing dss_wrapper put_sub function (and the underlying mutate.upsert_subscription it relies on) + # does not allow empty start/end times. We need to change that before we can test + # DSS behaviors with respect to missing optional parameters. + + # no_opt_params = self._default_creation_params.copy() + # no_opt_params["sub_id"] = self._test_subscription_ids[0] + # del no_opt_params["start_time"] + # del no_opt_params["end_time"] + # self._create_sub_with_params(no_opt_params) + # + # no_start_param = self._default_creation_params.copy() + # no_start_param["sub_id"] = self._test_subscription_ids[1] + # del no_start_param["start_time"] + # self._create_sub_with_params(no_start_param) + # + # no_end_param = self._default_creation_params.copy() + # no_end_param["sub_id"] = self._test_subscription_ids[2] + # del no_end_param["end_time"] + # self._create_sub_with_params(no_start_param) + + # Create the subscription with all parameters set: + all_set_params = self._default_creation_params.copy() + all_set_params["sub_id"] = self._test_subscription_ids[3] + self._create_sub_with_params(all_set_params) + + def _create_sub_with_params(self, creation_params: Dict[str, Any]): with self.check( "Create subscription", [self._dss_wrapper.participant_id] ) as check: - created_sub = self._dss_wrapper.put_sub( + newly_created = self._dss_wrapper.put_sub( check, - **self._test_subscription_params, + **creation_params, ) + loguru.logger.info(f"Created subscription {newly_created}") + # Check that what we get back is valid and corresponds to what we want to create + self._compare_upsert_resp_with_params( + creation_params["sub_id"], newly_created, creation_params, False + ) - # Make sure the subscription corresponds to what we requested - self._validate_subscription(created_sub.subscription) - - # Check the notification index is 0 + # Check that the notification index is 0 for a newly created subscription. + # Should the notification field be missing, we assume it will have defaulted to 0 on the DSS's side. with self.check( - "Returned notification index is 0", [self._dss_wrapper.participant_id] + "Returned notification index is 0 if present", + [self._dss_wrapper.participant_id], ) as check: - notif_index = created_sub.subscription.notification_index - if notif_index != 0: + notif_index = newly_created.subscription.notification_index + if notif_index is not None and notif_index != 0: check.record_failed( f"Returned notification index was {notif_index} instead of 0", Severity.High, - query_timestamps=[created_sub.query.request.timestamp], + details="A subscription is expected to have a notification index of 0 when it is created" + f"Parameters used: {creation_params}", + query_timestamps=[newly_created.query.request.timestamp], ) - self._current_sub_version = created_sub.subscription.version + # Store the version of the subscription + self._current_subscriptions[ + creation_params["sub_id"] + ] = newly_created.subscription + # Store the parameters we used for that subscription + self._sub_params_by_sub_id[creation_params["sub_id"]] = creation_params - def _test_get_sub(self): - """Retrieves the previously created Submission by its ID and ensures that - the data obtained in the response is correct.""" + def _compare_upsert_resp_with_params( + self, + sub_id: str, + creation_resp_under_test: ChangedSubscription, + creation_params: Dict[str, Any], + was_mutated: bool, + ): + """ + Verify that the response of the server is conforming to the spec and the parameters we used in the request. + """ + check_name = ( + "Response to subscription mutation contains a subscription" + if was_mutated + else "Response to subscription creation contains a subscription" + ) with self.check( - "Get Subscription by ID", [self._dss_wrapper.participant_id] + check_name, + [self._dss_wrapper.participant_id], ) as check: - fetched_sub = self._dss_wrapper.get_sub( - check, - self._sub_id, - ) + if not creation_resp_under_test.subscription: + check.record_failed( + "Response to subscription creation did not contain a subscription", + Severity.High, + details="A subscription is expected to be returned in the response to a subscription creation request." + f"Parameters used: {creation_params}", + query_timestamps=[creation_resp_under_test.query.request.timestamp], + ) # Make sure the subscription corresponds to what we requested - self._validate_subscription_and_notif_index(fetched_sub.subscription) + self._validate_subscription( + sub_id, + creation_resp_under_test.subscription, + creation_params, + was_mutated=was_mutated, + query_timestamps=[creation_resp_under_test.query.request.timestamp], + ) + + def _test_mutate_subscriptions_shift_time(self): + """Mutate all existing subscriptions by adding 10 seconds to their start and end times""" + + for sub_id, sub in self._current_subscriptions.items(): + with self.check( + "Subscription can be mutated", [self._dss_wrapper.participant_id] + ) as check: + orig_params = self._sub_params_by_sub_id[sub_id].copy() + new_params = dict( + sub_id=sub_id, + area_vertices=orig_params["area_vertices"][ + :-1 + ], # remove the last vertex to change the footprint + alt_lo=orig_params["alt_lo"], + alt_hi=orig_params["alt_hi"], + start_time=sub.time_start + timedelta(seconds=10), + end_time=sub.time_end + timedelta(seconds=10), + uss_base_url=orig_params["uss_base_url"], + ) + mutated_sub_response = self._dss_wrapper.put_sub( + check, + sub_version=sub.version, + **new_params, + ) + + # Check that what we get back is valid and corresponds to what we want to create + self._compare_upsert_resp_with_params( + sub_id, mutated_sub_response, new_params, was_mutated=True + ) + # Store the version of the subscription + self._current_subscriptions[sub_id] = mutated_sub_response.subscription + # Update the parameters we used for that subscription + self._sub_params_by_sub_id[sub_id] = new_params + + def _test_mutate_subscriptions_change_area(self): + """ + Mutate all existing subscriptions by updating their footprint. + """ + for sub_id, sub in self._current_subscriptions.items(): + with self.check( + "Subscription can be mutated", [self._dss_wrapper.participant_id] + ) as check: + new_params = self._sub_params_by_sub_id[sub_id].copy() + + # Shift all previous vertices west by 0.001 degrees + new_params["area_vertices"] = [ + s2sphere.LatLng.from_degrees( + vertex.lat().degrees, vertex.lng().degrees - 0.001 + ) + for vertex in new_params["area_vertices"] + ] + mutated_sub_response = self._dss_wrapper.put_sub( + check, + sub_version=sub.version, + **new_params, + ) + + # Check that what we get back is valid and corresponds to what we want to create + self._compare_upsert_resp_with_params( + sub_id, mutated_sub_response, new_params, was_mutated=True + ) + # Store the version of the subscription + self._current_subscriptions[sub_id] = mutated_sub_response.subscription + # Update the parameters we used for that subscription + self._sub_params_by_sub_id[sub_id] = new_params + + def _test_get_sub(self): + """Retrieves the previously created Subscription by their ID and ensures that + the data obtained in the response is correct.""" + + for sub_id, sub_params in self._sub_params_by_sub_id.items(): + with self.check( + "Get Subscription by ID", [self._dss_wrapper.participant_id] + ) as check: + fetched_sub = self._dss_wrapper.get_sub( + check, + sub_id, + ) + + # Make sure the subscription corresponds to what we requested + self._validate_subscription_and_notif_index( + sub_id, + fetched_sub.subscription, + sub_params, + False, + [fetched_sub.query.request.timestamp], + ) def _test_valid_search_sub(self): """Search for the created subscription by using the configured ISA's footprint. This is expected to work""" @@ -177,22 +412,27 @@ def _test_valid_search_sub(self): self._isa_area, ) - with self.check( - "Created Subscription is in search results", - [self._dss_wrapper.participant_id], - ) as check: - if self._sub_id not in subs_in_area.subscriptions: - check.record_failed( - "Created subscription is not present in search results", - Severity.High, - f"The subscription {self._sub_id} was expected to be found in the search results, but these only contained the following subscriptions: {subs_in_area.subscriptions.keys()}", - query_timestamps=[subs_in_area.query.request.timestamp], - ) - - # Make sure the returned subscription corresponds to what we created - self._validate_subscription_and_notif_index( - subs_in_area.subscriptions[self._sub_id] - ) + for sub_id, sub_params in self._sub_params_by_sub_id.items(): + with self.check( + "Created Subscription is in search results", + [self._dss_wrapper.participant_id], + ) as check: + if sub_id not in subs_in_area.subscriptions: + check.record_failed( + "Created subscription is not present in search results", + Severity.High, + f"The subscription {sub_id} was expected to be found in the search results, but these only contained the following subscriptions: {subs_in_area.subscriptions.keys()}", + query_timestamps=[subs_in_area.query.request.timestamp], + ) + + # Make sure the returned subscription corresponds to what we created + self._validate_subscription_and_notif_index( + sub_id, + subs_in_area.subscriptions[sub_id], + sub_params, + False, + [subs_in_area.query.request.timestamp], + ) def _test_huge_area_search_sub(self): """Checks that too big search areas are rejected""" @@ -207,48 +447,61 @@ def _test_huge_area_search_sub(self): def _test_delete_sub_faulty(self): """Try to delete subscription in an incorrect way""" - with self.check( - "Missing version prevents deletion", [self._dss_wrapper.participant_id] - ) as check: - self._dss_wrapper.del_sub_expect_response_code( - check=check, - expected_response_codes={400}, - sub_id=self._sub_id, - sub_version="", # this results in an empty url path parameter in the query (what we want to test) - ) + for sub_id in self._current_subscriptions.keys(): + with self.check( + "Missing version prevents deletion", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.del_sub_expect_response_code( + check=check, + expected_response_codes={400}, + sub_id=sub_id, + sub_version="", # this results in an empty url path parameter in the query (what we want to test) + ) - with self.check( - "Incorrect version prevents deletion", [self._dss_wrapper.participant_id] - ) as check: - self._dss_wrapper.del_sub_expect_response_code( - check=check, - expected_response_codes={400}, - sub_id=self._sub_id, - sub_version="notacorrectversion", - ) + with self.check( + "Incorrect version prevents deletion", + [self._dss_wrapper.participant_id], + ) as check: + self._dss_wrapper.del_sub_expect_response_code( + check=check, + expected_response_codes={400}, + sub_id=sub_id, + sub_version="notacorrectversion", + ) def _test_delete_sub(self): - """Delete the subscription in the correct way""" - with self.check( - "Subscription can be deleted", [self._dss_wrapper.participant_id] - ) as check: - deleted_sub = self._dss_wrapper.del_sub( - check=check, sub_id=self._sub_id, sub_version=self._current_sub_version + """Delete the subscriptions in the correct way""" + + for sub_id, sub in self._current_subscriptions.items(): + with self.check( + "Subscription can be deleted", [self._dss_wrapper.participant_id] + ) as check: + deleted_sub = self._dss_wrapper.del_sub( + check=check, sub_id=sub_id, sub_version=sub.version + ) + # Make sure the returned subscription corresponds to what we created + self._validate_subscription_and_notif_index( + sub_id, + deleted_sub.subscription, + self._sub_params_by_sub_id[sub_id], + False, + [deleted_sub.query.request.timestamp], ) - # Make sure the returned subscription corresponds to what we created - self._validate_subscription_and_notif_index(deleted_sub.subscription) + self._current_subscriptions = {} def _test_get_deleted_sub(self): """Try to retrieve the deleted subscription by its ID.""" - with self.check( - "Query by subscription ID should fail", [self._dss_wrapper.participant_id] - ) as check: - self._dss_wrapper.get_sub_expect_response_code( - check=check, - expected_response_codes={404}, - sub_id=self._sub_id, - ) + for sub_id in self._sub_params_by_sub_id.keys(): + with self.check( + "Query by subscription ID should fail", + [self._dss_wrapper.participant_id], + ) as check: + self._dss_wrapper.get_sub_expect_response_code( + check=check, + expected_response_codes={404}, + sub_id=sub_id, + ) def _test_search_deleted_sub(self): """Try searching for the deleted subscription""" @@ -266,13 +519,15 @@ def _test_search_deleted_sub(self): "Deleted subscription should not be present in search results", [self._dss_wrapper.participant_id], ) as check: - if self._sub_id in subs_in_area.subscriptions: - check.record_failed( - "Deleted subscription is still present in search results", - Severity.High, - f"The subscription {self._sub_id} was deleted, and thus not expected to be found in the search results.", - query_timestamps=[subs_in_area.query.request.timestamp], - ) + for sub_id in self._sub_params_by_sub_id.keys(): + if sub_id in subs_in_area.subscriptions: + check.record_failed( + "A deleted subscription is still present in search results", + Severity.High, + f"The subscription {sub_id} was deleted, and thus not expected to be found in the search results." + f"Subscription IDs returned in search results: {subs_in_area.subscriptions.keys()}", + query_timestamps=[subs_in_area.query.request.timestamp], + ) def _test_loop_vertices_search_deleted_sub(self): """Try searching for the deleted subscription using vertices that describe a loop""" @@ -286,35 +541,112 @@ def _test_loop_vertices_search_deleted_sub(self): area=self._isa_area_loop, ) - def _validate_subscription_and_notif_index(self, sub_under_test): + def _validate_subscription_and_notif_index( + self, + sub_id: str, + sub_under_test: Subscription, + creation_params: Dict[str, Any], + was_mutated: bool, + query_timestamps: List[datetime], + ): """Compare the passed subscription with the data we specified when creating it""" - self._validate_subscription(sub_under_test) + self._validate_subscription( + sub_id, sub_under_test, creation_params, was_mutated, query_timestamps + ) - # Check the notification index is 0 or more + # Check the notification index is 0 or more, if it is present # (notifications might have been sent out between the creation and subsequent query) + # Should the index be absent, we assume it to be 0 on the DSS's side. with self.check( "Returned notification index is equal to or greater than 0", [self._dss_wrapper.participant_id], ) as check: - if sub_under_test.notification_index < 0: + if ( + sub_under_test.notification_index is not None + and sub_under_test.notification_index < 0 + ): check.record_failed( "Returned notification index is lower than 0", Severity.High, - f"Returned: {sub_under_test.notification_index} when 0 or more was expected", - query_timestamps=[sub_under_test.query.request.timestamp], + f"Returned: {sub_under_test.notification_index} when 0 or more was expected" + f"Parameters used: {creation_params}", + query_timestamps=query_timestamps, ) - def _validate_subscription(self, sub_under_test): + def _validate_subscription( + self, + sub_id: str, + sub_under_test: Subscription, + creation_params: Dict[str, Any], + was_mutated: bool, + query_timestamps: List[datetime], + ): + """ + Validate the subscription against the parameters used to create it. + + Args: + sub_id: ID of the subscription being validated + sub_under_test: subscription being validated + creation_params: parameters used to create or update the subscription + was_mutated: true if the resulting subscription is the result of a mutation or deletion + """ + + expect_start_time = creation_params["start_time"] + expect_end_time = creation_params["end_time"] + + with self.check( + "Returned subscription has an ID", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.id: + check.record_failed( + "Returned subscription had no ID", + Severity.High, + details="A subscription is expected to have an ID", + query_timestamps=query_timestamps, + ) with self.check( "Returned subscription ID is correct", [self._dss_wrapper.participant_id] ) as check: - if sub_under_test.id != self._sub_id: + if sub_under_test.id != sub_id: check.record_failed( "Returned subscription ID does not match provided one", Severity.High, - f"Provided: {self._sub_id}, Returned: {sub_under_test.id}", - query_timestamps=[sub_under_test.query.request.timestamp], + f"Provided: {sub_id}, Returned: {sub_under_test.id}", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription has an owner", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.owner: + check.record_failed( + "Returned subscription had no owner", + Severity.High, + details="A subscription is expected to have an owner", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription owner is correct", [self._dss_wrapper.participant_id] + ) as check: + if sub_under_test.owner != USS_QUALIFIER_OWNER: + check.record_failed( + "Returned subscription owner does not match provided one", + Severity.High, + f"Provided: {USS_QUALIFIER_OWNER}, Returned: {sub_under_test.owner}", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription has an ISA URL", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.isa_url: + check.record_failed( + "Returned subscription had no ISA URL", + Severity.High, + details="A subscription is expected to have an ISA URL", + query_timestamps=query_timestamps, ) with self.check( @@ -325,40 +657,68 @@ def _validate_subscription(self, sub_under_test): "Returned USS Base URL does not match provided one", Severity.High, f"Provided: {self._isa.base_url}, Returned: {sub_under_test.isa_url}", - query_timestamps=[sub_under_test.query.request.timestamp], + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription has a start time", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.time_start: + check.record_failed( + "Returned subscription had no start time", + Severity.High, + details="A subscription is expected to have a start time", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription has an end time", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.time_end: + check.record_failed( + "Returned subscription had no end time", + Severity.High, + details="A subscription is expected to have an end time", + query_timestamps=query_timestamps, ) with self.check( "Returned start time is correct", [self._dss_wrapper.participant_id] ) as check: if ( - abs( - sub_under_test.time_start - - self._test_subscription_params["start_time"] - ).total_seconds() + abs(sub_under_test.time_start - expect_start_time).total_seconds() > TIME_TOLERANCE_SEC ): check.record_failed( "Returned start time does not match provided one", Severity.High, - f"Provided: {self._test_subscription_params['time_start']}, Returned: {sub_under_test.time_start}", - query_timestamps=[sub_under_test.query.request.timestamp], + f"Provided: {expect_start_time}, Returned: {sub_under_test.time_start}", + query_timestamps=query_timestamps, ) with self.check( "Returned end time is correct", [self._dss_wrapper.participant_id] ) as check: if ( - abs( - sub_under_test.time_end - self._test_subscription_params["end_time"] - ).total_seconds() + abs(sub_under_test.time_end - expect_end_time).total_seconds() > TIME_TOLERANCE_SEC ): check.record_failed( "Returned end time does not match provided one", Severity.High, - f"Provided: {self._test_subscription_params['time_end']}, Returned: {sub_under_test.time_end}", - query_timestamps=[sub_under_test.query.request.timestamp], + f"Provided: {expect_end_time}, Returned: {sub_under_test.time_end}", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription has a version", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.version: + check.record_failed( + "Returned subscription had no version", + Severity.High, + details="A subscription is expected to have a version", + query_timestamps=query_timestamps, ) with self.check( @@ -371,10 +731,42 @@ def _validate_subscription(self, sub_under_test): Severity.High, f"Returned: {sub_under_test.version}, this does not match" + "[a-z0-9]{10,}$", - query_timestamps=[sub_under_test.query.request.timestamp], + query_timestamps=query_timestamps, ) + # If the subscription was mutated, we compare the returned version with the previously stored one: + if was_mutated: + with self.check( + "Mutated subscription version is updated", + [self._dss_wrapper.participant_id], + ) as check: + if ( + sub_under_test.version + == self._current_subscriptions[sub_under_test.id] + ): + check.record_failed( + "Returned subscription version was not updated", + Severity.High, + f"Returned: {sub_under_test.version}, Expected: {self._current_subscriptions[sub_under_test.id]}", + query_timestamps=query_timestamps, + ) + elif sub_id in self._current_subscriptions.keys(): + with self.check( + "Non-mutated subscription keeps the same version", + [self._dss_wrapper.participant_id], + ) as check: + if ( + sub_under_test.version + != self._current_subscriptions[sub_under_test.id].version + ): + check.record_failed( + "Returned subscription version was updated", + Severity.High, + f"Returned: {sub_under_test.version}, Expected: {self._current_subscriptions[sub_under_test.id]}.", + query_timestamps=query_timestamps, + ) + def cleanup(self): self.begin_cleanup() - self._ensure_test_sub_does_not_exist() + self._ensure_test_sub_ids_do_not_exist() self.end_cleanup() diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.md index c910806301..142f06ca17 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.md @@ -28,6 +28,14 @@ Perform basic operations on a single DSS instance to create, update and delete s This step ensures that no subscription with the known test ID exists in the DSS. +#### Search for all subscriptions in ISA area check + +If the DSS fails to let us search in the area for which test subscriptions will be created, it is failing to properly implement **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)**. + +#### Subscription can be deleted check + +An attempt to delete a subscription when the correct version is provided should succeed, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)**. + #### Ensure subscription with test ID does not exist check If the DSS cannot be queried for the existing test ID, or if a subscription with that ID exists and it cannot be removed, @@ -35,40 +43,77 @@ the DSS is likely not implementing **[astm.f3411.v19.DSS0030,e](../../../../../r ## Subscription Simple test case -This test case creates a subscription, goes on to query and search it in different ways, then deletes it and searches for it again. +This test case creates multiple subscriptions, goes on to query and search for them, then deletes and searches for them again. ### Create subscription validation test step -This test step creates a subscription and ensures that the subscription the DSS returned in the API call is correct and well-formed. +This test step creates multiple subscriptions with different combinations of the optional end and start time parameters. + +All subscriptions are left on the DSS when this step ends, as they are expected to be present for the subsequent step. #### Create subscription check -As per **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**, the DSS API must allow callers to create a valid subscription. +As per **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**, the DSS API must allow callers to create a subscription with either onr or both of the +start and end time missing, provided all the required parameters are valid. + +#### Response to subscription creation contains a subscription check + +As per **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**, upon creation of a subscription, +the newly created subscription must be part of its response. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. #### Returned subscription ID is correct check If the returned subscription ID does not correspond to the one specified in the creation parameters, -**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + -#### Returned notification index is 0 check +#### Returned notification index is 0 if present check -The notification index of a newly created subscription must be 0, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The notification index of a newly created subscription must be 0, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. #### Returned ISA URL has correct base URL check -The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. #### Returned start time is correct check -The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v19.DSS0060](../../../../../requirements/astm/f3411/v19.md)**. #### Returned end time is correct check -The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. #### Generated subscription version has proper format check -The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. ### Query Existing Subscription test step @@ -84,36 +129,169 @@ If the DSS fails to let us search in the area for which the subscription was jus #### Created Subscription is in search results check -If the created subscription is not returned in a search that covers the area it was created for, the DSS is not properly implementing **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +If the created subscription is not returned in a search that covers the area it was created for, the DSS is not properly implementing **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)**. #### No huge search area allowed check -In accordance with **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**, the DSS should not allow searches for areas that are too big. +In accordance with **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)**, the DSS should not allow searches for areas that are too big. #### Returned subscription ID is correct check If the returned subscription ID does not correspond to the one specified in the creation parameters, -**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + + #### Returned notification index is equal to or greater than 0 check -If the notification index of the subscription is less than 0, the DSS fails to properly implement **[interuss.f3411.dss_endpoints.GetSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v19.DSS0060](../../../../../requirements/astm/f3411/v19.md)**. #### Returned ISA URL has correct base URL check -The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. #### Returned start time is correct check -The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. #### Returned end time is correct check -The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Non-mutated subscription keeps the same version check + +If the version of the subscription is updated without there having been any mutation of the subscription, the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. #### Generated subscription version has proper format check -The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +### Mutate Subscription test step + +This test step mutates the previously created subscription to verify that the DSS reacts properly: notably, it checks that the subscription version is updated, +including for changes that are not directly visible, such as changing the subscription's footprint. + +#### Subscription can be mutated check + +If a subscription cannot be modified with a valid set of parameters, the DSS is failing to meet **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Response to subscription mutation contains a subscription check + +As per **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**, upon creation of a subscription, +the newly created subscription must be part of its response. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + + + +#### Returned notification index is equal to or greater than 0 check + +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v19.DSS0060](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned end time is correct check + +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Mutated subscription version is updated check + +Following a mutation, the DSS needs to update the subscription version, otherwise it is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Generated subscription version has proper format check + +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. ### Delete Subscription test step @@ -123,40 +301,75 @@ This also checks that the subscription data returned by a successful deletion is #### Missing version prevents deletion check -An attempt to delete a subscription without providing a version should fail, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +An attempt to delete a subscription without providing a version should fail, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)**. #### Incorrect version prevents deletion check -An attempt to delete a subscription while providing an incorrect version should fail, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +An attempt to delete a subscription while providing an incorrect version should fail, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)**. #### Subscription can be deleted check -An attempt to delete a subscription when the correct version is provided should succeed, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +An attempt to delete a subscription when the correct version is provided should succeed, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)**. -#### Returned subscription ID is correct check -If the returned subscription ID does not correspond to the one specified in the deletion request, -**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. #### Returned notification index is equal to or greater than 0 check -If the notification index of the subscription is less than 0, the DSS fails to properly implement **[interuss.f3411.dss_endpoints.GetSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. #### Returned ISA URL has correct base URL check -The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. #### Returned start time is correct check -The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v19.DSS0060](../../../../../requirements/astm/f3411/v19.md)**. #### Returned end time is correct check -The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Non-mutated subscription keeps the same version check + +If the version of the subscription is updated without there having been any mutation of the subscription, the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. #### Generated subscription version has proper format check -The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. ### Query Deleted Subscription test step @@ -173,11 +386,11 @@ If the DSS fails to let us search in the area for which the subscription was jus #### Search area that represents a loop is not allowed check The DSS should not allow us to search for subscriptions using a list of vertices describing a loop (first and last points in the list of vertices are the same), -otherwise it is failing to meet **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +otherwise it is failing to meet **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)**. #### Deleted subscription should not be present in search results check -If the DSS returns the deleted subscription in a search that covers the area it was originally created for, the DSS is not properly implementing **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +If the DSS returns the deleted subscription in a search that covers the area it was originally created for, the DSS is not properly implementing **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)**. ## Cleanup diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.md index 9bc7c14a01..8231a8dac3 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.md @@ -28,6 +28,14 @@ Perform basic operations on a single DSS instance to create, update and delete s This step ensures that no subscription with the known test ID exists in the DSS. +#### Search for all subscriptions in ISA area check + +If the DSS fails to let us search in the area for which test subscriptions will be created, it is failing to properly implement **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Subscription can be deleted check + +An attempt to delete a subscription when the correct version is provided should succeed, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)**. + #### Ensure subscription with test ID does not exist check If the DSS cannot be queried for the existing test ID, or if a subscription with that ID exists and it cannot be removed, @@ -35,40 +43,76 @@ the DSS is likely not implementing **[astm.f3411.v22a.DSS0030,e](../../../../../ ## Subscription Simple test case -This test case creates a subscription, goes on to query and search it in different ways, then deletes it and searches for it again. +This test case creates multiple subscriptions, goes on to query and search for them, then deletes and searches for them again. ### Create subscription validation test step -This test step creates a subscription and ensures that the subscription the DSS returned in the API call is correct and well-formed. +This test step creates multiple subscriptions with different combinations of the optional end and start time parameters. + +All subscriptions are left on the DSS when this step ends, as they are expected to be present for the subsequent step. #### Create subscription check -As per **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**, the DSS API must allow callers to create a valid subscription. +As per **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**, the DSS API must allow callers to create a subscription with either onr or both of the +start and end time missing, provided all the required parameters are valid. + +#### Response to subscription creation contains a subscription check + +As per **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**, upon creation of a subscription, +the newly created subscription must be part of its response. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. #### Returned subscription ID is correct check If the returned subscription ID does not correspond to the one specified in the creation parameters, -**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. -#### Returned notification index is 0 check +#### Returned notification index is 0 if present check -The notification index of a newly created subscription must be 0, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The notification index of a newly created subscription must be 0, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. #### Returned ISA URL has correct base URL check -The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. #### Returned start time is correct check -The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v22a.DSS0060](../../../../../requirements/astm/f3411/v22a.md)**. #### Returned end time is correct check -The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. #### Generated subscription version has proper format check -The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. ### Query Existing Subscription test step @@ -84,36 +128,165 @@ If the DSS fails to let us search in the area for which the subscription was jus #### Created Subscription is in search results check -If the created subscription is not returned in a search that covers the area it was created for, the DSS is not properly implementing **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +If the created subscription is not returned in a search that covers the area it was created for, the DSS is not properly implementing **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)**. #### No huge search area allowed check -In accordance with **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**, the DSS should not allow searches for areas that are too big. +In accordance with **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)**, the DSS should not allow searches for areas that are too big. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. + +#### Returned notification index is equal to or greater than 0 check + +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v22a.DSS0060](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned end time is correct check + +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Non-mutated subscription keeps the same version check + +If the version of the subscription is updated without there having been any mutation of the subscription, the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Generated subscription version has proper format check + +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +### Mutate Subscription test step + +This test step mutates the previously created subscription to verify that the DSS reacts properly: notably, it checks that the subscription version is updated, +including for changes that are not directly visible, such as changing the subscription's footprint. + +#### Subscription can be mutated check + +If a subscription cannot be modified with a valid set of parameters, the DSS is failing to meet **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Response to subscription mutation contains a subscription check + +As per **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**, upon creation of a subscription, +the newly created subscription must be part of its response. #### Returned subscription ID is correct check If the returned subscription ID does not correspond to the one specified in the creation parameters, -**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. #### Returned notification index is equal to or greater than 0 check -If the notification index of the subscription is less than 0, the DSS fails to properly implement **[interuss.f3411.dss_endpoints.GetSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v22a.DSS0060](../../../../../requirements/astm/f3411/v22a.md)**. #### Returned ISA URL has correct base URL check -The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. #### Returned start time is correct check -The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. #### Returned end time is correct check -The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Mutated subscription version is updated check + +Following a mutation, the DSS needs to update the subscription version, otherwise it is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. #### Generated subscription version has proper format check -The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. ### Delete Subscription test step @@ -123,40 +296,73 @@ This also checks that the subscription data returned by a successful deletion is #### Missing version prevents deletion check -An attempt to delete a subscription without providing a version should fail, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +An attempt to delete a subscription without providing a version should fail, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)**. #### Incorrect version prevents deletion check -An attempt to delete a subscription while providing an incorrect version should fail, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +An attempt to delete a subscription while providing an incorrect version should fail, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)**. #### Subscription can be deleted check -An attempt to delete a subscription when the correct version is provided should succeed, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +An attempt to delete a subscription when the correct version is provided should succeed, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned notification index is equal to or greater than 0 check + +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. #### Returned subscription ID is correct check -If the returned subscription ID does not correspond to the one specified in the deletion request, -**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. -#### Returned notification index is equal to or greater than 0 check +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. + +#### Returned subscription owner is correct check -If the notification index of the subscription is less than 0, the DSS fails to properly implement **[interuss.f3411.dss_endpoints.GetSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. + + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. #### Returned ISA URL has correct base URL check -The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. #### Returned start time is correct check -The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v22a.DSS0060](../../../../../requirements/astm/f3411/v22a.md)**. #### Returned end time is correct check -The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Non-mutated subscription keeps the same version check + +If the version of the subscription is updated without there having been any mutation of the subscription, the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. #### Generated subscription version has proper format check -The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. ### Query Deleted Subscription test step @@ -173,11 +379,11 @@ If the DSS fails to let us search in the area for which the subscription was jus #### Search area that represents a loop is not allowed check The DSS should not allow us to search for subscriptions using a list of vertices describing a loop (first and last points in the list of vertices are the same), -otherwise it is failing to meet **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +otherwise it is failing to meet **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)**. #### Deleted subscription should not be present in search results check -If the DSS returns the deleted subscription in a search that covers the area it was originally created for, the DSS is not properly implementing **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. +If the DSS returns the deleted subscription in a search that covers the area it was originally created for, the DSS is not properly implementing **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)**. ## Cleanup diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md index 0b46d1d692..90e13b0fdf 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md @@ -21,7 +21,7 @@