From b2e7e7edaa93f838d46ca62817b0215d089b048a Mon Sep 17 00:00:00 2001
From: Tamara Dahlgren <35777542+tldahlgren@users.noreply.github.com>
Date: Thu, 5 Mar 2020 16:54:29 -0800
Subject: [PATCH] Recover coverage from subprocesses during unit tests (#15354)

* Recover coverage from subprocesses during unit tests
---
 lib/spack/spack/cmd/test.py                   |  2 +-
 lib/spack/spack/test/cmd/test.py              | 11 ++++++-----
 lib/spack/spack/test/llnl/util/log.py         |  9 ++++++---
 lib/spack/spack/test/pytest.ini => pytest.ini |  2 +-
 share/spack/qa/run-unit-tests                 |  8 ++------
 5 files changed, 16 insertions(+), 16 deletions(-)
 rename lib/spack/spack/test/pytest.ini => pytest.ini (90%)

diff --git a/lib/spack/spack/cmd/test.py b/lib/spack/spack/cmd/test.py
index f2ca8fc93b..8cbc0fbccf 100644
--- a/lib/spack/spack/cmd/test.py
+++ b/lib/spack/spack/cmd/test.py
@@ -154,7 +154,7 @@ def test(parser, args, unknown_args):
 
     # The default is to test the core of Spack. If the option `--extension`
     # has been used, then test that extension.
-    pytest_root = spack.paths.test_path
+    pytest_root = spack.paths.spack_root
     if args.extension:
         target = args.extension
         extensions = spack.config.get('config:extensions')
diff --git a/lib/spack/spack/test/cmd/test.py b/lib/spack/spack/test/cmd/test.py
index 9a64209cfa..a9ef735afe 100644
--- a/lib/spack/spack/test/cmd/test.py
+++ b/lib/spack/spack/test/cmd/test.py
@@ -6,6 +6,7 @@
 from spack.main import SpackCommand
 
 spack_test = SpackCommand('test')
+cmd_test_py = 'lib/spack/spack/test/cmd/test.py'
 
 
 def test_list():
@@ -16,13 +17,13 @@ def test_list():
 
 
 def test_list_with_pytest_arg():
-    output = spack_test('--list', 'cmd/test.py')
-    assert output.strip() == "cmd/test.py"
+    output = spack_test('--list', cmd_test_py)
+    assert output.strip() == cmd_test_py
 
 
 def test_list_with_keywords():
     output = spack_test('--list', '-k', 'cmd/test.py')
-    assert output.strip() == "cmd/test.py"
+    assert output.strip() == cmd_test_py
 
 
 def test_list_long(capsys):
@@ -44,7 +45,7 @@ def test_list_long(capsys):
 
 def test_list_long_with_pytest_arg(capsys):
     with capsys.disabled():
-        output = spack_test('--list-long', 'cmd/test.py')
+        output = spack_test('--list-long', cmd_test_py)
     assert "test.py::\n" in output
     assert "test_list" in output
     assert "test_list_with_pytest_arg" in output
@@ -74,7 +75,7 @@ def test_list_names():
 
 
 def test_list_names_with_pytest_arg():
-    output = spack_test('--list-names', 'cmd/test.py')
+    output = spack_test('--list-names', cmd_test_py)
     assert "test.py::test_list\n" in output
     assert "test.py::test_list_with_pytest_arg\n" in output
     assert "test.py::test_list_with_keywords\n" in output
diff --git a/lib/spack/spack/test/llnl/util/log.py b/lib/spack/spack/test/llnl/util/log.py
index 1eae1ccf69..0c879c5a6e 100644
--- a/lib/spack/spack/test/llnl/util/log.py
+++ b/lib/spack/spack/test/llnl/util/log.py
@@ -32,7 +32,8 @@ def test_log_python_output_with_fd_stream(capfd, tmpdir):
         with open('foo.txt') as f:
             assert f.read() == 'logged\n'
 
-        assert capfd.readouterr() == ('', '')
+        # Coverage is cluttering stderr during tests
+        assert capfd.readouterr()[0] == ''
 
 
 def test_log_python_output_and_echo_output(capfd, tmpdir):
@@ -42,7 +43,8 @@ def test_log_python_output_and_echo_output(capfd, tmpdir):
                 print('echo')
             print('logged')
 
-        assert capfd.readouterr() == ('echo\n', '')
+        # Coverage is cluttering stderr during tests
+        assert capfd.readouterr()[0] == 'echo\n'
 
         with open('foo.txt') as f:
             assert f.read() == 'echo\nlogged\n'
@@ -75,7 +77,8 @@ def test_log_subproc_and_echo_output(capfd, tmpdir):
                 echo('echo')
             print('logged')
 
-        assert capfd.readouterr() == ('echo\n', '')
+        # Coverage is cluttering stderr during tests
+        assert capfd.readouterr()[0] == 'echo\n'
 
         with open('foo.txt') as f:
             assert f.read() == 'logged\n'
diff --git a/lib/spack/spack/test/pytest.ini b/pytest.ini
similarity index 90%
rename from lib/spack/spack/test/pytest.ini
rename to pytest.ini
index 59839c0005..baf163ef0b 100644
--- a/lib/spack/spack/test/pytest.ini
+++ b/pytest.ini
@@ -1,7 +1,7 @@
 # content of pytest.ini
 [pytest]
 addopts = --durations=20 -ra
-testpaths = .
+testpaths = lib/spack/spack/test
 python_files = *.py
 markers =
   db: tests that require creating a DB
diff --git a/share/spack/qa/run-unit-tests b/share/spack/qa/run-unit-tests
index 52748dacdf..01f564e5e1 100755
--- a/share/spack/qa/run-unit-tests
+++ b/share/spack/qa/run-unit-tests
@@ -37,16 +37,12 @@ bin/spack -h
 bin/spack help -a
 
 # Profile and print top 20 lines for a simple call to spack spec
-bin/spack -p --lines 20 spec mpileaks%gcc ^elfutils@0.170
+spack -p --lines 20 spec mpileaks%gcc ^elfutils@0.170
 
 #-----------------------------------------------------------
 # Run unit tests with code coverage
 #-----------------------------------------------------------
-extra_args=""
-if [[ -n "$@" ]]; then
-    extra_args="-k $@"
-fi
-$coverage_run bin/spack test -x --verbose "$extra_args"
+$coverage_run $(which spack) test -x --verbose
 
 #-----------------------------------------------------------
 # Run tests for setup-env.sh
-- 
GitLab