Bridge domain tests and user keywords refactor. 11/811/6
authorJan Gelety <jgelety@cisco.com>
Mon, 18 Apr 2016 22:07:13 +0000 (00:07 +0200)
committerStefan Kobza <skobza@cisco.com>
Fri, 22 Apr 2016 14:58:14 +0000 (14:58 +0000)
- BD tests changed to behavior-driven-test style
- added documentation to BD tests
- added documentation and examples to BD user KWs

Change-Id: Ifad45df3ef0bb55f5295363a264fe5f4e54f5762
Signed-off-by: Jan Gelety <jgelety@cisco.com>
resources/libraries/robot/bridge_domain.robot
resources/libraries/robot/interfaces.robot
tests/suites/bridge_domain/bridge_domain_untagged.robot [new file with mode: 0644]
tests/suites/bridge_domain/test.robot [deleted file]

index fe7553a..cd3b626 100644 (file)
 *** Settings ***
 | Library | resources.libraries.python.L2Util
 | Library | resources.libraries.python.InterfaceUtil
 *** Settings ***
 | Library | resources.libraries.python.L2Util
 | Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.NodePath
+| Resource | resources/libraries/robot/interfaces.robot
+| Resource | resources/libraries/robot/l2_traffic.robot
 
 *** Keywords ***
 
 *** Keywords ***
