This command prints out information about the known testcases. It has extra options to filter by runid, device, xunit, testcase, and status. Implements: #11 (`xfstestsdb testcase list`) Signed-off-by: Anna Schumaker <anna@nowheycreamery.com>
267 lines
12 KiB
Python
267 lines
12 KiB
Python
# Copyright 2023 (c) Anna Schumaker.
|
|
"""Tests the `xfstestsdb testcase list` command."""
|
|
import io
|
|
import unittest
|
|
import unittest.mock
|
|
import xfstestsdb.testcase.list
|
|
import tests.xunit
|
|
|
|
|
|
class TestTestCaseList(unittest.TestCase):
|
|
"""Tests the `xfstestsdb testcase list` command."""
|
|
|
|
def setUp(self):
|
|
"""Set up common variables."""
|
|
self.xfstestsdb = xfstestsdb.Command()
|
|
self.testcase = self.xfstestsdb.commands["testcase"]
|
|
self.list = self.testcase.commands["list"]
|
|
|
|
def setup_runs(self, mock_stdout: io.StringIO):
|
|
"""Set up runs in the database and clear stdout."""
|
|
self.xfstestsdb.run(["new", "/dev/vda1"])
|
|
self.xfstestsdb.run(["new", "/dev/vdb2"])
|
|
|
|
self.xfstestsdb.run(["xunit", "read", "1", str(tests.xunit.XUNIT_1)])
|
|
self.xfstestsdb.run(["xunit", "read", "2", str(tests.xunit.XUNIT_1),
|
|
"--name", "test-2"])
|
|
|
|
mock_stdout.seek(0)
|
|
mock_stdout.truncate(0)
|
|
|
|
def test_init(self):
|
|
"""Check that the testcase list command was set up properly."""
|
|
self.assertIsInstance(xfstestsdb.testcase.list.TestCaseTable(["col"]),
|
|
xfstestsdb.table.Table)
|
|
self.assertIsInstance(self.list, xfstestsdb.commands.Command)
|
|
self.assertIsInstance(self.list, xfstestsdb.testcase.list.Command)
|
|
self.assertEqual(self.testcase.subparser.choices["list"],
|
|
self.list.parser)
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_empty(self, mock_stdout: io.StringIO):
|
|
"""Test printing out an empty list."""
|
|
self.xfstestsdb.run(["testcase", "list", "--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(), "")
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_testcases(self, mock_stdout: io.StringIO):
|
|
"""Test listing xunits with default options."""
|
|
self.setup_runs(mock_stdout)
|
|
print()
|
|
self.xfstestsdb.run(["testcase", "list", "--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(),
|
|
"""
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| run | device | xunit | testcase | status | time |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
|
|
| 1 | /dev/vda1 | test-1 | test/02 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/03 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
|
|
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
|
|
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
|
|
| 1 | /dev/vda1 | test-1 | test/07 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
|
|
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
|
|
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/02 | skipped | 0 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/03 | skipped | 0 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/04 | passed | 4 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/05 | passed | 5 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/06 | passed | 6 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/07 | skipped | 0 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/08 | passed | 8 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/09 | failure | 9 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
""")
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_filter_run(self, mock_stdout: io.StringIO):
|
|
"""Test listing testcases beloging to a specific run."""
|
|
self.setup_runs(mock_stdout)
|
|
print()
|
|
self.xfstestsdb.run(["testcase", "list", "--runid", "1",
|
|
"--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(),
|
|
"""
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| run | device | xunit | testcase | status | time |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
|
|
| 1 | /dev/vda1 | test-1 | test/02 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/03 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
|
|
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
|
|
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
|
|
| 1 | /dev/vda1 | test-1 | test/07 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
|
|
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
|
|
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
""")
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_filter_device(self, mock_stdout: io.StringIO):
|
|
"""Test listing testcases matching a device pattern."""
|
|
self.setup_runs(mock_stdout)
|
|
print()
|
|
self.xfstestsdb.run(["testcase", "list", "--device", "*vdb*",
|
|
"--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(),
|
|
"""
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| run | device | xunit | testcase | status | time |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/02 | skipped | 0 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/03 | skipped | 0 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/04 | passed | 4 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/05 | passed | 5 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/06 | passed | 6 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/07 | skipped | 0 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/08 | passed | 8 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/09 | failure | 9 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
""")
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_filter_xunit(self, mock_stdout: io.StringIO):
|
|
"""Test listing testcases matching an xunit pattern."""
|
|
self.setup_runs(mock_stdout)
|
|
print()
|
|
self.xfstestsdb.run(["testcase", "list", "--xunit", "*1",
|
|
"--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(),
|
|
"""
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| run | device | xunit | testcase | status | time |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
|
|
| 1 | /dev/vda1 | test-1 | test/02 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/03 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
|
|
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
|
|
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
|
|
| 1 | /dev/vda1 | test-1 | test/07 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
|
|
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
|
|
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
""")
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_filter_testcase(self, mock_stdout: io.StringIO):
|
|
"""Test listing testcases matching a specific pattern."""
|
|
self.setup_runs(mock_stdout)
|
|
print()
|
|
self.xfstestsdb.run(["testcase", "list", "--testcase", "test*1*",
|
|
"--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(),
|
|
"""
|
|
+-----+-----------+--------+----------+--------+------+
|
|
| run | device | xunit | testcase | status | time |
|
|
+-----+-----------+--------+----------+--------+------+
|
|
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
|
|
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
|
|
+-----+-----------+--------+----------+--------+------+
|
|
""")
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_filter_passed(self, mock_stdout: io.StringIO):
|
|
"""Test listing testcases that passed."""
|
|
self.setup_runs(mock_stdout)
|
|
print()
|
|
self.xfstestsdb.run(["testcase", "list", "--passed",
|
|
"--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(),
|
|
"""
|
|
+-----+-----------+--------+----------+--------+------+
|
|
| run | device | xunit | testcase | status | time |
|
|
+-----+-----------+--------+----------+--------+------+
|
|
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
|
|
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
|
|
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
|
|
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
|
|
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
|
|
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/04 | passed | 4 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/05 | passed | 5 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/06 | passed | 6 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/08 | passed | 8 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
|
|
+-----+-----------+--------+----------+--------+------+
|
|
""")
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_filter_skipped(self, mock_stdout: io.StringIO):
|
|
"""Test listing testcases that were skipped."""
|
|
self.setup_runs(mock_stdout)
|
|
print()
|
|
self.xfstestsdb.run(["testcase", "list", "--skipped",
|
|
"--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(),
|
|
"""
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| run | device | xunit | testcase | status | time |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| 1 | /dev/vda1 | test-1 | test/02 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/03 | skipped | 0 s |
|
|
| 1 | /dev/vda1 | test-1 | test/07 | skipped | 0 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/02 | skipped | 0 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/03 | skipped | 0 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/07 | skipped | 0 s |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
""")
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_filter_failure(self, mock_stdout: io.StringIO):
|
|
"""Test listing testcases that failed."""
|
|
self.setup_runs(mock_stdout)
|
|
print()
|
|
self.xfstestsdb.run(["testcase", "list", "--failure",
|
|
"--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(),
|
|
"""
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| run | device | xunit | testcase | status | time |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/09 | failure | 9 s |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
""")
|
|
|
|
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
|
|
def test_list_filter_pass_fail(self, mock_stdout: io.StringIO):
|
|
"""Test listing testcases that passed and failed."""
|
|
self.setup_runs(mock_stdout)
|
|
print()
|
|
self.xfstestsdb.run(["testcase", "list", "--passed", "--failure",
|
|
"--color", "none"])
|
|
self.assertEqual(mock_stdout.getvalue(),
|
|
"""
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| run | device | xunit | testcase | status | time |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
|
|
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
|
|
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
|
|
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
|
|
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
|
|
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
|
|
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/04 | passed | 4 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/05 | passed | 5 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/06 | passed | 6 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/08 | passed | 8 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/09 | failure | 9 s |
|
|
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
|
|
+-----+-----------+--------+----------+---------+------+
|
|
""")
|