From 4a46723219e5284bec21b9dccd6589a670babc63 Mon Sep 17 00:00:00 2001 From: kali Date: Mon, 27 Aug 2012 23:21:43 +0900 Subject: add test_dump_default_eipconfig to eip.test_checks plus a little bit of cleaning around (created constants file). added some notes about inminent deprecation *work in progress* --- src/leap/base/config.py | 3 ++- src/leap/base/tests/test_config.py | 25 ++++++------------- src/leap/eip/checks.py | 49 +++++++++++++++++++++++++++++++------- src/leap/eip/config.py | 37 +++++++++++++++------------- src/leap/eip/constants.py | 20 ++++++++++++++++ src/leap/eip/tests/test_checks.py | 35 ++++++++++++++++++++++----- src/leap/eip/tests/test_config.py | 4 ++++ 7 files changed, 123 insertions(+), 50 deletions(-) create mode 100644 src/leap/eip/constants.py (limited to 'src/leap') diff --git a/src/leap/base/config.py b/src/leap/base/config.py index 4d7db018..93a89638 100644 --- a/src/leap/base/config.py +++ b/src/leap/base/config.py @@ -162,7 +162,7 @@ def get_groupname(): # json stuff -# XXX merge with JSONConfig +# XXX merge with JSONConfig / EIPChecks as appropiate. def get_config_json(config_file=None): """ will replace get_config function be developing them @@ -236,6 +236,7 @@ class Configuration(object): except requests.ConnectionError as e: if e.message == "[Errno 113] No route to host": if not is_internet_up: + # this was meant to be a function invocation I guess... self.error = "No valid internet connection found" else: self.error = "Provider server appears currently down." diff --git a/src/leap/base/tests/test_config.py b/src/leap/base/tests/test_config.py index 67be0e54..93de0782 100644 --- a/src/leap/base/tests/test_config.py +++ b/src/leap/base/tests/test_config.py @@ -10,6 +10,7 @@ import requests from leap.base import config from leap.base import constants from leap.base import exceptions +from leap.eip import constants as eipconstants from leap.util.fileutil import mkdir_p from leap.testing.basetest import BaseLeapTest @@ -50,26 +51,13 @@ class ProviderDefinitionTestCase(ProviderTest): def setUp(self): # dump a sample eip file # XXX Move to Use EIP Spec Instead!!! - EIP_JSON = { - "provider": "testprovider.org", - "transport": "openvpn", - "openvpn_protocol": "tcp", - "openvpn_port": "80", - "openvpn_ca_certificate": "~/.config/leap/testprovider.org/" - "keys/ca/testprovider-ca-cert-" - "2013-01-01.pem", - "openvpn_client_certificate": "~/.config/leap/testprovider.org/" - "keys/client/openvpn-2012-09-31.pem", - "connect_on_login": True, - "block_cleartext_traffic": True, - "primary_gateway": "usa_west", - "secondary_gateway": "france", - "management_password": "oph7Que1othahwiech6J" - } + # XXX tests to be moved to eip.checks and eip.providers + # XXX can use eipconfig.dump_default_eipconfig + path = os.path.join(self.home, '.config', 'leap') mkdir_p(path) with open(os.path.join(path, 'eip.json'), 'w') as fp: - json.dump(EIP_JSON, fp) + json.dump(eipconstants.EIP_SAMPLE_JSON, fp) def test_complete_file(self): with mock.patch.object(requests, "get") as mock_method: @@ -88,6 +76,7 @@ class ProviderDefinitionTestCase(ProviderTest): u'serial': 1, u'services': [u'eip'], u'version': u'0.1.0'} + # XXX why init to localhost? cf = config.Configuration("http://localhost/") self.assertIn('default', cf.providers) @@ -238,7 +227,7 @@ class ConfigHelperFunctions(BaseLeapTest): """ code to be written yet """ - pass + raise NotImplementedError if __name__ == "__main__": diff --git a/src/leap/eip/checks.py b/src/leap/eip/checks.py index bb588cf7..1726e73a 100644 --- a/src/leap/eip/checks.py +++ b/src/leap/eip/checks.py @@ -1,20 +1,26 @@ import logging logger = logging.getLogger(name=__name__) +import os + +from leap.base import config as baseconfig +from leap.eip import config as eipconfig +from leap.eip import constants as eipconstants class EIPChecker(object): """ - Executes all tests needed + Several tests needed to ensure a EIPConnection can be sucessful """ - def __init__(self): - pass + #def __init__(self): + ## no init needed atm.. + #pass - def do_all_checks(self, checker=None): + def run_all(self, checker=None): """ - just runs all tests in a row. - will raise if some error encounter. + runs all checks in a row. + will raise if some error encountered. catching those exceptions is not our responsibility at this moment """ @@ -24,20 +30,32 @@ class EIPChecker(object): # let's call all tests # needed for a sane eip session. - checker.dump_default_eipconfig() + checker.check_default_eipconfig() checker.check_is_there_default_provider() checker.fetch_definition() checker.fetch_eip_config() checker.check_complete_eip_config() checker.ping_gateway() - def dump_default_eipconfig(self): - raise NotImplementedError + # public checks + + def check_default_eipconfig(self): + """ + checks if default eipconfig exists, + and dumps a default file if not + """ + # it *really* does not make sense to + # dump it right now, we can get an in-memory + # config object and dump it to disk in a + # later moment + if not self._is_there_default_eipconfig(): + self._dump_default_eipconfig() def check_is_there_default_provider(self): raise NotImplementedError def fetch_definition(self): + # check_and_get_definition_file raise NotImplementedError def fetch_eip_config(self): @@ -48,3 +66,16 @@ class EIPChecker(object): def ping_gateway(self): raise NotImplementedError + + # private helpers + + def _get_default_eipconfig_path(self): + return baseconfig.get_config_file(eipconstants.EIP_CONFIG) + + def _is_there_default_eipconfig(self): + return os.path.isfile( + self._get_default_eipconfig_path()) + + def _dump_default_eipconfig(self): + eipconfig.dump_default_eipconfig( + self._get_default_eipconfig_path()) diff --git a/src/leap/eip/config.py b/src/leap/eip/config.py index 8d5c19da..2694ca61 100644 --- a/src/leap/eip/config.py +++ b/src/leap/eip/config.py @@ -1,4 +1,5 @@ -import ConfigParser +import ConfigParser # to be deprecated +import json import logging import os import platform @@ -6,6 +7,8 @@ import socket from leap.util.fileutil import (which, mkdir_p, check_and_fix_urw_only) + +# from leap.base import config as baseconfig from leap.base.config import (get_default_provider_path, get_config_file, get_username, @@ -14,6 +17,7 @@ from leap.base.config import (get_default_provider_path, from leap.baseapp.permcheck import (is_pkexec_in_system, is_auth_agent_running) from leap.eip import exceptions as eip_exceptions +from leap.eip import constants as eipconstants logger = logging.getLogger(name=__name__) logger.setLevel('DEBUG') @@ -276,6 +280,8 @@ def get_sensible_defaults(): return defaults +# XXX to be deprecated. see dump_default_eipconfig +# and the new JSONConfig classes. def get_config(config_file=None): """ temporary method for getting configs, @@ -286,10 +292,6 @@ def get_config(config_file=None): @rtype: ConfigParser instance @rparam: a config object """ - # TODO - # - refactor out common things and get - # them to util/ or baseapp/ - defaults = get_sensible_defaults() config = ConfigParser.ConfigParser(defaults) @@ -302,21 +304,24 @@ def get_config(config_file=None): with open(fpath, 'wb') as configfile: config.write(configfile) config_file = open(fpath) - - #TODO - # - convert config_file to list; - # look in places like /etc/leap/eip.cfg - # for global settings. - # - raise warnings/error if bad options. - - # at this point, the file should exist. - # errors would have been raised above. - config.readfp(config_file) - return config +def dump_default_eipconfig(filepath): + """ + writes a sample eip config + in the given location + """ + # XXX TODO: + # use EIPConfigSpec istead + folder, filename = os.path.split(filepath) + if not os.path.isdir(folder): + mkdir_p(folder) + with open(filepath, 'w') as fp: + json.dump(eipconstants.EIP_SAMPLE_JSON, fp) + + def check_vpn_keys(config): """ performs an existance and permission check diff --git a/src/leap/eip/constants.py b/src/leap/eip/constants.py new file mode 100644 index 00000000..7124ca57 --- /dev/null +++ b/src/leap/eip/constants.py @@ -0,0 +1,20 @@ +EIP_CONFIG = "eip.json" + +EIP_SAMPLE_JSON = { + "provider": "testprovider.example.org", + "transport": "openvpn", + "openvpn_protocol": "tcp", + "openvpn_port": "80", + "openvpn_ca_certificate": "~/.config/leap/providers/" + "testprovider.example.org/" + "keys/ca/testprovider-ca-cert-" + "2013-01-01.pem", + "openvpn_client_certificate": "~/.config/leap/providers/" + "testprovider.example.org/" + "keys/client/openvpn-2012-09-31.pem", + "connect_on_login": True, + "block_cleartext_traffic": True, + "primary_gateway": "usa_west", + "secondary_gateway": "france", + "management_password": "oph7Que1othahwiech6J" +} diff --git a/src/leap/eip/tests/test_checks.py b/src/leap/eip/tests/test_checks.py index 53f8dc6c..ea2b3d15 100644 --- a/src/leap/eip/tests/test_checks.py +++ b/src/leap/eip/tests/test_checks.py @@ -1,11 +1,15 @@ +import json try: import unittest2 as unittest except ImportError: import unittest +import os from mock import Mock -from leap.eip import checks as eip_checks +from leap.base import config as baseconfig +from leap.eip import checks as eipchecks +from leap.eip import constants as eipconstants from leap.testing.basetest import BaseLeapTest @@ -19,10 +23,12 @@ class EIPCheckTest(BaseLeapTest): def tearDown(self): pass + # test methods are there, and can be called from run_all + def test_checker_should_implement_check_methods(self): - checker = eip_checks.EIPChecker() + checker = eipchecks.EIPChecker() - self.assertTrue(hasattr(checker, "dump_default_eipconfig"), + self.assertTrue(hasattr(checker, "check_default_eipconfig"), "missing meth") self.assertTrue(hasattr(checker, "check_is_there_default_provider"), "missing meth") @@ -33,11 +39,11 @@ class EIPCheckTest(BaseLeapTest): self.assertTrue(hasattr(checker, "ping_gateway"), "missing meth") def test_checker_should_actually_call_all_tests(self): - checker = eip_checks.EIPChecker() + checker = eipchecks.EIPChecker() mc = Mock() - checker.do_all_checks(checker=mc) - self.assertTrue(mc.dump_default_eipconfig.called, "not called") + checker.run_all(checker=mc) + self.assertTrue(mc.check_default_eipconfig.called, "not called") self.assertTrue(mc.check_is_there_default_provider.called, "not called") self.assertTrue(mc.fetch_definition.called, @@ -49,6 +55,23 @@ class EIPCheckTest(BaseLeapTest): self.assertTrue(mc.ping_gateway.called, "not called") + # test individual check methods + + def test_dump_default_eipconfig(self): + checker = eipchecks.EIPChecker() + # no eip config (empty home) + eipconfig = baseconfig.get_config_file(eipconstants.EIP_CONFIG) + self.assertFalse(os.path.isfile(eipconfig)) + checker.check_default_eipconfig() + # we've written one, so it should be there. + self.assertTrue(os.path.isfile(eipconfig)) + with open(eipconfig, 'rb') as fp: + deserialized = json.load(fp) + self.assertEqual(deserialized, + eipconstants.EIP_SAMPLE_JSON) + # TODO: when new JSONConfig class is in place, we shold + # run validation methods. + if __name__ == "__main__": unittest.main() diff --git a/src/leap/eip/tests/test_config.py b/src/leap/eip/tests/test_config.py index ed9fe270..fac4729d 100644 --- a/src/leap/eip/tests/test_config.py +++ b/src/leap/eip/tests/test_config.py @@ -81,6 +81,10 @@ class EIPConfigTest(BaseLeapTest): self.assertEqual(command, 'openvpn') self.assertEqual(args, self.get_expected_openvpn_args()) + # XXX TODO: + # - should use touch_exec to plant an "executabe" in the path + # - should check that "which" for openvpn returns what's expected. + if __name__ == "__main__": unittest.main() -- cgit v1.2.3