sw test tool: add unit test

Signed-off-by: Minoru TAKAHASHI <takahashi.minoru7@gmail.com>
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
Minoru TAKAHASHI 2014-09-12 17:32:48 +09:00 committed by FUJITA Tomonori
parent 688351a817
commit 43ab3472ff
2 changed files with 464 additions and 0 deletions

View File

View File

@ -0,0 +1,464 @@
# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
#
# 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.
# vim: tabstop=4 shiftwidth=4 softtabstop=4
import unittest
from nose.tools import *
import binascii
import inspect
import json
import logging
import math
import netaddr
import os
import signal
import sys
import time
import traceback
from random import randint
from ryu import cfg
# import all packet libraries.
PKT_LIB_PATH = 'ryu.lib.packet'
for modname, moddef in sys.modules.iteritems():
if not modname.startswith(PKT_LIB_PATH) or not moddef:
continue
for (clsname, clsdef, ) in inspect.getmembers(moddef):
if not inspect.isclass(clsdef):
continue
exec 'from %s import %s' % (modname, clsname)
from ryu.base import app_manager
from ryu.controller import handler
from ryu.controller import ofp_event
from ryu.controller.handler import set_ev_cls
from ryu.exception import RyuException
from ryu.lib import dpid as dpid_lib
from ryu.lib import hub
from ryu.lib import stringify
from ryu.lib.packet import packet
from ryu.ofproto import ofproto_protocol
from ryu.ofproto import ofproto_v1_3
from ryu.ofproto import ofproto_v1_3_parser
from ryu.ofproto import ofproto_v1_4
from ryu.tests.switch.tester import TestPatterns
from ryu.tests.switch.tester import TestFile
from ryu.tests.switch.tester import OfTester
CONF = cfg.CONF
LOG = logging.getLogger('test_tester')
SAMPLE_DESC = "action: 00_OUTPUT"
class Test_tester(unittest.TestCase):
""" Test case for tester
"""
# action/00_OUTPUT.json
test_json_1 = {
"description": "ethernet/ipv4/tcp-->'actions=output:2'",
"prerequisite": [
{
"OFPFlowMod": {
"table_id": 0,
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"port": "target_send_port_1"
}
}
],
"type": 4
}
}
]
}
}
],
"tests": [
{
"ingress": [
"ethernet(dst='22:22:22:22:22:22', \
src='12:11:11:11:11:11', ethertype=2048)",
"ipv4(tos=32, proto=6, src='192.168.10.10', \
dst='192.168.20.20', ttl=64)",
"tcp(dst_port=2222, option=str('\\x00' * 4), \
src_port=11111)",
"'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x0\
8\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x1\
2\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1\
b\\x1c\\x1d\\x1e\\x1f'"
],
"egress":[
"ethernet(dst='22:22:22:22:22:22', \
src='12:11:11:11:11:11', ethertype=2048)",
"ipv4(tos=32, proto=6, src='192.168.10.10', \
dst='192.168.20.20', ttl=64)",
"tcp(dst_port=2222, option=str('\\x00' * 4), \
src_port=11111)",
"'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x0\
8\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x1\
2\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1\
b\\x1c\\x1d\\x1e\\x1f'"
]
}
]
}
# group/00_ALL.json
test_json_2 = {
"description": "2Mbps(ethernet/ipv4/tcp)-->'in_port=1,\
actions=group:all(actions=output:2/actions=output:3)'",
"prerequisite": [
{
"OFPGroupMod": {
"group_id": 0,
"buckets": [
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"port": "target_send_port_1"
}
}
]
}
},
{
"OFPBucket": {
"actions": [
{
"OFPActionOutput": {
"port": "target_send_port_2"
}
}
]
}
}
]
}
},
{
"OFPFlowMod": {
"match": {
"OFPMatch": {
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"value": "target_recv_port"
}
}
]
}
},
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionGroup": {
"group_id": 0
}
}
],
"type": 4
}
}
]
}
}
],
"tests": [
{
"ingress": {
"packets": {
"data": [
"ethernet(dst='22:22:22:22:22:22', \
src='12:11:11:11:11:11', ethertype=2048)",
"ipv4(proto=6)",
"tcp()",
"str('\\x11' * (1500 - 54))"
],
"pktps":175,
"duration_time":30
}
},
"egress":{
"throughput": [
{
"OFPMatch": {
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"value": "tester_recv_port_1"
}
}
]
},
"kbps": 2000
},
{
"OFPMatch": {
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"value": "tester_recv_port_2"
}
}
]
},
"kbps": 2000
}
]
}
}
]
}
# match/00_IN_PORT.json
test_json_3 = {
"description": "ethernet/ipv4/tcp-->'in_port=1,actions=output:2'",
"prerequisite": [
{
"OFPFlowMod": {
"table_id": 0,
"match": {
"OFPMatch": {
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"value": "target_recv_port"
}
}
]
}
},
"instructions": [
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"port": "target_send_port_1"
}
}
],
"type": 4
}
}
]
}
}
],
"tests": [
{
"ingress": [
"ethernet(dst='22:22:22:22:22:22', \
src='12:11:11:11:11:11', ethertype=2048)",
"ipv4(tos=32, proto=6, src='192.168.10.10', \
dst='192.168.20.20', ttl=64)",
"tcp(dst_port=2222, option=str('\\x00' * 4), \
src_port=11111)",
"'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x0\
8\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x1\
2\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1\
b\\x1c\\x1d\\x1e\\x1f'"
],
"egress":[
"ethernet(dst='22:22:22:22:22:22', \
src='12:11:11:11:11:11', ethertype=2048)",
"ipv4(tos=32, proto=6, src='192.168.10.10',\
dst='192.168.20.20', ttl=64)",
"tcp(dst_port=2222, option=str('\\x00' * 4), \
src_port=11111)",
"'\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x0\
8\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x1\
2\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1\
b\\x1c\\x1d\\x1e\\x1f'"
]
}
]
}
# meter/01_DROP_00_KBPS_00_1M.json
test_json_4 = {
"description": "2Mbps(ethernet/ipv4/tcp)-->'in_port=1,\
actions=meter:1Mbps(drop),output:2'",
"prerequisite": [
{
"OFPMeterMod": {
"meter_id": 1,
"bands": [
{
"OFPMeterBandDrop": {
"rate": 1000
}
}
]
}
},
{
"OFPFlowMod": {
"match": {
"OFPMatch": {
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"value": "target_recv_port"
}
}
]
}
},
"instructions": [
{
"OFPInstructionMeter": {
"meter_id": 1
}
},
{
"OFPInstructionActions": {
"actions": [
{
"OFPActionOutput": {
"port": "target_send_port_1"
}
}
],
"type": 4
}
}
]
}
}
],
"tests": [
{
"ingress": {
"packets": {
"data": [
"ethernet(dst='22:22:22:22:22:22', \
src='12:11:11:11:11:11', ethertype=2048)",
"ipv4(proto=6)",
"tcp()",
"str('\\x11' * (1500 - 54))"
],
"pktps":175,
"duration_time":30
}
},
"egress":{
"throughput": [
{
"OFPMatch": {
"oxm_fields": [
{
"OXMTlv": {
"field": "in_port",
"value": "tester_recv_port_1"
}
}
]
},
"kbps": 1000
}
]
}
}
]
}
def setUp(self):
OfTester.tester_ver = ofproto_v1_3.OFP_VERSION
OfTester.target_ver = ofproto_v1_3.OFP_VERSION
def tearDown(self):
pass
def test__normalize_test_json(self):
self.tests = TestPatterns(
"../switch/of13/action/00_OUTPUT.json",
logging.getLogger("test_tester"))
self.tests[SAMPLE_DESC]._normalize_test_json(Test_tester.test_json_1)
self.tests[SAMPLE_DESC]._normalize_test_json(Test_tester.test_json_2)
self.tests[SAMPLE_DESC]._normalize_test_json(Test_tester.test_json_3)
self.tests[SAMPLE_DESC]._normalize_test_json(Test_tester.test_json_4)
# action/00_OUTPUT.json
eq_(Test_tester.test_json_1["prerequisite"][0]["OFPFlowMod"][
"instructions"][0]["OFPInstructionActions"][
"actions"][0]["OFPActionOutput"]["port"],
CONF['test-switch']['target_send_port_1'])
# group/00_ALL.json
eq_(Test_tester.test_json_2["prerequisite"][1]["OFPFlowMod"][
"match"]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
CONF['test-switch']['target_recv_port'])
eq_(Test_tester.test_json_2["prerequisite"][0]["OFPGroupMod"][
"buckets"][0]["OFPBucket"]["actions"][0]["OFPActionOutput"][
"port"], CONF['test-switch']['target_send_port_1'])
eq_(Test_tester.test_json_2["prerequisite"][0]["OFPGroupMod"][
"buckets"][1]["OFPBucket"]["actions"][0]["OFPActionOutput"][
"port"], CONF['test-switch']['target_send_port_2'])
eq_(Test_tester.test_json_2["tests"][0]["egress"]["throughput"][
0]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
CONF['test-switch']['tester_recv_port_1'])
eq_(Test_tester.test_json_2["tests"][0]["egress"]["throughput"][
1]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
CONF['test-switch']['tester_recv_port_2'])
# match/00_IN_PORT.json
eq_(Test_tester.test_json_3["prerequisite"][0]["OFPFlowMod"][
"match"]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
CONF['test-switch']['target_recv_port'])
eq_(Test_tester.test_json_3["prerequisite"][0]["OFPFlowMod"][
"instructions"][0]["OFPInstructionActions"]["actions"][0][
"OFPActionOutput"]["port"], CONF['test-switch'][
'target_send_port_1'])
# meter/01_DROP_00_KBPS_00_1M.json
eq_(Test_tester.test_json_4["prerequisite"][1]["OFPFlowMod"][
"match"]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
CONF['test-switch']['target_recv_port'])
eq_(Test_tester.test_json_4["prerequisite"][1]["OFPFlowMod"][
"instructions"][1]["OFPInstructionActions"]["actions"][0][
"OFPActionOutput"]["port"],
CONF['test-switch']['target_send_port_1'])
eq_(Test_tester.test_json_4["tests"][0]["egress"]["throughput"][
0]["OFPMatch"]["oxm_fields"][0]["OXMTlv"]["value"],
CONF['test-switch']['tester_recv_port_1'])