Added really bad flow tests, and makefile magic for main project to run adapter tests
Change-Id: I73034e0f0eba43a806a5787acf6119f63d44f0e7
diff --git a/Makefile b/Makefile
index 9ab86e3..63f4869 100644
--- a/Makefile
+++ b/Makefile
@@ -459,11 +459,16 @@
nosetests -s tests --exclude-dir=./tests/itests/run_as_root/
endif
+TEST_ADAPTERS := $(shell find ./voltha/adapters -name test.mk)
+
ifneq ($(VOLTHA_BUILD),docker)
utest: venv protos
@ echo "Executing all unit tests"
- . ${VENVDIR}/bin/activate && \
- for d in $$(find ./tests/utests -type d|sort -nr); do echo $$d:; nosetests $$d; done
+ @ . ${VENVDIR}/bin/activate && nosetests ./tests/utests
+ @ for test in $(TEST_ADAPTERS); do \
+ echo Adapter Tests $$test:; \
+ $(MAKE) -f $$test; \
+ done
else
utest: protos test_runner
docker run \
@@ -475,9 +480,10 @@
--rm --net=host -v /var/run/docker.sock:/var/run/docker.sock \
${REGISTRY}${REPSOITORY}voltha-test_runner:${TAG} \
bash -c \
- 'for d in $$(find ./tests/utests -type d|sort -nr); do \
- echo $$d:; \
- nosetests $$d; \
+ '. ${VENVDIR}/bin/activate && nosetests ./tests/utests; \
+ for test in $(TEST_ADAPTERS); do \
+ echo Adapter Tests $$test:; \
+ $(MAKE) -f $$test; \
done'
endif
@@ -487,6 +493,10 @@
utest-with-coverage: venv protos
@ echo "Executing all unit tests and producing coverage results"
@ . ${VENVDIR}/bin/activate && nosetests $(COVERAGE_OPTS) ./tests/utests
+ @ for test in $(TEST_ADAPTERS); do \
+ echo Adapter Tests $$test:; \
+ $(MAKE) -f $$test; \
+ done
else
utest-with-coverage: protos test_runner
@echo "Executing all unit tests and producing coverage results"
@@ -498,7 +508,12 @@
-e DOCKER_HOST_IP=${DOCKER_HOST_IP} \
--rm --net=host -v /var/run/docker.sock:/var/run/docker.sock \
${REGISTRY}${REPSOITORY}voltha-test_runner:${TAG} \
- nosetests ${COVERAGE_OPTS} ./tests/utests;
+ bash -c \
+ 'nosetests ${COVERAGE_OPTS} ./tests/utests; \
+ for test in $(TEST_ADAPTERS); do \
+ echo Adapter Tests $$test:; \
+ $(MAKE) -f $$test; \
+ done'
endif
ifneq ($(VOLTHA_BUILD),docker)
diff --git a/tests/utests/voltha/adapters/adtran_olt/flow/test_flow_entry.py b/tests/utests/voltha/adapters/adtran_olt/flow/test_flow_entry.py
deleted file mode 100644
index dd9c0de..0000000
--- a/tests/utests/voltha/adapters/adtran_olt/flow/test_flow_entry.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# from voltha.adapters.adtran_olt.adtran_device_handler import DEFAULT_MULTICAST_VLAN, DEFAULT_UTILITY_VLAN
-# from voltha.adapters.adtran_olt.adtran_olt_handler import *
-# from voltha.adapters.adtran_olt.flow.flow_entry import *
-# from voltha.core.flow_decomposer import mk_flow_stat
-# import mock
-#
-#
-# class TestFlowEntry(object):
-# def setUp(self):
-# def get_pon(pon_id):
-# p = mock.MagicMock()
-# p.gem_ids = lambda a, b, c, d: {
-# 100: ([2048], 1234)
-# }
-# p.pon_id = pon_id
-# return p
-#
-# self.handler = mock.MagicMock(spec=AdtranOltHandler)
-# self.handler.device_id = 9876543210
-# self.handler.multicast_vlans = [DEFAULT_MULTICAST_VLAN]
-# self.handler.multicast_vlans = DEFAULT_UTILITY_VLAN
-# self.handler.northbound_ports = {1: None}
-# self.handler.exception_gems = False
-# self.handler.is_nni_port = lambda n: n in self.handler.northbound_ports
-# self.handler.is_pon_port = lambda n: not self.handler.is_nni_port(n)
-# self.handler.get_southbound_port = get_pon
-# self.handler.get_port_name = lambda n: "mock-{} 0/{}".format(
-# "uni" if n not in self.handler.northbound_ports else "nni",
-# n)
-#
-# def test_create(self):
-# downstream = mk_flow_stat(priority=40000,
-# match_fields=[
-# in_port(1),
-# vlan_vid(ofp.OFPVID_PRESENT | 4),
-# vlan_pcp(7),
-# metadata(666)
-# ],
-# actions=[
-# pop_vlan(),
-# output(5)
-# ])
-# ds_entry, ds_evc = FlowEntry.create(downstream, self.handler)
-# assert ds_entry is not None, "Entry already exists"
-# assert ds_evc is None, "EVC not labeled"
-#
-# upstream = mk_flow_stat(priority=40000,
-# match_fields=[
-# in_port(5),
-# vlan_vid(ofp.OFPVID_PRESENT | 666),
-# vlan_pcp(7)
-# ],
-# actions=[
-# push_vlan(0x8100),
-# set_field(vlan_vid(ofp.OFPVID_PRESENT | 4)),
-# set_field(vlan_pcp(7)),
-# output(1)
-# ])
-# us_entry, us_evc = FlowEntry.create(upstream, self.handler)
-# assert us_entry is not None, "Entry doesn't exist"
-# assert us_evc is not None, "EVC not labeled"
-# us_evc._do_install()
-# assert us_evc._installed, "EVC wasn't installed"
-# edit_configs = self.handler.netconf_client.edit_config.call_args_list
-# assert len(edit_configs) == 3, "EVC, EVC-MAP, and ACL edit config"
-# for call in edit_configs:
-# log.info("Netconf Calls: {}".format(call))
diff --git a/voltha/adapters/adtran_olt/Makefile b/voltha/adapters/adtran_olt/Makefile
index ff9a598..bbd25fb 100644
--- a/voltha/adapters/adtran_olt/Makefile
+++ b/voltha/adapters/adtran_olt/Makefile
@@ -1,36 +1 @@
-THIS_MAKEFILE := $(abspath $(MAKEFILE_LIST) )
-WORKING_DIR := $(dir $(THIS_MAKEFILE) )
-ADAPTERS_DIR := $(dir $(patsubst %/,%,$(WORKING_DIR)))
-VOLTHA_DIR := $(dir $(patsubst %/,%,$(ADAPTERS_DIR)))
-
-VENVDIR=$(WORKING_DIR)venv
-TESTDIR=$(WORKING_DIR)test
-
-PYTHONPATH := $(PYTHONPATH):$(VOLTHA_DIR)protos/third_party;
-IN_VENV=. '$(VENVDIR)/bin/activate';
-
-PROFILING=--profile-svg
-DOT := $(shell command -v dot 2> /dev/null)
-ifndef DOT
-$(warning "dot is not available please install graphviz")
-PROFILING=
-endif
-
-RUN_PYTEST=$(IN_VENV) PYTHONPATH=$(PYTHONPATH) py.test -vvlx $(PROFILING) --cov=$(WORKING_DIR) --cov-report term-missing --cov-report html
-
-$(VENVDIR):
- @virtualenv -p python2 $(VENVDIR)
- @virtualenv -p python2 --relocatable $(VENVDIR)
-
-.PHONY: create-venv
-create-venv: $(VENVDIR)
-
-.PHONY: test
-test: create-venv
- @$(IN_VENV) command -v py.test > /dev/null 2>&1 || `echo >&2 "'make requirements' first. Aborting."; exit 1;`
- @rm -rf $(TESTDIR)/__pycache__
- @cd $(WORKING_DIR) && $(RUN_PYTEST) $(TESTDIR)
-
-.PHONY: requirements
-requirements: create-venv
- @$(IN_VENV) pip install --upgrade -r test_requirements.txt
+include test.mk
\ No newline at end of file
diff --git a/voltha/adapters/adtran_olt/flow/flow_entry.py b/voltha/adapters/adtran_olt/flow/flow_entry.py
index 04aa9eb..5f4e56e 100644
--- a/voltha/adapters/adtran_olt/flow/flow_entry.py
+++ b/voltha/adapters/adtran_olt/flow/flow_entry.py
@@ -392,8 +392,7 @@
# basic rules are:
#
# 1 - Port numbers in increasing order
- ports = [self.in_port, self.output]
- ports.sort()
+ ports = sorted([self.in_port, self.output])
assert len(ports) == 2, 'Invalid port count: {}'.format(len(ports))
# 3 - The outer VID
diff --git a/voltha/adapters/adtran_olt/test.mk b/voltha/adapters/adtran_olt/test.mk
new file mode 100644
index 0000000..dcbf19d
--- /dev/null
+++ b/voltha/adapters/adtran_olt/test.mk
@@ -0,0 +1,38 @@
+THIS_MAKEFILE := $(abspath $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
+WORKING_DIR := $(dir $(THIS_MAKEFILE) )
+ADAPTERS_DIR := $(dir $(patsubst %/,%,$(WORKING_DIR)))
+VOLTHA_DIR := $(dir $(patsubst %/,%,$(ADAPTERS_DIR)))
+PROJ_DIR := $(VOLTHA_DIR)../
+
+VENVDIR=$(PROJ_DIR)venv-$(shell uname -s | tr '[:upper:]' '[:lower:]')
+TESTDIR=$(WORKING_DIR)test
+PYTHONPATH := $(PYTHONPATH):$(VOLTHA_DIR)protos/third_party;
+IN_VENV=. '$(VENVDIR)/bin/activate';
+
+PROFILING=--profile-svg
+DOT := $(shell command -v dot 2> /dev/null)
+ifndef DOT
+$(warning "dot is not available please install graphviz")
+PROFILING=
+endif
+
+RUN_PYTEST=$(IN_VENV) PYTHONPATH=$(PYTHONPATH) py.test -vvlx $(PROFILING) --cov=$(WORKING_DIR) --cov-report term-missing --cov-report html
+
+.PHONY: test
+test: requirements
+ @$(IN_VENV) command -v py.test > /dev/null 2>&1 || `echo >&2 "'make requirements' first. Aborting."; exit 1;`
+ @rm -rf $(TESTDIR)/__pycache__
+ @cd $(WORKING_DIR) && $(RUN_PYTEST) $(TESTDIR)
+
+.PHONY: create-venv
+create-venv: $(VENVDIR)/.built
+
+
+$(VENVDIR)/.built:
+ cd $(PROJ_DIR); make venv
+# @virtualenv -p python2 $(VENVDIR)
+# @virtualenv -p python2 --relocatable $(VENVDIR)
+
+.PHONY: requirements
+requirements: create-venv
+ @$(IN_VENV) pip install --upgrade -r $(WORKING_DIR)test_requirements.txt
diff --git a/tests/utests/voltha/adapters/adtran_olt/flow/__init__.py b/voltha/adapters/adtran_olt/test/flow/__init__.py
similarity index 100%
rename from tests/utests/voltha/adapters/adtran_olt/flow/__init__.py
rename to voltha/adapters/adtran_olt/test/flow/__init__.py
diff --git a/tests/utests/voltha/adapters/adtran_olt/flow/test_evc.py b/voltha/adapters/adtran_olt/test/flow/test_evc.py
similarity index 95%
rename from tests/utests/voltha/adapters/adtran_olt/flow/test_evc.py
rename to voltha/adapters/adtran_olt/test/flow/test_evc.py
index 19cc38c..aed6f60 100644
--- a/tests/utests/voltha/adapters/adtran_olt/flow/test_evc.py
+++ b/voltha/adapters/adtran_olt/test/flow/test_evc.py
@@ -1,5 +1,5 @@
-from nose.twistedtools import deferred
from collections import namedtuple
+import pytest_twisted
from voltha.adapters.adtran_olt.flow.evc import EVC
from mock import MagicMock
from twisted.internet import reactor, defer
@@ -12,7 +12,7 @@
assert str(evc) == "EVC-VOLTHA-1: MEN: [], S-Tag: None"
-@deferred()
+@pytest_twisted.inlineCallbacks
def test_evc_do_simple_install():
flow = MagicMock()
flow.flow_id = 1
@@ -42,10 +42,10 @@
flow.handler.netconf_client.edit_config.assert_called_with(xml)
assert evc.installed
d.addCallback(callback)
- return d
+ yield d
-@deferred()
+@pytest_twisted.inlineCallbacks
def test_evc_do_remove():
def get_evc_response():
d = defer.Deferred()
@@ -74,4 +74,4 @@
client.get.assert_called_with(get_xml)
client.edit_config.assert_called_with(delete_xml)
d.addCallback(callback)
- return d
+ yield d
diff --git a/voltha/adapters/adtran_olt/test/flow/test_flow_entry.py b/voltha/adapters/adtran_olt/test/flow/test_flow_entry.py
new file mode 100644
index 0000000..0fbc2b3
--- /dev/null
+++ b/voltha/adapters/adtran_olt/test/flow/test_flow_entry.py
@@ -0,0 +1,64 @@
+import pytest
+from voltha.adapters.adtran_olt.adtran_device_handler import DEFAULT_MULTICAST_VLAN, DEFAULT_UTILITY_VLAN
+from voltha.adapters.adtran_olt.adtran_olt_handler import *
+from voltha.adapters.adtran_olt.flow.flow_entry import *
+from voltha.adapters.adtran_olt.flow.flow_tables import DownstreamFlows, DeviceFlows
+from voltha.core.flow_decomposer import mk_flow_stat
+import mock
+
+
+@pytest.yield_fixture()
+def flow_handler():
+ handler = mock.MagicMock(spec=AdtranOltHandler)
+ handler.device_id = 9876543210
+ handler.multicast_vlans = [DEFAULT_MULTICAST_VLAN]
+ handler.northbound_ports = {1}
+ handler.southbound_ports = {}
+ handler.utility_vlan = 0
+ handler.downstream_flows = DownstreamFlows()
+ handler.upstream_flows = DeviceFlows()
+ handler.is_nni_port = lambda n: n in handler.northbound_ports
+ handler.is_pon_port = lambda n: not handler.is_nni_port(n)
+ handler.get_port_name = lambda n: "mock-{} 0/{}".format(
+ "uni" if n not in handler.northbound_ports else "nni",
+ n)
+ yield handler
+
+
+def test_create(flow_handler, caplog):
+ downstream = mk_flow_stat(priority=40000,
+ match_fields=[
+ in_port(1),
+ vlan_vid(ofp.OFPVID_PRESENT | 4),
+ vlan_pcp(7),
+ metadata(666)
+ ],
+ actions=[
+ pop_vlan(),
+ output(5)
+ ])
+ ds_entry, ds_evc = FlowEntry.create(downstream, flow_handler)
+ assert ds_entry is not None, "Entry wasn't created"
+ assert ds_evc is None, "EVC not labeled"
+
+ upstream = mk_flow_stat(priority=40000,
+ match_fields=[
+ in_port(5),
+ vlan_vid(ofp.OFPVID_PRESENT | 666),
+ vlan_pcp(7)
+ ],
+ actions=[
+ push_vlan(0x8100),
+ set_field(vlan_vid(ofp.OFPVID_PRESENT | 4)),
+ set_field(vlan_pcp(7)),
+ output(1)
+ ])
+ us_entry, us_evc = FlowEntry.create(upstream, flow_handler)
+ assert us_entry is not None, "Entry wasn't created"
+ assert us_evc is not None, "EVC not labeled"
+ us_evc._do_install()
+ assert us_evc._installed, "EVC wasn't installed"
+ edit_configs = flow_handler.netconf_client.edit_config.call_args_list
+ assert len(edit_configs) == 1, "EVC-MAP edit config"
+ for call in edit_configs:
+ log.info("Netconf Calls: {}".format(call))
diff --git a/voltha/adapters/adtran_olt/test_requirements.txt b/voltha/adapters/adtran_olt/test_requirements.txt
index 4d8a401..00910af 100644
--- a/voltha/adapters/adtran_olt/test_requirements.txt
+++ b/voltha/adapters/adtran_olt/test_requirements.txt
@@ -1,4 +1,5 @@
-r ../../../requirements.txt
-pytest >= 3.0, < 4.0
-pytest-cov >= 2.1.0, < 3.0
-pytest-profiling >= 1.1.1, < 2.0
+pytest
+pytest-cov
+pytest-profiling
+pytest-twisted