Data Plane Testing
******************

OFTest Overview
===============

The oftest framework consists of a test server connected to a target switch through an OpenFlow channel and directly to the data plane ports of the OF switch.
After programming the switch, oftest inserts packets in the data plane and verifies if the output is as expected.

.. image:: ../images/testing-oftest.png

We recommend using a server connected to a management network, a switch connected to the same management network, and then a **minimum of 2 ports directly connected between the server and the switch**.
A few tests will fail if you have less than 3 ports.

OFTest Setup
============

To install OFTEST on ubuntu, type the following:

.. code-block:: console

    $ sudo apt-get install python python-pip python-dev python-lxml libffi-dev libssl-dev -y
    $ sudo pip install cryptography
    $ sudo pip install ncclient
    $ sudo pip install scapy pycrypto
    $ sudo apt-get install python-ecdsa git
    $ git clone https://gerrit.opencord.org/fabric-oftest

Now let's configure the switch and point it to the test server.
It can be done in the same way as connecting the switch to any controller.
See `Connect Switch to Controller <../installation.html#connect-switch-to-controller>`_ for more details.

Assuming that you plugged the ports ``12`` and ``24`` of the switch to interfaces ``eth1`` and ``eth2`` of the server, respectively, then the following command can tell you if everything is working.

.. code-block:: console

    $ cd oftest
    $ sudo ./oft -V1.3 --test-dir=ofdpa flows.PacketInArp -i 12@eth1 -i 24@eth2
    WARNING: No route found for IPv6 destination :: (no default route?)
    flows.PacketInArp ... ok
    ----------------------------------------------------------------------
    Ran 1 test in 4.044s
    OK

Run Tests
=========

The command below should give you the following result:

.. code-block:: console

    $ sudo ./oft -V1.3 --test-dir=ofdpa flows -i 12@eth1 -i 24@eth2
    flows.ArpNL2 ... FAIL
    flows.L2FloodQinQ ... ok
    flows.L2FloodTagged ... ok
    flows.L2FloodTaggedUnknownSrc ... ok
    flows.L2UnicastTagged ... ok
    flows.L3McastToL2 ... FAIL
    flows.L3McastToL3 ... FAIL
    flows.L3McastToVPN ... FAIL
    flows.L3UcastTagged ... ok
    flows.L3VPNMPLS ... ok
    flows.L3VPN_32 ... FAIL
    flows.MPLSBUG ... ok
    flows.MplsTermination ... FAIL
    flows.Mtu1500 ... ok
    flows.Mtu4000 ... ERROR
    flows.PacketInArp ... ok
    flows.PacketInSrcMacMiss ... FAIL
    flows.PacketInUDP ... ok

For example, in this case, all the multicast failed because we don't have three ports, the test L3VPN failed as well, and that is a bug of the current build.
The **PacketInSrcMac** Miss failed because Mac learning is not enabled.

.. note::
    Expected test results can be found in https://github.com/opencord/fabric-oftest/blob/master/README.md

.. tip::
    OFTest can't successfully delete all groups using an OF message, because of that some tests interfere with others.
    If the results seem suspicious, **erase the flow tables and group tables** and run the test alone.



