NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)