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