14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""A collection of commonly used 'Features' which bzrlib uses to skip tests."""
18
22
from bzrlib import tests
19
23
from bzrlib.symbol_versioning import deprecated_in
26
class _NotRunningAsRoot(tests.Feature):
31
except AttributeError:
32
# If there is no uid, chances are there is no root either
36
def feature_name(self):
37
return 'Not running as root'
40
not_running_as_root = _NotRunningAsRoot()
22
42
apport = tests.ModuleAvailableFeature('apport')
23
ApportFeature = tests._CompatabilityThunkFeature('bzrlib.tests.features',
24
'ApportFeature', 'bzrlib.tests.features.apport', deprecated_in((2,1,0)))
43
meliae = tests.ModuleAvailableFeature('meliae')
25
44
paramiko = tests.ModuleAvailableFeature('paramiko')
26
45
pycurl = tests.ModuleAvailableFeature('pycurl')
46
pywintypes = tests.ModuleAvailableFeature('pywintypes')
47
sphinx = tests.ModuleAvailableFeature('sphinx')
27
48
subunit = tests.ModuleAvailableFeature('subunit')
51
class _BackslashDirSeparatorFeature(tests.Feature):
55
os.lstat(os.getcwd() + '\\')
61
def feature_name(self):
62
return "Filesystem treats '\\' as a directory separator."
64
backslashdir_feature = _BackslashDirSeparatorFeature()
67
class _PosixPermissionsFeature(tests.Feature):
71
# create temporary file and check if specified perms are maintained.
74
write_perms = stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
75
f = tempfile.mkstemp(prefix='bzr_perms_chk_')
78
os.chmod(name, write_perms)
80
read_perms = os.stat(name).st_mode & 0777
82
return (write_perms == read_perms)
84
return (os.name == 'posix') and has_perms()
86
def feature_name(self):
87
return 'POSIX permissions support'
90
posix_permissions_feature = _PosixPermissionsFeature()
93
class _ChownFeature(tests.Feature):
94
"""os.chown is supported"""
97
return os.name == 'posix' and hasattr(os, 'chown')
99
chown_feature = _ChownFeature()
102
class ExecutableFeature(tests.Feature):
103
"""Feature testing whether an executable of a given name is on the PATH."""
105
def __init__(self, name):
106
super(ExecutableFeature, self).__init__()
112
# This is a property, so accessing path ensures _probe was called
117
path = os.environ.get('PATH')
120
for d in path.split(os.pathsep):
122
f = os.path.join(d, self.name)
123
if os.access(f, os.X_OK):
128
def feature_name(self):
129
return '%s executable' % self.name
132
bash_feature = ExecutableFeature('bash')
133
sed_feature = ExecutableFeature('sed')
134
diff_feature = ExecutableFeature('diff')