""" Unit tests related to install_vbox """ import unittest from unittest.mock import patch from install_vbox import create_port_forward class CreateportforwardTestCase(unittest.TestCase): """ Class to test create_port_forward method """ def setUp(self): """ Method to set up the parameters used on the tests in this class """ # Set up the test parameters self.hostname = "TestVM" self.network = "NatNetwork" self.local_port = "8080" self.guest_port = "80" self.guest_ip = "10.10.10.1" self.rule_name = "Rule1" @patch("helper.vboxmanage.vboxmanage_addportforward") def test_successful_forwarding(self, mock_addport): """ Test create_port_forward method with successfull creation """ # Setup mock_addport.return_value = True # Run create_port_forward(self.hostname, self.network, self.local_port, self.guest_port, self.guest_ip) # Assert mock_addport.assert_called_once_with('TestVM', '8080', '10.10.10.1', '80', 'NatNetwork') @patch("install_vbox.V_BOX_OPTIONS") @patch("helper.vboxmanage.vboxmanage_getrulename") @patch("helper.vboxmanage.vboxmanage_addportforward") @patch("helper.vboxmanage.vboxmanage_deleteportforward", return_value=None) @patch('utils.install_log.LOG.info') @patch('utils.install_log.LOG.warning') def test_rewrite_rule_yes_to_all(self, mock_warning, mock_info, mock_deleteport, mock_addport, mock_getrule, mock_v_box_options): """ Test create_port_forward method that fails to create rule and the installer was called with --y (yes to all) as an argument """ # Setup mock_addport.side_effect = [False, True] mock_getrule.return_value = "Rule1" mock_v_box_options.y = True # Run result = create_port_forward(self.hostname, self.network, self.local_port, self.guest_port, self.guest_ip) # Assert mock_warning.assert_any_call( "Trying to create a port-forwarding rule with port: %s, but it is already in use with rule name: %s", "8080", "Rule1") mock_info.assert_any_call("Rewriting portforwarding rule...") mock_getrule.assert_called_once_with('NatNetwork', '8080') mock_deleteport.assert_called_once_with('Rule1', 'NatNetwork') mock_addport.assert_called_with('TestVM', '8080', '10.10.10.1', '80', 'NatNetwork') self.assertIsNone(result) @patch("install_vbox.yes_no_prompt") @patch("helper.vboxmanage.vboxmanage_getrulename") @patch("helper.vboxmanage.vboxmanage_addportforward") @patch("helper.vboxmanage.vboxmanage_deleteportforward", return_value=None) @patch('utils.install_log.LOG.warning') def test_rewrite_rule(self, mock_log, mock_deleteport, mock_addport, mock_getrule, mock_y_n_prompt): """ Test create_port_forward method that fails to create rule and the user input 'y' to rewrite the existing rule """ # Setup mock_addport.side_effect = [False, True] mock_getrule.return_value = "Rule1" mock_y_n_prompt.return_value = True # Run result = create_port_forward(self.hostname, self.network, self.local_port, self.guest_port, self.guest_ip) # Assert mock_log.assert_any_call( "Trying to create a port-forwarding rule with port: %s, but it is already in use with rule name: %s", "8080", "Rule1") mock_getrule.assert_called_once_with('NatNetwork', '8080') mock_deleteport.assert_called_once_with('Rule1', 'NatNetwork') mock_addport.assert_called_with('TestVM', '8080', '10.10.10.1', '80', 'NatNetwork') self.assertIsNone(result) @patch("install_vbox.yes_no_prompt") @patch("helper.vboxmanage.vboxmanage_getrulename") @patch("helper.vboxmanage.vboxmanage_addportforward") @patch('utils.install_log.LOG.info') @patch('utils.install_log.LOG.warning') def test_dont_rewrite_rule(self, mock_warning, mock_info, mock_addport, mock_getrule,mock_y_n_prompt): """ Test create_port_forward method that fails to create rule and the user input 'n' to rewrite the existing rule """ # Setup mock_addport.return_value = False mock_getrule.return_value = "Rule1" mock_y_n_prompt.return_value = False # Run result = create_port_forward(self.hostname, self.network, self.local_port, self.guest_port, self.guest_ip) # Assert mock_warning.assert_any_call( "Trying to create a port-forwarding rule with port: %s, but it is already in use with rule name: %s", "8080", "Rule1") mock_info.assert_any_call("Ignoring the creation of the port-forward rule and continuing installation!") mock_getrule.assert_called_once_with('NatNetwork', '8080') mock_addport.assert_called_once_with('TestVM', '8080', '10.10.10.1', '80', 'NatNetwork') self.assertIsNone(result) @patch("helper.vboxmanage.vboxmanage_getrulename") @patch("helper.vboxmanage.vboxmanage_addportforward") @patch('utils.install_log.LOG.error') @patch('utils.install_log.LOG.critical') @patch("sys.exit") def test_norule(self, mock_exit, mock_critical, mock_error, mock_addport, mock_getrule): """ Test create_port_forward method that fails to create rule and no existing rule is found """ # Setup mock_addport.return_value = False mock_getrule.return_value = "" mock_exit.side_effect = SystemExit(1) # Run with self.assertRaises(SystemExit) as cm: create_port_forward(self.hostname, self.network, self.local_port, self.guest_port, self.guest_ip) # Assert self.assertEqual(cm.exception.code, 1) mock_critical.assert_any_call( "Could not add a port-forwarding rule using port %s, and could not find any rule already using it. Check the Nat Network and/or local port.", "8080") mock_error.assert_any_call("Aborting!") if __name__ == '__main__': unittest.main()