bugfix: fix macos incompatibility in lock test (#8573)

- Spack was assuming that a group with gid == current uid would always exist.
- This was breaking the travis build for macos.

- also fix issue with the DB tarball test finding coverage filesx
This commit is contained in:
Todd Gamblin 2018-06-26 05:51:02 -07:00 committed by Massimiliano Culpo
parent bdd5aab8be
commit a48bdfaf1d
3 changed files with 29 additions and 16 deletions

View file

@ -27,8 +27,10 @@
import hashlib import hashlib
import fileinput import fileinput
import glob import glob
import grp
import numbers import numbers
import os import os
import pwd
import re import re
import shutil import shutil
import stat import stat
@ -212,6 +214,21 @@ def set_install_permissions(path):
os.chmod(path, 0o644) os.chmod(path, 0o644)
def group_ids(uid=None):
"""Get group ids that a uid is a member of.
Arguments:
uid (int): id of user, or None for current user
Returns:
(list of int): gids of groups the user is a member of
"""
if uid is None:
uid = os.getuid()
user = pwd.getpwuid(uid).pw_name
return [g.gr_gid for g in grp.getgrall() if user in g.gr_mem]
def copy_mode(src, dest): def copy_mode(src, dest):
"""Set the mode of dest to that of src unless it is a link. """Set the mode of dest to that of src unless it is a link.
""" """

View file

@ -35,8 +35,9 @@ def test_create_db_tarball(tmpdir, database):
with tmpdir.as_cwd(): with tmpdir.as_cwd():
debug('create-db-tarball') debug('create-db-tarball')
# get the first non-dotfile to avoid coverage files in the directory
files = os.listdir(os.getcwd()) files = os.listdir(os.getcwd())
tarball_name = files[0] tarball_name = next(f for f in files if not f.startswith('.'))
# debug command made an archive # debug command made an archive
assert os.path.exists(tarball_name) assert os.path.exists(tarball_name)

View file

@ -72,10 +72,9 @@
import pytest import pytest
from llnl.util.filesystem import touch from llnl.util.filesystem import touch, group_ids
import spack.util.lock import spack.util.lock
from spack.util.executable import which
from spack.util.multiproc import Barrier from spack.util.multiproc import Barrier
from spack.util.lock import Lock, WriteTransaction, ReadTransaction, LockError from spack.util.lock import Lock, WriteTransaction, ReadTransaction, LockError
@ -936,14 +935,16 @@ def test_disable_locking(private_lock_path):
def test_lock_checks_user(tmpdir): def test_lock_checks_user(tmpdir):
"""Ensure lock checks work.""" """Ensure lock checks work with a self-owned, self-group repo."""
path = str(tmpdir)
uid = os.getuid() uid = os.getuid()
if uid not in group_ids():
pytest.skip("user has no group with gid == uid")
# self-owned, own group # self-owned, own group
tmpdir.chown(uid, uid) tmpdir.chown(uid, uid)
# safe # safe
path = str(tmpdir)
tmpdir.chmod(0o744) tmpdir.chmod(0o744)
spack.util.lock.check_lock_safety(path) spack.util.lock.check_lock_safety(path)
@ -966,23 +967,17 @@ def test_lock_checks_user(tmpdir):
def test_lock_checks_group(tmpdir): def test_lock_checks_group(tmpdir):
path = str(tmpdir) """Ensure lock checks work with a self-owned, non-self-group repo."""
uid = os.getuid() uid = os.getuid()
gid = next((g for g in group_ids() if g != uid), None)
id_cmd = which('id') if not gid:
if not id_cmd: pytest.skip("user has no group with gid != uid")
pytest.skip("Can't determine user's groups.")
# find a legal gid to user that is NOT the user's uid
gids = [int(gid) for gid in id_cmd('-G', output=str).split(' ')]
gid = next((g for g in gids if g != uid), None)
if gid is None:
pytest.skip("Can't determine user's groups.")
# self-owned, another group # self-owned, another group
tmpdir.chown(uid, gid) tmpdir.chown(uid, gid)
# safe # safe
path = str(tmpdir)
tmpdir.chmod(0o744) tmpdir.chmod(0o744)
spack.util.lock.check_lock_safety(path) spack.util.lock.check_lock_safety(path)