diff --git a/core/roslib/src/roslib/os_detect.py b/core/roslib/src/roslib/os_detect.py index 8f07919d..5276ba60 100644 --- a/core/roslib/src/roslib/os_detect.py +++ b/core/roslib/src/roslib/os_detect.py @@ -34,6 +34,7 @@ from __future__ import with_statement +import roslib.exceptions import roslib.rospack import roslib.stacks import os @@ -71,9 +72,20 @@ def lsb_get_release_version(): except: return None +class OSDetectException(roslib.exceptions.ROSLibException): pass + +class OSBase: + def check_presence(self): + raise OSDetectException("check_presence unimplemented") + + def get_name(self): + raise OSDetectException("check_presence unimplemented") + + def get_version(self): + raise OSDetectException("check_presence unimplemented") ###### Debian SPECIALIZATION ######################### -class Debian: +class Debian(OSBase): def check_presence(self): if "Debian" == lsb_get_os(): return True @@ -106,7 +118,7 @@ class Ubuntu(Debian): ###### END UBUNTU SPECIALIZATION ######################## ###### Mint SPECIALIZATION ######################### -class Mint: +class Mint(Debian): def check_presence(self): try: filename = "/etc/issue" @@ -119,26 +131,14 @@ class Mint: print "Mint failed to detect OS" return False - def get_version(self): - try: - filename = "/etc/issue" - if os.path.exists(filename): - with open(filename, 'r') as fh: - os_list = fh.read().split() - if os_list[0] == "Linux" and os_list[1] == "Mint": - return os_list[2] - except: - print "Mint failed to get version" - return False - - return False + #get_version inherited from debian def get_name(self): return "mint" ###### END Mint SPECIALIZATION ######################## ###### Fedora SPECIALIZATION ######################### -class Fedora: +class Fedora(OSBase): def check_presence(self): try: filename = "/etc/redhat_release" @@ -211,7 +211,7 @@ def port_detect(p): return (std_out.count("(active)") > 0) -class Macports: +class Macports(OSBase): def check_presence(self): filename = "/usr/bin/sw_vers" if os.path.exists(filename): @@ -227,7 +227,7 @@ class Macports: ###### END Macports SPECIALIZATION ######################## ###### Arch SPECIALIZATION ######################### -class Arch: +class Arch(OSBase): def check_presence(self): filename = "/etc/arch-release" @@ -256,7 +256,7 @@ class Arch: ###### END Arch SPECIALIZATION ######################## -class Override: +class Override(OSBase): def __init__(self): self._os_name = "uninitialized from ROS_OS_OVERRIDE=name:version" self._os_version = "uninitialized from ROS_OS_OVERRIDE=name:version" @@ -277,9 +277,9 @@ class Override: -class OSAbstractionException(Exception): pass -class OSAbstraction: + +class OSDetect: """ This class will iterate over registered classes to lookup the active OS and Version of that OS for lookup in rosdep.yaml""" def __init__(self, os_list = [Debian(), Ubuntu(), Mint(), Macports(), Arch(), Fedora(), Rhel()]): @@ -304,7 +304,7 @@ class OSAbstraction: def get_os_specific_class(self): if not self._os_class: if not self.detect_os(): - raise OSAbstractionException("No OS detected") + raise OSDetectException("No OS detected") else: return self._os_class diff --git a/test/test_roslib/test/test_roslib_os_detect.py b/test/test_roslib/test/test_roslib_os_detect.py index 080e0587..7a10a4d7 100644 --- a/test/test_roslib/test/test_roslib_os_detect.py +++ b/test/test_roslib/test/test_roslib_os_detect.py @@ -41,6 +41,23 @@ import roslib.rosenv import roslib.os_detect import rostest +class test_OS(roslib.os_detect.OSBase): + def check_presence(self): + return True + def get_name(self): + return "os_name" + def get_version(self): + return "os_version" + +class dummy_OS(roslib.os_detect.OSBase): + def check_presence(self): + return False + def get_name(self): + return "os_name2" + def get_version(self): + return "os_version2" + + class RoslibOsDetectTest(unittest.TestCase): def test_tripwire_ubuntu(self): @@ -68,8 +85,46 @@ class RoslibOsDetectTest(unittest.TestCase): self.assertEqual("rhel", rhel.get_name()) - def test_tripwire_OSAbstraction(self): - osa = roslib.os_detect.OSAbstraction() + def test_tripwire_OSDetect(self): + osa = roslib.os_detect.OSDetect() + + def test_OSDetect_single(self): + osa = roslib.os_detect.OSDetect([test_OS()]) + self.assertEqual("os_name", osa.get_name()) + self.assertEqual("os_version", osa.get_version()) + + def test_OSDetect_first_of_two(self): + osa = roslib.os_detect.OSDetect([test_OS(), dummy_OS()]) + self.assertEqual("os_name", osa.get_name()) + self.assertEqual("os_version", osa.get_version()) + + def test_OSDetect_second_of_two(self): + osa = roslib.os_detect.OSDetect([dummy_OS(), test_OS()]) + self.assertEqual("os_name", osa.get_name()) + self.assertEqual("os_version", osa.get_version()) + + def test_OSDetect_first_of_many(self): + osa = roslib.os_detect.OSDetect([test_OS(), dummy_OS(), dummy_OS(), dummy_OS(), dummy_OS()]) + self.assertEqual("os_name", osa.get_name()) + self.assertEqual("os_version", osa.get_version()) + + def test_OSDetect_second_of_many(self): + osa = roslib.os_detect.OSDetect([dummy_OS(), test_OS(), dummy_OS(), dummy_OS(), dummy_OS()]) + self.assertEqual("os_name", osa.get_name()) + self.assertEqual("os_version", osa.get_version()) + + def test_OSDetect_last_of_many(self): + osa = roslib.os_detect.OSDetect([dummy_OS(), dummy_OS(), dummy_OS(), dummy_OS(), test_OS(),]) + self.assertEqual("os_name", osa.get_name()) + self.assertEqual("os_version", osa.get_version()) + + def test_ubuntu_in_OSA(self): + ubuntu = roslib.os_detect.Ubuntu() + ubuntu.check_presence = True + osa = roslib.os_detect.OSDetect() + self.assertEqual("ubuntu", ubuntu.get_name()) + + if __name__ == '__main__': rostest.unitrun('test_roslib', 'test_os_detect', RoslibOsDetectTest, coverage_packages=['roslib.os_detect'])