-| Vpp l2bd forwarding setup
-| | [Documentation] | Setup BD between 2 interfaces on VPP node and if learning
-| | ...             | is off set static L2FIB entry on second interface
-| | [Arguments] | ${node} | ${if1} | ${if2} | ${learn}=${TRUE} | ${mac}=${EMPTY}
-| | Set Interface State | ${node} | ${if1} | up
-| | Set Interface State | ${node} | ${if2} | up
-| | Vpp Add L2 Bridge Domain | ${node} | ${1} | ${if1} | ${if2} | ${learn}
-| | Run Keyword If | ${learn} == ${FALSE}
-| | ... | Vpp Add L2fib Entry | ${node} | ${mac} | ${if2} | ${1}
-| | All Vpp Interfaces Ready Wait | ${nodes}
+| Path for 2-node BD testing is set
+| | [Documentation] | Compute path for bridge domain testing on two given nodes
+| | ...             | and set corresponding test case variables.
+| | ...
+| | ... | *Arguments:*
+| | ... | - ${tg_node} - TG node. Type: dictionary
+| | ... | - ${dut_node} - DUT node. Type: dictionary
+| | ...
+| | ... | *Return:*
+| | ... | - No value returned
+| | ...
+| | ... | _NOTE:_ This KW sets following test case variables:
+| | ... | - ${tg_node} - TG node.
+| | ... | - ${tg_to_dut_if1} - 1st TG interface towards DUT.
+| | ... | - ${tg_to_dut_if2} - 2nd TG interface towards DUT.
+| | ... | - ${dut_node} - DUT node.
+| | ... | - ${dut_to_tg_if1} - 1st DUT interface towards TG.
+| | ... | - ${dut_to_tg_if2} - 2nd DUT interface towards TG.
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Given Path for 2-node BD testing is set \| ${nodes['TG']} \
+| | ... | \| ${nodes['DUT1']} \|
+| | [Arguments] | ${tg_node} | ${dut_node}
+| | Append Nodes | ${tg_node} | ${dut_node} | ${tg_node}
+| | Compute Path | always_same_link=${FALSE}
+| | ${tg_to_dut_if1} | ${tmp}= | First Interface
+| | ${tg_to_dut_if2} | ${tmp}= | Last Interface
+| | ${dut_to_tg_if1} | ${tmp}= | First Ingress Interface
+| | ${dut_to_tg_if2} | ${tmp}= | Last Egress Interface
+| | Set Test Variable | ${tg_to_dut_if1}
+| | Set Test Variable | ${tg_to_dut_if2}
+| | Set Test Variable | ${dut_to_tg_if1}
+| | Set Test Variable | ${dut_to_tg_if2}
+| | Set Test Variable | ${tg_node}
+| | Set Test Variable | ${dut_node}
+
+| Path for 3-node BD testing is set
+| | [Documentation] | Compute path for bridge domain testing on three given
+| | ...             | nodes and set corresponding test case variables.
+| | ...
+| | ... | *Arguments:*
+| | ... | - ${tg_node} - TG node. Type: dictionary
+| | ... | - ${dut1_node} - DUT1 node. Type: dictionary
+| | ... | - ${dut2_node} - DUT2 node. Type: dictionary
+| | ...
+| | ... | *Return:*
+| | ... | - No value returned
+| | ... |
+| | ... | _NOTE:_ This KW sets following test case variables:
+| | ... | - ${tg_node} - TG node.
+| | ... | - ${tg_to_dut1} - TG interface towards DUT1.
+| | ... | - ${tg_to_dut2} - TG interface towards DUT2.
+| | ... | - ${dut1_node} - DUT1 node.
+| | ... | - ${dut1_to_tg} - DUT1 interface towards TG.
+| | ... | - ${dut1_to_dut2} - DUT1 interface towards DUT2.
+| | ... | - ${dut2_node} - DUT2 node.
+| | ... | - ${dut2_to_tg} - DUT2 interface towards TG.
+| | ... | - ${dut2_to_dut1} - DUT2 interface towards DUT1.
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Given Path for 3-node BD testing is set \| ${nodes['TG']} \
+| | ... | \| ${nodes['DUT1']} \| ${nodes['DUT2']} \|
+| | [Arguments] | ${tg_node} | ${dut1_node} | ${dut2_node}
+| | Append Nodes | ${tg_node} | ${dut1_node} | ${dut2_node} | ${tg_node}
+| | Compute Path
+| | ${tg_to_dut1} | ${tmp}= | Next Interface
+| | ${dut1_to_tg} | ${tmp}= | Next Interface
+| | ${dut1_to_dut2} | ${tmp}= | Next Interface
+| | ${dut2_to_dut1} | ${tmp}= | Next Interface
+| | ${dut2_to_tg} | ${tmp}= | Next Interface
+| | ${tg_to_dut2} | ${tmp}= | Next Interface
+| | Set Test Variable | ${tg_to_dut1}
+| | Set Test Variable | ${dut1_to_tg}
+| | Set Test Variable | ${tg_to_dut2}
+| | Set Test Variable | ${dut2_to_tg}
+| | Set Test Variable | ${dut1_to_dut2}
+| | Set Test Variable | ${dut2_to_dut1}
+| | Set Test Variable | ${tg_node}
+| | Set Test Variable | ${dut1_node}
+| | Set Test Variable | ${dut2_node}
+
+| Bridge domain on DUT node is created
+| | [Documentation] | Create bridge domain on given VPP node with defined
+| | ...             | learning status.
+| | ...
+| | ... | *Arguments:*
+| | ... | - ${dut_node} - DUT node. Type: dictionary
+| | ... | - ${bd_id} - Bridge domain ID. Type: integer
+| | ... | - ${learn} - Enable/disable MAC learn. Type: boolean, \
+| | ... | default value: ${TRUE}
+| | ...
+| | ... | *Return:*
+| | ... | - No value returned
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Bridge domain on DUT node is created \| ${nodes['DUT1']} \| 2 \|
+| | ... | \| Bridge domain on DUT node is created \| ${nodes['DUT1']} \| 5 \
+| | ... | \| learn=${FALSE} \|
+| | [Arguments] | ${dut_node} | ${bd_id} | ${learn}=${TRUE}
+| | ${learn} = | Set Variable If | ${learn} == ${TRUE} | ${1} | ${0}
+| | Create L2 BD | ${dut_node} | ${bd_id} | learn=${learn}
+
+| Interface is added to bridge domain
+| | [Documentation] | Set given interface admin state to up and add this
+| | ...             | interface to required L2 bridge domain on defined
+| | ...             | VPP node.
+| | ...
+| | ... | *Arguments:*
+| | ... | - ${dut_node} - DUT node. Type: dictionary
+| | ... | - ${dut_if} - DUT node interface name. Type: string
+| | ... | - ${bd_id} - Bridge domain ID. Type: integer
+| | ...
+| | ... | *Return:*
+| | ... | - No value returned
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Interface is added to bridge domain \| ${nodes['DUT2']} \
+| | ... | \| GigabitEthernet0/8/0 \| 3 \|
+| | [Arguments] | ${dut_node} | ${dut_if} | ${bd_id}
+| | Set Interface State | ${dut_node} | ${dut_if} | up
+| | Add Interface To L2 BD | ${dut_node} | ${dut_if} | ${bd_id}
+
+| Destination port is added to L2FIB on DUT node
+| | [Documentation] | Create a static L2FIB entry for required destination port
+| | ...             | on defined interface and bridge domain ID
+| | ...             | of the given VPP node.
+| | ...
+| | ... | *Arguments:*
+| | ... | - ${dest_node} - Destination node. Type: dictionary
+| | ... | - ${dest_node_if} - Destination node interface name. Type: string
+| | ... | - ${vpp_node} - DUT node to add L2FIB entry on. Type: dictionary
+| | ... | - ${vpp_node_if} - DUT node interface name. Type: string
+| | ... | - ${bd_id} - Bridge domain ID. Type: integer
+| | ...
+| | ... | *Return:*
+| | ... | - No value returned
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Destination port is added to L2FIB on DUT node \| ${nodes['TG']} \
+| | ... | \| eth1 \| ${nodes['DUT2']} \| GigabitEthernet0/8/0 \| 3 \|
+| | [Arguments] | ${dest_node} | ${dest_node_if} | ${vpp_node}
+| | ...         | ${vpp_node_if} | ${bd_id}
+| | ${mac}= | Get Interface Mac | ${dest_node} | ${dest_node_if}
+| | Vpp Add L2fib Entry | ${vpp_node} | ${mac} | ${vpp_node_if} | ${bd_id}
index 649ee63..330cc79 100644 (file)
 | | # Ethernet MTU is physical layer MTU minus size of Ethernet header and FCS
 | | ${eth_mtu}= | Evaluate | ${mtu} - 14 - 4
 | | Set Interface Ethernet MTU | ${tg_node} | ${tg_port} | ${eth_mtu}
 | | # Ethernet MTU is physical layer MTU minus size of Ethernet header and FCS
 | | ${eth_mtu}= | Evaluate | ${mtu} - 14 - 4
 | | Set Interface Ethernet MTU | ${tg_node} | ${tg_port} | ${eth_mtu}
