Best Python code snippet using playwright-python
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-----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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())...
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!