Best Python code snippet using hypothesis
router.py
Source:router.py  
1# Copyright 2012 OpenStack Foundation.2# All Rights Reserved.3#4#    Licensed under the Apache License, Version 2.0 (the "License"); you may5#    not use this file except in compliance with the License. You may obtain6#    a copy of the License at7#8#         http://www.apache.org/licenses/LICENSE-2.09#10#    Unless required by applicable law or agreed to in writing, software11#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT12#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the13#    License for the specific language governing permissions and limitations14#    under the License.15from glance.api.v2 import image_actions16from glance.api.v2 import image_data17from glance.api.v2 import image_members18from glance.api.v2 import image_tags19from glance.api.v2 import images20from glance.api.v2 import metadef_namespaces21from glance.api.v2 import metadef_objects22from glance.api.v2 import metadef_properties23from glance.api.v2 import metadef_resource_types24from glance.api.v2 import metadef_tags25from glance.api.v2 import schemas26from glance.api.v2 import tasks27from glance.common import wsgi28class API(wsgi.Router):29    """WSGI router for Glance v2 API requests."""30    def __init__(self, mapper):31        custom_image_properties = images.load_custom_properties()32        reject_method_resource = wsgi.Resource(wsgi.RejectMethodController())33        schemas_resource = schemas.create_resource(custom_image_properties)34        mapper.connect('/schemas/image',35                       controller=schemas_resource,36                       action='image',37                       conditions={'method': ['GET']})38        mapper.connect('/schemas/image',39                       controller=reject_method_resource,40                       action='reject',41                       allowed_methods='GET',42                       conditions={'method': ['POST', 'PUT', 'DELETE',43                                              'PATCH', 'HEAD']})44        mapper.connect('/schemas/images',45                       controller=schemas_resource,46                       action='images',47                       conditions={'method': ['GET']})48        mapper.connect('/schemas/images',49                       controller=reject_method_resource,50                       action='reject',51                       allowed_methods='GET',52                       conditions={'method': ['POST', 'PUT', 'DELETE',53                                              'PATCH', 'HEAD']})54        mapper.connect('/schemas/member',55                       controller=schemas_resource,56                       action='member',57                       conditions={'method': ['GET']})58        mapper.connect('/schemas/member',59                       controller=reject_method_resource,60                       action='reject',61                       allowed_methods='GET',62                       conditions={'method': ['POST', 'PUT', 'DELETE',63                                              'PATCH', 'HEAD']})64        mapper.connect('/schemas/members',65                       controller=schemas_resource,66                       action='members',67                       conditions={'method': ['GET']})68        mapper.connect('/schemas/members',69                       controller=reject_method_resource,70                       action='reject',71                       allowed_methods='GET',72                       conditions={'method': ['POST', 'PUT', 'DELETE',73                                              'PATCH', 'HEAD']})74        mapper.connect('/schemas/task',75                       controller=schemas_resource,76                       action='task',77                       conditions={'method': ['GET']})78        mapper.connect('/schemas/task',79                       controller=reject_method_resource,80                       action='reject',81                       allowed_methods='GET',82                       conditions={'method': ['POST', 'PUT', 'DELETE',83                                              'PATCH', 'HEAD']})84        mapper.connect('/schemas/tasks',85                       controller=schemas_resource,86                       action='tasks',87                       conditions={'method': ['GET']})88        mapper.connect('/schemas/tasks',89                       controller=reject_method_resource,90                       action='reject',91                       allowed_methods='GET',92                       conditions={'method': ['POST', 'PUT', 'DELETE',93                                              'PATCH', 'HEAD']})94        mapper.connect('/schemas/metadefs/namespace',95                       controller=schemas_resource,96                       action='metadef_namespace',97                       conditions={'method': ['GET']})98        mapper.connect('/schemas/metadefs/namespace',99                       controller=reject_method_resource,100                       action='reject',101                       allowed_methods='GET',102                       conditions={'method': ['POST', 'PUT', 'DELETE',103                                              'PATCH', 'HEAD']})104        mapper.connect('/schemas/metadefs/namespaces',105                       controller=schemas_resource,106                       action='metadef_namespaces',107                       conditions={'method': ['GET']})108        mapper.connect('/schemas/metadefs/namespaces',109                       controller=reject_method_resource,110                       action='reject',111                       allowed_methods='GET',112                       conditions={'method': ['POST', 'PUT', 'DELETE',113                                              'PATCH', 'HEAD']})114        mapper.connect('/schemas/metadefs/resource_type',115                       controller=schemas_resource,116                       action='metadef_resource_type',117                       conditions={'method': ['GET']})118        mapper.connect('/schemas/metadefs/resource_type',119                       controller=reject_method_resource,120                       action='reject',121                       allowed_methods='GET',122                       conditions={'method': ['POST', 'PUT', 'DELETE',123                                              'PATCH', 'HEAD']})124        mapper.connect('/schemas/metadefs/resource_types',125                       controller=schemas_resource,126                       action='metadef_resource_types',127                       conditions={'method': ['GET']})128        mapper.connect('/schemas/metadefs/resource_types',129                       controller=reject_method_resource,130                       action='reject',131                       allowed_methods='GET',132                       conditions={'method': ['POST', 'PUT', 'DELETE',133                                              'PATCH', 'HEAD']})134        mapper.connect('/schemas/metadefs/property',135                       controller=schemas_resource,136                       action='metadef_property',137                       conditions={'method': ['GET']})138        mapper.connect('/schemas/metadefs/property',139                       controller=reject_method_resource,140                       action='reject',141                       allowed_methods='GET',142                       conditions={'method': ['POST', 'PUT', 'DELETE',143                                              'PATCH', 'HEAD']})144        mapper.connect('/schemas/metadefs/properties',145                       controller=schemas_resource,146                       action='metadef_properties',147                       conditions={'method': ['GET']})148        mapper.connect('/schemas/metadefs/properties',149                       controller=reject_method_resource,150                       action='reject',151                       allowed_methods='GET',152                       conditions={'method': ['POST', 'PUT', 'DELETE',153                                              'PATCH', 'HEAD']})154        mapper.connect('/schemas/metadefs/object',155                       controller=schemas_resource,156                       action='metadef_object',157                       conditions={'method': ['GET']})158        mapper.connect('/schemas/metadefs/object',159                       controller=reject_method_resource,160                       action='reject',161                       allowed_methods='GET',162                       conditions={'method': ['POST', 'PUT', 'DELETE',163                                              'PATCH', 'HEAD']})164        mapper.connect('/schemas/metadefs/objects',165                       controller=schemas_resource,166                       action='metadef_objects',167                       conditions={'method': ['GET']})168        mapper.connect('/schemas/metadefs/objects',169                       controller=reject_method_resource,170                       action='reject',171                       allowed_methods='GET',172                       conditions={'method': ['POST', 'PUT', 'DELETE',173                                              'PATCH', 'HEAD']})174        mapper.connect('/schemas/metadefs/tag',175                       controller=schemas_resource,176                       action='metadef_tag',177                       conditions={'method': ['GET']})178        mapper.connect('/schemas/metadefs/tag',179                       controller=reject_method_resource,180                       action='reject',181                       allowed_methods='GET',182                       conditions={'method': ['POST', 'PUT', 'DELETE',183                                              'PATCH', 'HEAD']})184        mapper.connect('/schemas/metadefs/tags',185                       controller=schemas_resource,186                       action='metadef_tags',187                       conditions={'method': ['GET']})188        mapper.connect('/schemas/metadefs/tags',189                       controller=reject_method_resource,190                       action='reject',191                       allowed_methods='GET',192                       conditions={'method': ['POST', 'PUT', 'DELETE',193                                              'PATCH', 'HEAD']})194        # Metadef resource types195        metadef_resource_types_resource = (196            metadef_resource_types.create_resource())197        mapper.connect('/metadefs/resource_types',198                       controller=metadef_resource_types_resource,199                       action='index',200                       conditions={'method': ['GET']})201        mapper.connect('/metadefs/resource_types',202                       controller=reject_method_resource,203                       action='reject',204                       allowed_methods='GET',205                       conditions={'method': ['POST', 'PUT', 'DELETE',206                                              'PATCH', 'HEAD']})207        mapper.connect('/metadefs/namespaces/{namespace}/resource_types',208                       controller=metadef_resource_types_resource,209                       action='show',210                       conditions={'method': ['GET']})211        mapper.connect('/metadefs/namespaces/{namespace}/resource_types',212                       controller=metadef_resource_types_resource,213                       action='create',214                       conditions={'method': ['POST']})215        mapper.connect('/metadefs/namespaces/{namespace}/resource_types',216                       controller=reject_method_resource,217                       action='reject',218                       allowed_methods='GET, POST',219                       conditions={'method': ['PUT', 'DELETE',220                                              'PATCH', 'HEAD']})221        mapper.connect('/metadefs/namespaces/{namespace}/resource_types/'222                       '{resource_type}',223                       controller=metadef_resource_types_resource,224                       action='delete',225                       conditions={'method': ['DELETE']})226        mapper.connect('/metadefs/namespaces/{namespace}/resource_types/'227                       '{resource_type}',228                       controller=reject_method_resource,229                       action='reject',230                       allowed_methods='DELETE',231                       conditions={'method': ['GET', 'POST', 'PUT',232                                              'PATCH', 'HEAD']})233        # Metadef Namespaces234        metadef_namespace_resource = metadef_namespaces.create_resource()235        mapper.connect('/metadefs/namespaces',236                       controller=metadef_namespace_resource,237                       action='index',238                       conditions={'method': ['GET']})239        mapper.connect('/metadefs/namespaces',240                       controller=metadef_namespace_resource,241                       action='create',242                       conditions={'method': ['POST']})243        mapper.connect('/metadefs/namespaces',244                       controller=reject_method_resource,245                       action='reject',246                       allowed_methods='GET, POST',247                       conditions={'method': ['PUT', 'DELETE',248                                              'PATCH', 'HEAD']})249        mapper.connect('/metadefs/namespaces/{namespace}',250                       controller=metadef_namespace_resource,251                       action='show',252                       conditions={'method': ['GET']})253        mapper.connect('/metadefs/namespaces/{namespace}',254                       controller=metadef_namespace_resource,255                       action='update',256                       conditions={'method': ['PUT']})257        mapper.connect('/metadefs/namespaces/{namespace}',258                       controller=metadef_namespace_resource,259                       action='delete',260                       conditions={'method': ['DELETE']})261        mapper.connect('/metadefs/namespaces/{namespace}',262                       controller=reject_method_resource,263                       action='reject',264                       allowed_methods='GET, PUT, DELETE',265                       conditions={'method': ['POST', 'PATCH', 'HEAD']})266        # Metadef namespace properties267        metadef_properties_resource = metadef_properties.create_resource()268        mapper.connect('/metadefs/namespaces/{namespace}/properties',269                       controller=metadef_properties_resource,270                       action='index',271                       conditions={'method': ['GET']})272        mapper.connect('/metadefs/namespaces/{namespace}/properties',273                       controller=metadef_properties_resource,274                       action='create',275                       conditions={'method': ['POST']})276        mapper.connect('/metadefs/namespaces/{namespace}/properties',277                       controller=metadef_namespace_resource,278                       action='delete_properties',279                       conditions={'method': ['DELETE']})280        mapper.connect('/metadefs/namespaces/{namespace}/properties',281                       controller=reject_method_resource,282                       action='reject',283                       allowed_methods='GET, POST, DELETE',284                       conditions={'method': ['PUT', 'PATCH', 'HEAD']})285        mapper.connect('/metadefs/namespaces/{namespace}/properties/{'286                       'property_name}',287                       controller=metadef_properties_resource,288                       action='show',289                       conditions={'method': ['GET']})290        mapper.connect('/metadefs/namespaces/{namespace}/properties/{'291                       'property_name}',292                       controller=metadef_properties_resource,293                       action='update',294                       conditions={'method': ['PUT']})295        mapper.connect('/metadefs/namespaces/{namespace}/properties/{'296                       'property_name}',297                       controller=metadef_properties_resource,298                       action='delete',299                       conditions={'method': ['DELETE']})300        mapper.connect('/metadefs/namespaces/{namespace}/properties/{'301                       'property_name}',302                       controller=reject_method_resource,303                       action='reject',304                       allowed_methods='GET, PUT, DELETE',305                       conditions={'method': ['POST', 'PATCH', 'HEAD']})306        # Metadef objects307        metadef_objects_resource = metadef_objects.create_resource()308        mapper.connect('/metadefs/namespaces/{namespace}/objects',309                       controller=metadef_objects_resource,310                       action='index',311                       conditions={'method': ['GET']})312        mapper.connect('/metadefs/namespaces/{namespace}/objects',313                       controller=metadef_objects_resource,314                       action='create',315                       conditions={'method': ['POST']})316        mapper.connect('/metadefs/namespaces/{namespace}/objects',317                       controller=metadef_namespace_resource,318                       action='delete_objects',319                       conditions={'method': ['DELETE']})320        mapper.connect('/metadefs/namespaces/{namespace}/objects',321                       controller=reject_method_resource,322                       action='reject',323                       allowed_methods='GET, POST, DELETE',324                       conditions={'method': ['PUT', 'PATCH', 'HEAD']})325        mapper.connect('/metadefs/namespaces/{namespace}/objects/{'326                       'object_name}',327                       controller=metadef_objects_resource,328                       action='show',329                       conditions={'method': ['GET']})330        mapper.connect('/metadefs/namespaces/{namespace}/objects/{'331                       'object_name}',332                       controller=metadef_objects_resource,333                       action='update',334                       conditions={'method': ['PUT']})335        mapper.connect('/metadefs/namespaces/{namespace}/objects/{'336                       'object_name}',337                       controller=metadef_objects_resource,338                       action='delete',339                       conditions={'method': ['DELETE']})340        mapper.connect('/metadefs/namespaces/{namespace}/objects/{'341                       'object_name}',342                       controller=reject_method_resource,343                       action='reject',344                       allowed_methods='GET, PUT, DELETE',345                       conditions={'method': ['POST', 'PATCH', 'HEAD']})346        # Metadef tags347        metadef_tags_resource = metadef_tags.create_resource()348        mapper.connect('/metadefs/namespaces/{namespace}/tags',349                       controller=metadef_tags_resource,350                       action='index',351                       conditions={'method': ['GET']})352        mapper.connect('/metadefs/namespaces/{namespace}/tags',353                       controller=metadef_tags_resource,354                       action='create_tags',355                       conditions={'method': ['POST']})356        mapper.connect('/metadefs/namespaces/{namespace}/tags',357                       controller=metadef_namespace_resource,358                       action='delete_tags',359                       conditions={'method': ['DELETE']})360        mapper.connect('/metadefs/namespaces/{namespace}/tags',361                       controller=reject_method_resource,362                       action='reject',363                       allowed_methods='GET, POST, DELETE',364                       conditions={'method': ['PUT', 'PATCH', 'HEAD']})365        mapper.connect('/metadefs/namespaces/{namespace}/tags/{tag_name}',366                       controller=metadef_tags_resource,367                       action='show',368                       conditions={'method': ['GET']})369        mapper.connect('/metadefs/namespaces/{namespace}/tags/{tag_name}',370                       controller=metadef_tags_resource,371                       action='create',372                       conditions={'method': ['POST']})373        mapper.connect('/metadefs/namespaces/{namespace}/tags/{tag_name}',374                       controller=metadef_tags_resource,375                       action='update',376                       conditions={'method': ['PUT']})377        mapper.connect('/metadefs/namespaces/{namespace}/tags/{tag_name}',378                       controller=metadef_tags_resource,379                       action='delete',380                       conditions={'method': ['DELETE']})381        mapper.connect('/metadefs/namespaces/{namespace}/tags/{tag_name}',382                       controller=reject_method_resource,383                       action='reject',384                       allowed_methods='GET, POST, PUT, DELETE',385                       conditions={'method': ['PATCH', 'HEAD']})386        images_resource = images.create_resource(custom_image_properties)387        mapper.connect('/images',388                       controller=images_resource,389                       action='index',390                       conditions={'method': ['GET']})391        mapper.connect('/images',392                       controller=images_resource,393                       action='create',394                       conditions={'method': ['POST']})395        mapper.connect('/images',396                       controller=reject_method_resource,397                       action='reject',398                       allowed_methods='GET, POST',399                       conditions={'method': ['PUT', 'DELETE', 'PATCH',400                                              'HEAD']})401        mapper.connect('/images/{image_id}',402                       controller=images_resource,403                       action='update',404                       conditions={'method': ['PATCH']})405        mapper.connect('/images/{image_id}',406                       controller=images_resource,407                       action='show',408                       conditions={'method': ['GET']})409        mapper.connect('/images/{image_id}',410                       controller=images_resource,411                       action='delete',412                       conditions={'method': ['DELETE']})413        mapper.connect('/images/{image_id}',414                       controller=reject_method_resource,415                       action='reject',416                       allowed_methods='GET, PATCH, DELETE',417                       conditions={'method': ['POST', 'PUT', 'HEAD']})418        image_actions_resource = image_actions.create_resource()419        mapper.connect('/images/{image_id}/actions/deactivate',420                       controller=image_actions_resource,421                       action='deactivate',422                       conditions={'method': ['POST']})423        mapper.connect('/images/{image_id}/actions/reactivate',424                       controller=image_actions_resource,425                       action='reactivate',426                       conditions={'method': ['POST']})427        mapper.connect('/images/{image_id}/actions/deactivate',428                       controller=reject_method_resource,429                       action='reject',430                       allowed_methods='POST',431                       conditions={'method': ['GET', 'PUT', 'DELETE', 'PATCH',432                                              'HEAD']})433        mapper.connect('/images/{image_id}/actions/reactivate',434                       controller=reject_method_resource,435                       action='reject',436                       allowed_methods='POST',437                       conditions={'method': ['GET', 'PUT', 'DELETE', 'PATCH',438                                              'HEAD']})439        image_data_resource = image_data.create_resource()440        mapper.connect('/images/{image_id}/file',441                       controller=image_data_resource,442                       action='download',443                       conditions={'method': ['GET']})444        mapper.connect('/images/{image_id}/file',445                       controller=image_data_resource,446                       action='upload',447                       conditions={'method': ['PUT']})448        mapper.connect('/images/{image_id}/file',449                       controller=reject_method_resource,450                       action='reject',451                       allowed_methods='GET, PUT',452                       conditions={'method': ['POST', 'DELETE', 'PATCH',453                                              'HEAD']})454        image_tags_resource = image_tags.create_resource()455        mapper.connect('/images/{image_id}/tags/{tag_value}',456                       controller=image_tags_resource,457                       action='update',458                       conditions={'method': ['PUT']})459        mapper.connect('/images/{image_id}/tags/{tag_value}',460                       controller=image_tags_resource,461                       action='delete',462                       conditions={'method': ['DELETE']})463        mapper.connect('/images/{image_id}/tags/{tag_value}',464                       controller=reject_method_resource,465                       action='reject',466                       allowed_methods='PUT, DELETE',467                       conditions={'method': ['GET', 'POST', 'PATCH',468                                              'HEAD']})469        image_members_resource = image_members.create_resource()470        mapper.connect('/images/{image_id}/members',471                       controller=image_members_resource,472                       action='index',473                       conditions={'method': ['GET']})474        mapper.connect('/images/{image_id}/members',475                       controller=image_members_resource,476                       action='create',477                       conditions={'method': ['POST']})478        mapper.connect('/images/{image_id}/members',479                       controller=reject_method_resource,480                       action='reject',481                       allowed_methods='GET, POST',482                       conditions={'method': ['PUT', 'DELETE', 'PATCH',483                                              'HEAD']})484        mapper.connect('/images/{image_id}/members/{member_id}',485                       controller=image_members_resource,486                       action='show',487                       conditions={'method': ['GET']})488        mapper.connect('/images/{image_id}/members/{member_id}',489                       controller=image_members_resource,490                       action='update',491                       conditions={'method': ['PUT']})492        mapper.connect('/images/{image_id}/members/{member_id}',493                       controller=image_members_resource,494                       action='delete',495                       conditions={'method': ['DELETE']})496        mapper.connect('/images/{image_id}/members/{member_id}',497                       controller=reject_method_resource,498                       action='reject',499                       allowed_methods='GET, PUT, DELETE',500                       conditions={'method': ['POST', 'PATCH', 'HEAD']})501        tasks_resource = tasks.create_resource()502        mapper.connect('/tasks',503                       controller=tasks_resource,504                       action='create',505                       conditions={'method': ['POST']})506        mapper.connect('/tasks',507                       controller=tasks_resource,508                       action='index',509                       conditions={'method': ['GET']})510        mapper.connect('/tasks',511                       controller=reject_method_resource,512                       action='reject',513                       allowed_methods='GET, POST',514                       conditions={'method': ['PUT', 'DELETE', 'PATCH',515                                              'HEAD']})516        mapper.connect('/tasks/{task_id}',517                       controller=tasks_resource,518                       action='get',519                       conditions={'method': ['GET']})520        mapper.connect('/tasks/{task_id}',521                       controller=tasks_resource,522                       action='delete',523                       conditions={'method': ['DELETE']})524        mapper.connect('/tasks/{task_id}',525                       controller=reject_method_resource,526                       action='reject',527                       allowed_methods='GET, DELETE',528                       conditions={'method': ['POST', 'PUT', 'PATCH',529                                              'HEAD']})...test_parsers.py
Source:test_parsers.py  
1# Copyright 2019 James Brown2#3# Licensed under the Apache License, Version 2.0 (the "License");4# you may not use this file except in compliance with the License.5# You may obtain a copy of the License at6#7#     http://www.apache.org/licenses/LICENSE-2.08#9# Unless required by applicable law or agreed to in writing, software10# distributed under the License is distributed on an "AS IS" BASIS,11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12# See the License for the specific language governing permissions and13# limitations under the License.14#15# flake8: noqa: E50116import pytest17from torpy.parsers import HSDescriptorParser, IntroPointParser, RouterDescriptorParser18@pytest.fixture19def hs_example():20    return """rendezvous-service-descriptor aj7trvc2tuggkzsffrbla3qogs2plltf21version 222permanent-key23-----BEGIN RSA PUBLIC KEY-----24MIGJAoGBALdj5MFZtlrjI54ousrBzA3fSyfn0NC32OBhl61BLgO67vPBiIiFFzo925YIqa4h3jZQrxdI3MeK4xTLQ6HhnQXvcM+ZR57o5zTR7fpqra89i75rwUjW5wqc9O263roxzt1UWbJBtbzOT9FYxGSIczsYdG6MQRg9BK/2v391Oz9NbDb1AgMBAAE=27-----END RSA PUBLIC KEY-----28secret-id-part jrhhuswdnmpplrlflxc4buquuzijljkr29publication-time 2019-03-20 06:00:0030protocol-versions 2,331introduction-points32-----BEGIN MESSAGE-----33aW50cm9kdWN0aW9uLXBvaW50IGt4eGlxenU2YnI0cGg1ZmgybzN1eHh3ZnNjaGpy34a282CmlwLWFkZHJlc3MgMjE3LjIzLjcuMTAzCm9uaW9uLXBvcnQgOTAwMQpvbmlv35bi1rZXkKLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQU9E36dG9TajZreUh6WHN4enhwVDgvOGFpV2hCcmVMdGFMbjZybGJhRjUwRnVQWkY5azVG37ZGhnMDAKNjFWbHc1djUzVHlWTFJST042Mkt5TlJZT1o5NWd1V2FEajBDVDBMbCtE38Qzh5OU5ORk83Zk02SG1hR1pkYTlnYwpxYkRtK2JET1JTSHVmd2FzWTNSVHlEVW5H39TWFpSXpxeDJna0l4dEI1TituTkk4eERDVFlEQWdNQkFBRT0KLS0tLS1FTkQgUlNB40IFBVQkxJQyBLRVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJM41SUMgS0VZLS0tLS0KTUlHSkFvR0JBTGNHRGZzcVBObzNKcFpIMjVMcnd4bDNGeWZt42VExKUGdtRUh5KzcvcUJ0eVlBTEp1cC9McGRxcQpRcjkraTBpcFdLcWs3cG5TUi9w43aFo4S3pnR1lnVGJWUDZyV2NGQXZvWEhQWXVmc1d6OVp2SGY3N0drYVZZSTJSCkVq44TEtaL1FMRG9rYVFKOFpHeWNpUnJ3ZHlRdHMyTUxZc00rRUQ3bmhHZzdtR2N2eWZC45SWZBZ01CQUFFPQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJvZHVj46dGlvbi1wb2ludCB5bjN4NG9scTdsYm1ic3ptanlsZ29ybmhvemliZ2V5ZQppcC1h47ZGRyZXNzIDk0LjIzLjE1MC44MQpvbmlvbi1wb3J0IDQ0Mwpvbmlvbi1rZXkKLS0t48LS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQU94ajNzT2syb3g349dzU5aXdhejl6WHc2UktvdjJXYUh6TWVvbjBiWlVVQXVHcWlKT01ONEt3RkQKMlNS50LzBrSUY1UjIyV3I4a2x0cXQxbWlTY0tvWk9KU2MrYXVVVjR6TXl2NmE5bnl2cXJt51amhDYWJqSlFoQ0M4VQpoT3ZrL2N3K1MvZHZnQXFGTkdnTzNHV0RrSnI3bC9BTXh552alhVa1FKYnVjb1JiWGkwbU56QWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBVQkxJQyBL53RVktLS0tLQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMgS0VZLS0t54LS0KTUlHSkFvR0JBTVJDYWJHdWI3Mk1xSndqMHJXRnArZW5xSzRzMVBEeGZUVDUx55Zmcwdkd0bStxM1E0azFtUm1tVApiNkc3OTNNOVV6WnN4dVNKbDRSOVJyZEJaM1pt56OGRmMDU2cEUvSmJ0Q2NWVnlPb0daZlVsWHhXaDM0c2RZdU4xCkZGb1Iva0JlLzBF57aWtBSWI5eGsyS001SjlKMGEyc1A0UTNhL2NGOWJkNjhpMWlaSmIySWhBZ01CQUFF58PQotLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCmludHJvZHVjdGlvbi1wb2lu59dCBoemo1aGY0NXdiN3AyNDNnbWhldGppbzYyZmFzcG51ZQppcC1hZGRyZXNzIDIx60Ny43OS4xNzkuMTc3Cm9uaW9uLXBvcnQgOTAwMQpvbmlvbi1rZXkKLS0tLS1CRUdJ61TiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JR0pBb0dCQU5xY2R0YTQvOUFFYzkyMjJx62YUVnVTNSQ1E0ZEVGTnlDSDNDbTVTNGFDa2dxbHp0VmJPSlBlVmQKVjJaTjk4dW8x63OGlXa3JySENiZUdTWTVqdkkvdTFlUzFydTNNTkM1NTBhNDE3RHdFUGlaUWJxMitO64N1dGYisxbwpOa2x2TkllZTZGMDllb2FYMExuVGJjR1RheGJLaHF0cWh4cGJvYTVJ65RUV0L05CajRmNE05QWdNQkFBRT0KLS0tLS1FTkQgUlNBIFBVQkxJQyBLRVktLS0t66LQpzZXJ2aWNlLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlH67SkFvR0JBTzZzbjNzekJXVGxjQVAvV1lIQ2ZzVmVnSDBPNmNlcHlWRVllOW82YzQ468cGh6VDBoZzFnWmJMdApOS3lqM2xWR1RaYVFxY3Jvak16bzhlbkEwR2VyeGsrWVpF69THV3eDRCYmIraUk5d1gvbmJib3ptejhLZjhNdnVGCmNkakFDalEwV3liVXBtcWdk70TXBpVHc4SFNSbWh0SWlsQXE1L1VnYzNTaVRQbHlqWVYxN1BBZ01CQUFFPQotLS0t71LUVORCBSU0EgUFVCTElDIEtFWS0tLS0tCgo=72-----END MESSAGE-----73signature74-----BEGIN SIGNATURE-----75XkVVwRd1reFUb0KqdtYUWcLUCQduq7GnGJ8IpNYbsI4x8LadiRi9gxABv8E4OjYQ765CiP6qso+SMieOP7PEQK67+VMnrUaPUsldDjYdSkWCTNSPgbaXOasSFxJ0pZeQXx77NwjHDSI4mD57pkSzvPgd+t/hrA3AFAWZu49eUw4BYwc=78-----END SIGNATURE-----79"""80hs_example2 = """HTTP/1.0 200 OK81Date: Wed, 20 Mar 2019 21:17:16 GMT82Content-Type: text/plain83X-Your-Address-Is: 104.192.88.9784Content-Encoding: identity85Content-Length: 325386Pragma: no-cache87rendezvous-service-descriptor expocwozpjpjce7kfcdyu3et25aswqdf88version 289permanent-key90-----BEGIN RSA PUBLIC KEY-----91MIGJAoGBALdj5MFZtlrjI54ousrBzA3fSyfn0NC32OBhl61BLgO67vPBiIiFFzo992YIqa4h3jZQrxdI3MeK4xTLQ6HhnQXvcM+ZR57o5zTR7fpqra89i75rwUjW5wqc9O933roxzt1UWbJBtbzOT9FYxGSIczsYdG6MQRg9BK/2v391Oz9NbDb1AgMBAAE=94-----END RSA PUBLIC KEY-----95secret-id-part 2o5f46v3wjaoysjde3z2tjkax5unwp4z96publication-time 2019-03-20 21:00:0097protocol-versions 2,398introduction-points99-----BEGIN MESSAGE-----100aW50cm9kdWN0aW9uLXBvaW50IHlzbmJvNWlxemt0Zmh3dGhlNjdxNGI3M3A1bGti101NGU1CmlwLWFkZHJlc3MgMTM2LjI0My43MC4xOTgKb25pb24tcG9ydCA5MDAxCm9u102aW9uLWtleQotLS0tLUJFR0lOIFJTQSBQVUJMSUMgS0VZLS0tLS0KTUlHSkFvR0JB103T01uajFoQUR4dDcrT0xqVnJxRnFWdGFaQ1kranNqdlk1OTNDMktYdnVJT3dTcXVB104SUZHamVLQgpnM2dEVjZRckZyN0ZKSGZjOTZiTkVRa2I2RmhUQkFydVB2OTJYQ3Aw105TVdsTzBhS2ZWNTZLckgrZXg0ZWRRUmxXClUzY2l3c3IrMStVclcwOS9ob0twb29K106WGhaSUZJRjg3d1RvYlFxbVM4LzFnMzBQR2tHWGhBZ01CQUFFPQotLS0tLUVORCBS107U0EgUFVCTElDIEtFWS0tLS0tCnNlcnZpY2Uta2V5Ci0tLS0tQkVHSU4gUlNBIFBV108QkxJQyBLRVktLS0tLQpNSUdKQW9HQkFOUERQZkFSTS9BbXRQYUJCZDMyY3FvWVZN109Vit4WkY5djI0aVY0cTZxODRTaEM0Z3YzMFI4cjZHCldJbjErZUJSYWUyZXkzVlVn110S21BYmU2TzJ0SUNmN3Q2QzY0REFBZFVVcVljc1Vka2pmQy8yQ1IwaXpjaExuK1gK111NWdHSU0rbmpseGppRVFEZHZWaDljWjlzV0RtUzdhYmkvbXNkMmRjZFhXV3QwSkRy112WlJ4dEFnTUJBQUU9Ci0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0KaW50cm9k113dWN0aW9uLXBvaW50IGZrNjR5d3JnazNnNmR4M2FjY2psempxbW9yZTdwd2t3Cmlw114LWFkZHJlc3MgNzguMTI5LjIwOC4xODQKb25pb24tcG9ydCA0NDMKb25pb24ta2V5115Ci0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLQpNSUdKQW9HQkFKZCtyeVFu116RHl3eGRUeTZKNXlQbGJmVmFFWWxNenF0WEZhZTVtSkJGdDdCRHhXQjRDZ1lFOG9I117Ckd4ZTg4UXpjTFUvd0FEZmVSaDVMaVpweWdhY0J6M1VRY04yYklGWm9Bc3hmMU5W118R3NLR2xrV3RSTWl0ZmMyWjkKcW8yMVpHdUNMUTZDb3RTeG5sUXVJNWxaR1ZkQ3kx119WGt0d2lzK2VGL2RiRWNra3dwS3FoRkFnTUJBQUU9Ci0tLS0tRU5EIFJTQSBQVUJM120SUMgS0VZLS0tLS0Kc2121"""122def test_hs_parser(hs_example):123    res = HSDescriptorParser.parse(hs_example)124    print(res)125@pytest.fixture126def ip_example():127    return """introduction-point ysnbo5iqzktfhwthe67q4b73p5lkb4e5128ip-address 136.243.70.198129onion-port 9001130onion-key131-----BEGIN RSA PUBLIC KEY-----132MIGJAoGBAOMnj1hADxt7+OLjVrqFqVtaZCY+jsjvY593C2KXvuIOwSquAIFGjeKB133g3gDV6QrFr7FJHfc96bNEQkb6FhTBAruPv92XCp0MWlO0aKfV56KrH+ex4edQRlW134U3ciwsr+1+UrW09/hoKpooJXhZIFIF87wTobQqmS8/1g30PGkGXhAgMBAAE=135-----END RSA PUBLIC KEY-----136service-key137-----BEGIN RSA PUBLIC KEY-----138MIGJAoGBANPDPfARM/AmtPaBBd32cqoYVMV+xZF9v24iV4q6q84ShC4gv30R8r6G139WIn1+eBRae2ey3VUgKmAbe6O2tICf7t6C64DAAdUUqYcsUdkjfC/2CR0izchLn+X1405gGIM+njlxjiEQDdvVh9cZ9sWDmS7abi/msd2dcdXWWt0JDrZRxtAgMBAAE=141-----END RSA PUBLIC KEY-----142introduction-point fk64ywrgk3g6dx3accjlzjqmore7pwkw143ip-address 78.129.208.184144onion-port 443145onion-key146-----BEGIN RSA PUBLIC KEY-----147MIGJAoGBAJd+ryQnDywxdTy6J5yPlbfVaEYlMzqtXFae5mJBFt7BDxWB4CgYE8oH148Gxe88QzcLU/wADfeRh5LiZpygacBz3UQcN2bIFZoAsxf1NVGsKGlkWtRMitfc2Z9149qo21ZGuCLQ6CotSxnlQuI5lZGVdCy1Xktwis+eF/dbEckkwpKqhFAgMBAAE=150-----END RSA PUBLIC KEY-----151service-key152-----BEGIN RSA PUBLIC KEY-----153MIGJAoGBANw4LrTMxv1lXQp2XgKXUklE/KgdHB3bSQ+f8FzIIEat+ndVvTuq4ILp154PngUxqTS8ulc0ZMJ+kLezLBzYupVZy+c4Lhc9SCROTtz93yoO45NPtcszKaNO1+K155kf95gp5BHvuC51OD4UGJOgaQzusRjrbfDc2KB2D5g+scok86qgShAgMBAAE=156-----END RSA PUBLIC KEY-----157introduction-point 3ugi53c4uqbkt6sepdyqymneid3r62ef158ip-address 195.201.9.37159onion-port 143160onion-key161-----BEGIN RSA PUBLIC KEY-----162MIGJAoGBAJwz6KYUdMpK4/g5LurMLE53kWNU5oUzdXZTHc7/zNcdYKejAYwADVqM163d+jJjlNfi5XEUAZmTVFP2VwAGBza86hlfApg01kvLA9ptDOsgtrGhc8kYT6nQYX+164gVvSRyXDMNOMlZRA9ALA8wmhmFM/3T5BvjpsV90xum56qnWp0lvnAgMBAAE=165-----END RSA PUBLIC KEY-----166service-key167-----BEGIN RSA PUBLIC KEY-----168MIGJAoGBAN44XsgtoiYfSGUSmiudOPJQo96Mhd/dcuzQbYzhK1X6F7FvmMcJWhLK169LO/0dedGvqikKwEuNjhkGawwqYudL3sZ6AUyxY9wgfzznfWYbLFMx9KpZzh76n6c170sObvfg6Gt0HmZIh+nJdhF1n8u/xYZZ4TyL8jGg+eyG/aJ1jIfnoPAgMBAAE=171-----END RSA PUBLIC KEY-----172"""173def test_ip_parser(ip_example):174    res = IntroPointParser.parse(ip_example)175    print(res)176@pytest.fixture177def rd_example():178    return """router Nyx 51.15.252.1 9001 0 9030179identity-ed25519180-----BEGIN ED25519 CERT-----181AQQABph4ATKUIStvlLeIF/2rGBv6k+/8sK05mjCtRjeXH5lJBfECAQAgBACuN8aH182zaPSQqkRZi9nU79oNKT/e1pSsBw8u0YeHF6SfVUDl/yIU9i53fU9eF5bKB41b7Pn183r7xCUwOJnEXwQLoZ5wr5oFQKMNzsgEzUwj20K0NGQ3djZCEtt8vjiqflTQw=184-----END ED25519 CERT-----185master-key-ed25519 rjfGh82j0kKpEWYvZ1O/aDSk/3taUrAcPLtGHhxekn0186platform Tor 0.3.5.8 on Linux187proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2188published 2019-03-31 11:43:32189fingerprint 8532 DE42 43E4 949E 4EA8 6E88 CDCA 6821 582F 1A13190uptime 2840486191bandwidth 1073741824 1073741824 24702282192extra-info-digest FFDAB70266F42AE8938EC1C0E6DC1A275DD903FE bCEVMfYHbSxL6Th0iJj0Wo8HZrzLnyqDvlheyO1JzNE193onion-key194-----BEGIN RSA PUBLIC KEY-----195MIGJAoGBALlYKkE6C0RMPe6YbUtlP5Ucu90Kj8GnsYD0Hwbh7tqL/QkXFSPRnoA81968fGdp/jlNhQt/Asfbsqq9H+7FLQ6r8rZG1/ndMO8g+khobBvddFxr0JBn5BvZO8h197MJAbg8K/DVSnfxIaJrhxN/VWUjEmH9vwpmyuNYIXZKRHfqszn1G1AgMBAAE=198-----END RSA PUBLIC KEY-----199signing-key200-----BEGIN RSA PUBLIC KEY-----201MIGJAoGBAMRcnxPGmSTWelnSD6FVET7L88E2xf3vd17cB2JDTWdw0gIGM7aL4WVL202P8xuVqshwmlqXGiExtruqZUVWD8M1pAQwNoILCpqJJ5U1LZyqmRoNlkRjcCKuaJw203RiSsmJCvkCZzcJ3PBiJbhMxqKyweGWSqsB2bRNpSb8aZLIIOZnzXAgMBAAE=204-----END RSA PUBLIC KEY-----205onion-key-crosscert206-----BEGIN CROSSCERT-----207HiWs9Bo11xyyJs+i/8AdpNDoQkdNVoTuvMFNnDamYceEUTWaoxDazk3OIFkiIHqe208wPI0AKF5+vTUWHfRBB4AuBYgoLMxAAPNtbSgKnI9c+5pKwsWeHJs89F0jTIulNYs209Es1T9HQq+HGWRH8M0Dbv6o/W5MKLppvqRIhbXXRrR+I=210-----END CROSSCERT-----211ntor-onion-key-crosscert 1212-----BEGIN ED25519 CERT-----213AQoABpjcAa43xofNo9JCqRFmL2dTv2g0pP97WlKwHDy7Rh4cXpJ9APezxMtt8tMB214tpDMZnC+Hq9pK62Yu6Na3H+T0+fdme8CmhXa9pQ8NgCpeW7Es9oNXaCev8BcMol/2156AFJ3vFidAI=216-----END ED25519 CERT-----217family $13E8EB1D9FD7470AA87A47DC93538E88340A0903 $157106182B9F33663CAEDCD883D302316331DE5E $2C5FDD910AE3E21C0B6F9DD4BF397F570C8358FA $3844DFD3446832A3C8A137EEA616D4EEB370C788 $42E0FB190D20522C6C8C71E42B71DA33AC7A780E $4DDBC57BA2A63F0439FD41D92BFF8E141CC61213 $54FA84FF74B0C2BAC45CEADB4BF9C9CAEF72020F $67469C0671BF8D4BECB11F006AD541E9BC54EBCB $69D22FAEE5D4E18A098D5DEF68EAEE8D24F53CCA $70A81E423F94A9BF58D2FF432BBF59FA73426DB6 $8154154C636EC317C7165FD839F34F79963376C1 $88C3708A9D71ECEC1910B63C3FAA5BF60CD7E199 $8C34A154997812D1396BC462A42DA0A59B55952D $AEA760EE120B630262C70C1C11D4158BBF12C602 $B5EDD091D81655C2EBADB38065A868AA20259AC3 $B756D7123D759EAB62CB6A09148AD65AC216F3E3 $C79517FFC1327B0D4E86218A34C8E2570F338CF9 $C8850DE0EBC07481808F32F2BAA76CA65CB659FB $CE946DFEC40A1BFC3665A4727F54354F57297497218hidden-service-dir219contact abuse [AT] torworld.org - BTC 34yFiqwbcUA5MYSvUcpjqARvhoTwMFjmPs220ntor-onion-key owtGGV469gdDNIWfnIlIHgR7CvM0Ak5VwLiZCtBgtzc=221reject 0.0.0.0/8:*222reject 169.254.0.0/16:*223reject 127.0.0.0/8:*224reject 192.168.0.0/16:*225reject 10.0.0.0/8:*226reject 172.16.0.0/12:*227reject 51.15.252.1:*228reject 5.157.0.0/18:*229reject 5.188.216.0/24:*230reject 31.11.43.0/24:*231reject 37.139.49.0/24:*232reject 37.9.42.0/24:*233reject 37.9.53.0/24:*234reject 46.148.112.0/24:*235reject 46.148.120.0/24:*236reject 46.148.127.0/24:*237reject 46.161.56.0/24:*238reject 46.161.57.0/24:*239reject 46.161.58.0/24:*240reject 46.161.59.0/24:*241reject 46.161.60.0/24:*242reject 46.161.61.0/24:*243reject 46.161.62.0/24:*244reject 46.161.63.0/24:*245reject 46.243.140.0/24:*246reject 46.243.142.0/24:*247reject 46.243.173.0/24:*248reject 46.29.248.0/21:*249reject 46.8.255.0/24:*250reject 47.104.0.0/13:*251reject 49.12.0.0/16:*252reject 49.13.0.0/16:*253reject 79.110.22.0/24:*254reject 79.133.107.0/24:*255reject 81.94.43.0/24:*256reject 83.217.11.0/24:*257reject 84.19.170.240/28:*258reject 85.121.39.0/24:*259reject 85.93.5.0/24:*260reject 91.200.12.0/22:*261reject 91.200.164.0/24:*262reject 91.200.81.0/24:*263reject 91.200.82.0/24:*264reject 91.200.83.0/24:*265reject 91.207.4.0/22:*266reject 91.209.12.0/24:*267reject 91.212.124.0/24:*268reject 91.213.126.0/24:*269reject 91.216.3.0/24:*270reject 91.217.10.0/23:*271reject 91.220.101.0/24:*272reject 91.220.163.0/24:*273reject 91.220.62.0/24:*274reject 91.224.160.0/23:*275reject 91.225.216.0/22:*276reject 91.226.92.0/22:*277reject 91.230.252.0/23:*278reject 91.235.2.0/24:*279reject 91.236.74.0/23:*280reject 91.238.82.0/24:*281reject 91.243.90.0/24:*282reject 91.243.91.0/24:*283reject 91.243.93.0/24:*284reject 93.179.88.0/24:*285reject 95.181.176.0/24:*286reject 95.181.177.0/24:*287reject 95.181.182.0/24:*288reject 95.181.183.0/24:*289reject 95.181.216.0/24:*290reject 95.181.217.0/24:*291reject 95.181.219.0/24:*292reject 95.182.79.0/24:*293reject 95.85.80.0/24:*294reject 95.85.81.0/24:*295reject 103.215.80.0/22:*296reject 103.63.0.0/22:*297reject 113.212.64.0/19:*298reject 141.101.132.0/24:*299reject 141.101.201.0/24:*300reject 141.136.27.0/24:*301reject 146.185.200.0/24:*302reject 146.185.201.0/24:*303reject 146.185.202.0/24:*304reject 146.185.203.0/24:*305reject 146.185.204.0/24:*306reject 146.185.205.0/24:*307reject 146.185.206.0/24:*308reject 150.129.40.0/22:*309reject 151.237.176.0/20:*310reject 159.174.0.0/16:*311reject 172.80.0.0/17:*312reject 176.53.112.0/20:*313reject 176.97.116.0/22:*314reject 178.159.97.0/24:*315reject 178.16.80.0/20:*316reject 178.57.65.0/24:*317reject 178.57.66.0/24:*318reject 178.57.67.0/24:*319reject 178.57.68.0/24:*320reject 179.61.200.0/23:*321reject 181.214.37.0/24:*322reject 181.215.39.0/24:*323reject 185.101.68.0/24:*324reject 185.101.71.0/24:*325reject 185.103.252.0/23:*326reject 185.106.104.0/23:*327reject 185.106.92.0/24:*328reject 185.106.94.0/24:*329reject 185.112.102.0/24:*330reject 185.115.140.0/24:*331reject 185.127.24.0/22:*332reject 185.129.148.0/23:*333reject 185.137.219.0/24:*334reject 185.14.192.0/24:*335reject 185.14.193.0/24:*336reject 185.14.195.0/24:*337reject 185.146.168.0/22:*338reject 185.154.20.0/22:*339reject 185.159.36.0/22:*340reject 185.169.228.0/22:*341reject 185.2.32.0/24:*342reject 185.71.0.0/22:*343reject 188.247.135.0/24:*344reject 188.247.230.0/24:*345reject 188.247.232.0/24:*346reject 188.68.0.0/24:*347reject 188.68.1.0/24:*348reject 188.68.3.0/24:*349reject 188.72.126.0/24:*350reject 188.72.127.0/24:*351reject 188.72.96.0/24:*352reject 191.101.24.0/24:*353reject 191.101.54.0/23:*354reject 191.96.170.0/24:*355reject 191.96.174.0/24:*356reject 193.105.171.0/24:*357reject 193.138.244.0/22:*358reject 193.93.192.0/24:*359reject 193.93.195.0/24:*360reject 194.29.185.0/24:*361reject 195.182.57.0/24:*362reject 195.190.13.0/24:*363reject 195.191.56.0/23:*364reject 195.225.176.0/22:*365reject 204.225.16.0/20:*366reject 212.92.127.0/24:*367reject 46.8.44.0/23:*368reject 46.98.64.0/18:*369reject 68.119.232.0/21:*370reject 68.215.0.0/16:*371reject 69.244.0.0/14:*372reject 70.111.0.0/16:*373reject 70.126.0.0/15:*374reject 112.78.2.0/24:*375reject 193.9.28.0/24:*376reject 195.20.40.0/21:*377reject 5.8.37.0/24:*378reject 5.101.218.0/24:*379reject 5.101.221.0/24:*380reject 79.110.17.0/24:*381reject 79.110.18.0/24:*382reject 79.110.19.0/24:*383reject 79.110.25.0/24:*384reject 93.179.89.0/24:*385reject 93.179.90.0/24:*386reject 93.179.91.0/24:*387reject 185.46.84.0/22:*388reject 185.50.250.0/24:*389reject 185.50.251.0/24:*390reject 193.9.158.0/24:*391reject 5.196.26.96:*392reject 23.235.209.11:*393reject 23.92.87.202:*394reject 27.254.151.81:*395reject 27.254.152.29:*396reject 27.254.40.113:*397reject 27.254.41.206:*398reject 27.254.44.105:*399reject 27.254.61.110:*400reject 27.254.85.27:*401reject 27.254.85.49:*402reject 36.39.155.98:*403reject 36.66.209.21:*404reject 36.72.228.22:*405reject 36.76.176.64:*406reject 37.203.213.110:*407reject 46.26.129.203:*408reject 46.34.160.34:*409reject 50.118.100.49:*410reject 54.37.96.109:*411reject 58.195.1.4:*412reject 59.157.4.2:*413reject 60.13.186.5:*414reject 60.241.184.209:*415reject 62.75.132.67:*416reject 63.249.152.74:*417reject 64.127.71.73:*418reject 64.182.6.61:*419reject 64.85.233.8:*420reject 66.117.5.245:*421reject 66.70.134.137:*422reject 66.70.190.236:*423reject 68.65.122.86:*424reject 74.124.194.43:*425reject 77.104.143.180:*426reject 77.227.184.45:*427reject 77.228.191.183:*428reject 78.108.82.18:*429reject 78.108.83.153:*430reject 78.108.87.155:*431reject 78.108.89.85:*432reject 78.108.93.91:*433reject 78.108.95.116:*434reject 78.108.95.207:*435reject 78.138.104.167:*436reject 78.138.88.232:*437reject 79.170.44.115:*438reject 79.187.34.150:*439reject 79.188.45.226:*440reject 80.48.160.146:*441reject 80.52.222.10:*442reject 80.65.93.241:*443reject 83.0.245.234:*444reject 83.1.195.232:*445reject 83.17.220.66:*446reject 83.212.110.172:*447reject 83.212.112.80:*448reject 83.212.117.233:*449reject 83.212.120.81:*450reject 83.220.128.111:*451reject 83.220.144.107:*452reject 83.220.144.30:*453reject 84.19.190.8:*454reject 84.19.191.164:*455reject 85.117.35.21:*456reject 85.25.185.254:*457reject 86.104.134.144:*458reject 87.118.102.19:*459reject 87.118.90.136:*460reject 87.119.194.135:*461reject 87.236.210.110:*462reject 87.236.210.124:*463reject 87.237.198.245:*464reject 87.246.143.242:*465reject 87.254.167.37:*466reject 89.232.63.147:*467reject 91.108.176.118:*468reject 91.121.78.51:*469reject 91.201.202.12:*470reject 91.208.144.164:*471reject 92.36.213.75:*472reject 93.153.195.181:*473reject 93.170.128.136:*474reject 93.170.130.147:*475reject 93.170.131.108:*476reject 93.171.202.191:*477reject 93.65.43.220:*478reject 94.103.36.55:*479reject 95.169.184.25:*480reject 95.169.184.7:*481reject 95.169.190.104:*482reject 95.62.197.90:*483reject 96.31.35.51:*484reject 103.19.89.118:*485reject 103.230.84.239:*486reject 103.26.41.71:*487reject 103.4.52.150:*488reject 103.53.172.20:*489reject 103.53.172.96:*490reject 103.59.164.125:*491reject 103.7.56.119:*492reject 103.7.59.135:*493reject 103.221.222.65:*494reject 104.244.120.12:*495reject 104.247.76.199:*496reject 109.127.8.242:*497reject 109.127.8.246:*498reject 109.199.98.63:*499reject 109.229.210.250:*500reject 109.229.36.65:*501reject 109.237.111.168:*502reject 109.248.200.23:*503reject 110.138.108.142:*504reject 110.164.126.64:*505reject 110.164.205.225:*506reject 111.67.15.173:*507reject 111.67.16.254:*508reject 113.29.230.24:*509reject 115.146.59.207:*510reject 120.63.157.195:*511reject 120.63.175.225:*512reject 124.110.195.160:*513reject 128.210.157.251:*514reject 130.206.78.158:*515reject 137.74.6.95:*516reject 138.100.137.61:*517reject 143.225.116.108:*518reject 147.156.165.26:*519reject 148.163.100.151:*520reject 150.244.121.149:*521reject 151.97.190.239:*522reject 151.97.80.16:*523reject 154.66.197.59:*524reject 158.110.80.108:*525reject 158.69.255.67:*526reject 161.67.132.25:*527reject 162.223.94.56:*528reject 162.255.119.249:*529reject 172.81.119.140:*530reject 177.4.23.159:*531reject 177.70.107.137:*532reject 177.70.122.13:*533reject 177.70.122.193:*534reject 177.70.123.117:*535reject 177.70.123.128:*536reject 177.70.123.8:*537reject 177.70.123.90:*538reject 177.70.98.122:*539reject 177.70.98.242:*540reject 178.210.173.46:*541reject 178.250.241.22:*542reject 178.250.243.146:*543reject 178.250.245.138:*544reject 178.250.246.89:*545reject 178.32.255.132:*546reject 178.32.52.15:*547reject 180.182.234.200:*548reject 180.241.47.130:*549reject 180.250.210.23:*550reject 180.250.28.38:*551reject 181.136.26.124:*552reject 185.15.185.201:*553reject 185.15.185.209:*554reject 185.19.92.70:*555reject 185.59.28.14:*556reject 185.61.152.30:*557reject 185.242.179.15:*558reject 185.242.179.16:*559reject 186.202.153.34:*560reject 186.64.122.105:*561reject 187.141.112.98:*562reject 187.141.12.161:*563reject 187.174.252.247:*564reject 188.218.158.126:*565reject 188.219.154.228:*566reject 188.240.2.93:*567reject 188.241.140.212:*568reject 188.241.140.222:*569reject 188.241.140.224:*570reject 188.84.140.44:*571reject 188.85.248.131:*572reject 190.128.122.234:*573reject 190.128.29.1:*574reject 190.15.192.25:*575reject 190.183.59.133:*576reject 190.7.28.147:*577reject 191.252.104.136:*578reject 191.252.128.181:*579reject 191.252.130.32:*580reject 191.252.132.201:*581reject 191.252.134.38:*582reject 191.252.135.80:*583reject 191.252.136.74:*584reject 191.252.140.148:*585reject 191.252.140.199:*586reject 191.252.140.212:*587reject 191.252.141.145:*588reject 191.252.142.98:*589reject 191.252.143.96:*590reject 191.252.2.161:*591reject 192.100.170.12:*592reject 192.64.11.244:*593reject 192.64.9.116:*594reject 192.99.37.46:*595reject 193.146.210.69:*596reject 193.218.145.184:*597reject 193.218.145.32:*598reject 193.218.145.50:*599reject 194.144.188.70:*600reject 195.117.119.187:*601reject 195.205.24.101:*602reject 198.50.173.86:*603reject 198.54.126.39:*604reject 199.187.129.193:*605reject 199.201.121.169:*606reject 199.201.121.185:*607reject 199.246.2.104:*608reject 199.7.234.100:*609reject 200.0.24.42:*610reject 200.116.206.58:*611reject 201.149.83.183:*612reject 201.232.32.124:*613reject 202.115.63.125:*614reject 202.144.144.195:*615reject 202.150.213.85:*616reject 202.150.213.93:*617reject 202.28.32.110:*618reject 202.28.32.20:*619reject 202.29.22.38:*620reject 202.29.230.198:*621reject 202.67.13.107:*622reject 203.170.192.150:*623reject 203.170.192.240:*624reject 203.170.193.23:*625reject 203.24.188.166:*626reject 208.83.210.109:*627reject 208.93.233.58:*628reject 209.99.40.225:*629reject 209.164.84.70:*630reject 209.182.193.155:*631reject 209.182.199.168:*632reject 209.182.208.165:*633reject 209.182.213.90:*634reject 209.191.185.67:*635reject 210.37.11.238:*636reject 210.4.76.221:*637reject 210.46.85.150:*638reject 210.83.80.26:*639reject 212.252.45.46:*640reject 212.44.64.202:*641reject 212.72.132.138:*642reject 213.147.67.20:*643reject 213.185.88.41:*644reject 213.185.88.60:*645reject 213.205.38.29:*646reject 213.25.134.75:*647reject 216.176.100.240:*648reject 216.215.112.149:*649reject 216.59.16.171:*650reject 222.124.202.178:*651reject 222.124.206.41:*652reject 222.29.197.232:*653reject 46.173.218.123:*654reject 91.219.29.41:*655reject 195.208.1.101:*656reject 5.79.71.205:*657reject 5.79.71.225:*658reject 46.244.21.4:*659reject 50.21.181.152:*660reject 50.63.202.35:*661reject 52.5.245.208:*662reject 64.71.166.50:*663reject 67.215.255.139:*664reject 74.200.48.169:*665reject 74.208.153.9:*666reject 74.208.164.166:*667reject 74.208.64.191:*668reject 85.17.31.122:*669reject 85.17.31.82:*670reject 87.106.149.145:*671reject 87.106.149.153:*672reject 87.106.18.112:*673reject 87.106.18.141:*674reject 87.106.190.153:*675reject 87.106.20.192:*676reject 87.106.24.200:*677reject 87.106.253.18:*678reject 87.106.26.9:*679reject 95.211.230.75:*680reject 104.244.14.252:*681reject 109.70.26.37:*682reject 144.217.74.156:*683reject 146.148.124.166:*684reject 148.81.111.111:*685reject 151.80.148.103:*686reject 176.58.104.168:*687reject 178.162.203.202:*688reject 178.162.203.211:*689reject 178.162.203.226:*690reject 178.162.217.107:*691reject 184.105.192.2:*692reject 192.0.72.20:*693reject 192.0.72.21:*694reject 192.169.69.25:*695reject 192.42.116.41:*696reject 192.42.119.41:*697reject 193.166.255.170:*698reject 193.166.255.171:*699reject 204.11.56.48:*700reject 208.91.197.46:*701reject 212.227.20.93:*702reject 213.165.83.176:*703reject 216.218.135.114:*704reject 216.218.185.162:*705reject 216.218.208.114:*706reject 216.66.15.109:*707reject 72.55.186.0/24:*708reject 174.142.230.0/24:*709reject 184.107.100.0/24:*710reject 184.107.101.0/24:*711reject 184.107.116.0/24:*712reject 108.163.147.0/24:*713reject 198.72.104.0/24:*714reject 67.205.125.0/24:*715reject 67.205.105.0/24:*716reject 184.107.95.0/24:*717reject 5.145.168.0/21:*718reject 37.235.53.0/24:*719reject 37.252.96.0/24:*720reject 77.81.112.0/22:*721reject 77.81.116.0/22:*722reject 91.192.108.0/22:*723reject 93.93.64.0/21:*724reject 151.236.23.0/24:*725reject 158.255.238.0/24:*726reject 185.49.192.0/22:*727reject 185.50.196.0/22:*728reject 185.66.175.0/24:*729reject 185.76.77.0/24:*730reject 185.86.210.0/24:*731reject 185.104.152.0/24:*732reject 185.129.249.0/24:*733reject 192.71.213.0/24:*734reject 195.78.228.0/22:*735reject 23.217.172.41:*736reject 23.217.173.70:*737reject 23.217.161.62:*738reject 23.217.161.153:*739reject 23.235.33.144:*740accept *:20-21741accept *:43742accept *:53743accept *:80744accept *:110745accept *:143746accept *:220747accept *:443748accept *:873749accept *:989-990750accept *:991751accept *:992752accept *:993753accept *:995754accept *:1194755accept *:1293756accept *:3690757accept *:4321758accept *:5222-5223759accept *:5228760accept *:9418761accept *:11371762accept *:64738763reject *:*764tunnelled-dir-server765router-sig-ed25519 JWCYm75YxNMFHgUUI4cJyRgDGwcIedVSYIQERCdJFlRMjxPS9LOvcUzuv4rBZQLC3RAA80j7D5udcfeW0R0SDw766router-signature767-----BEGIN SIGNATURE-----768SLhtm94eITNNjle4PRclrt7uW/PswS5ByuQfQJ50m5tD+ENoZQx02HNWhD2Ovw8D769LEAPxV9sbjt8fzJ/EIzdl8vh+Nz2SIPJFBU1dkRkWSVE+Is0JPRqNKlzpVpWfW8h770zKOoQK1MV0YfYNhvLoSV9li7ed1GJrw9kmWOUgoRV3s=771-----END SIGNATURE-----772"""773def test_rd_parser(rd_example):774    res = RouterDescriptorParser.parse(rd_example)775    print(res)776@pytest.fixture777def rd_example2():778    return """router FalkensteinTor02 5.9.43.211 9001 0 0779identity-ed25519780-----BEGIN ED25519 CERT-----781AQQABsdtAbJp6YkI/WzQR8BP/30zhjSwogIlmyv6R/H5ru6ZgRhmAQAgBAATlA+2782LrLjDwoljVbbgDmbudSPI8ZcxiLR0qDaIBslLAjhjMMY5E+Joq39z+uytdAxKLSl783LtjMg4X3WRb3jGy+8gVbiYgpbCjvSnfQbEHmm8C6VxHWoMQShsT4LwPJiQs=784-----END ED25519 CERT-----785master-key-ed25519 E5QPti6y4w8KJY1W24A5m7nUjyPGXMYi0dKg2iAbJSw786or-address [2a01:4f8:161:32c7::2]:9001787platform Tor 0.4.5.0-alpha-dev on Linux788proto Cons=1-2 Desc=1-2 DirCache=1-2 FlowCtrl=1 HSDir=1-2 HSIntro=3-5 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Padding=2 Relay=1-3789published 2020-08-20 09:56:35790fingerprint 0512 FE6B E9CC A0ED 1331 52E6 4010 B2FB A141 EB10791uptime 64805792bandwidth 31457280 73400320 33471488793extra-info-digest F631D985A46F850C46FE2355947D36CA45DBE335 M/2vGW74uurcpt0e+7/EJqOV4LpoJRYAZ+G7I9f58L4794onion-key795-----BEGIN RSA PUBLIC KEY-----796MIGJAoGBAMC8N8BeGYY6vt/QO1QFd0puJpEZq83iISrgGL1KAKleTGbqLpv7WBH0797SKIDFpleHiElq74yC6yXZf9cDCfXzctpVWa1zPI/ISCJaxFEbDLMLTgaRy7PGA9d798Sxze6wrlo+eXmLc9qSrJLyNScMpVRjL748YXxypbL+2RbHCfB7o1AgMBAAE=799-----END RSA PUBLIC KEY-----800signing-key801-----BEGIN RSA PUBLIC KEY-----802MIGJAoGBAL+bi9Kfe8dhwaaq8c5kcAXbCHUyvfx9gVBCuDj7jAOQKy16zBfuUh7q803614bwRiD4sFC4QFq+j43EjJgXeReAH9sDeWJxP3Q9muEuCcqfmf+OAlYjruXEYrT804LEO6q2Hd22nJ9WaxEHgvSCvECTNmODUdgP0DJpkKcwks3VM4wamZAgMBAAE=805-----END RSA PUBLIC KEY-----806onion-key-crosscert807-----BEGIN CROSSCERT-----808Jq35dkFnNz2asXwJfQR57FRySoaluo1FEhFe5l349iLKy1Nd9U2YAYErg9845GRp809BD1OYpqMYvtgxOvNz6ltsbfz6eHaOxJhnXumLyv59cDtLAQ+Piicar9EbPmBCQsp810c0K9YfijqJ8y4EbEGpCW01nTglqKr+527wD+Hbb346g=811-----END CROSSCERT-----812ntor-onion-key-crosscert 1813-----BEGIN ED25519 CERT-----814AQoABsh6AROUD7YusuMPCiWNVtuAOZu51I8jxlzGItHSoNogGyUsAI8evueV8KZm815nXoT6qtg208Dbmh19z0jPm745LXgElQ8U/CTLOSVGW1fMkVs0zPjyvpSVrTjH5fz816LRcQgJ/X6gM=817-----END ED25519 CERT-----818family $0512FE6BE9CCA0ED133152E64010B2FBA141EB10 $08F06A0DDAFABF9A26FCB2E392A1435F9E048216 $0A7208B8903DD3FF5CDFA218A3823AF498CE69CE $128FC6D8FBF753121C5662FEE309CCD47B64BA6B $599A708756048993A1029B2775EEF8C9E40BB640 $695D811B130673C2DE8DCFC5A9E742790BD25066 $7185B69E3267E71D0E4CBE30209677205DEA5E67 $8E5F4EE45E0631A60E59CAA42E1464FD7120459D $B70BD334FFEE23E653B75219AE12CF0236BCFCBB $B76A047C20D3E4F9B5A64428298DA55A90D62472 $D7230F4F13324A28C308AF94E2385D0A7F1B05F9 $DEF8C760A79FEF2358E03AE5A1950086ABEB953E $F0F13714732C347312426EC2B8D5C4940EAA45BA $F5C3DA7642BB037E0D279359AE88CD7FC03A98A0819hidden-service-dir820contact <tor AT afo MINUS tm DOT org>821ntor-onion-key xbqQBTwgBWJxkxBrHuHsKp5WyZ4yof09zsnGZMXB+Rk822reject *:*823tunnelled-dir-server824router-sig-ed25519 Hk2KgDHyw7OAo8g79eo7mEHK/k3UszFAH1Fkole70BIdUDOvA/8oHwSA2aO+Rp1i6v0I/LlKr0u8/pqDzGd7Bg825router-signature826-----BEGIN SIGNATURE-----827UmJeAncV38dJBgsKSVxw14cRdo/YTu3owAa+YJOWkWsNl03UATGeNAWQGc2ZwhI3828nk4ha7uQ254z5uDyWT5vD7QbPREcFbWvif7EWRqqBi0kdwSClYzMI/+4dFh+dz3v829jvfDaEld8KBz3UxumcxRnswmDzC9zsS3Bq/LxQ7LrR4=830-----END SIGNATURE-----831"""832def test_rd_parser2(rd_example2):833    res = RouterDescriptorParser.parse(rd_example2)...Model_test_1.py
Source:Model_test_1.py  
...186    reject_train = reject_data[feature_used]187    predict_reject_prob = pipeline_model.predict_proba(reject_train)[:,1]188    return predict_reject_prob,reject_train189# æç»æ ·æ¬ä¸åå§æ ·æ¬åå¹¶190def raw_combine_reject(train_data,reject_train_combine_label,feature_used):191    train_combine_reject_1 = pd.concat([train_data[feature_used+['user_type']],reject_train_combine_label\192          [feature_used+['user_type']]]).reset_index(drop=True)193    X_train_reject = train_combine_reject_1[feature_used]194    y_train_reject = train_combine_reject_1['user_type']195    return X_train_reject,y_train_reject196# æç»æ ·æ¬å轮次æµè¯197@timecount()198def reject_main_train(reject_train,train_data,predict_reject_prob,model_list,\199                      feature_used,model_auc_raw,bad,good,diff=0):  200    reject_evalutaion_detail = {}201    pipeline_model_userful = []202    reject_train_userful = []203    for ratio in [0.3,0.5,1,2]:204        for n_sample in [1000,2000,3000,4000]:    205            print('å¼å§ %s_%s'%(ratio,n_sample))206            # éåæç»æ ç¾207            reject_train_combine_label = reject_data_masked(reject_train,\208                                                            predict_reject_prob,n_sample,ratio,bad,good)209            # åå¹¶æ°æ®è®ç»é210            X_train_reject_1,y_train_reject_1 = raw_combine_reject(train_data,\211                                                                   reject_train_combine_label,feature_used)212            213            # æç»æ ·æ¬è®ç»214            pipeline_model_reject_1 = fuse_model_train(X_train_reject_1,y_train_reject_1,\215                                        model_list,category_feature,numeric_feature,classifier_type='train')216            # æç»æ ·æ¬è¯ä¼°217            evaluation_result = model_fuse_evaluation(pipeline_model_reject_1,train_data,\218                                                      valid_data,test_data,feature_used)219            reject_evalutaion_detail[str(ratio)+'_'+str(n_sample)] = evaluation_result220            if evaluation_result[1] - model_auc_raw >= diff:221                print('reject auc:',evaluation_result[1],'raw_auc:',model_auc_raw)222                print(y_train_reject_1.value_counts())223                pipeline_model_userful.append(pipeline_model_reject_1)224                reject_train_userful.append(reject_train_combine_label)...policy.py
Source:policy.py  
1"""2Unit tests for the stem.exit_policy.ExitPolicy class.3"""4import pickle5import unittest6try:7  # added in python 3.38  from unittest.mock import Mock, patch9except ImportError:10  from mock import Mock, patch11from stem.exit_policy import (12  DEFAULT_POLICY_RULES,13  get_config_policy,14  ExitPolicy,15  MicroExitPolicy,16  ExitPolicyRule,17)18class TestExitPolicy(unittest.TestCase):19  def test_example(self):20    # tests the ExitPolicy and MicroExitPolicy pydoc examples21    policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*')22    self.assertEqual('accept *:80, accept *:443, reject *:*', str(policy))23    self.assertEqual('accept 80, 443', policy.summary())24    self.assertTrue(policy.can_exit_to('75.119.206.243', 80))25    policy = MicroExitPolicy('accept 80,443')26    self.assertTrue(policy.can_exit_to('75.119.206.243', 80))27  def test_constructor(self):28    # The ExitPolicy constructor takes a series of string or ExitPolicyRule29    # entries. Extra whitespace is ignored to make csvs easier to handle.30    expected_policy = ExitPolicy(31      ExitPolicyRule('accept *:80'),32      ExitPolicyRule('accept *:443'),33      ExitPolicyRule('reject *:*'),34    )35    policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*')36    self.assertEqual(expected_policy, policy)37    policy = ExitPolicy(*'accept *:80, accept *:443, reject *:*'.split(','))38    self.assertEqual(expected_policy, policy)39    # checks that we truncate after getting a catch-all policy40    policy = ExitPolicy(*'accept *:80, accept *:443, reject *:*, accept *:20-50'.split(','))41    self.assertEqual(expected_policy, policy)42    # checks that we compress redundant policies43    policy = ExitPolicy(*'reject *:80, reject *:443, reject *:*'.split(','))44    self.assertEqual(ExitPolicy('reject *:*'), policy)45  def test_can_exit_to(self):46    # Basic sanity test for our can_exit_to() method. Most of the interesting47    # use cases (ip masks, wildcards, etc) are covered by the ExitPolicyRule48    # tests.49    policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*')50    for index in range(1, 100):51      ip_addr = '%i.%i.%i.%i' % (index / 2, index / 2, index / 2, index / 2)52      expected_result = index in (80, 443)53      self.assertEqual(expected_result, policy.can_exit_to(ip_addr, index))54      self.assertEqual(expected_result, policy.can_exit_to(port = index))55  def test_can_exit_to_strictness(self):56    # Check our 'strict' argument.57    policy = ExitPolicy('reject 1.0.0.0/8:80', 'accept *:*')58    self.assertEqual(False, policy.can_exit_to(None, 80, strict = True))  # can't exit to *all* instances of port 8059    self.assertEqual(True, policy.can_exit_to(None, 80, strict = False))  # can exit to *an* instance of port 8060    policy = ExitPolicy('accept 1.0.0.0/8:80', 'reject *:*')61    self.assertEqual(False, policy.can_exit_to(None, 80, strict = True))  # can't exit to *all* instances of port 8062    self.assertEqual(True, policy.can_exit_to(None, 80, strict = False))  # can exit to *an* instance of port 8063  def test_is_exiting_allowed(self):64    test_inputs = {65      (): True,66      ('accept *:*', ): True,67      ('reject *:*', ): False,68      ('accept *:80', 'reject *:*'): True,69      ('reject *:80', 'accept *:80', 'reject *:*'): False,70      ('reject *:50-90', 'accept *:80', 'reject *:*'): False,71      ('reject *:2-65535', 'accept *:80-65535', 'reject *:*'): False,72      ('reject *:2-65535', 'accept 127.0.0.0:1', 'reject *:*'): True,73      ('reject 127.0.0.1:*', 'accept *:80', 'reject *:*'): True,74    }75    for rules, expected_result in test_inputs.items():76      policy = ExitPolicy(*rules)77      self.assertEqual(expected_result, policy.is_exiting_allowed())78  def test_summary_examples(self):79    # checks the summary() method's pydoc examples80    policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*')81    self.assertEqual('accept 80, 443', policy.summary())82    policy = ExitPolicy('accept *:443', 'reject *:1-1024', 'accept *:*')83    self.assertEqual('reject 1-442, 444-1024', policy.summary())84  def test_summary_large_ranges(self):85    # checks the summary() method when the policy includes very large port ranges86    policy = ExitPolicy('reject *:80-65535', 'accept *:1-65533', 'reject *:*')87    self.assertEqual('accept 1-79', policy.summary())88  def test_without_port(self):89    policy = get_config_policy('accept 216.58.193.78, reject *')90    self.assertEqual([ExitPolicyRule('accept 216.58.193.78:*'), ExitPolicyRule('reject *:*')], list(policy))91    policy = get_config_policy('reject6 [2a00:1450:4001:081e:0000:0000:0000:200e]')92    self.assertEqual([ExitPolicyRule('reject [2a00:1450:4001:081e:0000:0000:0000:200e]:*')], list(policy))93  def test_non_private_non_default_policy(self):94    policy = get_config_policy('reject *:80-65535, accept *:1-65533, reject *:*')95    for rule in policy:96      self.assertFalse(rule.is_private())97      self.assertFalse(rule.is_default())98    self.assertFalse(policy.has_private())99    self.assertFalse(policy.has_default())100    self.assertEqual(policy, policy.strip_private())101    self.assertEqual(policy, policy.strip_default())102  def test_all_private_policy(self):103    for port in ('*', '80', '1-1024'):104      private_policy = get_config_policy('reject private:%s' % port, '12.34.56.78')105      for rule in private_policy:106        self.assertTrue(rule.is_private())107      self.assertEqual(ExitPolicy(), private_policy.strip_private())108    # though not commonly done, technically private policies can be accept rules too109    private_policy = get_config_policy('accept private:*')110    self.assertEqual(ExitPolicy(), private_policy.strip_private())111  @patch('socket.gethostname', Mock(side_effect = IOError('no address')))112  def test_all_private_policy_without_network(self):113    for rule in get_config_policy('reject private:80, accept *:80'):114      # all rules except the ending accept are part of the private policy115      self.assertEqual(str(rule) != 'accept *:80', rule.is_private())116  def test_all_default_policy(self):117    policy = ExitPolicy(*DEFAULT_POLICY_RULES)118    for rule in policy:119      self.assertTrue(rule.is_default())120    self.assertTrue(policy.has_default())121    self.assertEqual(ExitPolicy(), policy.strip_default())122  def test_mixed_private_policy(self):123    policy = get_config_policy('accept *:80, reject private:1-65533, accept *:*')124    for rule in policy:125      self.assertTrue(rule.is_accept != rule.is_private())  # only reject rules are the private ones126    self.assertEqual(get_config_policy('accept *:80, accept *:*'), policy.strip_private())127  def test_mixed_default_policy(self):128    policy = ExitPolicy('accept *:80', 'accept 127.0.0.1:1-65533', *DEFAULT_POLICY_RULES)129    for rule in policy:130      # only accept-all and reject rules are the default ones131      self.assertTrue(rule.is_accept != rule.is_default() or (rule.is_accept and rule.is_address_wildcard() and rule.is_port_wildcard()))132    self.assertEqual(get_config_policy('accept *:80, accept 127.0.0.1:1-65533'), policy.strip_default())133  def test_get_config_policy_with_ipv6(self):134    # ensure our constructor accepts addresses both with and without brackets135    self.assertTrue(get_config_policy('reject private:80', 'fe80:0000:0000:0000:0202:b3ff:fe1e:8329').is_exiting_allowed())136    self.assertTrue(get_config_policy('reject private:80', '[fe80:0000:0000:0000:0202:b3ff:fe1e:8329]').is_exiting_allowed())137  def test_str(self):138    # sanity test for our __str__ method139    policy = ExitPolicy('  accept *:80\n', '\taccept *:443')140    self.assertEqual('accept *:80, accept *:443', str(policy))141    policy = ExitPolicy('reject 0.0.0.0/255.255.255.0:*', 'accept *:*')142    self.assertEqual('reject 0.0.0.0/24:*, accept *:*', str(policy))143  def test_iter(self):144    # sanity test for our __iter__ method145    rules = [146      ExitPolicyRule('accept *:80'),147      ExitPolicyRule('accept *:443'),148      ExitPolicyRule('reject *:*'),149    ]150    self.assertEqual(rules, list(ExitPolicy(*rules)))151    self.assertEqual(rules, list(ExitPolicy('accept *:80', 'accept *:443', 'reject *:*')))152  def test_microdescriptor_parsing(self):153    # mapping between inputs and if they should succeed or not154    test_inputs = {155      'accept 80': True,156      'accept 80,443': True,157      '': False,158      'accept': False,159      'accept ': False,160      'accept\t80,443': False,161      'accept 80, 443': False,162      'accept 80,\t443': False,163      '80,443': False,164      'accept 80,-443': False,165      'accept 80,+443': False,166      'accept 80,66666': False,167      'reject 80,foo': False,168      'bar 80,443': False,169    }170    for policy_arg, expect_success in test_inputs.items():171      try:172        policy = MicroExitPolicy(policy_arg)173        if expect_success:174          self.assertEqual(policy_arg, str(policy))175        else:176          self.fail()177      except ValueError:178        if expect_success:179          self.fail()180  def test_microdescriptor_attributes(self):181    # checks that its is_accept attribute is properly set182    # single port183    policy = MicroExitPolicy('accept 443')184    self.assertTrue(policy.is_accept)185    # multiple ports186    policy = MicroExitPolicy('accept 80,443')187    self.assertTrue(policy.is_accept)188    # port range189    policy = MicroExitPolicy('reject 1-1024')190    self.assertFalse(policy.is_accept)191  def test_microdescriptor_can_exit_to(self):192    test_inputs = {193      'accept 443': {442: False, 443: True, 444: False},194      'reject 443': {442: True, 443: False, 444: True},195      'accept 80,443': {80: True, 443: True, 10: False},196      'reject 1-1024': {1: False, 1024: False, 1025: True},197    }198    for policy_arg, attr in test_inputs.items():199      policy = MicroExitPolicy(policy_arg)200      for port, expected_value in attr.items():201        self.assertEqual(expected_value, policy.can_exit_to(port = port))202    # address argument should be ignored203    policy = MicroExitPolicy('accept 80,443')204    self.assertFalse(policy.can_exit_to('127.0.0.1', 79))205    self.assertTrue(policy.can_exit_to('127.0.0.1', 80))206  def test_get_config_policy(self):207    test_inputs = {208      '': ExitPolicy(),209      'reject *': ExitPolicy('reject *:*'),210      'reject *:*': ExitPolicy('reject *:*'),211      'reject private': ExitPolicy(212        'reject 0.0.0.0/8:*',213        'reject 169.254.0.0/16:*',214        'reject 127.0.0.0/8:*',215        'reject 192.168.0.0/16:*',216        'reject 10.0.0.0/8:*',217        'reject 172.16.0.0/12:*',218        'reject 12.34.56.78:*',219      ),220      'accept *:80, reject *': ExitPolicy(221        'accept *:80',222        'reject *:*',223      ),224      '  accept *:80,     reject *   ': ExitPolicy(225        'accept *:80',226        'reject *:*',227      ),228    }229    for test_input, expected in test_inputs.items():230      self.assertEqual(expected, get_config_policy(test_input, '12.34.56.78'))231    test_inputs = (232      'blarg',233      'accept *:*:*',234      'acceptt *:80',235      'accept 257.0.0.1:80',236      'accept *:999999',237    )238    for test_input in test_inputs:239      self.assertRaises(ValueError, get_config_policy, test_input)240  def test_pickleability(self):241    """242    Checks that we can unpickle ExitPolicy instances.243    """244    policy = ExitPolicy('accept *:80', 'accept *:443', 'reject *:*')245    self.assertTrue(policy.can_exit_to('74.125.28.106', 80))246    encoded_policy = pickle.dumps(policy)247    restored_policy = pickle.loads(encoded_policy)248    self.assertEqual(policy, restored_policy)249    self.assertTrue(restored_policy.is_exiting_allowed())...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