+
+| Interfaces on all VPP nodes in the path are up
+| | [Documentation] | Wait until all interfaces of the given VPP node
+| | ...             | with admin-up state are in link-up state.
+| | ...
+| | ... | *Arguments:*
+| | ... | - @{node_list} - DUT nodes. Type: list
+| | ...
+| | ... | *Return:*
+| | ... | - No value returned
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Interfaces on all VPP nodes in the path are up \
+| | ... | \| ${nodes['DUT1']} \| ${nodes['DUT2']} \|
+| | [Arguments] | @{node_list}
+| | :FOR | ${node} | IN | @{node_list}
+| |      | VPP Node Interfaces Ready Wait | ${node}
diff --git a/tests/suites/bridge_domain/bridge_domain_untagged.robot b/tests/suites/bridge_domain/bridge_domain_untagged.robot
new file mode 100644 (file)
index 0000000..badc7a6
--- /dev/null
@@ -0,0 +1,120 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+*** Settings ***
+| Resource | resources/libraries/robot/default.robot
+| Resource | resources/libraries/robot/bridge_domain.robot
+| Library  | resources.libraries.python.Trace
+| Force Tags | HW_ENV | VM_ENV
+| Test Setup | Run Keywords | Setup all DUTs before test
+| ...        | AND          | Setup all TGs before traffic script
+| Test Teardown | Show Packet Trace on All DUTs | ${nodes}
+| Documentation | *Bridge domain test suite.*
+| ...
+| ... | Test suite uses 2-node topology TGTG - DUT1 - TG with two links
+| ... | between nodes as well as 3-node topology TG - DUT1 - DUT2 - TG
+| ... | with one link between nodes. Test packets are sent in both directions
+| ... | and contain Ethernet header, IPv4 header and ICMP message. Ethernet
+| ... | header MAC addresses are matching MAC addresses of the TG node.
+
+*** Variables ***
+| ${bd_id1} = | 1
+| ${bd_id2} = | 2
+
+*** Test Cases ***
+| VPP reports interfaces
+| | [Documentation] | Report VPP interfaces on the given node
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO | 3_NODE_SINGLE_LINK_TOPO
+| | VPP reports interfaces on | ${nodes['DUT1']}
+
+| Vpp forwards packets via L2 bridge domain 2 ports
+| | [Documentation] | Create bridge domain (learning enabled) on one VPP node,
+| | ...             | add there two interfaces and check traffic
+| | ...             | bidirectionally.
+| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
+| | Given Path for 2-node BD testing is set | ${nodes['TG']} | ${nodes['DUT1']}
+| | When Bridge domain on DUT node is created | ${dut_node} | ${bd_id1}
+| | And Interface is added to bridge domain | ${dut_node} | ${dut_to_tg_if1}
+| | ...                                     | ${bd_id1}
+| | And Interface is added to bridge domain | ${dut_node} | ${dut_to_tg_if2}
+| | ...                                     | ${bd_id1}
+| | And Interfaces on all VPP nodes in the path are up | ${dut_node}
+| | Then Send and receive ICMPv4 bidirectionally | ${tg_node} | ${tg_to_dut_if1}
+| | ...                                     | ${tg_to_dut_if2}
+
+| Vpp forwards packets via L2 bridge domain in circular topology
+| | [Documentation] | Create bridge domains (learning enabled) on two VPP nodes,
+| | ...             | add two interfaces to each bridge domain and check traffic
+| | ...             | bidirectionally.
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
+| | Given Path for 3-node BD testing is set | ${nodes['TG']} | ${nodes['DUT1']}
+| | ...                                     | ${nodes['DUT2']}
+| | When Bridge domain on DUT node is created | ${dut1_node} | ${bd_id1}
+| | And Interface is added to bridge domain | ${dut1_node} | ${dut1_to_tg}
+| | ...                                     | ${bd_id1}
+| | And Interface is added to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ...                                     | ${bd_id1}
+| | And Bridge domain on DUT node is created | ${dut2_node} | ${bd_id2}
+| | And Interface is added to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ...                                     | ${bd_id2}
+| | And Interface is added to bridge domain | ${dut2_node} | ${dut2_to_dut1}
+| | ...                                     | ${bd_id2}
+| | And Interfaces on all VPP nodes in the path are up | ${dut1_node}
+| | ...                                                | ${dut2_node}
+| | Then Send and receive ICMPv4 bidirectionally | ${tg_node} | ${tg_to_dut1}
+| | ...                                          | ${tg_to_dut2}
+
+| Vpp forwards packets via L2 bridge domain in circular topology with static L2FIB entries
+| | [Documentation] | Create bridge domains (learning disabled) on two VPP
+| | ...             | nodes, add two interfaces to each bridge domain and set
+| | ...             | static L2FIB entry on each interface and check traffic
+| | ...             | bidirectionally.
+| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
+| | Given Path for 3-node BD testing is set | ${nodes['TG']} | ${nodes['DUT1']}
+| | ...                                     | ${nodes['DUT2']}
+| | When Bridge domain on DUT node is created | ${dut1_node} | ${bd_id1}
+| | ...                                       | learn=${FALSE}
+| | And Interface is added to bridge domain | ${dut1_node} | ${dut1_to_tg}
+| | ...                                     | ${bd_id1}
+| | And Interface is added to bridge domain | ${dut1_node} | ${dut1_to_dut2}
+| | ...                                     | ${bd_id1}
+| | And Destination port is added to L2FIB on DUT node | ${tg_node}
+| | ...                                                | ${tg_to_dut1}
+| | ...                                                | ${dut1_node}
+| | ...                                                | ${dut1_to_tg}
+| | ...                                                | ${bd_id1}
+| | And Destination port is added to L2FIB on DUT node | ${tg_node}
+| | ...                                                | ${tg_to_dut2}
+| | ...                                                | ${dut1_node}
+| | ...                                                | ${dut1_to_dut2}
+| | ...                                                | ${bd_id1}
+| | And Bridge domain on DUT node is created | ${dut2_node} | ${bd_id2}
+| | ...                                      | learn=${FALSE}
+| | And Interface is added to bridge domain | ${dut2_node} | ${dut2_to_tg}
+| | ...                                     | ${bd_id2}
+| | And Interface is added to bridge domain | ${dut2_node} | ${dut2_to_dut1}
+| | ...                                     | ${bd_id2}
+| | And Destination port is added to L2FIB on DUT node | ${tg_node}
+| | ...                                                | ${tg_to_dut1}
+| | ...                                                | ${dut2_node}
+| | ...                                                | ${dut2_to_dut1}
+| | ...                                                | ${bd_id2}
+| | And Destination port is added to L2FIB on DUT node | ${tg_node}
+| | ...                                                | ${tg_to_dut2}
+| | ...                                                | ${dut2_node}
+| | ...                                                | ${dut2_to_tg}
+| | ...                                                | ${bd_id2}
+| | And Interfaces on all VPP nodes in the path are up | ${dut1_node}
+| | ...                                                | ${dut2_node}
+| | Then Send and receive ICMPv4 bidirectionally | ${tg_node} | ${tg_to_dut1}
+| | ...                                          | ${tg_to_dut2}
diff --git a/tests/suites/bridge_domain/test.robot b/tests/suites/bridge_domain/test.robot
deleted file mode 100644 (file)
index a2cf0c0..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright (c) 2016 Cisco and/or its affiliates.
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-*** Settings ***
-| Resource | resources/libraries/robot/default.robot
-| Resource | resources/libraries/robot/interfaces.robot
-| Resource | resources/libraries/robot/bridge_domain.robot
-| Resource | resources/libraries/robot/l2_traffic.robot
-| Library | resources.libraries.python.NodePath
-| Force Tags | HW_ENV | VM_ENV
-| Suite Setup | Setup all TGs before traffic script
-| Test Setup | Setup all DUTs before test
-
-*** Test Cases ***
-| VPP reports interfaces
-| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO | 3_NODE_SINGLE_LINK_TOPO
-| | VPP reports interfaces on | ${nodes['DUT1']}
-
-| Vpp forwards packets via L2 bridge domain 2 ports
-| | [Tags] | 3_NODE_DOUBLE_LINK_TOPO
-| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['TG']}
-| | Compute Path | always_same_link=${FALSE}
-| | ${tg_if1} | ${tmp}= | First Interface
-| | ${tg_if2} | ${tmp}= | Last Interface
-| | ${bd_if1} | ${tmp}= | First Ingress Interface
-| | ${bd_if2} | ${tmp}= | Last Egress Interface
-| | Vpp l2bd forwarding setup | ${nodes['DUT1']} | ${bd_if1} | ${bd_if2}
-| | Send and receive ICMPv4 bidirectionally | ${nodes['TG']} | ${tg_if1} | ${tg_if2}
-
-| Vpp forwards packets via L2 bridge domain in circular topology
-| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
-| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
-| | ...          | ${nodes['TG']}
-| | Compute Path
-| | ${tg_if1} | ${tg}= | Next Interface
-| | ${dut1_if1} | ${dut1}= | Next Interface
-| | ${dut1_if2} | ${dut1}= | Next Interface
-| | ${dut2_if1} | ${dut2}= | Next Interface
-| | ${dut2_if2} | ${dut2}= | Next Interface
-| | ${tg_if2} | ${tg}= | Next Interface
-| | Vpp l2bd forwarding setup | ${dut1} | ${dut1_if1} | ${dut1_if2}
-| | Vpp l2bd forwarding setup | ${dut2} | ${dut2_if1} | ${dut2_if2}
-| | Send and receive ICMPv4 bidirectionally | ${tg} | ${tg_if1} | ${tg_if2}
-
-| Vpp forwards packets via L2 bridge domain in circular topology with static L2FIB entries
-| | [Tags] | 3_NODE_SINGLE_LINK_TOPO
-| | Append Nodes | ${nodes['TG']} | ${nodes['DUT1']} | ${nodes['DUT2']}
-| | ...          | ${nodes['TG']}
-| | Compute Path
-| | ${tg_if1} | ${tg}= | Next Interface
-| | ${dut1_if1} | ${dut1}= | Next Interface
-| | ${dut1_if2} | ${dut1}= | Next Interface
-| | ${dut2_if1} | ${dut2}= | Next Interface
-| | ${dut2_if2} | ${dut2}= | Next Interface
-| | ${tg_if2} | ${tg}= | Next Interface
-| | ${mac}= | Get Interface Mac | ${tg} | ${tg_if2}
-| | Vpp l2bd forwarding setup | ${dut1} | ${dut1_if1} | ${dut1_if2} | ${FALSE}
-| | ...                       | ${mac}
-| | Vpp l2bd forwarding setup | ${dut2} | ${dut2_if1} | ${dut2_if2} | ${FALSE}
-| | ...                       | ${mac}
-| | Send and receive ICMPv4 bidirectionally | ${tg} | ${tg_if1} | ${tg_if2}