mock_gateway.py (10133B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\campaigns\client\v1\mock_data\mock_gateway.py 2 import random 3 import uthread2 4 from campaigns.client.v1.data_model.campaign import CampaignID 5 from campaigns.client.v1.mock_data.mock_campaigns import campaigns, participant_objective_stats, campaigns_stats, objectives_stats, unredeemed_rewards, campaigns_objectives 6 from campaigns.client.v1.mock_data.mock_contributionmethods import versioned_contribution_methods 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 eveProto.generated.eve_public.campaign.campaign_pb2 import Identifier as CampaignIdentifier 9 from eveProto.generated.eve_public.campaign.contributionmethod.definition.api.requests_pb2 import GetAllRequest as ContributionMethodGetAllRequest 10 from eveProto.generated.eve_public.campaign.api.requests_pb2 import GetLimitsRequest, GetLimitsResponse, GetAllRequest, GetAllResponse, GetParticipantStatsResponse, GetParticipantStatsRequest, GetStatsResponse, GetStatsRequest, GetAllUnredeemedRewardsRequest, GetRequest 11 from eveProto.generated.eve_public.campaign.objective.api.requests_pb2 import CommitRequest, ResignRequest, RedeemRewardsRequest, GetStatsRequest as ObjectiveGetStatsRequest, GetStatsResponse as ObjectiveGetStatsResponse 12 from eveProto.generated.eve_public.campaign.objective.objective_pb2 import Identifier as ObjectiveIdentifier 13 from six.moves.http_client import OK, NOT_FOUND, INTERNAL_SERVER_ERROR, BAD_REQUEST, FORBIDDEN, UNAUTHORIZED 14 from logging import getLogger 15 from mock import Mock 16 from semantic_version import SemanticVersion 17 from uuid import UUID 18 logger = getLogger('campaigns') 19 20 class MockCampaignsGateway(object): 21 22 def __init__(self, message_player): 23 self._message_player = message_player 24 self._request_delay_min = 0 25 self._request_delay_max = 0 26 self._request_error_rate = 0 27 SETTING_REQUEST_DELAY.on_change.connect(self._on_request_delay_changed) 28 SETTING_REQUEST_ERROR_RATE.on_change.connect(self._on_request_error_rate_changed) 29 30 def _on_request_error_rate_changed(self, value): 31 if value == REQUEST_ERROR_RATE_OFF: 32 self._request_error_rate = 0 33 elif value == REQUEST_ERROR_RATE_10: 34 self._request_error_rate = 0.1 35 elif value == REQUEST_ERROR_RATE_50: 36 self._request_error_rate = 0.5 37 elif value == REQUEST_ERROR_RATE_80: 38 self._request_error_rate = 0.8 39 elif value == REQUEST_ERROR_RATE_100: 40 self._request_error_rate = 1 41 else: 42 raise ValueError('Invalid request error rate value') 43 logger.info('Mock Gateway: Error Rate set to %s percent', self._request_error_rate * 100) 44 45 def _on_request_delay_changed(self, value): 46 if value == REQUEST_DELAY_OFF: 47 self._request_delay_min = 0 48 self._request_delay_max = 0 49 elif value == REQUEST_DELAY_ON_100MS: 50 self._request_delay_min = 0 51 self._request_delay_max = 0.1 52 elif value == REQUEST_DELAY_ON_100_200_MS: 53 self._request_delay_min = 0.1 54 self._request_delay_max = 0.2 55 elif value == REQUEST_DELAY_ON_1_2_S: 56 self._request_delay_min = 1 57 self._request_delay_max = 2 58 else: 59 raise ValueError('Invalid request delay value') 60 logger.info('Mock Gateway: Request Delay set to %s to %s seconds', self._request_delay_min, self._request_delay_max) 61 62 def send_blocking_character_request_and_receive_response(self, request_payload, expected_response_class, timeout_seconds, max_attempts, retry_delay_in_seconds): 63 delay_secs = random.uniform(self._request_delay_min, self._request_delay_max) 64 if delay_secs > 0: 65 uthread2.Sleep(delay_secs) 66 should_error = False 67 if random.random() < self._request_error_rate: 68 should_error = True 69 if isinstance(request_payload, GetLimitsRequest): 70 return get_limits_response(should_error) 71 if isinstance(request_payload, GetAllRequest): 72 return get_all_response(should_error) 73 if isinstance(request_payload, GetParticipantStatsRequest): 74 return get_participant_stats_response(request_payload.campaign, should_error) 75 if isinstance(request_payload, GetStatsRequest): 76 return get_stats_response(request_payload.campaign, should_error) 77 if isinstance(request_payload, GetRequest): 78 return get_response(request_payload.campaign, request_payload.version, should_error) 79 if isinstance(request_payload, GetAllUnredeemedRewardsRequest): 80 return get_unredeemed_rewards_response(request_payload.page, should_error) 81 if isinstance(request_payload, ObjectiveGetStatsRequest): 82 return get_objective_stats_response(request_payload.objective, should_error) 83 if isinstance(request_payload, CommitRequest) or isinstance(request_payload, ResignRequest) or isinstance(request_payload, RedeemRewardsRequest): 84 if should_error: 85 return create_error_response([NOT_FOUND, 86 BAD_REQUEST, 87 INTERNAL_SERVER_ERROR, 88 FORBIDDEN, 89 UNAUTHORIZED]) 90 return (create_response_primitive(OK), None) 91 if isinstance(request_payload, ContributionMethodGetAllRequest): 92 return contribution_method_get_all_response(request_payload.version, should_error) 93 raise NotImplementedError('Attempted to use MockCampaignsGateway for request that has not been mocked: %s' % request_payload) 94 95 def _notify_of_mock_use(self): 96 self._message_player('Using mocked data for Campaigns') 97 logger.info('Using mocked data for Campaigns') 98 99 100 def create_error_response(error_list): 101 error_code = random.choice(error_list) 102 return (create_response_primitive(error_code), None) 103 104 105 def create_response_primitive(status_code): 106 response_primitive = Mock() 107 response_primitive.status_code = status_code 108 return response_primitive 109 110 111 def get_limits_response(should_error): 112 if should_error: 113 return create_error_response([INTERNAL_SERVER_ERROR]) 114 response_payload = GetLimitsResponse(max_active_objectives_per_participant=10) 115 return (create_response_primitive(OK), response_payload) 116 117 118 def get_all_response(should_error): 119 if should_error: 120 return create_error_response([INTERNAL_SERVER_ERROR]) 121 response_payload = GetAllResponse() 122 campaign_ids = [ id.uuid for id in campaigns.iterkeys() ] 123 for uuid in campaign_ids: 124 identifier = CampaignIdentifier(uuid=uuid.bytes) 125 response_payload.campaigns.append(identifier) 126 127 return (create_response_primitive(OK), response_payload) 128 129 130 def get_participant_stats_response(campaign_id, should_error): 131 if should_error: 132 return create_error_response([NOT_FOUND, 133 BAD_REQUEST, 134 INTERNAL_SERVER_ERROR, 135 UNAUTHORIZED]) 136 response_payload = participant_objective_stats.get(CampaignID.from_proto(campaign_id), None) 137 if response_payload is None: 138 return (create_response_primitive(NOT_FOUND), GetParticipantStatsResponse()) 139 return (create_response_primitive(OK), response_payload) 140 141 142 def get_stats_response(campaign_id, should_error): 143 if should_error: 144 return create_error_response([NOT_FOUND, BAD_REQUEST, INTERNAL_SERVER_ERROR]) 145 response_payload = GetStatsResponse() 146 campaign_id = CampaignID.from_proto(campaign_id) 147 campaign_stats = campaigns_stats.get(campaign_id, None) 148 if campaign_stats is None: 149 return (create_response_primitive(NOT_FOUND), response_payload) 150 response_payload.campaign_stats.MergeFrom(campaign_stats) 151 campaign_objectives = campaigns_objectives.get(campaign_id, []) 152 for uuid in campaign_objectives: 153 objective = objectives_stats[uuid] 154 response_payload.objective_stats.append(GetStatsResponse.ObjectiveStats(objective=ObjectiveIdentifier(uuid=uuid.bytes), stats=objective)) 155 156 return (create_response_primitive(OK), response_payload) 157 158 159 def get_response(campaign_id, version, should_error): 160 if should_error: 161 return create_error_response([NOT_FOUND, BAD_REQUEST, INTERNAL_SERVER_ERROR]) 162 response_payload = campaigns.get(CampaignID.from_proto(campaign_id), None) 163 if response_payload is None: 164 return (create_response_primitive(NOT_FOUND), response_payload) 165 return (create_response_primitive(OK), response_payload) 166 167 168 def get_unredeemed_rewards_response(page, should_error): 169 if should_error: 170 return create_error_response([BAD_REQUEST, INTERNAL_SERVER_ERROR, UNAUTHORIZED]) 171 response_payload = unredeemed_rewards 172 return (create_response_primitive(OK), response_payload) 173 174 175 def get_objective_stats_response(objective_id_list, should_error): 176 if should_error: 177 return create_error_response([NOT_FOUND, BAD_REQUEST, INTERNAL_SERVER_ERROR]) 178 id_list = [ UUID(bytes=objective_id.uuid) for objective_id in objective_id_list ] 179 response_payload = ObjectiveGetStatsResponse() 180 for uuid in id_list: 181 objective = objectives_stats.get(uuid, None) 182 if objective is not None: 183 response_payload.objective_stats.append(ObjectiveGetStatsResponse.ObjectiveStats(objective=ObjectiveIdentifier(uuid=uuid.bytes), stats=objective)) 184 185 return (create_response_primitive(OK), response_payload) 186 187 188 def contribution_method_get_all_response(version, should_error): 189 if should_error: 190 return create_error_response([BAD_REQUEST, INTERNAL_SERVER_ERROR]) 191 semantic_version = SemanticVersion.from_proto(version) 192 response_payload = versioned_contribution_methods.get(semantic_version, None) 193 if response_payload is None: 194 return (create_response_primitive(NOT_FOUND), response_payload) 195 return (create_response_primitive(OK), response_payload)