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

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)