mock_gateway.py (15173B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\campaigns\client\v2\mock_data\mock_gateway.py 2 from __future__ import absolute_import, division, print_function 3 import random 4 import uthread2 5 import uuid 6 from datetime import datetime, timedelta 7 from campaigns.client.qa.settings import SETTING_REQUEST_DELAY, REQUEST_DELAY_OFF, REQUEST_DELAY_ON_100MS, REQUEST_DELAY_ON_100_200_MS, SETTING_REQUEST_ERROR_RATE, REQUEST_ERROR_RATE_OFF, REQUEST_ERROR_RATE_10, REQUEST_ERROR_RATE_50, REQUEST_ERROR_RATE_80, REQUEST_ERROR_RATE_100, REQUEST_DELAY_ON_1_2_S 8 from campaigns.client.v2.mock_data.mock_event_matcher_definitions import MOCK_DEFINITIONS 9 from eveProto.generated.eve_public.campaign import campaign_pb2 10 from eveProto.generated.eve_public.campaign.api.requests_pb2 import GetAllForNamespaceRequest, GetAllForNamespaceResponse, GetLimitsRequest, GetLimitsResponse, GetRequest, GetResponse, GetStatusRequest, GetStatusResponse, GetAllUnredeemedParticipantRewardsRequest, GetAllUnredeemedParticipantRewardsResponse 11 from eveProto.generated.eve_public.public_pb2 import NextPage 12 from eveProto.generated.eve_public.campaign.objective import objective_pb2 13 from eveProto.generated.eve_public.campaign.participation.participation_pb2 import Configuration as ParticipationProto 14 from eveProto.generated.eve_public.campaign.objective.api.requests_pb2 import CommitRequest, ResignRequest, GetRequest as ObjectiveGetRequest, GetResponse as ObjectiveGetResponse, GetStatusRequest as ObjectiveGetStatusRequest, GetStatusResponse as ObjectiveGetStatusResponse, GetParticipantStatusRequest, GetParticipantStatusResponse 15 from eveProto.generated.eve_public.campaign.campaign_pb2 import Identifier 16 from eveProto.generated.eve_public.campaign.track import track_pb2 17 from eveProto.generated.eve_public.campaign.track.api.requests_pb2 import RedeemParticipantRewardsRequest, GetTickingContributionsPredictionRequest, GetTickingContributionsPredictionResponse 18 from eveProto.generated.eve_public.campaign.trigger.eventmatch.definition.api.requests_pb2 import GetAllRequest 19 from eveProto.generated.eve_public.campaign.ui.ui_pb2 import Definition as UIDefinitionProto 20 from eveProto.generated.eve_public.semanticversion_pb2 import Specification 21 from google.protobuf.timestamp_pb2 import Timestamp 22 from six.moves.http_client import OK, BAD_REQUEST, NOT_FOUND, INTERNAL_SERVER_ERROR, FORBIDDEN, UNAUTHORIZED, NOT_ACCEPTABLE, NOT_MODIFIED 23 from mock import Mock 24 from logging import getLogger 25 logger = getLogger('campaigns_v2') 26 MOCK_NAMESPACE = 'mock_namespace' 27 MOCK_CAMPAIGN_DEFINITION_NAME = 'MockCampaign' 28 MOCK_CAMPAIGN_ETAG = 1 29 MOCK_OBJECTIVE_UUIDS = [uuid.UUID('3d9c1f0a-6b2e-4c8d-9f1a-2b3c4d5e6f70'), uuid.UUID('8e7d6c5b-4a39-4281-9f0e-1d2c3b4a5968')] 30 MOCK_TRACK_UUID = uuid.UUID('5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d') 31 MOCK_OBJECTIVE_TRACK_UUID = uuid.UUID('9f8e7d6c-5b4a-4392-8a1b-0c9d8e7f6a5b') 32 MOCK_CAMPAIGN_UUIDS = [uuid.UUID('0b5b9f3e-3f4c-4d1e-9a61-1f0c7a2d9e01'), uuid.UUID('7c1a2b3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d')] 33 MOCK_UPCOMING_DEFINITION_NAME = 'MockUpcomingCampaign' 34 MOCK_MAX_ACTIVE_OBJECTIVES = 10 35 MOCK_TICKING_CONTRIBUTION_KEY = 'mock_ticking_contribution' 36 37 class MockCampaignsGateway(object): 38 39 def __init__(self, message_player): 40 self._message_player = message_player 41 self._request_delay_min = 0 42 self._request_delay_max = 0 43 self._request_error_rate = 0 44 SETTING_REQUEST_DELAY.on_change.connect(self._on_request_delay_changed) 45 SETTING_REQUEST_ERROR_RATE.on_change.connect(self._on_request_error_rate_changed) 46 47 def _on_request_error_rate_changed(self, value): 48 if value == REQUEST_ERROR_RATE_OFF: 49 self._request_error_rate = 0 50 elif value == REQUEST_ERROR_RATE_10: 51 self._request_error_rate = 0.1 52 elif value == REQUEST_ERROR_RATE_50: 53 self._request_error_rate = 0.5 54 elif value == REQUEST_ERROR_RATE_80: 55 self._request_error_rate = 0.8 56 elif value == REQUEST_ERROR_RATE_100: 57 self._request_error_rate = 1 58 else: 59 raise ValueError('Invalid request error rate value') 60 logger.info('Mock Gateway: Error Rate set to %s percent', self._request_error_rate * 100) 61 62 def _on_request_delay_changed(self, value): 63 if value == REQUEST_DELAY_OFF: 64 self._request_delay_min = 0 65 self._request_delay_max = 0 66 elif value == REQUEST_DELAY_ON_100MS: 67 self._request_delay_min = 0 68 self._request_delay_max = 0.1 69 elif value == REQUEST_DELAY_ON_100_200_MS: 70 self._request_delay_min = 0.1 71 self._request_delay_max = 0.2 72 elif value == REQUEST_DELAY_ON_1_2_S: 73 self._request_delay_min = 1 74 self._request_delay_max = 2 75 else: 76 raise ValueError('Invalid request delay value') 77 logger.info('Mock Gateway: Request Delay set to %s to %s seconds', self._request_delay_min, self._request_delay_max) 78 79 def send_blocking_character_request_and_receive_response(self, request_payload, expected_response_class, timeout_seconds, max_attempts, retry_delay_in_seconds): 80 delay_secs = random.uniform(self._request_delay_min, self._request_delay_max) 81 if delay_secs > 0: 82 uthread2.Sleep(delay_secs) 83 should_error = False 84 if random.random() < self._request_error_rate: 85 should_error = True 86 if isinstance(request_payload, GetAllForNamespaceRequest): 87 return get_all_for_namespace_response(should_error) 88 if isinstance(request_payload, GetLimitsRequest): 89 return get_limits_response(should_error) 90 if isinstance(request_payload, (CommitRequest, ResignRequest)): 91 if should_error: 92 return create_error_response([NOT_FOUND, 93 BAD_REQUEST, 94 INTERNAL_SERVER_ERROR, 95 FORBIDDEN, 96 UNAUTHORIZED, 97 NOT_ACCEPTABLE]) 98 return (create_response_primitive(OK), None) 99 if isinstance(request_payload, RedeemParticipantRewardsRequest): 100 if should_error: 101 return create_error_response([NOT_FOUND, 102 BAD_REQUEST, 103 INTERNAL_SERVER_ERROR, 104 UNAUTHORIZED]) 105 return (create_response_primitive(OK), None) 106 if isinstance(request_payload, GetTickingContributionsPredictionRequest): 107 return get_ticking_contributions_prediction_response(should_error) 108 if isinstance(request_payload, GetAllRequest): 109 return get_all_event_matcher_definitions_request(should_error) 110 if isinstance(request_payload, ObjectiveGetRequest): 111 return get_objective_response(request_payload, should_error) 112 if isinstance(request_payload, GetRequest): 113 return get_campaign_response(request_payload, should_error) 114 if isinstance(request_payload, GetStatusRequest): 115 return get_campaign_status_response(should_error) 116 if isinstance(request_payload, ObjectiveGetStatusRequest): 117 return get_objective_status_response(should_error) 118 if isinstance(request_payload, GetParticipantStatusRequest): 119 return get_objective_participant_status_response(should_error) 120 if isinstance(request_payload, GetAllUnredeemedParticipantRewardsRequest): 121 return get_all_unredeemed_participant_rewards_response(should_error) 122 raise NotImplementedError('Attempted to use MockCampaignsGateway for request that has not been mocked: %s' % request_payload) 123 124 def _notify_of_mock_use(self): 125 self._message_player('Using mocked data for Campaigns') 126 logger.info('Using mocked data for Campaigns') 127 128 129 def create_error_response(error_list): 130 error_code = random.choice(error_list) 131 return (create_response_primitive(error_code), None) 132 133 134 def create_response_primitive(status_code): 135 response_primitive = Mock() 136 response_primitive.status_code = status_code 137 return response_primitive 138 139 140 def get_all_for_namespace_response(should_error): 141 if should_error: 142 return create_error_response([BAD_REQUEST, NOT_FOUND, INTERNAL_SERVER_ERROR]) 143 scheduled_start_time = Timestamp() 144 scheduled_start_time.FromDatetime(datetime.utcnow() + timedelta(days=1)) 145 response_payload = GetAllForNamespaceResponse(campaigns=[ Identifier(uuid=campaign_uuid.bytes) for campaign_uuid in MOCK_CAMPAIGN_UUIDS ], upcoming_campaigns=[GetAllForNamespaceResponse.Upcoming(definition_name=MOCK_UPCOMING_DEFINITION_NAME, ui=UIDefinitionProto(), scheduled_start_time=scheduled_start_time)]) 146 return (create_response_primitive(OK), response_payload) 147 148 149 def get_limits_response(should_error): 150 if should_error: 151 return create_error_response([INTERNAL_SERVER_ERROR]) 152 response_payload = GetLimitsResponse(max_active_objectives_per_participant=MOCK_MAX_ACTIVE_OBJECTIVES) 153 return (create_response_primitive(OK), response_payload) 154 155 156 def get_ticking_contributions_prediction_response(should_error): 157 if should_error: 158 return create_error_response([NOT_FOUND, BAD_REQUEST, INTERNAL_SERVER_ERROR]) 159 contribution_type = GetTickingContributionsPredictionResponse.Contribution 160 evaluations = [contribution_type.Evaluation(key='base', constant=3), contribution_type.Evaluation(key='per_system', units_count=5)] 161 contributions = [contribution_type(key=MOCK_TICKING_CONTRIBUTION_KEY, value=13, evaluations=evaluations)] 162 response_payload = GetTickingContributionsPredictionResponse(contributions=contributions) 163 return (create_response_primitive(OK), response_payload) 164 165 166 def _is_current_mock_version(request): 167 return request.WhichOneof('current_version') == 'version' and request.version.etag == MOCK_CAMPAIGN_ETAG 168 169 170 def _mock_campaign_version(): 171 return campaign_pb2.Version(definition_version=Specification(major=1), etag=MOCK_CAMPAIGN_ETAG, definition_schema_major_version=1) 172 173 174 def _mock_track_attributes(key): 175 return track_pb2.Attributes(key=key, ui=UIDefinitionProto(), target_progress_value=1000, no_participant_contribution_track=True) 176 177 178 def get_campaign_response(request, should_error): 179 if should_error: 180 return create_error_response([NOT_FOUND, BAD_REQUEST, INTERNAL_SERVER_ERROR]) 181 if _is_current_mock_version(request): 182 return (create_response_primitive(NOT_MODIFIED), None) 183 scheduled_start_time = Timestamp() 184 scheduled_start_time.FromDatetime(datetime.utcnow() - timedelta(days=1)) 185 response_payload = GetResponse(attributes=campaign_pb2.Attributes(version=_mock_campaign_version(), scheduled_start_time=scheduled_start_time, definition_name=MOCK_CAMPAIGN_DEFINITION_NAME, namespace=campaign_pb2.Namespace(namespace=MOCK_NAMESPACE), ui=UIDefinitionProto(), participation=ParticipationProto(eligibility_all=True), lifecycle_state=campaign_pb2.LifecycleState(state=campaign_pb2.STATE_ACTIVE)), stats=campaign_pb2.Stats(total_contributors=42), tracks=[GetResponse.Track(id=track_pb2.Identifier(uuid=MOCK_TRACK_UUID.bytes), attributes=_mock_track_attributes('main'), stats=track_pb2.Stats(current_progress=250))], objectives=[ objective_pb2.Identifier(uuid=objective_uuid.bytes) for objective_uuid in MOCK_OBJECTIVE_UUIDS ], upcoming_objectives=[objective_pb2.Upcoming(key='mock_upcoming_objective', ui=UIDefinitionProto())]) 186 return (create_response_primitive(OK), response_payload) 187 188 189 def get_objective_response(request, should_error): 190 if should_error: 191 return create_error_response([NOT_FOUND, BAD_REQUEST, INTERNAL_SERVER_ERROR]) 192 if _is_current_mock_version(request): 193 return (create_response_primitive(NOT_MODIFIED), None) 194 response_payload = ObjectiveGetResponse(attributes=objective_pb2.Attributes(key='mock_objective', ui=UIDefinitionProto(), participation=ParticipationProto(commitment_required=True, eligibility_all=True), lifecycle_state=objective_pb2.LifecycleState(state=objective_pb2.STATE_ACTIVE)), tracks=[ObjectiveGetResponse.Track(id=track_pb2.Identifier(uuid=MOCK_OBJECTIVE_TRACK_UUID.bytes), attributes=_mock_track_attributes('objective_main'))], version=_mock_campaign_version()) 195 return (create_response_primitive(OK), response_payload) 196 197 198 def get_all_event_matcher_definitions_request(should_error): 199 if should_error: 200 return create_error_response([BAD_REQUEST, NOT_FOUND, INTERNAL_SERVER_ERROR]) 201 response_payload = MOCK_DEFINITIONS 202 return (create_response_primitive(OK), response_payload) 203 204 205 def _mock_track_status(track_status_class, track_uuid, current_progress): 206 return track_status_class(id=track_pb2.Identifier(uuid=track_uuid.bytes), state=track_pb2.LifecycleState(state=track_pb2.STATE_STARTED), stats=track_pb2.Stats(current_progress=current_progress)) 207 208 209 def get_campaign_status_response(should_error): 210 if should_error: 211 return create_error_response([NOT_FOUND, BAD_REQUEST, INTERNAL_SERVER_ERROR]) 212 response_payload = GetStatusResponse(state=campaign_pb2.LifecycleState(state=campaign_pb2.STATE_STARTED), stats=campaign_pb2.Stats(total_contributors=42), tracks=[_mock_track_status(GetStatusResponse.Track, MOCK_TRACK_UUID, 250)]) 213 return (create_response_primitive(OK), response_payload) 214 215 216 def get_objective_status_response(should_error): 217 if should_error: 218 return create_error_response([NOT_FOUND, BAD_REQUEST, INTERNAL_SERVER_ERROR]) 219 response_payload = ObjectiveGetStatusResponse(state=objective_pb2.LifecycleState(state=objective_pb2.STATE_STARTED), stats=objective_pb2.Stats(total_contributors=12, commitment_stats=objective_pb2.Stats.CommitmentStats(committed_participants=8, total_participants=10)), tracks=[_mock_track_status(ObjectiveGetStatusResponse.Track, MOCK_OBJECTIVE_TRACK_UUID, 400)]) 220 return (create_response_primitive(OK), response_payload) 221 222 223 def get_objective_participant_status_response(should_error): 224 if should_error: 225 return create_error_response([NOT_FOUND, 226 BAD_REQUEST, 227 UNAUTHORIZED, 228 INTERNAL_SERVER_ERROR]) 229 response_payload = GetParticipantStatusResponse(commitment_state=objective_pb2.COMMITMENT_STATE_COMMITTED, tracks=[GetParticipantStatusResponse.Track(id=track_pb2.Identifier(uuid=MOCK_OBJECTIVE_TRACK_UUID.bytes), stats=track_pb2.ParticipantStats(participant_track=track_pb2.ParticipantStats.ParticipantTrack(current_participant_contribution=120, max_participant_contribution_reached=False)))]) 230 return (create_response_primitive(OK), response_payload) 231 232 233 def get_all_unredeemed_participant_rewards_response(should_error): 234 if should_error: 235 return create_error_response([BAD_REQUEST, UNAUTHORIZED, INTERNAL_SERVER_ERROR]) 236 track_rewards = GetAllUnredeemedParticipantRewardsResponse.TrackUnredeemedRewards 237 response_payload = GetAllUnredeemedParticipantRewardsResponse(tracks=[track_rewards(track=track_pb2.Identifier(uuid=MOCK_TRACK_UUID.bytes), isk_intervals_unredeemed=2, lp_intervals_unredeemed=1), track_rewards(track=track_pb2.Identifier(uuid=MOCK_OBJECTIVE_TRACK_UUID.bytes), no_isk_unredeemed=True, lp_intervals_unredeemed=3)], next_page=NextPage()) 238 return (create_response_primitive(OK), response_payload)