How to use create_acl method in autotest

Best Python code snippet using autotest_python

acl.py

Source:acl.py Github

copy

Full Screen

...29 ACL Object30 """31 self._callback = callback32 @abc.abstractmethod33 def create_acl(self, **kwargs):34 """35 Create an Access Control List.36 Args:37 address_type (str): ACL address type, ip or ipv6 or mac.38 acl_type (str): ACL type, extended or standard.39 acl_name (str): Unique name for ACL.40 callback (function): A function executed upon completion of the method.41 The only parameter passed to `callback` will be the ``ElementTree`` `config`.42 Returns:43 True, False or None for Success, failure and no-change respectively.44 Examples:45 >>> from pyswitch.device import Device46 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:47 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',48 address_type='mac')49 >>> print dev.acl.create_acl(acl_name='Acl_2', acl_type='extended',50 address_type='ip')51 >>> print dev.acl.create_acl(acl_name='Acl_3', acl_type='extended',52 address_type='ipv6')53 """54 return55 @abc.abstractmethod56 def delete_acl(self, **kwargs):57 """58 Delete Access Control List.59 Args:60 acl_name (str): Name of the access list.61 callback (function): A function executed upon completion of the method.62 The only parameter passed to `callback` will be the ``ElementTree`` `config`.63 Returns:64 True, False or None for Success, failure and no-change respectively.65 Examples:66 >>> from pyswitch.device import Device67 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:68 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',69 address_type='mac')70 >>> print dev.acl.delete_acl(acl_name='Acl_2')71 >>> print dev.acl.delete_acl(acl_name='Acl_1')72 """73 return74 @abc.abstractmethod75 def apply_acl(self, **kwargs):76 """77 Apply an ACL to a physical port, port channel, VE or management interface.78 Args:79 rbridge_id (str): RBridge ID of the VDX switch under which VE will be configured80 intf_type (str): Interface type, (physical, port channel, VE or management interface).81 intf_name (str[]): Array of the Interface Names.82 acl_name (str): Name of the access list.83 acl_direction (str): Direction of ACL binding on the specified interface [in/out].84 traffic_type (str): Traffic type for the ACL being applied [switched/routed].85 callback (function): A function executed upon completion of the method.86 The only parameter passed to `callback` will be the ``ElementTree`` `config`.87 Returns:88 True, False or None for Success, failure and no-change respectively89 for each interfaces.90 Examples:91 >>> from pyswitch.device import Device92 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:93 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',94 address_type='mac')95 >>> print dev.acl.apply_acl(intf_type='ethernet', intf_name='0/1,0/2',96 acl_name='Acl_1', acl_direction='in',97 traffic_type='switched')98 """99 return100 @abc.abstractmethod101 def remove_acl(self, **kwargs):102 """103 Remove ACL from a physical port, port channel, VE or management interface.104 Args:105 rbridge_id (str): RBridge ID of the VDX switch under which VE will be configured106 intf_type (str): Interface type, (physical, port channel, VE or management interface).107 intf_name (str[]): Array of the Interface Names.108 acl_name (str): Name of the access list.109 acl_direction (str): Direction of ACL binding on the specified interface [in/out].110 traffic_type (str): Traffic type for the ACL being applied [switched/routed].111 callback (function): A function executed upon completion of the method.112 The only parameter passed to `callback` will be the ``ElementTree`` `config`.113 Returns:114 True, False or None for Success, failure and no-change respectively115 for each interfaces.116 Examples:117 >>> from pyswitch.device import Device118 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:119 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',120 address_type='mac')121 >>> print dev.acl.apply_acl(intf_type='ethernet', intf_name='0/1,0/2',122 acl_name='Acl_1', acl_direction='in',123 traffic_type='switched')124 >>> print dev.acl.remove_acl(intf_type='ethernet', intf_names='0/1,0/2',125 acl_name='Acl_1', acl_direction='in',126 traffic_type='switched')127 """128 return129 @abc.abstractmethod130 def add_l2_acl_rule(self, **kwargs):131 """132 Add ACL rule to an existing L2 ACL.133 Args:134 acl_name (str): Name of the access list.135 acl_rules (array): List of ACL sequence rules.136 seq_id (int): Sequence number of the rule.137 action (str): Action to apply on the traffic (deny/permit/hard-drop).138 source (str): Source filter, can be 'any' or 'host', or the actual MAC address.139 srchost (str): Source MAC in HHHH.HHHH.HHHH format.140 src_mac_addr_mask (str): Mask for the source MAC address.141 dst (str): Destination filter, can be 'any' or 'host', or the actual MAC address.142 dsthost (str): Destination MAC in HHHH.HHHH.HHHH format.143 dst_mac_addr_mask (str): Mask for the destination MAC address.144 ethertype (str): EtherType, can be 'arp', 'fcoe', 'ipv4' or 1536-65535.145 count (str): Enables the packet count.146 log (str): Enables the logging.147 callback (function): A function executed upon completion of the method.148 The only parameter passed to `callback` will be the ``ElementTree`` `config`.149 Returns:150 True, False or None for Success, failure and no-change respectively151 for each seq_ids.152 Examples:153 >>> from pyswitch.device import Device154 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:155 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',156 address_type='mac')157 >>> print dev.acl.add_mac_acl_rule(acl_name='Acl_1', seq_id=20,158 action='permit', source='host',159 srchost='2222.2222.2222')160 """161 return162 @abc.abstractmethod163 def add_ipv4_rule_acl(self, **kwargs):164 """165 Add ACL rule to an existing IPv4 ACL.166 Args:167 acl_name (str): Name of the access list.168 acl_rules (array): List of ACL sequence rules.169 seq_id (int): Sequence number of the rule.170 action (str): Action to apply on the traffic (deny/permit/hard-drop).171 protocol_type (str): Type of IP packets to be filtered (<0-255>, tcp, udp, icmp or ip).172 source (str): Source filter, can be 'any' or 'host', or the actual MAC address.173 destination (str): Destination filter, can be 'any' or 'host', or the actual MAC.174 dscp (str): DSCP values of the packet to filter.175 urg (str): Enables urg for the rule.176 ack (str): Enables ack for the rule.177 push (str):Enables push for the rule.178 fin (str): Enables fin for the rule.179 rst (str): Enables rst for the rule.180 sync (str): Enables sync for the rule.181 vlan (str): VLAN ID for the rule.182 count (str): Enables the packet count.183 log (str): Enables the logging.184 callback (function): A function executed upon completion of the method.185 The only parameter passed to `callback` will be the ``ElementTree`` `config`.186 Returns:187 True, False or None for Success, failure and no-change respectively188 for each seq_ids.189 Examples:190 >>> from pyswitch.device import Device191 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:192 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',193 address_type='ip')194 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1', seq_id=10,195 action='permit',196 source='host 192.168.0.3')197 """198 return199 @abc.abstractmethod200 def add_ipv6_rule_acl(self, **kwargs):201 """202 Add ACL rule to an existing IPv6 ACL.203 Args:204 acl_name (str): Name of the access list.205 acl_rules (array): List of ACL sequence rules.206 seq_id (int): Sequence number of the rule.207 action (str): Action to apply on the traffic (deny/permit/hard-drop).208 protocol_type (str): Type of IP packets to be filtered (<0-255>, tcp, udp, icmp or ip).209 source (str): Source filter, can be 'any' or 'host', or the actual MAC address.210 destination (str): Destination filter, can be 'any' or 'host', or the actual MAC.211 dscp (str): DSCP values of the packet to filter.212 urg (str): Enables urg for the rule.213 ack (str): Enables ack for the rule.214 push (str):Enables push for the rule.215 fin (str): Enables fin for the rule.216 rst (str): Enables rst for the rule.217 sync (str): Enables sync for the rule.218 vlan (str): VLAN ID for the rule.219 count (str): Enables the packet count.220 log (str): Enables the logging.221 callback (function): A function executed upon completion of the method.222 The only parameter passed to `callback` will be the ``ElementTree`` `config`.223 Returns:224 True, False or None for Success, failure and no-change respectively225 for each seq_ids.226 Examples:227 >>> from pyswitch.device import Device228 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:229 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',230 address_type='ipv6')231 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1', seq_id=10,232 action='permit',233 source='2:2::2:2')234 """235 return236 @abc.abstractmethod237 def delete_l2_acl_rule(self, **kwargs):238 """239 Remove ACL rule from an existing L2 ACL.240 Args:241 acl_name (str): Name of the access list.242 seq_ids (list): Rule sequence-ids for bulk deletion.243 seq_id (int): Rule sequence-id to delete.244 callback (function): A function executed upon completion of the method.245 The only parameter passed to `callback` will be the ``ElementTree`` `config`.246 Returns:247 True, False or None for Success, failure and no-change respectively248 for each seq_ids.249 Examples:250 >>> from pyswitch.device import Device251 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:252 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',253 address_type='mac')254 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1', seq_id=10,255 action='permit', source='host',256 srchost='2222.2222.2222')257 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1', seq_id=10)258 """259 return260 @abc.abstractmethod261 def delete_ipv4_acl_rule(self, **kwargs):262 """263 Remove ACL rule from an existing IPv4 ACL.264 Args:265 acl_name (str): Name of the access list.266 seq_ids (list): Rule sequence-ids for bulk deletion.267 seq_id (int): Rule sequence-ids to delete.268 callback (function): A function executed upon completion of the method.269 The only parameter passed to `callback` will be the ``ElementTree`` `config`.270 Returns:271 True, False or None for Success, failure and no-change respectively272 for each seq_ids.273 Examples:274 >>> from pyswitch.device import Device275 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:276 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',277 address_type='ip')278 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1', seq_id=10,279 action='permit',280 source='host 192.168.0.3')281 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1', seq_id=10)282 """283 return284 @abc.abstractmethod285 def delete_ipv6_acl_rule(self, **kwargs):286 """287 Remove ACL rule from an existing IPv6 ACL.288 Args:289 acl_name (str): Name of the access list.290 seq_ids (list): Rule sequence-ids for bulk deletion.291 seq_id (int): Rule sequence-ids to delete.292 callback (function): A function executed upon completion of the method.293 The only parameter passed to `callback` will be the ``ElementTree`` `config`.294 Returns:295 True, False or None for Success, failure and no-change respectively296 for each seq_ids.297 Examples:298 >>> from pyswitch.device import Device299 >>> with Device(conn=conn, auth=auth, connection_type='NETCONF') as dev:300 >>> print dev.acl.create_acl(acl_name='Acl_1', acl_type='standard',301 address_type='ipv6')302 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1', seq_id=10,303 action='permit',304 source='host 2:2::2:2')305 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1', seq_id=10)306 """307 return308 @abc.abstractmethod309 def add_ipv4_rule_acl_bulk(self, **kwargs):310 """311 Add ACL rule to an existing IPv4 ACL.312 Args:313 acl_name (str): Name of the access list.314 acl_rules (array): List of ACL sequence rules.315 Returns:316 True, False or None for Success, failure and no-change respectively317 for each seq_ids.318 Examples:319 >>> from pyswitch.device import Device320 >>> with Device(conn=conn, auth=auth,321 connection_type='NETCONF') as dev:322 >>> print dev.acl.create_acl(acl_name='Acl_1',323 acl_type='standard',324 address_type='ip')325 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1',326 acl_rules = [{"seq_id": 10, "action": "permit",327 "source": "host 192.168.0.3")328 """329 return330 @abc.abstractmethod331 def delete_ipv4_acl_rule_bulk(self, **kwargs):332 """333 Delete ACL rules from IPv4 ACL.334 Args:335 acl_name (str): Name of the access list.336 acl_rules (string): Range of ACL sequence rules.337 Returns:338 True, False or None for Success, failure and no-change respectively339 for each seq_ids.340 Examples:341 >>> from pyswitch.device import Device342 >>> with Device(conn=conn, auth=auth,343 connection_type='NETCONF') as dev:344 >>> print dev.acl.create_acl(acl_name='Acl_1',345 acl_type='standard',346 address_type='ip')347 >>> print dev.acl.add_ip_acl_rule(acl_name='Acl_1',348 acl_rules = [{"seq_id": 10, "action": "permit",349 "source": "host 192.168.0.3")350 """351 return352 @abc.abstractmethod353 def add_ipv6_rule_acl_bulk(self, **kwargs):354 """355 Add ACL rule to an existing IPv6 ACL.356 Args:357 acl_name (str): Name of the access list.358 acl_rules (array): List of ACL sequence rules.359 Returns:360 True, False or None for Success, failure and no-change respectively361 for each seq_ids.362 Examples:363 >>> from pyswitch.device import Device364 >>> with Device(conn=conn, auth=auth,365 connection_type='NETCONF') as dev:366 >>> print dev.acl.create_acl(acl_name='Acl_1',367 acl_type='standard',368 address_type='ipv6')369 >>> print dev.acl.add_ipv6_rule_acl_bulk(acl_name='Acl_1',370 acl_rules='[371 seq_id=10,372 action="permit",373 source="2:2::2:2"]')374 """375 return376 @abc.abstractmethod377 def delete_ipv6_acl_rule_bulk(self, **kwargs):378 """379 Delete ACL rules from IPv4 ACL.380 Args:381 acl_name (str): Name of the access list.382 acl_rules (string): Range of ACL sequence rules.383 Returns:384 True, False or None for Success, failure and no-change respectively385 for each seq_ids.386 Examples:387 >>> from pyswitch.device import Device388 >>> with Device(conn=conn, auth=auth,389 connection_type='NETCONF') as dev:390 >>> print dev.acl.create_acl(acl_name='Acl_1',391 acl_type='standard',392 address_type='ip')393 >>> print dev.acl.delete_ipv6_acl_rule_bulk(acl_name='Acl_1',394 seq_id="10,30-40")395 """396 return397 @abc.abstractmethod398 def add_l2_acl_rule_bulk(self, **kwargs):399 """400 Add ACL rule to an existing L2 ACL.401 Args:402 acl_name (str): Name of the access list.403 acl_rules (array): List of ACL sequence rules.404 Returns:405 True, False or None for Success, failure and no-change respectively406 for each seq_ids.407 Examples:408 >>> from pyswitch.device import Device409 >>> with Device(conn=conn, auth=auth,410 connection_type='NETCONF') as dev:411 >>> print dev.acl.create_acl(acl_name='Acl_1',412 acl_type='standard',413 address_type='mac')414 >>> print dev.acl.add_mac_acl_rule(acl_name='Acl_1', seq_id=20,415 action='permit',416 source='host',417 srchost='2222.2222.2222')418 """419 return420 @abc.abstractmethod421 def delete_l2_acl_rule_bulk(self, **kwargs):422 """423 Delete ACL rules from MAC ACL.424 Args:425 acl_name (str): Name of the access list.426 seq_id(string): Range of ACL sequences seq_id="10,30-40"427 Returns:428 True, False or None for Success, failure and no-change respectively429 for each seq_ids.430 Examples:431 >>> from pyswitch.device import Device432 >>> with Device(conn=conn, auth=auth,433 connection_type='NETCONF') as dev:434 >>> print dev.acl.create_acl(acl_name='Acl_1',435 acl_type='standard',436 address_type='ip')437 >>> print dev.acl.delete_l2_acl_rule_bulk(acl_name='Acl_1',438 seq_id="10,30-40")439 """440 return441 @abc.abstractmethod442 def get_acl_rules(self, **kwargs):443 """444 Returns the number of congiured rules445 Args:446 acl_name (str): Name of the access list.447 Returns:448 Number of rules configured,...

Full Screen

Full Screen

EosNumberedAclParser_test.py

Source:EosNumberedAclParser_test.py Github

copy

Full Screen

...85 token_list1 = '1 permit host 192.168.0.1'.split()86 token_list2 = '1 permit 192.168.0.1 0.0.0.0'.split()87 token_list3 = '1 permit 192.168.0.1'.split()88 token_list4 = '99 permit any'.split()89 self.assertEqual(exp_acl1, self.parser.create_acl(token_list1))90 self.assertEqual(exp_acl1, self.parser.create_acl(token_list2))91 self.assertEqual(exp_acl1, self.parser.create_acl(token_list3))92 self.assertEqual(exp_acl2, self.parser.create_acl(token_list4))93 def test_create_acl_stdAclWithModifiers(self):94 token_list = '1 permit any assign-queue 0'.split()95 acl = self.parser.create_acl(token_list)96 self.assertEqual('assign-queue 0', acl.get_surplus_params())97 def test_create_acl_extAclWithTooFewParametersShouldThrowException(self):98 token_list = '100 permit ip any'.split()99 self.assertRaisesRegex(EosAclParseError,100 "^ERROR: Extended ACEs need protocol, source "101 "and destination.*$",102 self.parser.create_acl, token_list)103 def test_create_acl_extAclWithWrongProtocolShouldThrowException(self):104 token_list = '100 permit unknown any any'.split()105 self.assertRaisesRegex(EosAclParseError,106 "^ERROR: Unsupported ACE protocol.*$",107 self.parser.create_acl, token_list)108 def test_create_acl_extAclWithInvalidSourceAddressShouldThrow(self):109 token_list = '100 deny ip unknown any'.split()110 self.assertRaisesRegex(EosAclParseError,111 "^src: ERROR: Invalid address in ACE"112 " config.*$",113 self.parser.create_acl, token_list)114 def test_create_acl_extAclWithIncompleteSrcAddressShouldThrow(self):115 token_list = '100 deny ip host any'.split()116 self.assertRaisesRegex(EosAclParseError,117 "^src: ERROR: Missing address parameter in ACE"118 " config.*$",119 self.parser.create_acl, token_list)120 def test_create_acl_extAclWithMissingSrcPortShouldThrowException(self):121 token_list = '100 deny ip host 10.0.0.1 eq any'.split()122 self.assertRaisesRegex(EosAclParseError,123 "^src: ERROR: Invalid port definition in ACE"124 " config.*$",125 self.parser.create_acl, token_list)126 def test_create_acl_extAclWithInvalidDestinationAddressShouldThrow(self):127 token_list = '100 deny ip any unknown'.split()128 self.assertRaisesRegex(EosAclParseError,129 "^dest: ERROR: Invalid address in ACE"130 " config.*$",131 self.parser.create_acl, token_list)132 def test_create_acl_extAclWithIncompleteDestAddressShouldThrow(self):133 token_list = '100 deny ip any host'.split()134 self.assertRaisesRegex(EosAclParseError,135 "^dest: ERROR: Missing address parameter in ACE"136 " config.*$",137 self.parser.create_acl, token_list)138 def test_create_acl_extAclWithMissingDestPortShouldThrowException(self):139 token_list = '100 deny ip host 10.0.0.1 any eq'.split()140 self.assertRaisesRegex(EosAclParseError,141 "^dest: ERROR: Missing port definition in ACE"142 " config.*$",143 self.parser.create_acl, token_list)144 def test_create_acl_extAclWithInvalidDestPortShouldThrowException(self):145 token_list = '100 deny ip host 10.0.0.1 any eq unknown'.split()146 self.assertRaisesRegex(EosAclParseError,147 "^dest: ERROR: Invalid port definition in ACE"148 " config.*$",149 self.parser.create_acl, token_list)150 def test_create_acl_extAclsShouldSucceed(self):151 token_list1 = '100 deny ip host 192.0.2.1 any'.split()152 token_list2 = \153 '100 deny ip 192.0.2.1 0.0.0.0 0.0.0.0 255.255.255.255'.split()154 exp_ace1 = ACE(action='deny', protocol='ip',155 source=IPv4Address('192.0.2.1'),156 source_mask=IPv4Address('0.0.0.0'),157 dest=IPv4Address('0.0.0.0'),158 dest_mask=IPv4Address('255.255.255.255'))159 exp_acl1 = ACL(number=100)160 exp_acl1.add_ace(exp_ace1)161 token_list3 = '399 permit 7 any any'.split()162 token_list4 = '399 permit tcp any any'.split()163 token_list5 = '399 permit tcp any eq 80 any'.split()164 token_list6 = '399 permit tcp any eq 80 any eq 23'.split()165 exp_ace2 = ACE(action='permit', protocol='tcp',166 source=IPv4Address('0.0.0.0'),167 source_mask=IPv4Address('255.255.255.255'),168 dest=IPv4Address('0.0.0.0'),169 dest_mask=IPv4Address('255.255.255.255'))170 exp_acl2 = ACL(number=399)171 exp_acl2.add_ace(exp_ace2)172 self.assertEqual(exp_acl1, self.parser.create_acl(token_list1))173 self.assertEqual(exp_acl1, self.parser.create_acl(token_list2))174 exp_ace2.set_protocol('7')175 self.assertEqual(exp_acl2, self.parser.create_acl(token_list3))176 exp_ace2.set_protocol('tcp')177 self.assertEqual(exp_acl2, self.parser.create_acl(token_list4))178 exp_ace2.set_source_op('eq')179 exp_ace2.set_source_port('80')180 self.assertEqual(exp_acl2, self.parser.create_acl(token_list5))181 exp_ace2.set_dest_op('eq')182 exp_ace2.set_dest_port('23')183 self.assertEqual(exp_acl2, self.parser.create_acl(token_list6))184 def test_create_acl_extAclWithModifiers(self):185 token_list = \186 '100 permit ip host 192.0.2.1 eq 23 0.0.0.0 255.255.255.255 ' \187 'eq 80 precedence 1 assign-queue 0'.split()188 acl = self.parser.create_acl(token_list)189 self.assertEqual('precedence 1 assign-queue 0',190 acl.get_surplus_params())191if __name__ == '__main__':192 unittest.main()...

Full Screen

Full Screen

test_acl.py

Source:test_acl.py Github

copy

Full Screen

1from unittest import TestCase2from unittest.mock import MagicMock3from fastly_bouncer.fastly_api import ACL4from fastly_bouncer.service import ACLCollection5def create_acl(name):6 return ACL(id="1", name=name, service_id="a", version="1")7class TestACLCollection(TestCase):8 def test_condition_generator(self):9 acl_collection = ACLCollection(1, MagicMock(), "servie_id", "3")10 acl_collection.acls = [11 create_acl("acl_1"),12 create_acl("acl_2"),13 create_acl("acl_3"),14 ]15 assert (16 acl_collection.generate_conditions()17 == "(client.ip ~ acl_1) || (client.ip ~ acl_2) || (client.ip ~ acl_3)"18 )19 acl_collection.acls = [create_acl("acl_1")]...

Full Screen

Full Screen

Automation Testing Tutorials

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.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run autotest automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful