Update/Add requirements to run ODL robot CSIT
[functest.git] / functest / tests / unit / odl / test_odl.py
index e08deb2..2484f5a 100644 (file)
@@ -18,7 +18,7 @@ import unittest
 from keystoneauth1.exceptions import auth_plugins
 import mock
 from robot.errors import DataError, RobotError
-from robot.result import testcase as result_testcase
+from robot.result import model
 from robot.utils.robottime import timestamp_to_secs
 
 from functest.core import testcase
@@ -49,11 +49,9 @@ class ODLVisitorTesting(unittest.TestCase):
                 'elapsedtime': 1000,
                 'text': 'Hello, World!',
                 'critical': True}
-        test = result_testcase.TestCase(name=data['name'],
-                                        status=data['status'],
-                                        message=data['text'],
-                                        starttime=data['starttime'],
-                                        endtime=data['endtime'])
+        test = model.TestCase(
+            name=data['name'], status=data['status'], message=data['text'],
+            starttime=data['starttime'], endtime=data['endtime'])
         test.parent = mock.Mock()
         config = {'name': data['parent'],
                   'criticality.test_is_critical.return_value': data[
@@ -90,7 +88,7 @@ class ODLTesting(unittest.TestCase):
         os.environ["OS_USERNAME"] = self._os_username
         os.environ["OS_PASSWORD"] = self._os_password
         os.environ["OS_TENANT_NAME"] = self._os_tenantname
-        self.test = odl.ODLTests()
+        self.test = odl.ODLTests(case_name='odl', project_name='functest')
         self.defaultargs = {'odlusername': self._odl_username,
                             'odlpassword': self._odl_password,
                             'neutronip': self._keystone_ip,
@@ -109,21 +107,23 @@ class ODLParseResultTesting(ODLTesting):
     """The class testing ODLTests.parse_results()."""
     # pylint: disable=missing-docstring
 
+    _config = {'name': 'dummy', 'starttime': '20161216 16:00:00.000',
+               'endtime': '20161216 16:00:01.000'}
+
     @mock.patch('robot.api.ExecutionResult', side_effect=DataError)
     def test_raises_exc(self, mock_method):
         with self.assertRaises(DataError):
             self.test.parse_results()
-            mock_method.assert_called_once_with()
+        mock_method.assert_called_once_with(
+            os.path.join(odl.ODLTests.res_dir, 'output.xml'))
 
-    def test_ok(self):
-        config = {'name': 'dummy', 'starttime': '20161216 16:00:00.000',
-                  'endtime': '20161216 16:00:01.000', 'status': 'PASS'}
+    def _test_result(self, config, result):
         suite = mock.Mock()
         suite.configure_mock(**config)
         with mock.patch('robot.api.ExecutionResult',
                         return_value=mock.Mock(suite=suite)):
             self.test.parse_results()
-            self.assertEqual(self.test.criteria, config['status'])
+            self.assertEqual(self.test.result, result)
             self.assertEqual(self.test.start_time,
                              timestamp_to_secs(config['starttime']))
             self.assertEqual(self.test.stop_time,
@@ -131,6 +131,26 @@ class ODLParseResultTesting(ODLTesting):
             self.assertEqual(self.test.details,
                              {'description': config['name'], 'tests': []})
 
+    def test_null_passed(self):
+        self._config.update({'statistics.critical.passed': 0,
+                             'statistics.critical.total': 20})
+        self._test_result(self._config, 0)
+
+    def test_no_test(self):
+        self._config.update({'statistics.critical.passed': 20,
+                             'statistics.critical.total': 0})
+        self._test_result(self._config, 0)
+
+    def test_half_success(self):
+        self._config.update({'statistics.critical.passed': 10,
+                             'statistics.critical.total': 20})
+        self._test_result(self._config, 50)
+
+    def test_success(self):
+        self._config.update({'statistics.critical.passed': 20,
+                             'statistics.critical.total': 20})
+        self._test_result(self._config, 100)
+
 
 class ODLRobotTesting(ODLTesting):
 
@@ -336,9 +356,11 @@ class ODLMainTesting(ODLTesting):
         with mock.patch.object(self.test, 'set_robotframework_vars',
                                return_value=True), \
                 mock.patch.object(odl, 'open', mock.mock_open(),
-                                  create=True), \
+                                  create=True) as mock_open, \
                 mock.patch.object(self.test, 'parse_results'):
             self._test_main(testcase.TestCase.EX_OK, *args)
+        mock_open.assert_called_once_with(
+            os.path.join(odl.ODLTests.res_dir, 'stdout.txt'), 'w+')
 
     @mock.patch('os.remove')
     @mock.patch('robot.run', return_value=1)
@@ -347,9 +369,11 @@ class ODLMainTesting(ODLTesting):
         with mock.patch.object(self.test, 'set_robotframework_vars',
                                return_value=True), \
                 mock.patch.object(odl, 'open', mock.mock_open(),
-                                  create=True), \
+                                  create=True) as mock_open, \
                 mock.patch.object(self.test, 'parse_results'):
             self._test_main(testcase.TestCase.EX_OK, *args)
+        mock_open.assert_called_once_with(
+            os.path.join(odl.ODLTests.res_dir, 'stdout.txt'), 'w+')
 
     @mock.patch('os.remove', side_effect=OSError)
     @mock.patch('robot.run')
@@ -358,9 +382,11 @@ class ODLMainTesting(ODLTesting):
         with mock.patch.object(self.test, 'set_robotframework_vars',
                                return_value=True), \
                 mock.patch.object(odl, 'open', mock.mock_open(),
-                                  create=True), \
+                                  create=True) as mock_open, \
                 mock.patch.object(self.test, 'parse_results'):
             self._test_main(testcase.TestCase.EX_OK, *args)
+        mock_open.assert_called_once_with(
+            os.path.join(odl.ODLTests.res_dir, 'stdout.txt'), 'w+')
 
 
 class ODLRunTesting(ODLTesting):
@@ -368,19 +394,10 @@ class ODLRunTesting(ODLTesting):
     """The class testing ODLTests.run()."""
     # pylint: disable=missing-docstring
 
-    @classmethod
-    def _fake_url_for(cls, service_type='identity'):
-        if service_type == 'identity':
-            return "http://{}:5000/v2.0".format(
-                ODLTesting._keystone_ip)
-        elif service_type == 'network':
-            return "http://{}:9696".format(ODLTesting._neutron_ip)
-        else:
-            return None
-
     def _test_no_env_var(self, var):
         with mock.patch('functest.utils.openstack_utils.get_endpoint',
-                        side_effect=self._fake_url_for):
+                        return_value="http://{}:9696".format(
+                            ODLTesting._neutron_ip)):
             del os.environ[var]
             self.assertEqual(self.test.run(),
                              testcase.TestCase.EX_RUN_ERROR)
@@ -393,7 +410,8 @@ class ODLRunTesting(ODLTesting):
                            if 'odlrestconfport' in kwargs else '8181')
 
         with mock.patch('functest.utils.openstack_utils.get_endpoint',
-                        side_effect=self._fake_url_for):
+                        return_value="http://{}:9696".format(
+                            ODLTesting._neutron_ip)):
             if exception:
                 self.test.main = mock.Mock(side_effect=exception)
             else:
@@ -410,18 +428,15 @@ class ODLRunTesting(ODLTesting):
                 osusername=self._os_username)
 
     def _test_multiple_suites(self, suites,
-                              status=testcase.TestCase.EX_OK,
-                              exception=None, **kwargs):
+                              status=testcase.TestCase.EX_OK, **kwargs):
         odlip = kwargs['odlip'] if 'odlip' in kwargs else '127.0.0.3'
         odlwebport = kwargs['odlwebport'] if 'odlwebport' in kwargs else '8080'
         odlrestconfport = (kwargs['odlrestconfport']
                            if 'odlrestconfport' in kwargs else '8181')
         with mock.patch('functest.utils.openstack_utils.get_endpoint',
-                        side_effect=self._fake_url_for):
-            if exception:
-                self.test.main = mock.Mock(side_effect=exception)
-            else:
-                self.test.main = mock.Mock(return_value=status)
+                        return_value="http://{}:9696".format(
+                            ODLTesting._neutron_ip)):
+            self.test.main = mock.Mock(return_value=status)
             self.assertEqual(self.test.run(suites=suites), status)
             self.test.main.assert_called_once_with(
                 suites,
@@ -467,7 +482,8 @@ class ODLRunTesting(ODLTesting):
 
     def test_no_sdn_controller_ip(self):
         with mock.patch('functest.utils.openstack_utils.get_endpoint',
-                        side_effect=self._fake_url_for):
+                        return_value="http://{}:9696".format(
+                            ODLTesting._neutron_ip)):
             self.assertEqual(self.test.run(),
                              testcase.TestCase.EX_RUN_ERROR)
 
@@ -492,7 +508,8 @@ class ODLRunTesting(ODLTesting):
 
     def test_apex_no_controller_ip(self):
         with mock.patch('functest.utils.openstack_utils.get_endpoint',
-                        side_effect=self._fake_url_for):
+                        return_value="http://{}:9696".format(
+                            ODLTesting._neutron_ip)):
             os.environ["INSTALLER_TYPE"] = "apex"
             self.assertEqual(self.test.run(),
                              testcase.TestCase.EX_RUN_ERROR)
@@ -506,7 +523,8 @@ class ODLRunTesting(ODLTesting):
 
     def test_netvirt_no_controller_ip(self):
         with mock.patch('functest.utils.openstack_utils.get_endpoint',
-                        side_effect=self._fake_url_for):
+                        return_value="http://{}:9696".format(
+                            ODLTesting._neutron_ip)):
             os.environ["INSTALLER_TYPE"] = "netvirt"
             self.assertEqual(self.test.run(),
                              testcase.TestCase.EX_RUN_ERROR)
@@ -520,7 +538,8 @@ class ODLRunTesting(ODLTesting):
 
     def test_joid_no_controller_ip(self):
         with mock.patch('functest.utils.openstack_utils.get_endpoint',
-                        side_effect=self._fake_url_for):
+                        return_value="http://{}:9696".format(
+                            ODLTesting._neutron_ip)):
             os.environ["INSTALLER_TYPE"] = "joid"
             self.assertEqual(self.test.run(),
                              testcase.TestCase.EX_RUN_ERROR)
@@ -563,7 +582,7 @@ class ODLArgParserTesting(ODLTesting):
         self.defaultargs['foo'] = 'bar'
         with self.assertRaises(SystemExit):
             self.parser.parse_args(["--foo=bar"])
-            mock_method.assert_called_once_with()
+        self.assertTrue(mock_method.getvalue().startswith("usage:"))
 
     def _test_arg(self, arg, value):
         self.defaultargs[arg] = value